반응형

윈도우즈(Windows)에서 볼라틸리티(volatility)를 사용하여 메모리 분석 - 1
윈도우즈(Windows)에서 볼라틸리티(volatility)를 사용하여 메모리 덤프 뜬 것을 분석해보는 시간을 가져보자.

vol.zip

윈도우즈에서 volatility를 사용하려면 위의 파일이 필요하다. 다운로드를 받으면된다.
volatility를 사용하려면 넷프레임워크 아니면 파이썬이 필요한데 정확히 뭐였는지 기억이 안난다.
혹시 실행이 안된다면 파이썬이나 넷프레임워크를 설치해보자.


 이번 포스팅에서는 볼라틸리티(volatility)에 대해 자주 사용할 법한 명령어들 몇개를 실제로 실습을 해볼 예정이다.
 여담으로 Volatility(휘발성)와 vulnerability(취약성)와 혼동하면 안된다.



vol.exe -f [분석하고자 하는 이미지(zeus.vmem, XXXX-20161229-112527.raw)] imageinfo
위에는 zeus에 감염된 메모리에 대한 이미지정보를 나타내는 것이고 아래 명령어는 필자의 컴퓨터(Windows 10)를
덤프 뜬 것을 본것이다. 윈도우에서 메모리 덤프뜨는 방법은 기존의 포스팅에 있으니 참고하면 되겠다.
imageinfo에서는 Suggested Profile(s)의 정보가 중요하다. 앞으로 분석하는데에 사용되는 값이기 때문이다.




vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] pslist 
pslist 명령어는 시스템의 프로세스들을 보여주기 위해 사용한다.
오프셋, 프로세스 이름, ID, 부모 프로세스 ID(PPID), 쓰레드의 수, 핸들의 수, 프로세스 시작 시간과 종료 시간을 보여준다.
다만 프로세스가 은닉되었거나 연결이 끊어진 프로세스는 출력해주지 않는다. (psscan 명령어는 통해 파악)





vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] pslist > pslist.txt
위와 똑같은 pslist의 출력인데 " > pslist.txt " 명령어를 통하여 텍스트 파일로 나타낼 수 있다. 





vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] pstree > pstree.txt
pstree 명령어는 프로세스를 트리 형태로 출력해주는 것을 보기 위해 사용한다. pslist와 유사하며 마찬가지로
은닉되었거나 연결이 끊긴 프로세스는 보여주지 않는다. 자식프로세스는 마침표를 통하여 구분하게 된다. 





vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] psscan > psscan.txt
psscan은 pslist, pstree와 유사하지만 풀 태그 스캐닝을 사용하여 프로세스를 출력해준다. 따라서 종료된 프로세스나
비활성화 되어있는 프로세스, 루트 킷에 의해 숨겨지거나 연결이 끊긴 프로세스들을 찾을 수 있게된다.






vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] dlllist > dlllist.txt
프로세스에서 Load된 DLL들을 보기위한 명령어이다. -p 명령어를 통하여 특정 프로세스 DLL을 볼 수 있으며
이는 PEV의 InLoadOrderModuleList에서 가르키는 LDR_DATA_TABLE_ENTRY 구조체들의 이중연결리스트를 지닌다.
DLL들은 한 프로세스에서 LoadLibrary(또는 LdrLoadDll과 같은 몇몇 파생함수)를 호출할 때 이 리스트에 자동으로 추가되며
FreeLibrary가 호출되거나 레퍼런스 카운트가 0이 될 때까지 제거되지 않는다.






vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] hivelist > hivelist.txt
메모리의 레지스터 하이브(hives)의 가상메모리 주소들의 위치를 파악하고 디스크에 관련된 하이브에 전체 경로를
표기하기 위해 hivelist명령어를 사용한다. 만약 특정 하이브로부터 값을 표기하기 원한다면, 이 명령어를 실행시켜서
해당 되는 하이브 주소 값을 볼 수 있으며, 이 명령어를 통하여 Windows password를 크랙할 수 있게 된다.







Windows password는 SAM에 속해있으며 값을 추출하기 위해 위에 표기 되어있는 값을 알아야 한다. 



vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] hashdump -y [시스템의 Virtual(0xe101b008)] -s [샘의 Virtual(0xe1544008)]
이 사진 이전의 hivelist.txt 결과에서 값을 적으면 된다. 그럼 linux에서 보던 passwd, shadow파일처럼 생긴 것을 볼 수 있다.






vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] connections > conn.txt
메모리 덤프를 뜰 때 활성화 되어 있는 TCP연결들을 보기 위한 명령어이다. 현재 이 덤프파일에는 안나와 있지만
네트워크의 pslist와 비슷하다고 생각하면 될 듯 싶다.
오프셋은 기본적으로 가상 오프셋으로 출력되지만 물리적인 오프셋을 얻고 싶다면 -p 명령어를 추가적으로 사용한다.





vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] connscan > conn2.txt
connscan은 프로세스로 따지자면 psscan과 유사하다.
풀 태그 스캐닝을 사용하여 _TCPT_OBJECT 구조체를 찾기 위해 사용된다. 이 명령어는 32bits와 64bits Windows XP와
Windows 2003 Server에서만 동작한다고 한다. 
이 명령어는 이미 종료되어버린 연결들로부터 아티팩트를 찾아 낼 수 있고 게다가 활성화된 것들도 찾아 낼 수 있다.
부분적으로 덮여쓰여진 필드를 발견 할 수 있지만 전체적으로 신뢰할 수 있는 정보이다.
따라서 오탐이 발견될 수 있지만 많은 정보를 찾을 수 있다는 장점이 있다. 






vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] malfind -p 856 > 856.txt
malfind 명령어는 VAD 태그와 페이지 권한들 같은 문자들을 기반으로 사용자 모드 메모리에 숨겨져 있거나 삽입되어 있는 코드나 DLLs를 찾아내는데 도움을 준다. 참고로 malfind는 CreateRemoteThread -> LoadLibrary로 사용되는 프로세스에 삽입되는 DLLs은 탐지하지 않는다.
이 기술로 삽입된 DLLs는 숨겨지지 않으며 CommandReference21#dlllist에서 이것들을 확인할 수 있다.
malfind의 목적은 기본적인 메소드/도구들이 보지 못하는 것을 DLLs의 위치를 찾아내는 것이다. 
malfind에 의해 인식되는 메모리 세그먼트의 압축된 복사파일을 저장하고 싶다면, -D 옵션과 결과가 저장될 dir를 지정해주면 된다. 






vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] -p 856 impscan -b [Malfind의 프로세스 결과 값의 Address(0xb7000)] > impscan.txt
메모리 덤프에서 찾은 코드를 Reverse engineering(역공학)을 하기 위해선 코드가 import하고 있는 함수를 보는 것이 필수적이다.
다른 말로 말하자면 그것이 가르키고 있는 API함수들을 의미한다. 

Impscan은 PE의 IAT(Import Address Table)를 파싱할 필요 없이 API들을 불러와 정의 할 수 있다. 만약 악성코드가
완벽하게 PE Header를 지우고 커널 드라이브에서 실행되고 있다면 여기엔 나오지 않게 될 것이다. 







vol.exe -f zeus.vmem --profile=[imageinfo의 Profile값(WinXPSP2x86)] -D [경로(C:\Users\Moon\Desktop\run)] procexedump
프로세스의 실행(슬랙 공간은 미포함)을 덤프하기 위해서 사용되는 명령어이다. 
프로세스을 실행하는 실행파일을 뽑아낸다. 

test




참고 문헌 : Volatility Command 2.1(번역 문서) - www.boanproject.com 


반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기