티스토리 뷰


Volatility Screenshot Plugin Remaster Research


요즘 디지털포렌식 학회 하계 기술 워크샵, 코드 엔진 컨퍼런스 방문 등 방학을 나름 알차게 보내고 있다고 생각한다. 그런데 막상 개인 연구는 좀 소홀한 듯 하다.. 물론 KDFS 2017이나 디지털 범인을 찾아라 등 다양한 경진 대회도 있는지라 그것을 준비하는 것도 괜찮다고 생각했다. 그러나 많은 고수분들께서 참가하시는 바람에 의욕을 잃었다.



The Art of Memory Forensics : Simple Volatility Plugin Development Guide, Donghyun Kim


각설하고 이때까지 Volatility Plugin 개발을 연구하면서 많은 이득을 봐 왔기도 했지만, Volatility라는 Tool에 대해서 이해를 한 것이지 실질적인 메모리 포렌식에 대한 지식의 부족함을 항상 느껴왔다. 때마침 KAIST의 CPUU님이 리눅스 메모리 포렌식에 대한 현재의 문제점에 대해 시사하는 논문을 작성하여 발표하셨다. 그것을 본 나는 메모리 포렌식의 문제점을 해결해보자는 생각을 가지게 되었고, 내가 메모리 포렌식에서 신기하게 사용했던 Screenshot Plugin에 대한 분석과 개선 방향을 제시하는 연구를 해보고자 한다.



Department of Defense Cyber Crime Center : http://www.dc3.mil/digital-forensics


일명 DC3 (Department of Defense Cyber Crime Center)는 미 국방부 (Department of Defense)의 산하 기관이다. 이 DC3에서는 2006년부터 Digital Forensic과 관련한 Challenge를 개최해왔는데 2009년 대회에서 고려대학교 디지털 포렌식 연구센터에서 수상한 바가 있다.


필자가 해당 Challenge의 문제 때문에 처음으로 Volatility의 Screenshot이라는 Plugin을 접하게 된다. DC3 Digital Forensic Challenge의 문제 중에서 메모리 덤프 파일에 대한 질문과 그에 대한 보고서를 작성하는 문제가 있었는데, 그 중 한 문제가 사용자의 PC 화면을 Screenshot하는 문항이었다. 아쉽게도 Redline이나 Rekall과 같은 메모리 포렌식 분석 도구에서는 Screenshot이라는 Plugin은 존재하지 않았고 Volatility에서 해당 Plugin을 이용하여 Screenshot을 추출 할 수 있었다. 메모리 포렌식을 공부하며 꽤 많은 Artifact를 얻어 낼 수 있었다는 점을 알고는 있었지만 사용자의 화면까지 얻어 낼 수 있으리라고 생각하지는 못했다.



Volatility Command Reference (Screenshot Plugin) :  https://goo.gl/ZyEfYz


Screenshot은 Volatility의 기본 Plugin으로 시스템에 해당하는 각 Desktop에 대해서 Screenshot을 추출하여 준다. 참고로 여기서 말하는 Desktop은 우리가 생각하는 바탕화면의 Desktop이 아니다. Windows에서 정의하는 Desktop의 의미에 대해서는 추후에 설명하도록 하겠다. Screenshot은 Wire-Frame Diagram의 형태로 Z-Order에 따라 각 Window의 제목이 붙여져있다. (Z-Order 역시 추후에 설명하겠다.)


해당 Plugin의 설명에서 보면 Wire-Frame Diagram 형태로 그려준다고 하였는데, 처음에는 그냥 사각형 형태로 그려주겠거니 하였지만 실제로 Wireframe이라는 키워드를 검색해보니 UI/UX 개발에서 많이 사용되는 단어라고 한다. 웹이나 어플리케이션 개발 프로젝트를 진행함에 있어 구조를 표현하기 위한 하나의 설계도라고 볼 수 있다. 다만 디자인적인 요소가 들어가기 전이라 선(Wire)과 틀(Frame)만을 이용해서 전반적인 시안을 잡는 것이다. 단순한 디자인으로 느껴질 수 있지만 디자인의 컨셉이나 고객의 요구사항, 컨텐츠들의 기능을 파악 할 수 있기 때문에 중요도가 높다고 한다. 요약하자면 개발에 앞서서 기능과 관련한 구성을 선과 틀만을 통해 그려 놓은 것이 Wire-Frame Diagram이라고 할 수 있겠다.



What are Wireframes?https://www.lucidchart.com/pages/wireframe



Volatility Screenshot Plugin 추출 결과


Volatility Screenshot Plugin 역시 Wiki에서 언급한대로 Wire-Frame과 유사한 형태로 Screenshot이 추출 되는 것을 알 수 있다. 실제 화면과 동일 하지도 않고, 모든 영역을 보여주는 것이 아니므로 아쉬운 점도 존재하지만 침해사고에 의해 손상된 PC나 Digital Forensic 조사가 필요한 PC가 어떠한 상태였는지 대략적으로 알 수 있기 때문에, Digital Forensic의 관점에서는 흥미롭고 중요한 Artifact가 될 수 있다고 생각한다.


2012년 10월 경쯤 Volatility Labs에 Volatility Screenshot Plugin에 대해서 소개가 되었고 소개에 대한 글은 아래와 같다. (발번역 주의) 또한 소개 글 중간중간에 필자가 공부한 개념이나 알아야 할 내용에 대해 첨부하였다.


MoVP 4.2 Taking Screenshots from Memory Dumps (Tuesday, October 2, 2012)


Open Memory Forensics Workshop 2012가 현재 진행 중이므로, 오늘의 MoVP 포스트는 짧고 간단할 것이다. 그러나 Volatility만의 흥미롭고 새로운 기능에 대해서 소개하고자한다. 



BDG's GDI Utilitieshttp://moyix.blogspot.kr/2010/07/gdi-utilities-taking-screenshots-of.html


Brendan Dolan Gavit가 Volatility를 위해 개발한 GDI (Graphic Devie Interfacte, Microsoft Windows에서 사용하는 Graphic API) 유틸리티 중 하나로 Screenshot Plugin이 포함되어 있다. 해당 Plugin은 Desktop에서의 프로그램 Window 의 위치에 따라 WireFrame을 그려준다. 실제 스크린 샷과 거리가 멀지만, 메모리 포렌식의 관점에서 보면 흥미로운 사실 임에는 틀림없다. 또한 Brendan Dolan Gavit은 Window 상호 작용으로 인한 물리적 메모리의 변화에 기반하여 VM Introspection과 PyGame을 활용하여 사용자의 입력을 추적하는 Plugin을 작성하였다. 이 두 가지의 전문적인 개발은 Volatility의 힘을 활용할 수 있는 방법을 보여준다.



A Virtual Machine Introspection Based Architecture for Intrusion Detection, Tal Garfinkel



Memory Forensics using Virtual Machine Introspection for Cloud Computing (Blackhat US 2016)


Screenshot Plugin 개발과 관련한 글을 보면 개발자는 Pygame과 Virtual Machine Introspection을 사용하였다고 하는데 Virtual Machine Introspection이 무엇일까




http://libvmi.com/docs/gcode-intro.html



Virtual Machine Introspection을 통한 실시간 Plugin 동작


Volatility 2.2의 Release를 위해, Brendan Dolan Gavit의 Screenshot Plugin을 최신의 핵심 코드에 기반 작업하였고, 모든 주요한 Windows 버전에 지원하도록 업데이트 하였다. 원래의 Plugin은 Window XP (x86)에서만 작동을 하여서, 여러 개의 Desktop에 대해 검사를 할 필요가 없었다. (Session 0 Isolation 적용 이전) 그러나 현재의 Plugin은 각각의 Desktop에 대해서 하나의 Screenshot을 내놓는다. (RDP 및 여러 로그온 사용자의 Desktop도 포함하여)


해당 문단을 보게 되면 XP에서는 여러 개의 Desktop에 대해서 검사를 할 필요가 없었지만, 이후 버전부터는 여러 개의 Desktop을 검사해야 하므로 개선을 하였다고 언급 되었다. 여기서 Session 0 Isolation이라는 개념이 등장한다. Session 0 Isolation을 이해하기에 앞서 Windows의 Session, Window Station과 Desktop에 대해 깊이 이해해보도록 하자.



Understanding Windows at a deeper level Sessions, Window Stations, Desktops : https://goo.gl/7kwL4P




Screenshots Plugin


Plugin의 내부 동작 과정은 매우 간단하다. MoVP 2.2 Malware In Your Windows에서 설명한 것과 같이 각각 Desktop 속의 창 마다의 Z-Order (윈도우 창의 앞 뒤 깊이) 정보를 가져와서 나열한다.


MoVp 2.2 설명, Z-Order의 개념 


Z-Order : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms633545(v=vs.85).aspx




tagWND 구조체에서 각 창의 왼쪽, 오른쪽, 위쪽, 아래쪽 좌표를 가져오고 이를 PIL (Python Imaging Library)와 활용하여 사각형을 그린다.


tagWND 구조체, PIL 활용 방법 설명


PIL : http://www.pythonware.com/products/pil/


이러한 원리로 개발 된 Screenshot Plugin이 마지막으로 Commit 된지 4년정도가 넘었는데 Windows가 10 버전까지 업그레이드 된 지금은 이 Plugin이 정상적으로 잘 동작될지 궁금하여 한 번 시험해보기로 하였다. 처음에는 Windows 10을 가상 머신에 설치한 관계로 .VMEM 파일을 기반으로 Volatility를 실행하였다. Volatility에서 메모리 덤프 파일의 Profile을 탐지해주는 Imageinfo를 통해서 Windows 10 64bit의 운영체제에서 덤프한 메모리 덤프 파일인 것을 인식하는데에는 성공하였다. 그러나 Suggested Profile을 기준으로 다양한 Plugin을 사용해보았을 시 문자열이 누락되거나 일부 정보가 정확하게 출력되지 않는 현상을 경험하게 되었다.



Volatility imageinfo 명령 실행 결과



VMEM 파일을 이용한 Process List 출력


이러한 이유로 다른 방식의 메모리 덤프를 진행하게 되었다. 적절하지 못한 방법일 수 있으나 Plugin 동작 유무를 테스트하기 위한 Sample File이므로 Windows 10 64bit 운영체제가 동작하고 있는 환경에 FTK Imager Lite 3.1.1을 설치하여 최대한 환경에 영향을 주지 않도록 메모리 덤프를 진행하였다. 대략 2GB 정도의 메모리 덤프 파일을 획득할 수 있었으며, Screenshot Plugin의 정확한 동작 유무를 알기 위해 다양한 창을 띄운 상태에서 덤프를 진행하였다.



Windows 10 (Build 15063.0) Memory Dump



Volatility 2.6 Windows Profilehttps://github.com/volatilityfoundation/volatility/wiki/2.6-Win-Profiles


메모리 덤프를 성공적으로 진행 한 뒤에는 win10.mem이라는 파일을 획득 할 수 있었다. 해당 파일을 기반으로 Volatility를 실행한 결과, 이전에 VMEM을 사용한 결과보다 훨씬 다양한 Profile을 제안 받을 수 있었다. Windows 10 Profile 같은 경우에 Volatility 2.6이 Release 되면서 포함되게 되었는데 아직 업데이트가 활발하게 진행되고 있는 OS인만큼 Profile이 다양하고 약간의 오류가 존재하는 것 같다. Volatility의 다양한 Plugin을 동작시킴에 있어 최대한 오류를 줄이기 위해서 가장 최근의 (2017. 04. 04) Profile인 Win10x64_15063을 사용하였다.



MEM 파일을 이용한 Process List 출력


그 결과, 이전과 달리 문자열이나 정보의 누락 없이 정상적으로 Plugin이 동작함을 볼 수 있다. 이어서 Screenshot Plugin도 동작시켜 본 결과, 파일의 쓰기 권한 때문에 sudo를 사용해야한다는 점 빼고는 무리 없이 진행이 되었다. 그러나 Screenshot이 추출되어 보관된 폴더를 조회한 결과, 정상적인 Screenshot를 발견할 수 없었다. 대부분 작고 하얀 네모만 존재할 뿐 어디에서도 Desktop의 화면이라고 볼 수 있는 사진 파일을 찾기 힘들었다.



기존의 Screenshot Plugin 테스트 결과


이러한 Screenshot Plugin의 오류는 여러 경우를 생각해 볼 수 있지만, Screenshot에 해당하는 이미지가 생성된다는 점에서 PIL 라이브러리는 정상적으로 동작함을 알 수 있으며, Screenshot의 파일 명에서 여러 Session과 Service, Station의 이름이 기록됨을 보아 Session의 유무 정도는 정상적으로 판단하고 불러오는 것을 알 수 있다. 그렇다면 PIL 라이브러리가 그림을 그리기 이전에 필요한 데이터 값들이 정상적이지 못하다는 것을 추측 해볼 수 있으며, Session과 Station에 대한 정보는 확인하고 불러 올 수 있되 그것을 가공하거나 분석하는 과정이 포함된 Plugin이 Windows 10에서 오류를 일으키는 것을 추측해 볼 수 있다. 오류에 대한 정확한 분석을 위해서는 Volatility Screenshot Plugin을 구성하는 모듈이나 여러 기능이 포함된 Source Code의 분석이 필요하다.




linux architecture (gnome) : https://askubuntu.com/questions/21347/is-there-a-schematic-overview-of-ubuntus-architecture

V-Type, Volshell 사용법, 구조체 추적, 모듈 마다의 연결도

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday