OLD 2018 ~ 2021/MAJOR → Forensic
180107_[IR_report]_linux_webshell
pogn
2018. 1. 15. 01:33
Concept |
파일시스템을 unmount 해야할 때, 해당 파일 시스템에 있는 파일을 사용하는 프로세스때문에 잘 되지 않을 때,
해당 파일시스템에 있는 파일에 접근하고 있는 프로세스들을 다 찾아 줄 수 있다.
lsof -l 은 모든 네트워크 Socket들을 찾아낼 수 있고, 잘 활용하면 어떤 네트워크 Connection에 의해서
netstat -t 와 함께 사용하여, 해당 파일을 어떤 PID를 가진 어떤 User가 사용하고 있는지 확인가능하다.
lsof -iTCP@fool.bbana.co.kr:login
root 권한을 가진 사용자의 권한 및 레이블을 보여준다.
초동분석
- 히스토리
- 시스템의 계쩡들
--> etc/passwd/
grep bash /etc/passwd
uid/ gid가 0으로 설정되어있다는 것은
쉘 실행권한을 가진
공격자가 루트권한을 획득을 했다! adduser는 루트만 할 수 있기 때문
useradd 명령어로 계정 추가를 한 시간 --> secure log에 있다.
grep useradd secure*
공격자가 많이 변조하는 부분이 cron tab은 꼭 확인해야한다.
[cat crontab] 아래의 3줄이 passwd , shadow 같은 파일은 해당 crontab에 원래 없는파일임.
루트권한 획득 후 --> cron으로 백도어를 설치를 했다.
분석
웹 서버니깐 아파치 웹서버가 구동되는 파일들, 생성하는 파일들 + 웹 로그 확인을 먼저 해야한다.
confirm --> admin admin웹 브라우져로 이동한 것은 아닌걸 확인가능
..tmp/에 있음
su admin
ud
id
./.expl
하면 바로 쉘 권한이 떨어진다는게 보임.
|
Hands-on Practice |
침해사고 대응 실습 과제로 주어진 리눅스 시스템 VM에 대한 분석을 진행하여 보았다.
1) 휘발성 정보 수집
가장 먼저, 대표적인 휘발성 데이터를 수집하였다.
history > history.txt : 입력한 명령어 로그
: 리눅스 시스템에서는 로그인 한 순간부터 입력한 커맨드는 버퍼에 기록되지만,
로그아웃 할 시 버퍼에 기록된 history는 ~/.bash_history에 추가적으로 기록된다.
history 명령어를 입력하면 /.bash_history와 buffered/cache history가 화면에 나온다. (단, 시간정보는 알 수 없다. - hist 변수 설정을 해 주면 로그에 시간을 나오게 할 수 있다.)
ps -aux > ps.txt : 현재 프로세스 // 실제 봤을때 ps -ef 하고 차이점은 그닥 모르겠음...
현재 사용자가 실행한 프로세스에 대한 정보를 출력한다. (현재 로그인한 계정은 root이다.)
단, -a : 다른 터미널의 프로세스 상태보기
- u : 사용자 이름과 시작 시간 추가해서 보기
- x : 진행중인 프로세스들과 다른 터미널의 프로세스 보기
lsof -i > lsof.txt : 프로세스에 의해 열린 파일들 중 인터넷과 관련된 파일
프로세스에 의해서 open된 파일들에 대한 정보 / -i : ipv4,6와 관련된 파일만 보이기
netstat -naop > netstat.txt : 네트워크 정보 수집
네트워크 프로토콜 통계를 위한 네트워크 연결을 보여주는 도구
-n : 컴퓨터 이름 대신 IP주소
-a : 네트워크 연결을 기다리고 있는 모든 포트(소켓)를 보여주는 옵션 // 좀비PC 확인시, -na는 꼭들어가야
-o : (owner) 각 연결의 소유자 프로세스
-p : 해당 프로토코을 사용하는 프로그램을 보여줌 // 프로세스 관련
2) 프로세스 분석
ps -ef | more
netstat -naop : tcp/udp 이외에 raw 소켓 통신을 하는 포트가 확인되었다. : pid=2267, ttymon
ps -ef | grep 2267
해당 PID를 가진 프로세스가 없다 -> 숨겨져 있다는 의미
lsof -i : COMMAND:3 (PID=2267)
사용자 계정 정보, 루트 권한의 히스토리, Shell 사용 권한이 있는 계정의 History
pid=2267인 해당 프로세스가 없다.
cd /etc -> 서비스의 설정 파일들이 모여 있는 위치
cat passwd | grep bash
계정이 추가가 되어 있다는 것은 root 권한 탈취가 이미 이루어졌다는 의미이다.
위에선 찾을 수 없었던 프로세스가 cd /proc에서는 발견되었다. pid =2267
3) 로그분석
var/log 디렉토리에는 리눅스 커널이 생성한 로그들이 모여있다.
각 로그들의 기능은 아래와 같다.
---------------------------------------------------------------------------------------------------------------------------------
boot.log : 부팅시 나타나는 모든 메시지 기록. 부팅 기록 및 부팅 시 에러나 조치사항을 살펴보려면 이 파일을 참조
cron : 시스템의 정기적인 작업에 대한 로그 (crontab기능관련)
--> stat crontab, cat crontab로 확인한다.
lastlog : 시스템 각 계정의 최근 접속정보 확인 ( 계정만, 시간만 지정도 가능하다.)
--> binary 파일이기 때문에 [ lastlog -u 계정명 -t 일자(현재-일자) ] 이런 형식으로 사용.
maillog : sendmail, pop 등의 메일관련 데몬의 로그
message : 운영체제에서 보내주는 실시간 로그. 주로 콘솔로 실시간으로 보여진다.
rpmpkgs :
secure : 언제 누가 어디에서 어떻게 접속을 했는가에 대한 로그를 기록한다.
spooler :
wtmp : 시스템 전체 로그인 기록을 저장.
xferlog : ftp로 로그인하는 사용자에 대한 로그를 기록
그 외)
dmesg : 부팅될 당시의 각종 메시지들을 저장한다.
ksyms :
---------------------------------------------------------------------------------------------------------------------------------
secure 로그는 로그인과 관련된 로그들이 남는다.
root로의 로그인 시도 뒤에,
useradd (root로만 실행할 수 있는 명령어)를 통해 mysql, admin, fuckroot라는 계정이 생성되는 로그가 있다.
xferlog는 FTP 접속과 관련된 로그가 남는다. admin 계정을 가진 사용자가 4월 29일 01시경에 접속을 했음을 알 수 있다.
일반적으로 FTP 는 파일을 전송하는데 사용되는데, cat, grep과 같은 명령어 실행파일을 자신의 디렉토리에 올린 것이 확인되었다.
* Reverse Connection
기존에 웹 로그는 /var/log/httpd/ 디렉토리 안에 access_log, error_log ( 아파치 웹서버의 접속로그, 에러로그)로 저장이 되나
해당 디렉토리에서 해당 로그를 찾아볼 수 없었다.
ps -ef를 통해 프로세스에서의 http 서비스가 pid=2252번으로 돌아가고,
lsof -p 2252를 통해 해당 프로세스가 읽고 쓰는 로그파일이 usr/local/apache/logs/에 있음을 알수 있었다.
usr/local/apache/logs/accesslog에서 특이한 점은 POST로 불규칙한 파일 사이즈를 보내는 것이다.
-->웹 쉘일 가능성이 높다.
// 보통은 규칙적인가? 그렇다.
들어가보니 웹 쉘임을 확인하였다.
* ls -l | grep passwd*
passwdl, shadowl -> 기본적으로 존재하는 파일이 X
grep member_confirm.php -> 웹 쉘 최초 접근 시간 확인
stat member_confirm.php
apache 환경에서 php파일의 대부분은 root 혹은 nobody인 경우가 대다수이지만 이 파일은
UID/GID가 admin이다. 이는, admin 계정의
SQL Injection을 통해서 생성하면? uid에 mysql이 들어가 있을 것
--> 공격은 nobody 권한의 웹 브라우저에서 진행,
하지만 데이터베이스에서 저장된 웹 쉘을 서버에다가 write하는 것은 mysql이 하는 것이기 때문에
-> 따라서, 웹 기반 공격을 통해서 이 웹쉘 파일을 업로드 한 것이 아니다
ftp서비스도 돌고 있었으니 ftp 로그를 확인하자.. /var/log/xferlog -> 첫번째 로그에서 확인 가능
4) 최종 분석 결과
---------------------------------------------------------------------------------------------------------------------------------
1-- FTP 접속 및 웹 쉘 업로드
: 4/28 21:23:09
2-- 웹 쉘 접근 시간
: 4/28 21:23:38
-- 이 사이에 루트 권한을 획득하는 과정이 있을 것..
3-- 계정 생성 시간
: /var/log/secure.1 로그에서 확인.. grep useradd
: 4/28 22:14:28
---------------------------------------------------------------------------------------------------------------------------------
|
Reference |
lsof 명령어
etc/passwd etc/shadow 파일 구조
로그파일 관련 정보
리눅스 디렉토리 관련 정보
|