0x01 malware forensics2009. 2. 25. 11:54

 
1. Building Your Live Response Toolkit
 
라이브 시스템 분석시에는 잘알려진 신뢰할 수 있는 툴들을 사용해서 데이터를 수집해야 한다.
분석 대상 시스템의 파일들을 공격자가 변경했을 가능성이 있으니 대상 시스템의 원본 프로그램에 의지하지 말고 자신만의 CD를 만들고 그 툴들을 통해서 데이터를 수집하는 것이 좋다. 파일(또는 툴)을 확인하는데 Dependency Walker(depends.com)나 PEView를 사용하는 것이 좋다.
 
Dependency Walker : http://www.dependencywalker.com/
PEView : http://www.magma.ca/~wjr/
 
침해 대응에 사용되는 많은 툴들은 공격자들에 의해서도 사용되기 때문에 구분 지을 수 있어야 한다. 예를 들면 파일명을 바꾼다든지 파일명 끝에 자신의(you!!) 이니셜 같은 것을 붙여도 된다. 또는 Hex 에디터로 바이너리를 열어서 특정 문자열을 넣어 두어서 공격자가 사용하는 바이너리와 구분지으면 된다. Hex 에디터로 바이너리를 열어서 PE 헤더 바로 뒤쪽의 오프셋 0x600 만큼 떨어진 위치에 구별할 수 있는 약간의 바이트를 추가한다. 그리고 정확한 식별을 위해서 해쉬값을 생성해 놓는다.
 
PE 헤더 다음에는 Section Table이 나오는데 cmd.exe는 Section Table의 위치가 0x1d0이다.
0x1d0 + 0x600 = 0x7d0의 내용을 33 31 33 33 37 (31337)로 변경 후 다른 이름으로 저장하고 실행 잘 되는지 확인하면 된다.

<원본>



<수정본>


<md5 해쉬값 비교> 


But!! 이런 마킹이 어떤 경우에는 잘 동작하지 않을 수 있다. 특히 상용 소프트웨어에서는...
이런 신뢰할 수 있는 툴킷을 만들면 보통 CD에 담아서 사용하는데 그것보다 수집한 데이터를 저장하기 위해서 thumb drive(손가락 크기만한 저장매체)나 외장 하드를 더 선호한다. 예를 들면 고용량 thumb drive(4G ~ 8G)나 외장 하드는 전체 시스템 메모리 덤프 이미지와 같은 큰 데이터까지 저장할 수 있다.

결국 로컬이냐 원격이냐 하는 문제점에 직면하게 되는데
로컬은 대상 시스템의 미디어에 접근해서 수집된 결과들을 저장할 수 있다는 것을 의미하고
원격은 일반적으로 netcat이나 cryptcat을 통해 연결해서 수집된 결과들을 수집 서버에 전송한다는 것을 의미한다.

원격에서 데이터를 수집하는 것은 상호작용을 줄일 수 있지만 네트워크를 통해서 연결해야 한다는 단점이 있다.



대상시스템                                       ----->       수집시스템(172.16.131.32)
pv.exe -e | nc 172.16.131.32 13579                  nc -l -p 13579 > pv-e-20090108-host1.txt

 
어떤 경우에는 대상 네트워크가 엄격한 방화벽을 가지고 있는데 이런 경우 원격 수집 저장소에 연결하는 것이 까다롭다. 게다가 대상 시스템의 물리적 메모리를 수집하는 동안 몇 기가 바이트의 데이터가 생길 수도 있다. 이런 경우 가장 좋은 방법은 자신이 만든 Live Response Toolkit을 다루기 쉽게 만드는 것이다.(어쩌라는거냐 -_-)

Chapter 1.에서는 계속 악성코드 분석에 대한 시나리오를 통해 여러가지 툴들에 대해서 논의할 것이고 이 장이 끝나는 시점에서 우리는 Incident Response Tools Suite를 찾을 수 있을 것이다. 결국 이 책에서 언급하는 툴들을 한번씩 다 써보고 자신에게 잘 맞는 툴을 선택해서 툴킷을 만들어야 한다.
 
여담) 필자는 IRTK(Incident Response ToolKit)이라는 이름으로 만들 생각이다. 물론 USB에...
1기가 USB는 두개 있는데 이건 좀 부족할 듯 하고 요즘 USB가 똥값이니 8기가짜리 하나 사야겠다. ㅎㅎ
 

1.1 Testing and Validating Your Tools

Winalysis : google에서 검색하면 많이 나옴

  - 시스템 설정 snapshot : file, registry, users, local and global group, rights policy, services, scheduler, volumes, shares

InstallSpy : http://www.2brightsparks.com/freeware/freeware-hub.html
  - 시스템 무결성 모니터링 :  프로그램이 설치되거나 실행될 때 발생하는 레지스트리의 변화나 파일 시스템, 레코드의 변화를 모니터링

좀 더 자세한 시스템의 변화를 보고자 한다면
FileMon : http://technet.microsoft.com/en-us/sysinternals/bb896642.aspx
RegMon : http://technet.microsoft.com/en-us/sysinternals/bb896652.aspx
Process Monitor : http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx
* 모두 SysinternalsSuite에 포함되어 있음(툴킷에 기본적으로 들어가야할 프로그램이라 생각된다)

그외 System Monitoring Tools
Regshot : http://sourceforge.net/projects/regshot
InCtrl5 : http://www.pcmag.com/article2/0,1759,25126,00.asp
InstallWatch : http://www.epsilonsquared.com/installwatch.htm
InstallSpy : http://www.2brightsparks.com/freeware/freeware-hub.html
FingerPrint v.2.1.3 : http://www.2brightsparks.com/freeware/freeware-hub.html
PCLogger : http://www.soft-trek.com.au/prjPCLogger.asp
GFI LANguard System Integrity Monitor : http://kbase.gfi.com/showarticle.asp?id=KBID001573
http://www.net-security.org/software.php?id=483
DirMonitor : http://www.evarest.be/DirMonitor/index.html
Microsoft Installation Monitor : http://www.microsoft.com/downloads/details.aspx?FamilyID=48427471-0901-4505-b715-cc3b3ead9ad6&DisplayLang=en
Microsoft Change Analysis Diagnostic Tool : http://support.microsoft.com/kb/924732

위 프로그램들을 모두 다 사용할 필요는 없다. 대신 한번씩 사용해보고 자신에게 가장 잘 맞는 프로그램을 선택하는 것이 좋다.
분석자가 원하는 기능을 가지고 있고 분석자가 사용하기 편한 프로그램을 선택하면 된다.


2. Volatile Data Collection Methodology

 - 감염된 머신에서는 Incident Response Toolkit에 있는 신뢰할 수 있는 명령어 쉘을 실행
 - 시스템 날짜와 시간을 기록하고 믿을 수 있는 시간과 비교
 - 물리적 메모리의 내용 획득
 - 호스트네임, 사용자 및 운영체제 세부 정보 수집
 - 시스템 상태와 환경 세부 정보 수집
 - 시스템에 로그인한 사용자 확인
 - 네트워크 연결과 열려진 포트 검사
 - DNS 쿼리와 연결된 호스트네임 검사
 - 실행중인 프로세스 검사
 - 열려진 포트와 연관된 프로세스와 프로그램
 - 서비스와 드라이버 검사
 - 열려진 파일 검사
 - 명령어 히스토리 검사
 - 매핑된 드라이브와 공유 확인
 - 권한이 없는 계정, 그룹, 공유 그리고 다른 시스템 리소스와 윈도우 "net" 명령어를 사용하는 설정 확인
 - 스케쥴 작업 결정
 - 클립보드 내용 수집
 - 감사 정책 결정


2.1 Preservation of Volatile Data

휘발성 데이터는 실행중인 프로세스, 열려진 파일, 네트워크 연결 정보들이 있다. 어떤 경우에는 비휘발성 데이터를 분석 대상 시스템에서 가져와야 하는 경우도 있고 전체 디스크에 대한 복사본(forensic duplicate)를 만들어야 한다. 그리고 이렇게 수집된 데이터들은 모두 MD5 해쉬값을만들고 다른 속성들이 문서화되야 한다. 분석자의 실수를 줄이기 위해서 휘발성 데이터를 수집하는 절차를 자동화하는 것도 좋다.(즉, 스크립트를 작성해서 돌려라~)

pslist를 통해서 현재 실행중인 프로세스를 확인할 수 있다.



간혹 rootkit이 설치된 경우에는 프로세스가 숨겨져서 프로세스 목록에 나오지 않는 경우도 있다. 이러한 이유때문에 메모리 전체를 덤프 뜨는 것을 고려해봐야 한다.
물리적 메모리을 캡쳐하는 가장 간단한 방법은 dd 명령을 이용하는 것이다.


dd.exe if=\\.\\PhysicalMemory of="E:\images\memoryimage.dd" conv=sync,noerror --md5sum --verifymd5 --md5out="E:\images\memoryimage.dd.md5" --log="E:\images\memoryimage.dd.log"


이 명령과 옵션은 Windows Server 2003 SP1이나 그 후 버전에서는 동작하지 않는다. GUI 환경에서 메모리를 캡쳐하고자 한다면 HELIX 그래픽 유저 인터페이스를 사용하면 된다.
http://helix.e-fense.com/Download.php

현재는 HELIX 3 버전이고 이메일 주소만 정확히 적으면 다운로드 링크를 받을 수 있고 또는 아래 링크에서도 받을 수 있다.
http://ftp.ntua.gr/pub/linux/helix/Helix2008R1.iso


HELIX와 비슷한 프로그램으로 nigilant32라는 프로그램이 있다.
http://www.agilerm.net/publications_4.html

상용 원격 포렌식 툴은 다음과 같은 제품들이 있다. 모두 전체 메모리를 캡쳐할 수 있다.
ProDiscoverIR - http://www.techpathways.com/prodiscoverir.htm
OnlineDFS - http://www.cyberstc.com/
LiveWire - http://www.wetstonetech.com/
 
책에서는 숨겨진 프로세스나 파일, 레지스트리, 네트워크 연결 정보들을 분석하기 위해서 메모리 전체를 덤프하는 방법만 언급하고 있지만 메모리 전체를 덤프한다는 것이 그리 쉬운 일은 아니다. 게다가 원격에서 점검하고 악성코드 바이너리 파일을 획득해야 한다면 더더욱 어려울 것이다. 숨겨진 프로세스나 파일, 레지스트리, 네트워크 연결 정보등은 개인적으로 IceSword나  gmer를 이용해서 분석하는 것을 추천한다.
 
둘다 프리웨어이고 상당히 강력한 기능들을 가지고 있어 필자도 자주 사용하고 있다.
IceSword : http://pjf.blogcn.com/index.shtml
gmer : http://www.gmer.net/index.php


2.2 Collecting Subject System Details

분석 대상 시스템의 세부적인 항목들을 먼저 수집하는데 이런 데이터들은 차후 분석 단계에서 유용하게 사용될 수 있기 때문이다.



System Date and Time
날짜와 시간은 분석에 상당히 중요한 역할을 한다. 날짜와 시간을 확인하는 방법은 여러가지가 있다.



now 명령은 Windows Server 2003 Resource Kit Tools에서 찾을 수도 있고 다음 URL에서 다운 받아서 사용할 수도 있다. 이 명령은 time 명령과 date 명령의 결과를 모두 보여준다. time이나 date 명령을 쓰느니 차라리 now를 쓰는게 더 낫지 않을까..
http://support.microsoft.com/kb/927229
http://download.microsoft.com/download/win2000platform/now/1.00.0.1/nt5/en-us/now_setup.exe


System Identifiers
시스템을 식별하기 위해 호스트네임, 현재 사용자 그리고 운영체제 버전을 확인한다.



ipconfig /all 명령을 실행하면 IP주소외 여러가지 정보를 확인할 수 있는데 이와 유사한 기능을 하는 DiamondCS의 iplist도 있다.
그런데! 현재는 없는 듯 하다. 대안으로 DiamonCS 사이트에서 제공하는 유용한 Freeware가 있는데 특히 콘솔툴킷을 사용하면 여러가지 정보들을 획득할 수 있을 것이다.
http://www.diamondcs.com.au/freeutilities.php
http://www.diamondcs.com.au/consoletools.php (콘솔툴킷)


Network Configuration
합법적이지 않은 VPN 아답터에 대한 설정도 확인해봐야 한다. 복잡한 악성코드들은 원격 C&C 노드로 연결하는 경우가 있다. 이런 VPN을 통한 통신 내용들은 IDS나 모니터링 툴에 의해 탐지되는 것이 어렵기 때문에 주의를 요한다.
그리고 분석 대상 시스템의 네트워크 카드가 promiscuous 모드로 동작하고 있는지 확인해야 한다. 즉, 스니퍼가 실행중인지 확인해야 한다는 것이다.

promiscdetect나 마이크로소프트사의 promqry를 활용하여 분석 대상 시스템에서 스니퍼가 실행중인지 확인할 수 있다.
http://www.ntsecurity.nu/toolbox/promiscdetect/
http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=4DF8EB90-83BE-45AA-BB7D-1327D06FE6F5&displaylang=en

테스트를 위해 Cain을 실행한 후 promiscdetect와 promqry를 실행한 화면이다.






Enabled Protocols
현재 시스템에서 사용중인 프로토콜을 확인한다. URLProtocolView을 사용해서 확인할 수 있다.
http://www.nirsoft.net/utils/url_protocol_view.html



결과는 파일로 저장이 가능하다. 아래 예제를 하나 보도록 하자.
==================================================
URL Name          : irc
Status            : Enabled
Type              : Executable
Description       : URL:IRC Protocol
Command-Line      : "C:\WINDOWS\temp\spoolsv\spoolsv.exe" -noconnect
Product Name      : mIRC
Company Name      : mIRC Co. Ltd.
Modified Time     : 2008-11-06 오전 8:01:54
==================================================
command-line 명령은 spoolsv.exe인데 서비스는 IRC로 나오고 있다. 즉, 프로세스를 확인하면 spoolsv라는 프로세스로 보이겠지만 실제로는 IRC로 사용되고 있다는 것이다. spoolsv.exe가 변조된 경우도 있겠지만 위 예제의 경우 spoolsv.exe가 다른 경로에 새롭게 생성되어 실행되고 있다는 것을 확인할 수 있다.


System Uptime
시스템이 살아있었던 시간을 확인한다. DiamondCS console 툴킷 중 uptime과 PsTools 패키지에 있는 psuptime으로 확인한다.




System Environment
시스템의 기본 정보를 확인한다. 운영체제 버전이나 패치레벨, 하드웨어 정보와 같은 기초 정보들을 수집한다.

psinfo는 SysInternals 툴킷에 포함되어 있다.



systeminfo는 윈도우에서 기본적으로 제공하는 명령으로 운영체제 정보와 하드웨어 정보 및 Hotfix에 대한 정보까지 수집할 수 있다.

dumpwin은 psinfo나 systeminfo보다 더 많은 정보들을 제공한다. 서비스라던지, 사용자/그룹 계정, 계정 정책, ACL, 실행중인 프로세스 등 더 많은 정보를 수집하는 것이 가능하다.
http://www.niiconsulting.com/innovation/tools.html




2.3 Identifying Users Logged into the System

시스템에 로그인한 사용자를 가려내는 이유는 감염 가능성이 있는 시스템으로 로그인 하려는 잠재적인 침입자를 찾아내고 추가적인 감염 가능성이 존재하는 시스템을 확인하기 위해서이다. 그리고 내부에서 발생하는 악성코드 감염 사고에 대한 통찰력(insight)을 제공하기도 한다.


분석자는 다음과 같은 정보를 획득해야 한다.
  - 사용자 이름
  - 연결 지점(로컬인지 원격인지)
  - 로그인 세션 기간
  - 사용자가 접근하고 있는 공유, 파일 또는 다른 시스템 자원
  - Processed Associated with the user(사용자와 연관된 처리??)
  - 사용자에 의해 발생하는 네트워크 행동


psloggedon
pslooggedon은 PsTools에 포함된 프로그램이다.




quser(query user utility)
quser는 마이크로소프트에서 제공하는 프로그램으로 로그인 사용자, 로그온 시간과 날짜 그리고 세션의 타입과 상태 등의 정보를 표시해 준다. quser는 c:\windows\system32\dllcache에 위치하고 있다.




netusers
http://www.systemtools.com/free.htm에 가면 구할 수 있다. 그 외에 여러가지 프리웨어들이 많으니 한번씩 사용해 보시길..



netusers 명령은 /history 스위치를 사용하면 각 사용자들이 가장 마지막에 로그인한 날짜와 시간을 보여준다. 리눅스의 lastlog와 비슷한 역할을 하는 명령이다.


logonsessions
logonsessions는 PsTools와 SysInternals Suite에 포함된 명령이다. 이 명령은 -p 옵션을 사용하면 해당 로그온 세션이 실행 중인 프로세스 목록을 같이 보여준다.



 

2.4 Inspect Network Connections and Activity

네트워크 연결 검사, 최근 DNS 질의, NetBIOS 이름 테이블, ARP 캐시, 내부 라우팅 테이블, 열려진 포트와 연관된 프로세스 등의 정보를 확인한다.


2.5 Current and Recent Network Connections

분석자가 현재와 최근 네트워크 연결을 확인해야 하는 중요한 이유가 두가지 있다.

첫번째는 공격자가 분석 대상 시스템에 연결되었는지 확인하고 시스템을 역으로 감시하기 위해서이다. 만약 공격자가 공격 대상 시스템의 취약점을 제거하려고 하는 것을 눈치챈다면 로그와 같은 증거들을 제거함으로써 그들의 흔적을 지우거나 시스템에 더 큰 손상을 입힐 것이다. 즉, 공격자가 어디에서 연결되었는지 확인만 하되 정확한 데이터 수집이 이루어지기 전까지는 섣불리 행동해서는 안된다는 것이다.

두번째 이유는 분석 대상 시스템의 악성코드가 봇넷 C&C에 연결하기 위해 공격자에게 어떤 신호를 보내는지 확인하기 위해서이다. 만약 이런 정보를 알 수 있다면 분석자는 훨씬 더 수월하게 분석을 할 수 있을 것이고 추후 발생할 수 있는 유사한 공격에 대응하는데 도움이 될 것이기 때문이다.
실제로 봇이나 웜, 트로이목마 같은 악성코드들은 내장된 명령이 존재한다. 이런 명령들은 도메인 네임이나 URL, IP 주소와 같은 정보를 통해 공격자에게 연결을 하게 되고 공격자로부터 명령을 기다리게 된다.


분석자는 다음과 같은 정보들을 수집해야 한다.

  - 활성화된 네트워크 연결
  - 분석 대상 시스템에서 발생한 DNS 질의
  - ARP 캐시
  - NetBIOS 이름 테이블 캐시
  - 내부 라우팅 테이블 점검


Netstat

netstat는 너무 잘 알려진 명령이라 별다른 설명은 하지 않겠다. 여기서는 옵션에 대해서만 이야기하도록 하자.
보통 -an이라는 옵션을 많이 사용하는데 -ano라는 옵션을 쓸 것을 권장한다. -ano 옵션은 현재 네트워크 연결 상태와 해당 연결을 실행하고 있는 프로세스의 PID를 보여준다. PID를 보여준다는 것은 분석자가 좀 더 쉽게 공격자와 연결된 프로세스를 찾을 수 있게 해준다. 물론 PID를 확인한 후에는 process explorer와 같은 프로그램을 통해서 해당 프로세스를 확인해야 할 것이다.



위 화면에서는 현재 로컬 시스템(192.168.245.10)이 192.168.245.1의 9999포트로 연결한 것을 볼 수 있는데 이 연결을 실행하고 있는 프로세스의 PID는 1032번이라는 것이다. 즉, PID 1032번을 확인해서 어떤 프로그램이 실행되고 있는지 확인하면 된다.


DNS Queries from the Host System
많은 악성코드들은 하드 코딩된(바이너리 파일에 이미 정의된) 도메인 네임을 가지고 있다. 이것은 감염 후 공격자에게 연결하기 위함인데 IP를 사용하면 바뀔 가능성이 있기 때문에 도메인을 주로 사용한다. 분석 대상 시스템에서 최근에 질의한 DNS 쿼리는 ipconfig /displaydns 명령을 통해서 확인 할 수 있다.




NetBIOS Connections
W32/Deborm, worm.gen과 같은 웜들은 윈도우 파일 공유를 통해서 전하된다. 그들은 다른 시스템의 접근 가능한 파일 공유에 자기 스스로를 복제하고 네트워크 연결을 성립시키고 대상 시스템에 파일을 전송한다. 이런 경우 어떤 컴퓨터가 최근에 접속했었는지 어떤 파일을 전송했었는지에 대한 휘발성 데이터가 존재할 것이다.

윈도우 네트워킹은 NetBIOS 프로토콜을 사용한다. NetBIOS는 파일이나 프린터 공유와 같은 다양한 서비스를 제공한다. NetBIOS로 설정된 컴퓨터들은 각각 고유한 이름을 가지고 다른 컴퓨터들과 통신하게 된다.

NetBIOS 이름과 IP주소를 가지고 있는 NetBIOS 이름 캐시가 있는데 이것은 메모리상에 있으며 휘발성 데이터이기 수집하는데 시간적 제한이 있다. 윈도우 command-line에서 nbtstat라는 명령을 통해서 NetBIOS 이름 캐시 정보를 수집할 수 있다.

nbtstat -c 는 NetBIOS 이름 캐시를 보여준다.



nbtstat -S 나 net session 명령은 현재 연결된 NetBIOS 세션을 보여준다.



또는 시작 --> 모든프로그램 --> 관리도구 --> 컴퓨터 관리 --> 공유폴더 --> 세션에서 확인할 수도 있다. 단, 컴퓨터 관리에서 확인하면 자신의 컴퓨터에 연결된 정보만 확인할 수 있다. 즉, 위 명령을 통한 결과는 자신에게 연결한 시스템의 정보를 확인할 수 있다.



NetBIOS를 통해 전송된 파일은 net file이라는 명령을 통해서 확인할 수 있다.




ARP Cache
ARP는 IP 주소를 MAC 주소로 변경해주는 프로토콜이다. 이런 매핑 주소를 가지고 있는 것을 ARP 캐시 또는 ARP 테이블이라고 부른다. ARP 캐시는 현재 분석 대상 시스템과 연결되어 있거나 또는 최근에 연결되었었던 시스템들을 확인할 수 있게 해준다.



두개의 연결을 확인할 수 있는데 이것만으로는 이런 연결들이 악의적인 목적을 가진 연결인지 확인할 수는 없다.
따라서 앞서 살펴보았던 NetBIOS 정보들을 같이 점검하고 검토하면서 악의적인 연결들을 찾아내야 할 것이다.



지금까지 윈도우 휘발성 데이터 수집하는 일부 방법에 대해서 살펴보았습니다.
내용이 좀 많은 느낌이 들어 각 Chapter들을 여러개로 분할하여 글을 작성할 생각입니다.
1장은 총 4개로 나눠질 예정입니다.

다음 글에서는 프로세스와 관련된 데이터와 서비스와 드라이버, 스케줄 작업, 클리보드 데이터 수집에 대해서 살펴보도록 하겠습니다.




Posted by demantos

댓글을 달아 주세요

  1. 방문객

    좋은 내용 잘 봤습니다. 자주 방문할 것 같은 예감이...

    2009.05.21 11:11 [ ADDR : EDIT/ DEL : REPLY ]
  2. 좋은 내용 감사합니다..많이 배우고 가네요..^^

    2009.06.04 08:49 [ ADDR : EDIT/ DEL : REPLY ]
  3. 지나가는행인1

    이번에 포렌식에 대해서 공부중인데 많은 도움이 되었습니다! :)

    2009.07.15 15:35 [ ADDR : EDIT/ DEL : REPLY ]
  4. 까꿍

    보안쪽 많은 정보 참고가 되었습니다.
    앞으로도 멋찐 모습 기대하겠습니다.

    2009.12.26 09:05 [ ADDR : EDIT/ DEL : REPLY ]
  5. 알 수 없는 사용자

    많은 도움 됐습니다. 감사합니다 ^^
    앞으로도 많이 들릴거 같네요.

    2010.06.01 14:06 [ ADDR : EDIT/ DEL : REPLY ]