Volatility

Digital Forensic Wikipedia
둘러보기로 가기 검색하러 가기

소개[편집]

[그림 1] Volatility 실행화면

Volatility는 Volatile Systems에서 만든 CLI 기반 메모리 분석 도구이다. 오픈소스이며 웹페이지(https://code.google.com/p/volatility/downloads/list) 에서 Volatility의 각 버전별로 다운받을 수 있다. Volatility는 Windows, Linux, Mac OS에서 실행할 수 있으며 플러그인을 자신이 직접 만들어 사용하거나 다른 사용자가 직접 만든 플러그인을 사용할 수도 있다. 메모리 덤프 파일(img, raw, dmp), 하이버네이션 파일(hiber), 가상 머신 메모리(vmem)를 분석할 수 있으며, 실행 중이거나 종료 또는 루트킷으로 은닉된 프로세스의 오프셋, SID(보안 식별자), PID, 스레드 수, 핸들 수, 시작 및 종료시간도 알 수 있다.
Volatility를 이용하여 획득할 수 있는 프로세스 관련 정보들은 다음과 같다. 트리 형태의 프로세스 리스트, 프로세스가 로드한 DLL과 핸들, 프로세스 환경변수와 Import, Export하는 함수 등을 확인할 수 있다. 네트워크 정보도 확인할 수 있으며 시스템에서 로드했던 드라이버 목록도 출력할 수 있다. 아래의 [그림 1]은 Volatility의 실행화면이다.

사용법[편집]

[그림 2] Volatility imageinfo 플러그인 실행결과
[그림 3] Volatility psxview 플러그인 실행결과

Volatility 패키지 설치 후 추가적으로 암호 알고리즘 모듈인 pycrypto 모듈을 설치해야 Volatility가 정상적으로 작동한다. 파이썬 모듈인 pycypto는 https://pypi.python.org/pypi/pycrypto 에서 다운로드 할 수 있다. 또한 한글과 유니코드를 지원하기 위해 기본 문자셋을 ascii에서 UTF-8로 변환해 주어야 한다. 문자셋을 변경하는 방법은 파이썬 설치경로 하위의 Lib 디렉터리에 존재하는 site.py의 소스코드를 수정해야 한다. site.py의 setencoding 함수 첫 번째 줄(479번째 줄)을 encoding = "ascii"에서 encoding = "UTF-8"로 바꿈으로써 문자셋을 변환할 수 있다. Volatiliy는 플러그인 기반으로 동작을 하며 패키지에 포함되어 있는 기본 플러그인은 약 90여개 정도이다. 다음 [표 1]은 Volatility의 기본 옵션에 대한 표이다.

[표 1] Volatility의 기본 옵션
옵션 설명
-h, --help 모든 옵션의 도움말과 해당 옵션의 디폴트 값을 출력한다.
--conf-file 설정파일의 경로를 설정한다.
-d, --debug 볼라틸리티를 디버그한다.
--plugins 플러그인이 위치할 폴더를 설정한다. 세미콜론을 이용하여 추가 디렉터리 포함이 가능하다.
--info 지원 운영체제나 각 플러그인의 기본 정보를 출력한다.
--cache-directory 캐시 파일이 저장된 경로를 설정한다.
--cache Directory Table Base(DTB)[1], KDBG[2], KPCR[3]의 주소 등, 여러 변수를 저장하여 추후에 사용할 수 있도록 한다.
--tz 타임존을 설정한다. (유닉스 계열에서만 가능)
-f, --filename 메모리 이미지의 경로를 설정한다.
--profile 운영체제 및 버전을 설정한다.
-l, --location 메모리 이미지의 URN 경로를 설정한다.
-w, --write 쓰기모드를 활성화 한다.
--use-old-as 레거시[4] 주소 공간을 쓰도록 설정한다.
--dtb DTB 주소를 설정한다.
--output 출력 파일의 포맷을 설정한다.
--output-file 출력 파일의 경로를 설정한다.
-v, --verbose 진행상황을 출력한다.
-g, --kdbg KDBG의 주소값을 설정한다.
-k, --kpcr KPCR의 주소값을 설정한다.

[표 1]의 --info 옵션은 “vol.py —info”의 형식으로 사용하면 Volatility가 지원하는 윈도우 버전과 메모리 주소 공간 종류, 플러그인을 볼 수 있다. -h 옵션은 “vol.py –h”, “vol.py [플러그인] -h”와 같은 형식으로 사용할 수 있으며 각각 volatility의 도움말과 해당 플러그인에 대한 도움말을 확인할 수 있다. Volatility의 명령어는 –f 옵션을 사용하여 이미지의 경로를 입력하고 사용할 플러그인을 추가로 선택하여 입력하는 것이 기본적인 사용법이다. [표 2]은 Volatility의 기본 명령어 형식에 관한 표이다.

[표 2] Volatility 기본 명령어 형식
명령어
vol.py –f [이미지 경로] [플러그인] 혹은 vol.py –f [이미지 경로] --profile=[운영체제] [플러그인]

--profile에 해당하는 운영체제 정보는 —info옵션을 사용하여 지원되는 운영체제 중 메모리 이미지에 해당하는 적절한 운영체제를 선택하여 입력해야 한다. Volatility를 사용할 때 옵션의 입력 순서는 결과에 영향을 미치지 않으므로 원하는 순서로 입력하면 된다. 다음 [표 3]은 imageinfo 플러그인 이용하여 이미지 파일로 부터 알 수 있는 시스템 정보를 출력하는 예제이다.
[그림 2]은 imageinfo 플러그인 실행결과이다.

[표 3] Volatility imageinfo 플러그인 예제
명령어
vol.py -f memory.dd imageinfo

imageinfo 플러그인을 이용하여 예상 운영체제, 메모리 주소 공간, DTB와 KDBG, KCPR의 주소 등을 알 수 있다. 다음 [표 4]는 timeliner 플러그인을 이용하여 아티팩트를 시간과 함께 csv 파일로 출력하는 예제이다.

[표 4] Volatility timeliner 플러그인 예제
명령어
vol.py -f memory.dd timeliner —output-file result.csv

timeliner 플러그인이 출력하는 아티팩트는 [표 5]와 같다.

[표 5] Volatility timeliner 플러그인의 출력 아티팩트
아티팩트 종류 관련 플러그인
프로세스 pslist, psscan, pstree, procmemdump
쓰레드 thrdscan
네트워크, 소켓 netscan(Win7), connections(XP), connscan(XP)
레지스트리 hivelist, printkey, userassist
실행파일(exe) procexedump, handles
DLL 및 핸들 dlllist, dlldump
드라이버 driverscan, driverirp, moddump

각 아티팩트의 관련 플러그인을 사용하여 timeliner 플러그인 보다 더 세밀한 정보를 얻을 수 있다. 다음 [표 6]은 루트킷을 찾는데 이용할 수 있는 플러그인 목록이다.

[표 6] Volatility 루트킷 관련 플러그인
플러그인 이름 설명
psxview pslist와 psscan으로 숨겨진 프로세스를 찾는다.
driverscan 메모리에서 드라이버 오브젝트를 스캔한다.
apihooks API/DLL 함수의 후크를 찾는다.
ssdt System Service Descriptor Table(SSDT)[5]에서 후크를 찾는다.
driverirp I/O Request Packet(IRP)[6] 후크를 찾는다.
idt Interrupt Descriptor Table(IDT)[7]를 출력한다.

psxview 플러그인은 pslist와 psscan을 교차하여 숨겨진 프로세스를 찾는 역할을 한다. pslist는 각 프로세스가 더블 링크드 리스트로 연결되어 있는 것을 이용해서 프로세스 목록을 출력하지만 psscan은 메모리 이미지의 처음부터 끝까지 스캔을 하여 프로세스 목록을 출력하는 형식이다. 그러므로 psscan에서는 확인이 가능하지만 pslist에서 확인이 안되는 프로세스는 악성 프로세스일 가능성이 높다. [그림 3]은 psxview를 이용하여 시스템의 프로세스를 출력한 결과이다.
pslist는 false이지만 psscan 결과 true인 프로세스는 SafetyNutManage와 vmacthlp.exe가 있다. 이 중에서 SafetyNutManage는 실제로 해외의 악성 애드웨어이다. psxview를 이용하여 확인한 프로세스를 덤프하는 방법은 procexedump 플러그인을 통해 할 수 있다. [표 7]은 procexedump의 기본 명령어 형식이다.

[표 7] Volatility procexedump 플러그인 명령어 형식
명령어
vol.py –f [이미지 경로] procexedump –D [저장경로] -p [PID]

procexedump 플러그인을 사용하여 추출된 실행파일의 파일명은 “executable.[pid].exe” 형태를 가지게 된다.

도구기능[편집]

플러그인 방식의 Volatility는 많은 플러그인을 가지고 있고 사용자가 직접 플러그인을 작성하여 사용할 수 있어서 확장성이 매우 좋다. 하지만 각 플러그인이 모든 운영체제를 지원하는 것은 아니므로 플러그인을 사용하기 전에 플러그인 도움말을 출력하여 지원하는 운영체제를 확인하거나 https://code.google.com/p/volatility/wiki/FeaturesByPlugin 에서 확인한 뒤 사용하는 것이 좋다. 메모리 이미지의 운영체제를 사용할 플러그인이 지원한다면 각 플러그인이 정상 작동한다. [표 8]은 플러그인을 기능에 따라 분류한 표이다.

[표 8] Volatility 기능에 따른 플러그인의 분류
기능 분류 관련 플러그인
이미지 정보 imageinfo, kdbgscan, kpcrscan
프로세스, DLL pslist, pstree, psscan, dlllist, dlldump, handles, getsids, verinfo, enumfunc
프로세스 메모리 memmap, memdump, procmemdump, procexedump, vadwalk, vadtree, vadinfo, vaddump
커널 메모리, 오브젝트 connections, connscan, sockets, sockscan, netscan
레지스트리 hivescan, hivelist, printkey, hivedump, hashdump, lsadump, userassist
크래쉬 덤프, 하이버네이션 변환 crashinfo, hibinfo, imagecopy
멀웨어, 루트킷 malfind, svcscan, ldrmodules, impscan, apihooks, idt, gdt, threads, callbacks, driverirp, devicetree, psxview, ssdt_ex, timers
기타 strings, volshell, bioskbd, inspectcache, patcher, testsuite


제한사항[편집]

Volatility는 Windows 8을 지원하지 않으므로 Windows 8의 메모리를 분석하는데 어려움이 있다. 리눅스의 경우 2.6.11 부터 3.5 커널 버전까지 지원한다. Mac OS의 경우 10.5 버전부터 10.8.3 버전까지 분석을 지원한다. Volatility는 Python 기반이기 때문에 사용자가 윈도우 운영체제를 사용 시 파이썬을 필수적으로 설치해야 하며, 각 플러그인이 특정 모듈을 사용할 시에 해당 모듈을 일일이 설치해야 하는 번거로움이 있다. GUI가 아니므로 방대한 분석결과의 경우 분석하기 어려우며 각 모듈마다 시각화 도구를 추가적으로 설치해야 한다. 여러 플러그인의 실행결과를 조합하여 분석가의 비교 검토가 필요하므로 분석 시 많은 시간이 소요된다.

수사 활용 방안[편집]

Volatility의 확장성을 이용하여 메모리 이미지 내의 정보로 원격 데스크톱 사용흔적을 찾거나 패스워드를 찾아내는 등의 사용자 플러그인을 만들어 수사에 큰 도움이 될 수 있다. 기본적으로 많은 플러그인을 가지고 있는 만큼 메모리 이미지를 분석 의도에 맞추어 세밀하게 분석할 수 있는 것이 큰 장점이다. 또한 사용방법이 간단하여 비전문가도 비교적 쉽게 사용할 수 있다.

주석[편집]

  1. Directory Table Base(DTB): 가상주소를 물리주소로 변환하기 위한 디렉터리 테이블의 주소 값
  2. KDBG: 운영체제의 정보를 가지고 있는 구조체
  3. KPCR: CPU의 정보를 가지고 있는 구조체
  4. 레거시(Legacy) 모드 : 64 비트 주소체계가 나오기 이전 하위 아키텍처와 호환을 위해 만들어진 주소 공간 모드
  5. System Service Descriptor Table(SSDT): 시스템에서 이용가능한 모든 시스템 서비스의 주소를 가지고 있다.
  6. I/O Request Packet(IRP): 장치의 입출력 요청을 위한 패킷
  7. Interrupt Descriptor Table(IDT): 인터럽트가 발생했을 때 수행해야 할 핸들러의 주소가 저장된 테이블