본문 바로가기

My Study/Malware&Vulnerabilities

Memory Dump를 이용한 숨겨진 프로세스 찾기

이 내용은 쿠시스 호남권역 세미나 때 김태일 강사분께서 강의 하셨던 내용을 복습차원에서 직접 해보고 정리한 내용입니다.
=====================================================================
다들 바이러스가 걸린 컴퓨터에서 바이러스 샘플을 뽑아내기 위해 노력하신 기억들이 다들 있으실 것입니다.
TcpView, ProcessExplorer, Cport, Gmer, IceSword 등등.. 많은 툴들을 사용하면서 찾아낼려고 노력하셨을 것입니다.
이 때 몇몇 바이러스는 루티킷 기술이 유저모드 상이나 커널모드 상에서 구현되어 자기 프로세스를 프로세스 보는 툴로부터 벗어나기 위해 노력을 합니다. 
그래서 프로세스 목록 보는 툴로 보게 됬을 때 탐지를 할 수 없다는 것입니다.
그나마 IceSword, Gmer 등등.. 이런 툴들이 숨겨진 프로세스 목록까지 보게 해주는 툴이긴 하지만 언제까지나 자동화된 툴이고 사람이 그 자동화된 부분을 우회할 수 있다는 것입니다.
그래서 이번에 정리를 해보려고 하는 내용직접 Memory Dump를 떠서 그 메모리에서 프로세스 목록을 직접 사람이 분석을 해보는 것입니다. 이 방법을 사용할 경우 어떠한 루트킷 기술을 적용하더라도 모든 프로세스를 탐지할 수 있습니다.

그러면 시작해보도록 하겠습니다.
======================================================================
먼저 필요한 툴부터 소개를 하겠습니다.
mdd : 메모리 덤프를 뜨는 툴
volatility : 메모리 덤프에서 프로세스 목록을 뽑아내는 툴
python : Volatility이 python으로 제작되서 실행시키기 위해 필요한 툴
graphviz : 프로세스 목록을 보기좋게 그래프로 보기위한 툴
이렇게 총 4개의 툴이 필요합니다.

그리고 실험에 사용될 바이러스 샘플은 DDOS bot 프로그램 인데 이 바이러스는 루트킷 기술이 적용되 프로세스 목록으로부터 감추는 기능이 구현되어 있습니다. 여기서 이 바이러스가 내부적으로 무엇을 하는지에 대해선 주제에 벗어나므로 제외시키도록 하겠습니다.

일단 바이러스가 실행된 상태입니다. 이제 첫번째 과정으로 메모리 덤프를 떠야합니다.

mdd 파일을 cmd창에서 실행을 시키는데 뒤에 옵션으로 -o를 주시고 mdd파일이 저장될 절대 경로를 정해주시면됩니다.

위를 보시면 28.64%.. 이렇게 나오는데 100% 되면 완료가 됩니다. 
대략.. 30초~1분 정도 걸리는거 같습니다. 제 컴이 구린건지..ㅠㅠ
아무튼 완료가 된 화면입니다.

c:\에 test.mdd로 파일이 하나 생성됬습니다. cmd 창에서도 완료가 됬다면서 쭉쭉 정보가 나오는군요. 초가 나오네요. 72초가 걸렸네요 ㅜㅜ 그리고 MD5값도 쭉 나오구요. 

이번엔 이렇게 생성된 mdd파일에서 프로세스 목록을 뽑아보도록 하겠습니다.
사용할 툴은 volatility인데 아까 말씀 드렸듯이 python을 설치하셔야합니다.
python설치 하셔서 설치된 폴더를 환경변수에 등록 시켜 놓으시면.. 아래처럼 따라하시는데 문제 없을 것입니다.
이제 volatility에서 사용할 옵션은 두가지 입니다. 둘다 프로세스 목록을 뽑아오는 것인데 차이점이 있습니다.

1. python volatility pslist
volatility 옵션으로 pslist를 줄 경우입니다.
보통 프로세스들은 EPROCESS라는 구조체에 의해 더블링크드 리스트로 쭉 연결이 되어있습니다. 그래서 pslist옵션으로 프로세스 목록을 읽어오게 되면 이 더블링크드 리스트에 연결된 목록을 쭉 불러오게 되는 것입니다.
그냥 대충 어떻게 표현되는지 그림으로 보겠습니다.

이렇게 연결되어 있는데 저 리스트에 연결된 EPROCESS 목록을 쭉 읽어온다는 뜻입니다. ^^

한번 해보겠습니다.

빨간색 네모친 대로 쳐주시면 됩니다. 그러면 해당 mdd파일에서 추출해낸 프로세스 목록을 c:\list.txt로 뽑아냈을 것입니다.
위 그림을 보시면 list.txt가 생성된 것을 볼 수 있습니다.

이제 list.txt 내용을 보도록 하겠습니다.

일부만 봐본 내용입니다. 프로세스 명이 있고 Pid, PPid. Thread 수, Handle, 시작 시간이 나와있습니다.

여기서도 잘 분석해보면 나올수도 있지만 위 방법을 사용할 경우 탐지가 안되는 경우도 있습니다.
그 이유는 프로세스 목록 숨기는 방법 중에 DKOM이라는 방법을 사용해서 프로세스 탐지로부터 벗어나는 방법도 있기 때문입니다. 보통 프로세스 목록을 커널모드 상에서 숨기는 방법으로는 SSDT후킹을 사용해 숨겼는데 너무 많이 이 방법을 사용한 나머지...? SSDT후킹 탐지 방법이 많이 나왔습니다. 그래서 SSDT 후킹 대신 DKOM방법을 사용합니다.
DKOM방법은 아까 위에서 보셨던 그림을 떠올려서 보면 리스트로 연결된 자기 프로세스를 리스트에서 빼버리는 것입니다.

아마 이런 식이 될 것입니다. 이 방법을 사용할 경우 방금 보여드렸던 pslist옵션으로는 탐지가 안됩니다.

그래서 다른 옵션을 사용해보겠습니다.

2. python volatility psscan
psscan옵션을 사용하는 것입니다. 이 방법을 사용할 경우 리스트에 연결된 EPROCESS목록만 뽑아오는게 아니라
메모리 덤프 내부에 존재하는 모든 EPROCESS목록을 가져오게 됩니다. 그러므로 DKOM방법처럼 리스트를 끊어버린다 하더라도 전부 걸리게 되는 것입니다.
그리고 pslist와 달리 이 방법의 또 하나의 장점은 volatility -d 옵션을 주므로써 그래프로 깔끔하게 볼 수 있다는 것입니다.

이제 해보겠습니다.

psscan옵션을 주었고 추가적으로 -d 옵션도 주었습니다. 다시 쉘이 활성화 되는데 까지 있어서.. 7분이라는 시간이 걸렸습니다. -_-;;;;;;;;; 컴퓨터 다운먹은줄....;;
아무튼 list는 뽑아 냈습니다. 아까 list파일의 용량은 4KB였는데 이번엔 24KB이군요. 상당한 용량차이를 보입니다.
일단 열어보겠습니다.

뭐 pid는 보이고 ... 이것저것 보이는거 같은데 상당히 보기 불편합니다. 사실 이렇게 보려고 -d 옵션을 준건 아닙니다.
이제 이때 사용하는 마지막 툴인 graphviz툴을 사용할 것입니다. 해당 툴을 설치를 합니다.
C:\Program Files\Graphviz2.26.3\bin
위 경로를 가시게 되면 

dotty라는 프로그램이 존재합니다. 이제 list파일을 dotty툴로 열어보게 되면!! 눈이 정화가 될 것입니다.

이제 그래프로 쭉 나오게 되는데 여기서 이상한 점을 발견을 합니다.
보통 svchost.exe는 services.exe를 부모프로세스로 두고 태어나게? 됩니다.

위 그림처럼 말이죠. 하지만 svchost.exe인데도 불구하고 자기혼자 동떨어져 있는 놈이 한놈 있었습니다.


바로 요놈!! 부모 pid는 2204였고 2204프로세스가 svchost.exe를 생성시켰습니다. 
이럴 경우 이름만 svchost지 난 바이러스이다~~ 라고 말하고 있군요.

아무튼 이렇게 프로세스 목록에서부터 자기를 숨겼을 때 이와 같은 방법을 사용할 경우 
100% 탐지 할수 있다고 합니다.

위 그림을 보시면 file ofs해서 해당 메모리 덤프 파일로부터 offset위치를 알려주고 있는데
저 위치를 가면 해당 프로세스의 EPROCESS 구조체가 있습니다.

감사합니다 ^^

'My Study > Malware&Vulnerabilities' 카테고리의 다른 글

DLL Hijacking  (7) 2010.09.08
네이트온 유포 바이러스 lookr.exe 분석  (15) 2010.05.11
CodeEngn Malware Analysis Level8  (7) 2010.05.07
CodeEngn Malware Analysis Level7  (2) 2010.05.07
CodeEngn Malware Analysis Level6  (0) 2010.05.07