0x01 malware forensics2009. 3. 2. 20:39

3. Collecting Process Information

대부분의 악성코드들은 프로세스에서 확인할 수 있다. 공격자들이 발각되지 않고 감염된 시스템을 제어할려고 하는 것처럼 악성코드 프로세스들도 위장된 이름을 사용하거나 "scvhost"와 같이 애매한 프로세스 이름을 사용하여 자신들을 은닉시키려고 한다. scvhost라는 프로세스 이름(파일명)도 사용하지만 svch0st나 suvhost와 같은 이름도 사용한다. 즉, 분석자들은 프로세스 이름을 대충 보아서는 안되고 세심하게 살펴 보아야 한다.

프로세스에 대한 정보와 그 프로세스들이 다른 정보들과 어떤 연관성이 있는지 알아야 한다. 프로세스와 관련된 정보 수집에서는 다음과 같은 세부사항들을 수집한다.

  - 프로세스 이름과 PID
  - Temporal Context
  - 메모리 사용량
  - 프로세스를 실행 중인 프로그램
  - 프로세스를 실행 중인 사용자
  - 자식 프로세스
  - 불려진 라이브러리(dll)와 종속된 파일
  - 프로세스 실행에 사용된 명령줄 인자
  - 연관된 핸들
  - 프로세스의 메모리 내용
  - 시스템의 상태와 다른 정보들과 연관성 있는 문맥


3.1 Process Name and Process Identification(PID)

프로세스 정보를 수집하는 첫번째 단계는 어떤 프로세스들이 실행되고 있는지 파악하는 것이다. 일반적으로 이름이나 PID에 대해서 먼저 파악한다.
프로세스 정보를 확인하는 다양한 툴들이 있다. 비록 이런 툴들이 중복되는 기능들이 있긴 하지만 여러가지 툴들을 같이 사용하는 것이 좋다. 똑똑한 악성코드들은 시스템의 실행중인 프로세스들을 스캔하여 안티바이러스 프로세스나 방화벽, 침해사고대응 툴들이 실행중인지 확인해서 이런 프로세스들을 죽일려고 할 것이다.

가장 간단하게 프로세스에 대한 정보를 수집하는 방법은 tlist를 사용하는 것이다. tlist는 Windows Debugging Tool 패키지 안에 포함되어 있다.

Debugging Tools for Windows 32-bit

http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx#a



-t 옵션을 사용하면 트리형태로 보여준다. tlist /? 명령을 실행하면 사용 가능한 옵션들을 더 볼 수 있다.

그리고 비슷한 기능을 하는 PRCView가 있다. PRCView는 http://www.teamcti.com/pview/prcview.htm 에서 다운 받을 수 있다.



필자는 process explorer에 익숙해져 있어서 PRCView를 그리 자주 사용하지 않을 것 같다. 하지만 PRCView도 많은 기능들을 제공하고 있다. 특히 마음에 드는 기능은 Process Monitor 기능이다. Tools --> Process Monitor를 선택하면 프로세스 모니터를 실행시킨 이후에 실행되는 프로세스들을 순서대로 보여준다.



tlist만으로는 분석자에게 약간 정보가 부족할 수 있다. 분석자에게 프로세스가 실행중인 시간 또한 중요하다. tlist는 프로세스 실행 시간에 관련된 정보가 없다. 물론 PRCView에서는 Start Time과 End Time이 있긴 하지만...
프로세스 지속 시간은 시스템 uptime이나 프로세스가 연결된 타임라인과 같은 다른 의미있는 시스템 정보와 비교될 수 있다. 그리고 새로운 서비스의 추가라던지 네트워크 연결, 의심가는 이벤트 뷰어 로그, Prefetch 파일 엔트리와 같은 시스템 이벤트와도 비교될 수 있다.

이런 프로세스의 실행 시간은 pslist 명령을 통해서 확인할 수 있다. pslist는 PsTools suite에서 구할 수 있다.



그리고 우리는 특정 프로세스가 사용 중인 시스템 리소스를 알고 싶어할 수 있다. 종종 악성코드들은이 활성화되면 눈에 띄게 리소스를 소비한다. 특히, 램 용량이 2기가 미만인 경우에...
메모리 사용량을 확인할 수 있는 툴도 여러가지가 있는데 그 중에서 특히 다재다능한(^^) 툴이 윈도우에 기본으로 내장된 tasklist라는 툴이다. tasklist는 우리가 흔히 알고 있는 작업관리자(taskmgr)의 CLI 버전이라고 생각하면 되겠다.



위 명령들보다 좀 더 세부적인 내용을 보여주는 툴로 pmon, pstat, memsnap 과 같은 툴들이 있다. 모두 Windows XP Service Pack 2 Support Tools 패키지에서 구할 수 있다. http://www.microsoft.com/downloads/details.aspx?FamilyID=49ae8576-9bb9-4126-9761-ba8011fabf38&displaylang=en


3.2 Process to Executable Program Mapping: Full System Path to Executable File

실행중인 프로세스를 확인하고 나면 프로세스 타임라인이나 모메리 소묘량 같은 부가적인 정보를 획득하고 나면 어떤 프로세스가 악의적인 프로세스인지 판단해야 한다. 이런 프로세스에 대한 정확한 정보를 획득하기 위해서 각각의 프로세스들의 실행 이미지가 어느 위치에 존재하고 있는지(즉, 실행 파일이 어느 폴더에 있는지) 알아야 한다. 실행 중인 프로세스에 대한 개요와 실행 파일의 위치 정보를 획득하려면 PRCView를 사용하면 된다.

PRCView는 위에서 확인했었다. PRCView 폴더에 보면 pv.exe라는 명령이 있는데 -e 옵션을 사용하면 PRCView와 비슷한 결과를 확인할 수 있다.




실행 중인 프로세스에 대한 좀 더 자세한 정보를 얻고 싶다면 CurrProcess라는 프로그램을 사용할 것을 추천한다. CLI 모드에서 사용하려면 /stext 옵션과 결과를 저장한 파일경로와 파일명을 써주면 된다.

http://www.nirsoft.net/utils/cprocess.html

 

그리고 특정 프로세스에 대한 정보를 텍스트 파일로 저장할 수 있다.



의심이 가는 파일이 있다면 선택한 후 내용을 저장해서 확인할 수 있다.



svchost.exe 프로세스의 프로덕트 네임이나 회사명을 보면 mIRC라고 되어 있는 것을 확인할 수 있고 숨겨진 윈도우가 2개 있다는 것도 확인할 수 있다. 또한 파일의 속성이 보관파일(A), 읽기전용(R), 숨김파일(H), 시스템파일(S)의 속성을 가지고 있는 것도 확인할 수 있다.


Process to User Mapping
프로세스를 시작한 실행 파일을 찾는 과정에서 해당 프로세스의 소유자를 알아야 한다. 정상적이지 않은 사용자나 권한이 상승된 사용자가 실행 중인 프로세스는 악의적인 프로세스라는 것을 의미한다. 그렇다면 특정 프로세스가 어떤 사용자에 의해 실행되고 있는지 확인하려면 tasklist -V 명령을 사용하면 된다. 이 명령을 통해 프로세스, 프로그램이름, PID, 메모리 사용량, 프로그램 상태, 사용자이름 등을 확인할 수 있다.


 
여기서 한자기 문제점은 해당 프로세스를 실행하고 있는 사용자가 정상적인 사용자인지 정확히 구분할 수 있어야 한다는 것이다. 우리가 최소한 알아두어야 할 것은 시스템 계정에 의해서 실행되는 프로세스가 어떤 것이 있는지이다. 악성코드들이 자신의 존재를 숨기기 위해 가장 많이 사용되는 방법이 시스템 프로세스와 동일한 이름을 사용하거나 비슷한 이름을 사용하는 것이다(언뜻 봐서는 잘 구분이 안가는 비슷한 이름).

Windows 2000 기본 프로세스(http://support.microsoft.com/kb/263201/ko)에 대해서 잠깐 언급을 하고 가겠다. Windows 2000뿐만 아니라 Windows XP에서도 거의 동일하다.

 프로세스 이름  설 명  소유자 
 csrss.exe 이 프로세스는 Win32 하위 시스템의 사용자 모드 부분이다(Win32.sys는 커널 모드 부분임). Csrss는 클라이언트/서버 런타임 하위 시스템(Client/Server Run-time Subsystem)을 나타내며 항상 실행되어야 하는 필수적인 하위 시스템이다. Csrss는 콘솔 창, 스레드 생성과 삭제 및 16비트 가상 MS-DOS 환경의 일부를 담당한다.  NT AUTHORITY\SYSTEM
 explorer.exe 이 프로세스는 친숙한 작업 표시줄, 바탕 화면 등으로 표시되는 사용자 셸이다. 이 프로세스는 생각하는 것만큼 Windows를 실행하는 데 필수적이지는 않으며 대개 시스템에 부정적인 영향을 미치지 않고 작업 관리자에서 중지하고 다시 시작할 수 있다.  HOSTNAME\Administrator
 internat.exe Internat.exe는 시동 시에 실행되어 사용자가 지정한 다양한 입력 로캘을 로드한다. 다음 레지스트리 키에서 현재 사용자에 대해 로드할 로캘을 가져온다.
    HKEY_CURRENT_USER\Keyboard Layout\Preload
Internat.exe는 시스템 트레이로 "EN" 아이콘을 로드하여 사용자가 로캘을 쉽게 전환할 수 있도록 한다. 이 아이콘은 프로세스가 중지되면 사라지지만 제어판을 통해 로캘을 변경할 수 있다.

참고 "시스템"에 대한 로캘이 다음에서 로드된다.
    HKEY_USERS\.DEFAULT\Keyboard Layout\Preload
이러한 로캘은 로그온한 사용자가 없는 경우(예: 로그온 프롬프트에서)나 로컬 시스템 계정에서 실행 중인 시스템 서비스에서 사용된다.
 HOSTNAME\Administrator
 lsass.exe 로컬 보안 인증 서버인 이 프로세스는 Winlogon 서비스에 대해 사용자를 인증하는 프로세스를 생성한다. 이 프로세스는 기본 Msgina.dll 같은 인증 패키지를 사용하여 수행된다. 인증에 성공하면 Lsass는 초기 셸을 시작하는 데 사용되는 사용자의 액세스 토큰을 생성한다. 사용자가 시작하는 다른 프로세스는 이 토큰을 상속한다.  NT AUTHORITY\SYSTEM
 mstask.exe 이 프로세스는 사용자가 미리 정한 시간에 작업을 실행하는 일을 담당하는 작업 스케줄러 서비스이다.  NT AUTHORITY\SYSTEM
 smss.exe 이것은 사용자 세션의 시작을 담당하는 세션 관리자 하위 시스템이다. 이 프로세스는 시스템 스레드에서 시작되며 Winlogon 및 Win32(Csrss.exe) 프로세스의 시작과 시스템 변수 설정을 비롯한 다양한 작업을 수행한다. Smss.exe는 이러한 프로세스를 시작한 후 Winlogon이나 Csrss가 끝나기를 기다린다. 이것이 "정상적으로" 이루어지면 시스템이 종료되지만 예기치 않은 동작이 일어나면 Smss.exe는 시스템이 응답을 중지하도록 한다.  NT AUTHORITY\SYSTEM
 spoolsv.exe 이 스풀러 서비스는 스풀링된 인쇄/팩스 작업 관리를 담당한다.  NT AUTHORITY\SYSTEM
 svchost.exe 이것은 DLL에서 실행되는 다른 프로세스의 호스트 역할을 하는 일반 프로세스이므로 이 프로세스 항목은 둘 이상 표시될 수 있다. Svchost.exe를 사용 중인 프로세스를 확인하려면 Windows 2000 CD-ROM에서 Tlist.exe를 사용하면 된다. 명령줄 프롬프트에서의 구문은 tlist -s이다.
http://support.microsoft.com/kb/250320/
 NT AUTHORITY\SYSTEM
 NT AUTHORITY\NETWORK SERVICE
 NT AUTHORITY\LOCAL SERVICE
 services.exe 이 프로세스는 시스템 서비스의 시작, 중지 및 시스템 서비스와의 상호 작용을 담당하는 서비스 제어 관리자이다.  NT AUTHORITY\SYSTEM
 system 대부분의 시스템 커널 모드 스레드가 System 프로세스로 실행된다.  NT AUTHORITY\SYSTEM
 system idle
 process
이 프로세스는 각 프로세서에서 실행되는 단일 스레드로 시스템이 다른 스레드를 처리하지 않을 때의 프로세서 시간을 나타내는 일만 한다. 일반적으로 작업 관리자에서 이 프로세스가 프로세서 시간의 대부분을 차지한다.  NT AUTHORITY\SYSTEM
 winlogon.exe 이것은 사용자 로그온과 로그오프를 관리하는 프로세스이다. Winlogon은 사용자가 Ctrl+Alt+Del을 누를 때만 활성화되어 보안 대화 상자를 표시한다.  NT AUTHORITY\SYSTEM
 winmgmt.exe Winmgmt.exe는 Windows 2000에서 클라이언트 관리의 핵심 구성 요소이다. 이 프로세스는 첫 번째 클라이언트 응용 프로그램이 연결되거나 관리 응용 프로그램이 서비스를 요청할 때 지속적으로 초기화한다.  NT AUTHORITY\SYSTEM

주의할 점은 파일명이 같다고 해서 꼭 시스템에서 실행 중인 정상적인 프로세스라고 단정지을 수 없다는 것이다.


Child Process
악성코드들은 종종 자식 프로세스를 만들어낸다. 분석 도중 의심스러운 프로세스를 발견하면 그 프로세스에 대한 부모 프로세스와 자식 프로세스에 대해서 분석하려고 할 것이다. 이런 경우 pslist -t 명령을 통해 리눅스의 pstree와 같이 트리 형태로 프로세스를 볼 수 있다. 혹은 tlist -t 명령이나 pv -t(PRCView의 CLI) 명령을 통해서도 확인할 수 있다.

개인적으로 프로세스를 트리 형태로 확인하는 경우 process explorer를 추천한다.



 
Command-line Parameters
악성 프로세스에 대한 정보가 이미 있다면 해당 프로세스에서 사용하고 있는 command-line parameter에 대한 정보는 상당히 유요할 수 있다. DiamondCS에서 개발한 cmdline이라는 프로그램을 사용하면 특정 프로세스에서 사용중인 명령줄 인자값을 확인하는데 좋은 프로그램이다. http://www.diamondcs.com.au/consoletools.php



이 프로그램은 PID, 절대경로, 각각의 프로세스와 연관된 실행 파일을 보여준다. -pid 옵션을 사용하면 특정 프로세스에 대한 정보만 보여준다. 이와 유사한 명령으로는 tlist -c 나 pv -l 명령이 있다. 그리고 process explorer의 컬럼을 지정하는 옵션에서 command line 항목을 체크해주면 process explorer에서도 동일한 결과를 확인할 수 있다.




File Handles
파일이나 쓰레드, 그래픽 이미지와 같은 시스템 리소스는 일반적으로 객체(object)로 여겨지는 데이터 구조이다. 프로그램들은 객체 데이터에 직접적으로 접근할 수 없고 객체 핸들(object handle)에 의해서 접근할 수 있다. 각각의 핸들은 핸들 테이블에 의해 내부적으로 관리되는 엔트리를 가지고 있다. 핸들 테이블은 리소스 타입을 의미하는 리소스의 주소를 가지고 있다.

어떤 프로세스가 어떤 핸들을 사용하고 있는지에 대한 정보는 handle 명령을 통해서 확인할 수 있다. 이 명령은 Sysinternals 패키지에 포함되어 있다.
실행 중인 모든 프로세스에 대한 핸들은 -a 옵션을 사용해서 모든 핸들의 정보를 얻을 수 있다.

 spoolsv (PID 1600)  spoolsv (PID 864)
<excerpt>
spoolsv.exe pid: 1000 NT AUTHORITY\SYSTEM
C: File (RW-) C:\WINDOWS\system32
10: Section
14: Directory \Windows
18: Port
1C: Key HKLM
20: Directory \BaseNamedObjects
24: Mutant \Windows\WindowStations\WinSta0
38: Event
3C: Semaphore
40: Semaphore
44: Key HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32
48: Event \BaseNamedObjects\DINPUTWINMM
4C: File (---) \Device\KsecDD
50: Event
54: Event
58: Event
5C: Semaphore \BaseNamedObjects\shell.{A48F1A32-A340-11D1-BC6B-00A0C90312E1}
60: File (---) \Device\NamedPipe\net\NtControlPipe7
A8: File (---) \Device\NamedPipe\spoolss
AC: File (---) \Device\NamedPipe\spoolss
 <excerpt>
spoolsv.exe pid: 864 demantos\r00t
C: File (RW-) C:\WINDOWS\Temp\spoolsv
614: Port
618: Event
624: File (---) \Device\Afd\Endpoint
628: File (---) \Device\Tcp
630: File (---) \Device\Tcp
634: Event
638: File (---) \Device\Tcp
63C: Event
640: File (---) \Device\Tcp
644: Event
648: Event
64C: Port
650: Event
654: Token NT AUTHORITY\NETWORK SERVICE:3e4
658: Event
65C: Port
660: File (---) \Device\Tcp
664: File (---) \Device\Tcp
668: File (---) \Device\NetBT_Tcpip_{2DC00E6E-AD51-4E04-85A1-101876F63F96}
670: Event
78C: Key HKLM\SYSTEM\ControlSet001\Services\WinSock2\Parameters\NameSpace_Catalog5
790: Event
794: Key HKLM\SYSTEM\ControlSet001\Services\WinSock2\Parameters\Protocol_Catalog9


위 예제는 정상적인 spoolsv 프로세스와 악성코드로 동작하는 spoolsv의 핸들을 비교한 것이다. 의심스러운 spoolsv는 네트워크와 관련된 리소스에 접근하고 있는 것을 확인할 수 있다.

그리고 핸들 정보를 수집하는 다른 프로그램으로 Microsoft에서 배포하는 Open Handles(oh.exe)라는 프로그램이 있다.
http://www.microsoft.com/downloads/details.aspx?FamilyID=275D9F7A-83B2-4FB1-9B6A-DE8D28F72329&displaylang=en 


3.3 Dependencies Loaded by Running Processes

동적으로 링크된 실행 프로그램들이 제대로 실행되려면 공유 라이브러리들이 필요하다. 윈도우 프로그램에서 이런 공유 라이브러리는 DLL(Dynamic Link Labraries)이라 불리며 프로그램이 실행될 때 운영체제를 통해서 가져온다. DLL들이 불려질 때 정적으로(statically) 링킹되는 것보다 동적으로(dynamically) 링키되는 것이 훨씬 더 작고 시스템 메모리의 소모량도 더 적다.

실행 중인 프로세스에 의해 로드된 DLL을 확인하는 좋은 프로그램은 listdlls이다. listdlls는 Sysinternals 패키지에 포함되어 있다. listdlls 명령을 통해 각각의 모듈의 절대 경로를 확인할 수 있다.



프로세스에 의해 로딩된 DLL을 찾아내는 것은 분석에 아주 유용하다. 많은 악성코드들이 스스로를 실행시키기 보다는 DLL 형태로 제작되어 주요 시스템 프로세스에 Injection 되어 실행된다(DLL Injection). 이 공격 기법이 적용된 대표적인 루트킷이 Vanquish이다(rootkit.com에서 찾을 수 있다).

tlist나 PRCView, tasklist, WinInterrogate와 같은 프로그램에서도 실행 중인 프로세스에 의해 로딩된 DLL들을 확인할 수 있다.

WinInterrogate.exe
http://sourceforge.net/project/shownotes.php?release_id=122552&group_id=15870


Exported DLLs
listdlls에 의해 각각의 프로세스들이 사용하고 있는 DLL들을 확인하였다면(import) 해당 DLL들이 어떤 함수를 특정 프로세스에게 제공하고 있는지(export) DLLExportViewer로 확인해 볼 수 있다.

http://www.nirsoft.net/utils/dll_export_viewer.html


4. Correlate Open Ports with Running Processes and Programs

앞에서 우리는 로그인한 사용자, 활성화된 네트워크 연결 정보, 실행 중인 프로세스에 대한 정보 수집 방법에 대해서 알아보았다. 이번에는 열려진 포트와 실행 중인 포트를 확인하고 연결이 성립되었거나 포트를 열고 LISTEN하고 있는 실행 프로그램이 시스템의 어느 위치에 있는지 확인할 것이다. 다음과 같은 절보들을 수집해야 한다.

  - 로컬 IP와 포트
  - 원격 IP와 포트
  - 원격 호스트네임
  - 프로토콜
  - 연결 상태
  - 프로세스 이름과 PID
  - 프로세스와 연관된 실행 가능 프로그램
  - 실행 가능 프로그램의 경로
  - 프로세스/프로그램과 연관된 사용자 이름

Windows XP SP2 이상의 시스템에서는 netstat -anb라는 옵션을 사용하여 현재 열려있는 포트나 리슨하고 있는 포트와 해당 포트를 열고 있는 프로세스의 PID와 프로세스를 실행하고 있는 프로그램의 이름과 링크된 DLL의 경로를 확인할 수 있다.



이 명령은 결과가 생각보다 늦게 나오니 참고 기다리길 바란다. -_-


Openports
netstat와 비슷한 결과를 확인할 수 있는 프로그램으로 DiamondCS에서 개발한 openports라는 프로그램이 있다. 
-path 옵션과 -lines 옵션을 같이 사용하면 프로세스를 실행하고 있는 프로그램의 절대경로를 보여주고 각 프로세스별로 라인을 그려줘서 보기 쉽게 해준다. 옵션을 사용하지 않을 경우 프로그램의 절대경로가 아닌 프로그램 이름만 출력된다.




CurrPorts
openports로 프로세스와 포트의 매핑 정보를 확인한 후 좀 더 세부적인 정보를 확인하기 위해서 CurrPorts라는 프로그램을 사용한다. NirSoft에서 개발한 프로그램이다. (NirSoft 홈페이지에서 여러가지 휘발성 데이터 수집 프로그램을 찾을 수 있다.)
http://www.nirsoft.net/utils/cports.html



현재 192.168.245.1의 9999 포트로 연결된 것을 확이할 수 있다. 악성코드에 의한 원격지의 공격자에게 연결된 것이라면 Product Name이나 File Description, Product Version과 같은 실행 파일의 정보가 없는 경우도 있었지만 최근에 전파되고 있는 악성코드들은 정상적인 프로그램과 동일한 정보들을 가지고 있는 경우가 있다. 따라서 이런 정보들만으로는 구분하기 어려운데 한가지 확인해야 할 컬럼은 가장 마지막에 위치한 Module Filename 컬럼이다.



192.168.245.1:9999로 연결한 svchost.exe 프로세스가 사용하고 있는 모듈(dll)은 bitsex.dll이다. 특히 svchost는 DLL에서 실행되는 다른 프로세스의 호스트 역할을 하는 일반 프로세스여서 DLL Injection이 많이 발생한다. 즉, bitsex.dll은 인젝션된 DLL일 가능성이 크다는 것이다.

그렇다면 어떤 DLL이 정상 DLL이고 악성 DLL인지 구분할 수 있어야 하는데 솔직히 DLL 파일들이 너무 많아 전부 기억하는 것은 거의 불가능에 가깝다. 주로 사용되는 DLL들에 대해서 기억하거나 http://www.windll.com/ 사이트에서 윈도우 DLL 목록을 제공하니 찾아보는 수밖에 없다.

Sysinternal에 포함된 tcpvcon도 비슷한 정보들을 보여준다.


5. Identifying Services and Drivers

윈도우 서비스는 사용자의 실행이나 상호 작용이 필요하지 않은 윈도우 세션이 시작될 때 실행되는 어플리케이션을 의미한다. 이런 서비스들은 컴퓨터가 부팅될 때 자동적으로 실행하는게 가능하고 멈추거나 재시작하는 것도 가능하다. 사용자들 모르게 백그라운드에서 실행하는 것도 가능하다. 악성코드들은 공격 대상 시스템에서 자기 자신을 서비스로 등록하여 컴퓨터가 매번 부팅될 때마다 실행되게 할 수 있다. 사용자들 모르게...

악성코드들은 일반적으로 설명이나 상태, 시작 유형과 같은 정보들이 없기 때문에 실행 중인 서비스에 대한 정보를 수집하는 과정에서 다음과 같은 정보들을 확인하면 된다.

  - 서비스 이름
  - 표시 이름
  - 상태
  - 시작 유형
  - 서비스 설명
  - 종속성(의존성)
  - 서비스와 연관된 실행 파일
  - PID
  - 실행 프로그램 경로
  - 서비스와 연관된 사용자 이름

하지만 앞에서도 언급했듯이 최근에 전파되는 악성코드들은 이런 정보들이 정상 프로그램과 동일하게 입력된 경우가 있기 때문에 눈에 보이는 이런 정보들을 맹신해서는 안된다.

서비스에 대한 개요 정도만 확인한다면 tasklist /svc 명령을 통해서 확인할 수 있다.



좀 더 자세한 내용을 보고자 한다면 psservice나 ServiWin, servicelist와 같은 프로그램을 활용하면 된다.
psservice : Sysinternals Suite
ServiWin : http://www.nirsoft.net/utils/serviwin.html
servicelist : http://www.pathsolutions.com/download/ServiceList.zip

개인적으로 이런 프로그램들은 크게 도움이 안될 수도 있다는 생각이 든다. 왜냐하면 정상 서비스와 비슷하게 꾸며 놓는다면(decaration~) 서비스에 대한 지식이 다소 부족할 경우 지나칠 수 있다는 것이다. 결국 분석자가 주의를 기울려 분석하는 수밖에 없다. 실제로 bitsex.dll은 Netbot Attacker VIP 4.6 버전에서 사용하는 파일이다. 서비스를 아무리 봐도 정상 서비스처럼 보인다.




IceSword나 gmer와 같은 루트킷을 점검하는 프로그램을 실행해봐도 악성코드로 잡아내질 못한다. 물론 프로그램마다 특징이 있기 때문에 탐지 가능한 부분과 그렇지 않은 부분이 있을 수 있다. 필자가 말하고 싶은 것은 이런 경우도 있기 때문에 분석자가 주의를 기울여야 한다는 것이다. 하지만 이런 서비스들을 아주 못찾는 것은 아니다. 다른 정보를 토대로 서비스를 찾아낼 수도 있고 서비스에서는 못찾았지만 다른 정보를 확인하는 과정에서 악성코드를 찾아낼 수도 있기 때문이다.

서비스를 분석하는 다른 툴이나 윈도우 기본 명령들은 다음과 같다.
Net : net start
Tlist : tlist -s (Microsoft Debugging Tool)
Srvinfo : Windows 2003 Server Resource Kit Tools http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en
Sclist : Windows 2000 Server Resource Kit에 있다고 하는데 안보임(2000 RK이나 2003 RK이나 거의 동일)
SvcUtil : http://www.joeware.net/freetools/tools/svcutil/index.htm

그리고 시스템이 설치된 드라이버에 대한 정보 수집도 필요하다. 드라이버 정보를 수집하는 프로그램은 다음과 같다.
drivers : Windows 2000 Server Resource Kit Tools http://support.microsoft.com/kb/927229
DriverView : http://www.nirsoft.net/utils/driverview.html
ListLoadedDrivers : http://download.microsoft.com/download/win2000platform/drivers/1.0/nt5/en-us/drivers.exe

2003 RK에서는 printdriverinfo.exe 이라는 프로그램이 있는데 drivers.exe와 실행 결과가 다르다.


5.1 Determining Open Files

열려진 파일들을 확인함으로써 의심가는 프로세스들을 찾는 것이 가능하다. 다른 프로세스에 끼워진(embedded, 아무래도 인젝션을 의미하는 듯) 악성코드들은 공격자들이 공격 대상 시스템으로 접근하는 것이 가능하게 하고 공격자는 공격 대상 시스템에 연결하는 동안 어떤 파일을 오픈할 것이다. 이런 경우 열려진 파일을 확인하는 것은 공격의 목적을 알 수 있게 해준다(금융 데이터베이스 내용이나 민감한 기업 정보나 시스템의 다른 특별한 자원의 수집과 같은 목적).

내부적으로 중요한 파일이 있다는 가정하에 이런 파일의 정보가 악성코드에 의해 네트워크를 통해 외부로 유출될 수도 있기 때문에 공격자가 내부에 있는지 외부에 있는지도 확인할 필요가 있다.

여기서는 분석 대상 시스템에서 열려진 파일을  로컬과 원격으로 구분할 것다.


Identifying Files Opened Locally
로컬에서 열려진 파일을 확인하는 프로그램으로는 Nirsoft의 OpenFilesView가 있다. OpenFilesView는 파일을 열고 있는 프로세스나 핸들과 연관되거나 접근시간에 대해 read/write/delete하거나 파일의 위치 등 현재 사용 중인 파일에 대한 부가적인 정보를 보여준다.

OpenFilesView : http://www.nirsoft.net/utils/opened_files_view.html




Identifying Files Opened Locally
원격에서 열려진 파일은 net file 명령이나 psfile 프로그램에 의해서 확인 가능하다.






5.2 Collecting the Command History

침입자가 언제 접근했고 어떤 명령을 실행했었는지 확인하기 위해 명령어의 히스토리를 확인해야 한다. 단, 히스토리 로그가 변경되지 않았다는 가정하에..
분석자는 doskey /history 라는 명령을 통해 메모리에 저장된 명령어들을 확인할 수 있다. 단, 이 명령은 최대 61,900 바이트만큼만 저장할 수 있다.
이런 명령어 히스토리들은 침입자가 실행한 명령어 중에 폴더나 파일이 이름이나 도메인 네임, IP주소, 공유폴더 이름과 같은 정보들을 가지고 있기 때문에 분석자에게 유용한 정보가 될 수 있다.


5.3 Identifying Shares

일부 악성코드들은 네트워크 공유를 통해서 자신을 증식시키는데 현재 분석 대상 시스템의 공유 폴더 상태를 확인할 필요가 있다. net share 명령을 통해서 확인할 수 있다.




6. Determining Scheduled Tasks

어떤 악성코드들은 event-driven 한다. 이 말의 의미는 특정 날짜나 특정 이벤트가 발생하면 악성코드가 실행된다는 것이다. 이런것은 논리폭탄과 연관이 있다.
WORM_SOHANAD.FM과 같은 웜은 숙주사이트에서 파일을 다운로드하고 세개의 추가적인 악성코드를 설치한 다음 Windows Task Scheduler를 이용해서 파일을 실행할 수 있는 스케줄 작업을 생성한다.

WORM_SOHAND.FM : http://www.trendmicro.com/vinfo/virusencyclo/default5.asp?VName=WORM_SOHANAD.FM

스케줄 작업은 at 명령이나 schtasks /Query 명령을 통해서 확인할 수 있다. schtasks는 Windows XP, 2003, Vista에서 기본 명령이다.

C:\> schtasks /Query

추가적인 정보를 보려면 /FO LIST 와 /V 옵션을 사용하면 된다.

C:\> schtasks /Query /FO LIST /V


7. Collecting Clipboard Contents

공격자가 내부자일 경우 텍스트 비트를 복사하고 툴에 입력하거나 공격 문자열을 입력하는 경우 필요가 있다. 도메인 네임이나 IP주소, 이메일주소, 사용자이름, 패스워드, 호스트네임, 메신저 채팅 내용, 공격 명령 등이 클립보드에서 발견될 수 있다. 클립보드 내용을 확인할 수 있는 명령으 pclip이 있다. pclip은 UnxUtils 패키지에 포함되어 있다.

http://nchc.dl.sourceforge.net/sourceforge/unxutils/UnxUtils.zip









드디어 윈도우 휘발성 데이터 수집 두번째를 마무리했습니다.
약간 부족한 감이 없지 않습니다.
좀 더 채워졌으면 하는 내용이나 궁금하신 내용은 댓글을 이용해주세요~

오늘은 집에 가서 푹~ 쉬어야 겠군요..
원피스 391화를 보면서....^^;


Posted by demantos