사이버 공격(침해사고)의 포렌식 분석을 위한 데이터 수집 – 휘발성 데이터

사이버 공격(침해사고)의 데이터 수집 – 휘발성 데이터 부분

시스템 데이터 수집 항목을 분리하자면, 휘발성 데이터와 비휘발성 데이터로 나눌 수 있다.

휘발성 데이터는 전원이 꺼지거나 시스템이 재시작되면 사라지는 데이터이다. 휘발성 데이터의 수집은 시스템 역분석에서 매우 중요하다. 문제 해결의 핵심 단서로, 사건으로 따지면 범죄 현장과 같다. 만약 이 범죄 현장을 훼손하거나 현장을 변경한다면 범죄수사는 어떻게 될까?? 필히 난항을 피하지 못할 것이다. 이는 역분석에서도 마찬가지이다. 시스템에 문제가 생기고 해당 현상을 해소하기 위해 로그인하여 시스템을 재시작하거나 프로세스를 강제 종료 하거나 로그아웃 등 별도의 행동을 취하게 되면, 증거 데이터는 심하게 손상되어 분석이 매우 어렵게 된다.

사이버 공격 침해사고의 디지털 증거 확보분석

시간이 경과함에 따라 데이터가 유실된다

그리고 컴퓨터의 증거자료는 데이터이기 때문에 변형 되었는지 구분하기 어렵다. 그리고 역분석은 수집된 데이터를 기반으로 분석이 진행되기 때문에 손상된 수집 자료를 통한 분석은 원래의 문제점과 전혀 다른 결과가 나올 수 있을 정도로 위험하니 시스템 역분석 자체가 무의미해질 수 있다. 따라서 문제 발생시 변형되지 않은 데이터 수집이 제일순위로 진행되어야 한다.

물론 시간이 경과하거나 시스템에 변경이 생겼는데, 데이터 분석에 의미가 있는지 저자에게 묻는다면, 당연히 의미가 있다고 얘기할 것이다. 아직 분석할 수 있는 데이터가 남아 있을 가능성이 있기 때문이다. 하지만 반드시 원인이 되는 증거를 찾을 수 있는지에 대해서는 보증할 수 없다.

또 데이터는 시간이 지남에 따라 변형될 가능성이 커지게 된다. 따라서 문제가 발생하였을 때, 가능한 빠르게 데이터 수집을 진행해야 한다. 이 휘발성, 비휘발성 데이터라는 것은 단지 구분하는 것일 뿐, 수집 자료 대부분이 변형되지 않은 데이터 수집이 궁극적인 수집 목적이라 생각해야 한다.

추가로 아래 그림은 사고 발생시 수집해야 하는 영역를 주요 관점으로 나누어 본 것이다.

큰 관점은 하드웨어와 운영체제로 나누어 수집을 진행하며, 하드디스크 정보를 제외하고는 운영체제 활동의 정보를 수집하는 비중이 크다. 하드디스크의 경우 운영체제 기준으로 보면 변조되었거나 숨겨놓은 것을 확인 할 수 없을 경우가 발생하므로 바이너리 데이터로 수집하여 분석을 진행해야 하기 때문에 하드웨어 기준으로 수집하여야 한다.

그 외 메모리, 네트워크, 레지스트리는 운영체제가 활동하며 기록하는 정보라 할 수 있다. 단지 접근 기준을 하드웨어 관점인 바이너리와 운영체제 기준인 활동 정보를 함께 고려해 수집하여야 숨겨진 정보를 찾아낼 수 있다. 그리고 앞서 배운 사용자 영역인 세션 정보를 통해 보다 자세한 시스템의 활동정보를 수집할 수 있으며, 기존 정보를 사용자 중심으로 다시 가공하여 사용자가 활동한 흔적들도 찾아 낼 수 있다. 이 내용은 19장에서 자세히 다루도록 하겠다.

역분석 데이터 수집 영역

그럼 실제 수집 방법을 통해 각 영역들에 대해 자세히 알아보도록 하자.

실습 준비

처음부터 많은 도구에 대해 소개를 해야 할 것 같다.

대부분의 데이터 수집이 도구를 통해 진행해야 하는 만큼 많은 도구가 이용되므로 사전에 다운로드 해 놓고 따라하면서 실습을 진행하면 도움이 될 것이다.

그럼 각 도구들에 대해 알아보자(프로그램이 많아 별도의 기존과 다르게 표기하였다). 생각보다 실습 도구가 많으나, 역분석은 물론 장애 분석에도 유용한 도구들이므로 확인해 두자(도구가 많아 간단한 도구들은 함께 압축 해두었다. http://asecurity.so/2015/03/%ED%8F%AC%EB%9E%9C%EC%8B%9D-%EC%A6%9D%EA%B1%B0-%ED%99%95%EB%B3%B4%EB%B6%84%EC%84%9D%EC%9D%84-%EC%9C%84%ED%95%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%88%98%EC%A7%91-%EB%8F%84%EA%B5%AC/)

Hostname: 윈도우 기본 내장, 컴퓨터 이름 확인

Date: 윈도우 기본 내장, 날짜 확인

Time: 윈도우 기본 내장, 시간 확인

Psinfo: http://technet.microsoft.com/en-us/sysinternals/bb897550, 시스템 정보 확인

PsLoggedon: http://technet.microsoft.com/en-us/sysinternals/bb897545, 로그인 사용자 정보 확인

Logonsessions: http://technet.microsoft.com/en-us/sysinternals/bb896769, 로그인 사용자 정보 확인

Tasklist: 윈도우 기본 내장(비스타 이후), 실행 프로세스 확인

Tlist: Windbg(http://www.microsoft.com/download/en/details.aspx?id=19879)기본 내장, 실행 프로세스 확인

Pslist: http://technet.microsoft.com/en-us/sysinternals/bb896682, 실행 프로세스 확인

Psservice: http://technet.microsoft.com/en-us/sysinternals/bb897542, 실행 서비스 확인

Handle: http://technet.microsoft.com/en-us/sysinternals/bb896655, 실행 핸들 리스트 확인

ListDll, http://technet.microsoft.com/en-us/sysinternals/bb896656, 실행중인 Dll 리스트 확인

Sigcheck: http://technet.microsoft.com/en-us/sysinternals/bb897441, 시스템 파일 시그니처 검사

Hfind: http://www.mcafee.com/us/downloads/free-tools/forensic-toolkit.aspx, 숨김파일 검사

Streams: http://technet.microsoft.com/en-us/sysinternals/bb897440, ADS 파일 검사

Sfind: http://www.mcafee.com/us/downloads/free-tools/forensic-toolkit.aspx, ADS 파일 검사

ADS Spy: http://www.bleepingcomputer.com/files/adsspy.php, ADS 파일 검사

Afind: http://www.mcafee.com/us/downloads/free-tools/forensic-toolkit.aspx, 지정 시간에 접근 파일 확인

Ipconfig: 윈도우 기본 내장, 네트워크 정보 확인

Route: 윈도우 기본 내장, 라우트 정보 확인

Promqry: http://www.microsoft.com/download/en/details.aspx?id=1851, 스니핑 모드 인터페이스 확인 (미포함)

Promiscdetect: http://ntsecurity.nu/toolbox/promiscdetect, 스니핑 모드 인터페이스 확인

Netstat: 윈도우 기본 내장, 네트워크 연결 정보 확인

Fport: http://www.mcafee.com/kr/downloads/free-tools/fport.aspx, 네트워크 연결 정보 확인

Tcpvcon: http://technet.microsoft.com/en-us/sysinternals/bb897437, 네트워크 연결 정보 확인

Psfile: http://technet.microsoft.com/en-us/sysinternals/bb897552, 원격 연결 파일 정보 –

Nbtstat: 윈도우 기본 내장 , Netbios 이용 정보 확인

IISdiag: http://www.microsoft.com/download/en/details.aspx?id=11574, IIS 덤프 수집/분석 (미포함)

Inctrl5: http://www.freewaregeeks.com/?page=detail&get_id=2060&category=107, 파일 활동 분석 (미포함)

Adplus.vbs: http://msdn.microsoft.com/en-us/windows/hardware/gg463009, 메모리 덤프 수집 (미포함)

Mdd: http://sourceforge.net/projects/mdd/, 메모리 덤프 수집

Win32dd: http://win32dd.msuiche.net/, 메모리 덤프 수집 (미포함)

Dumpit: http://www.moonsols.com/wp-content/plugins/download-monitor/download.php?id=7, 메모리 덤프 수집 (미포함)

Memoryze: http://www.mandiant.com/products/free_software/memoryze/, 메모리 덤프 수집 (미포함)

Doskey: 윈도우 기본 내장, CMD 사용 히스토리 확인

Pclip: http://unxutils.sourceforge.net/, 클립 보드 사용 내용 확인

PSloglist: http://technet.microsoft.com/en-us/sysinternals/bb897544, 이벤트 로그 확인

Wevtutil: 윈도우 기본 내장(비스타 이후), 이벤트 로그 확인

Vssadmin: 윈도우 기본 내장, VVS 관리

Hobocopy: https://github.com/candera/hobocopy/downloads, VVS를 이용한 파일 복사

Dd: http://www.chrysocome.net/dd, 디스크 이미지 저장

Disk2vhd: http://technet.microsoft.com/en-us/sysinternals/ee656415, 물리디스크 VPC이미지로 변환

Vmdk2vhd: http://vmtoolkit.com/files/default.aspx, Vmware이미지 VPC이미지로 변환 (미포함)

Dikspart: 윈도우 기본 내장, 디스크 관리 도구

VMware vCenter Converter Standalone: http://downloads.vmware.com/d/info/infrastructure_operations_management/vmware_vcenter_converter_standalone/5_0, 가상이미지/물리이미지를 Vmware 이미지로 변환 (미포함)

Mbr: http://www.gmer.net/, MBR 영역 검사

Fixmbr: 윈도우 기본 내장(복구 모드), MBR 영역 복구

MPSReport: http://www.microsoft.com/download/en/details.aspx?id=24745, 윈도우 장애 로그 수집 도구 (미포함)

Psexec: http://technet.microsoft.com/en-us/sysinternals/bb897553, 원격 명령 실행

Netcat: http://netcat.sourceforge.net/, 네트워크 연결 도구 (미포함)

FPS: http://sourceforge.net/projects/windowsir/files/, 포랜식 자료 수집 도구

휘발성 데이터

휘발성 데이터는 시스템 문제 발생시 시스템에 동작하던 상태, 즉 저장되지 않은 증거 자료를 얘기한다. 예로 화면에 나타난 오류 메시지, 이 역시 시스템이 재시작하면, 해당 오류 화면은 사라지게 된다. 물론 해당 오류 메시지를 저장한 로그 데이터에서 해당 메시지를 재확인할 수 있을 것이다. 하지만, 이는 시스템을 분석을 통해 확인한 것으로, 로그 데이터가 존재하지 않을 수도 있고, 단지 메모리에 임시 저장해 놓은 저장되지 않는 로그형일 수도 있다는 것이다. 그리고 해당 내용을 분석자가 분석 중 증거 자료에서 누락시킬 수도 있다는 점을 감안한다면, 문제 발생 당시의 상태를 저장하는 작업이 얼마나 중요한지 알 수 있을 것이다.

또, 여기서 얘기하는 휘발성 데이터는 일반적인 내용이며, 각 상황에 따라 더 많은 자료를 수집할 수도 있고 더 적은 자료를 수집할 수도 있다.

그리고 휘발성 데이터 수집은 GUI 도구보다는 CLI를 통해 수집하기를 권장한다. 시스템에서 수집이 필요한 데이터를 단시간에 수집하기 위해서는 GUI로 하나하나 확인하고 수집하는 것은 그만큼 많은 시간을 허비하고 데이터가 변형될 가능성이 높아지기 때문에 사전에 미리 수집한 데이터 항목을 만들고 해당 데이터를 신속히 수집해야 한다(전부 수집이 어렵다면, 반드시 필요하다고 생각되는 휘발성 데이터만이라도 수집해야 한다).

시스템 이름

현재 분석하는 시스템의 호스트 이름을 확인하는 것으로, 분석에 가장 기본적이면서 여러 케이스를 진행 시 분류의 기준이 될 수 있다. 파일 이름 등을 호스트 명으로 하여 구분을 쉽게 하는 것도 또 다른 방법일 것이다.

컴퓨터 이름은 환경 변수로 %Computername%이다. 이는 여러 분석을 진행해야 하는 케이스의 분류 용도로도 사용할 수 있다. 만약 컴퓨터 이름을 수집하지 않으면, 어떤 대상에서 분석된 결과인지 차후 확인이 어려워진다. 각 분석 분류의 기본 정보이고 쉽게 확인할 수 있는 만큼 분석 진행 시 함께 수행하도록 하자

명령 프롬프트창(Cmd.exe)에 Hostname 명령을 통해 확인할 수 있다. 따라서 아래 명령을 이용하여 컴퓨터 이름으로 파일명을 생성하면서, 해당 파일 안에 시스템이름을 기입한다.

Hostname >> %computername%.txt

[그림 ] 컴퓨터 이름과 이를 표시하는 환경 변수 사용

-박스시작-

시스템 환경 변수

환경 변수는 시스템 변수와 사용자 변수로 나누어지는데, 시스템 변수는 시스템 전체 환경에 적용되며, 관리자만이 수정할 수 있다. 그리고 사용자 필요에 따라 해당 환경 변수를 만들 수 있는데, 내 컴퓨터의 속성에 들어가 고급 탭 에서 환경 변수를 오픈하여, 시스템 변수 및 사용자 변수를 추가할 수 있다.

[그림 ] 시스템 환경 설정

그리고 현재 설정된 변수값을 확인하려면 명령 프롬프트상에서 Set 명령을 이용하면 된다.

[그림 ] 현재 시스템에 등록된 환경 변수

-박스종료-

시스템 시간

시스템에 자료를 수집을 시작한 시간으로, 차후 분석을 진행할 때 중요한 기준점이 된다.

역분석 특성상 시간이라는 관점은 매우 중요하게 작용한다. 모래밭에서 찾을 수 있는 바늘의 위치를 알려주는 것만큼 시간은 분석을 원활하게 만들고 분석된 내용을 시간 흐름으로 정리할 수 있도록 도와준다.

DateTime 명령을 이용하여 현재 시스템 날짜와 시간을 기록할 수 있다.

Date /t & time /t

[그림 ] 현재 날짜와 시간을 화면에 출력한다

디스크 정보 수집

현재 연결되어 사용되는 디스크 정보를 확인해야 한다. 만약 이동형 디스크를 연결하였거나 네트워크 드라이브로 연결하여 사용 중인 경우, 이를 통해서 확인하여 중요한 조작 증거로 활용할 수 있다.

단 윈도우에서는 기본적으로 CLI를 통해 한번에 출력해주는 도구를 제공하지 않는다. 다행히 C#코드를 이용해 간편히 프로그램을 만들 수 있으니 프로그램 만들어 보자. 이 프로그램은 C#라이브러리인 System.IO의 DriverInfo를 통해 디스크 정보를 가져오는 간단한 프로그램이다. 1부에서도 언급하였듯이 앞으로도 필요에 따라 편리하게 이용할 수 있는 도구 개발도 함께 이해하며 진행하도록 하겠다.

di.cs
using System;

using System.IO;

class
Di

{

public
static
void Main()

{

DriveInfo[] all = DriveInfo.GetDrives();

foreach (DriveInfo d in all)

{

Console.WriteLine(“드라이브 {0}”, d.Name);

Console.WriteLine(” 타입: {0}”, d.DriveType);

if (d.IsReady == true)

{

Console.WriteLine(” 볼륨이름: {0}”, d.VolumeLabel);

Console.WriteLine(” 파일시스템: {0}”, d.DriveFormat);

Console.WriteLine(” 사용가능크기: {0, 15} 바이트”, d.TotalFreeSpace);

Console.WriteLine(” 전체크키: {0, 15} 바이트 “, d.TotalSize);

Console.WriteLine(“”);

}

}

}

}

[예제 1] 디스크 정보를 확인하는 C# 프로그램

위 내용을 컴파일한 후 실행하면 다음과 같이 현재 디스크 정보를 확인할 수 있다.

[그림 ] 현재 네트워크 드라이브가 설정되어 있음을 확인할 수 있다

-박스시작-

시스템 정보 수집

Sysinternals에서 제공하는 Psinfo(http://technet.microsoft.com/en-us/sysinternals/bb897550)는 시스템의 기본 정보는 물론, 설치 소프트웨어까지 한번에 확인할 수 있는 유용한 도구이다.

이 도구는 몇가지 확장 옵션을 제공하는데, 다음과 같다(유용한 옵션을 굵게 표시하였다).

-u: 원격 컴퓨터 정보 수집일 경우 유저명을 입력한다.

-p : 원격지인 경우 유저명 입력한다.

-h: 설치된 핫픽스(Hotfix)를 표시한다.

-s: 설치된 소프트웨어를 표시한다.

-d: 디스크 볼륨 정보를 표시한다.

-c: CSV형식으로 화면에 표시한다.

-t: CSV형식으로 표시할 때 기본 구분인 콤마를 다른것으로 지정할 수 있다.

이를 이용하여 정보를 시스템 기본 정보를 수집하여 보자. 추가로 원격지 검색시 \\*로 진행하면, 현재 도메인의 전체 컴퓨터에 대해 정보를 수집하게 된다. 그럼 아래와 같은 정보를 간단히 생성할 수 있다.

C:\>psinfo -s -h -d

PsInfo v1.77 – Local and remote system information viewer

Copyright (C) 2001-2009 Mark Russinovich

Sysinternals – www.sysinternals.com

System information for \\JUHAN-1:

Uptime: 0 days 1 hour 30 minutes 59 seconds

Kernel version: Microsoft Windows XP, Uniprocessor Free

Product type: Professional

Product version: 5.1

Service pack: 3

Kernel build number: 2600

Registered organization:

Registered owner: juhan

IE version: 6.0000

System root: C:\WINDOWS

Processors: 1

Processor speed: 2.6 GHz

Processor type: Intel(R) Core(TM) i5 CPU 760 @

Physical memory: 512 MB

Video driver: VirtualBox Graphics Adapter

Volume Type Format Label Size Free Free

C: Fixed NTFS 9.99 GB 1.04 GB 10.4%

D: CD-ROM 0.0%

E: Fixed NTFS ? ?? 19.99 GB 7.55 GB 37.8%

Z: Remote VBoxSharedFolderFS VBOX_?? 315.59 GB 158.03 GB

50.1%

Installed HotFix ß 현재 컴퓨터에 설치된 패치 정보를 확인 할 수 있다.

2011-09-29 Windows XP? ???? (KB898461)

2011-06-20 Q147222

n/a Internet Explorer – SP3

Applications: ß 현재 컴퓨터에 설치된 프로그램을 확인할 수 있다.

7-Zip 9.20

Adobe Flash Player 11 ActiveX 11.1.102.55

Adobe Flash Player 11 Plugin 11.1.102.55

Advanced Port Scanner v1.3

AhnLab Online Security

ClientKeeper KeyPro with E2E for 32bit

…중략

[실습 1] 현재 컴퓨터의 정보와 설치된 소프트웨어까지 확인 가능

-박스 종료-

로그인 유저

시스템이 부팅된 이후 로그인 되었던 사용자들에 대한 정보는 많은 정보를 제공한다. 더욱이 의심되는 로그인 유저의 로그인 시간도 확인할 수 있어, 이를 통해 분석의 큰 실마리를 잡을 수도 있을 것이다.

유심히 살펴보아야 할 내용은 다음과 같다

로그인 경로 원격/로컬인지
로그인 계정 정상적인 계정인지
로그인한 시간 이후 정당한 로그인인지 확인을 위해 필요하다.
사용한 프로세스 비정상적인 프로세스가 있는지, 로그인하여 활동한 내용 확인

[표 1] 사용자 확인시 체크할 내용

Sysinternals 에서 좋을 도구를 제공해 해당 도구를 이용 하여 로그인 하였던 사용자들에 대해 확인하도록 하자. PsLoggedon, PsSession로 확인할 수 있는데, 도구마다 수집하는 방식이 약간 다르게 동작한다. 그럼 먼저 PsLoggedon 도구 먼저 확인해 보자.

PsLoggedon

PsLoggedon를 Ollydbg로 분석해 보면, 레지스트리의 HKEY_USERS를 조사하여 로컬 로그인 한 사용자와 원격으로 리소스에 접근하고 있는 사용자 정보(명령 프롬프트에서 Net session)를 확인할 수 있다.

68 506C4200 PUSH 426C50 ; UNICODE “Connecting to Registry of %s…”

E8 E42D0000 CALL 00404A3B ; PsLogged.00404A3B

E8 4A320000 CALL 00404EA6 ; PsLogged.00404EA6

83C0 20 ADd EAX,20

50 PUSH EAX

E8 E5310000 CALL 00404E4A ; PsLogged.00404E4A

83C4 0C ADd ESP,0C

8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]

50 PUSH EAX ; phandle

68 03000080 PUSH 80000003 ; hKey = HKEY_USERS

57 PUSH EDI ; ComputerName

FF15 3C404200 CALL DWORD PTR DS:[42403C] ; RegConnectRegistryW

68 A86B4200 PUSH 426BA8 ; UNICODE ”

….중략

FF15 48404200 CALL DWORD PTR DS:[424048] ; ADVAPI32.LookupAccountSidW

85C0 TEST EAX,EAX

0F84 C1000000 JE 0040200A ; PsLogged.0040200A

385C24 13 CMP BYTE PTR SS:[ESP+13],BL

74 13 JE SHORT 00401F62 ; PsLogged.00401F62

3BF3 CMP ESI,EBX

75 13 JNZ SHORT 00401F66 ; PsLogged.00401F66

68 446A4200 PUSH 426A44 ; UNICODE “Users logged on locally:

…중략

[실습 2] Ollydbg로 확인한 PsLoggedon.exe의 로그인 여부를 조사하는 API

Psloggedon을 실행하면, 아래와 같이 원격지와 로컬에서 로그인한 정보를 확인할 수 있다.

[그림 ] 현재 로그인한 사용자 정보 확인

-박스시작-

EULA

휘발성 데이터 수집시 앞서 얘기한 것과 같이 GUI가 아닌 CLI 기반으로 수집을 진행해야 한다. 그리고 이러한 데이터 수집에 Sysinternal Tool이 많이 사용된다.

그런데 Sysinternal Tool의 경우 처음 실행할 때 해당 도구 사용에 대한 허용을 받게 된다. 이를 EULA(End-User License Agreement)라 하며, 사용 중 발생할 수 있는 장애 및 지원사항 등에 동의를 구하는 창을 생성하여 승인 후 사용하도록 하고 있다. 하지만 이는 자료 수집 작업에 방해가 된다.

[그림 ] EULA 승인을 기다리는 화면

이 창을 제거하기 위해서는 명령어 파라미터에 /accepteula를 추가하거나 레지스트리에 키를 미리 만들어 놓고 입력하여, 윈도우 창이 생성된 자동적으로 진행 하지 못하는 것을 방지 할 수 있다.

-박스종료-

Logonsessions

Logonsessions는 LsaEnumerateLogonSessions에 확인하여 현재 활성화 되어 있는 세션의 LUID
확인하여,
LsaGetLogonSessionData를 통해 정보를 수집하게 된다.

8D4C24 28 LEA ECX,DWORD PTR SS:[ESP+28]

51 PUSH ECX

8D5424 28 LEA EDX,DWORD PTR SS:[ESP+28]

52 PUSH EDX

895C24 2C MOV DWORD PTR SS:[ESP+2C],EBX

895C24 30 MOV DWORD PTR SS:[ESP+30],EBX

E8 A4060000 CALL 004030C6 ; <JMP.&Secur32.LsaEnumerateLogonSessions>

3BC3 CMP EAX,EBX

74 30 JE SHORT 00402A56 ; logonses.00402A56

.중략

8B5424 28 MOV EDX,DWORD PTR SS:[ESP+28]

8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]

2BC7 SUB EAX,EDI

51 PUSH ECX

8D44C2 F8 LEA EAX,DWORD PTR DS:[EDX+EAX*8-8]

50 PUSH EAX

895C24 1C MOV DWORD PTR SS:[ESP+1C],EBX

E8 37060000 CALL 004030C0 ; <JMP.&Secur32.LsaGetLogonSessionData>

8BF0 MOV ESI,EAX

3BF3 CMP ESI,EBX

74 3C JE SHORT 00402ACB ; logonses.00402ACB

68 E0ED4200 PUSH 42EDE0

E8 CC1E0000 CALL 00404965 ; logonses.00404965

83C4 04 ADd ESP,4

81FE 220000C0 CMP ESI,C0000022

75 13 JNZ SHORT 00402AB7 ; logonses.00402AB7

57 PUSH EDI

68 B8ED4200 PUSH 42EDB8 ; UNICODE “[%d] Access denied

….중략

68 E8EB4200 PUSH 42EBE8 ; UNICODE “[%d] Logon session %08x:%08x:

E8 8A1C0000 CALL 00404965 ; logonses.00404965

83C4 14 ADd ESP,14

3BEB CMP EBP,EBX

74 05 JE SHORT 00402CE7 ; logonses.00402CE7

8B45 00 MOV EAX,DWORD PTR SS:[EBP]

EB 02 JMP SHORT 00402CE9 ; logonses.00402CE9

33C0 XOR EAX,EAX

50 PUSH EAX

68 BCEB4200 PUSH 42EBBC ; UNICODE ” User name: %s ß 사용자 이름

E8 711C0000 CALL 00404965 ; logonses.00404965

8B5424 1C MOV EDX,DWORD PTR SS:[ESP+1C]

8B42 20 MOV EAX,DWORD PTR DS:[EDX+20]

50 PUSH EAX

68 90EB4200 PUSH 42EB90 ; UNICODE ” Auth package: %s ß 인증 유형

E8 5F1C0000 CALL 00404965 ; logonses.00404965

57 PUSH EDI

68 64EB4200 PUSH 42EB64 ; UNICODE ” Logon type: %s ß 로그인 유형

E8 541C0000 CALL 00404965 ; logonses.00404965

8B4C24 2C MOV ECX,DWORD PTR SS:[ESP+2C]

8B51 28 MOV EDX,DWORD PTR DS:[ECX+28]

52 PUSH EDX

68 38EB4200 PUSH 42EB38 ; UNICODE ” Session: %d ß 세션 정보

E8 421C0000 CALL 00404965 ; logonses.00404965

8B4424 3C MOV EAX,DWORD PTR SS:[ESP+3C]

50 PUSH EAX

68 0CEB4200 PUSH 42EB0C ; UNICODE ” Sid: %s

…중략

[실습 3] Ollydbg로 확인한 Logonsessions.exe의 로그인 여부를 조사하는 API

Logonsessions의 장점은, /p 옵션을 통해 로그인한 세션에서 사용하는 프로세스도 확인할 수 있다는 것이다.

[그림 ] 로그인 사용자의 프로세스 정보를 확인할 수 있다

사용 중인 프로세스 리스트

현재 시스템에서 동작중인 프로세스 확인하는 것으로 악의적인 프로세스가 있는지를 확인하는 조사 리스트에 가장 기본이 되는 리스트이다. 자료 수집에 중요하게 확인하여야 할 정보는 아래와 같다.

실행파일 경로 정상적인 실행 경로에 존재하는지 확인
실행시 사용한 파라미터 이상한 파라미터 값을 가진 프로세스가 존재하는지 확인
실행파일 실행한 사용자 실행 주체가 정상 사용자인지 확인
실행 시간 실행 가능성이(정당한) 있는 시간인지 확인
로드한 파일 이상한 파일을 로드한 것이 있는지 확인
사용중인 네트워크 리소스 비정상적인 네트워크 리소스를 사용하고 있는지 확인

[표] 프로세스 리스트에서 체크해야 할 내용

위 내용들을 확인하기 위해 주로 사용하는 프로그램 중 TasklistTlist, Pslist가 있는데 Tasklist는 Windows XP에 시스템에 기본적으로 탑재되어 있고 가장 많은 정보를 확인할 수 있다.

프로세스 리스트 확인은 기호에 맞는 프로그램을 사용하기 바란다. 아래 화면은 Tasklist 명령을 이용하여 현재 실행중인 프로세스 리스트를 확인한 내용이다.

[그림 ] 기본 내장된 Tasklist

Tlist 명령은 Windbg 설치시 함께 설치는 프로그램으로 Tree 리스트로 보여줄 수 있는 옵션이 있다. 주로 사용하는 옵션으로는 Tree 리스트로 보여주는 –t와 프로세스별 자세한 정보를 보여주는 –v가 있다.

[그림 ] Windbg에 내장된 Tlist

트리형은 프로세스간 관계 이해를 쉽게 확인할 수 있게 해준다. -v 옵션은 실행 인자를 확인할 있어, Tasklist 명령과 많은 차이가 나지 않지만, 프로세스 실행 계정 정보를 확인할 수 없는 점이 아쉽다.

[그림 ] 실행 명령 인자를 함께 확인할 수 있다

Pslist는 Sysinternals사가 제공하는 도구로서, 실행중인 프로세스 리스트를 확인 할 수 있는 유용한 도구다. Pslist 역시 다양한 옵션을 많이 제공하는데, 실행중인 스레드를 확인할 수 있는 -x 옵션이 인상적이다.

사용 중인 서비스 리스트

악의적인 용도로 서비스로 등록하여 자동 실행되도록 구성한 후 백도어 용도 등으로 사용되기도 한다. 주요 확인 리스트는 서비스와 프로세스간의 큰 차이가 없기 때문에, 프로세스의 주요 확인 사항과 동일하다.

따라서 전체 서비스 리스트를 확인하여 이상한 서비스가 실행 중인지 확인되지 않은 서비스가 설치된 건 없는지 확인해야 한다. 이는 Sysinternals에서 제공하는 Psservice를 통해서 확인할 수 있다.

[그림 ] Psservice를 이용해 확인한 서비스 리스트

PsService는 종속 서비스 6가지 정도의 옵션을 제공하는데, 아무 옵션도 주지 않았을 때는 query옵션으로 동작하며, depend 옵션을 통해 해당 서비스가 사용되는 종속 서비스를 확인할 수 있다.

[그림 ] 관련 종속 서비스만 확인이 가능하다

사용중인 핸들

프로세스 리스트보다 더 중요한 정보로, 각 프로세스들이 사용하고 있는 핸들 리스트를 확인해 볼 수 있다.

핸들에는 다양한 정보를 포함한다. 윈도우의 모든 활동이 핸들을 얻어서 진행하므로, 방대한 정보를 가지고 있다고 볼 수 있다.

여기에도 Sysinternals사가 제공하는 도구가 사용되는데, Process explorer에서 확인 가능한 Handle을 별도의 CLI 도구로 제공하여 해당 정보만 확인할 수 있는 도구을 제공한다. 기본적인 옵션으로 실행할 경우 해당 프로세스의 Section과 File 정보를 확인할 수 있고, 그 외 전체 -a 옵션을 주었을 경우 아래와 같은 추가적인 정보를 확인 할 수 있다.

Desktop, Directory, Event, File, IoCompletion, Job, Key, KeyedEvent, Mutant, Port, Process, Section, Semaphore, SymbolicLink, Thread, Timer, Token, WaitablePort, WindowStation, WmiGuid

전체 내용은 많은 값을 포함하므로, -a 옵션는 필요에 따라서 사용하기 바란다.

[그림 ] 현재 handle이라는 문구가 들어간 모든 정보 출력

이 핸들값은 이후 생성하는 메모리 덤프에서도 확인할 수 있으니, 메모리에서 확인하는 부분은 다시 진행하도록 하겠다.

사용 중인 Dll

Dll은 시스템을 감염시키는 Dll 인젝션으로 악성코드에서 흔히 사용되는 기법이다. 본 리스트를 확인하여, 의심되는 Dll 파일을 확인할 수 있다. 대다수의 도구가 Sysinternals에서 개발한 도구인 ListDll을 이용하여, 각 프로세스별로 사용 중인 Dll을 확인 할 수 있다.

[그림 ] 현재 프로세스에서 사용중인 Dll

변조된 시스템 파일

윈도우 운영체제는 현재 시스템 실행 파일과 Dll에 대해 온라인으로 디지털 사인을 통해 관리하는데, 이 검증값을 온라인으로 확인해 마이크로소프트에서 제공하는 파일 중 신뢰할 수 없는 검증값을 가진 파일들을 찾아주게 된다. 이를 통해 마이크로소프트에서 기본적으로 제공하는 파일 중 변조 의심이 되는 시스템 파일들을 찾아 낼 수 있을 것이다.

Sysinternal에서 제공하는 Sigcheck 도구를 이용하여 시스템파일이 위치한 디렉토리의 파일들을 검사할 수 있다.

[그림 ] 검증값을 확인하여 이상이 있는 경우 해당 파일을 표시

위와 같이 Windows 디렉토리에 실행 파일들을 확인할 수 있으며, 그 외 옵션들은 아래와 같은 의미를 가진다(유용한 옵션을 굵게 표시하였다).

-a: 모든 정보를 표시

-c: 사전에 다운로드한 서명 파일을 이용

-e: 실행 가능 파일들만 검사

-h: 파일의 해시값을 표시

-I: 서명자의 이름을 표시

-m: Dump manifest

-n: 파일버전에 대한 정보만 표시

-q: 배너 없이 진행

-r: 인증 취소 여부를 확인

-s: 하위 디렉토리도 검사

-u: 서명되지 않은 파일들만 표시

-v: CSV형으로 출력

숨긴 파일

여러분이 침입자라면, 자신과 관련된 흔적들을 보이지 않게 숨기고 싶지 않을까? 따라서 현재 시스템이 가동 중일 때 숨김 파일로 생성된 파일 리스트를 확인할 필요가 있다.

Foundstone에서 제공하는 Hfind 명령를 이용하여, 숨김 속성의 파일에 대해 확인할 수 있다.

[그림 ] 숨김 속성의 파일 검사

숨김 파일 중 일반 숨김 파일과 NTFS에서 제공하는 ADS(Alternate data streams)라는 숨김 파일도 존재하는데 이 숨김 파일은 생각보다 강력하다(실제 악성코드에서 이를 이용한 적도 있다). 뭔가 이유가 있어 만들어 놓은 기능인데, 실제 악의적인 용도로 많이 사용된다.

따라서 숨김 파일과 ADS 파일 리스트를 수집하여, 의심되는 파일이 존재하는지 확인하여야 한다.

Foundstone에서 제공하는 SFind, 혹은 Sysinternals에서 제공하는 Streams 도구를 통해 확인할 수 있다.

[그림 ] ADS의 파일 구조

이러한 ADS로 생성된 파일은 기본적으로 리스트에 나타나지 않으므로, 아래와 같이 Streams, Sfind를 이용하여 파일 존재여부를 확인할 수 있다.

[그림 ] ADS 파일 검사

비스타 이후부터는 기본 명령인 Dir에 ADS형 파일을 확인할 수 있도록 /r 옵션이 추가되어, 이를 통해 간단히 확인할 수 있다.

[그림 ] 비스타 이후부터 DIR 명령을 이용하여 ADS 파일을 확인할 수 있다

-박스시작-

ADS(Alternate data streams) 파일 생성하기

ADS 파일은 파일 이름에 : 를 추가하여 생성할 수 있는데, 대체 파일을 생성하는 방식이라고 생각하면 조금 쉽게 생각할 수 있다. 아래 명령을 통해 ADS 파일을 생성할 수 있다.

type c:\WINDOWS\system32\cmd.exe > ads.txt:cmd.exe

위 명령을 실행하게 되면, 실제 데이터는 ADS 파일인 ads.txt:cmd.exe에 저장되고, 모체인 ads.txt는 껍데기만이 생성되게 된다.

[그림 ] 생성한 ADS 파일, ADS Spy를 통해 숨겨진 파일을 확인할 수 있다

이를 이용하여, 다음과 같은 방식으로 악용할 수 있다.

악성 파일을 특정 파일에 ADS 파일로 생성한 후, 실행 명령을 통해 실행하는 방식을 사용하게 된다.

만약 계산기에 대체 스트림 파일을 생성한 후, 해당 파일을 시작
à
실행에서 Start 명령을 통해 실행할 수 있는데, 윈도우 2000에서는 이렇게 실행된 파일을 작업관리자에서 확인해 보면 단순히 원본 파일인 Calc.exe가 실행중인 것으로 나와 프로세스를 숨기는 데도 일조했다. 다행이 윈도우 XP 서비스 팩 이후부터 정확한 프로세스 명으로 표기로 변경되어 이를 구분할 수 있게 되어, ADS를 이용한 파일을 찾기가 어려운 부분을 조금은 해소해 주었다.

-박스종료-

최근에 접근한 파일

문제 발생 시점 당시 수정되었거나 생성, 실행한 파일을 확인할 수 있다면, 어떠한 행위를 하였는지 역분석이 용의해진다. 이는 Foundstone에서 제공하는 Afind를 이용하여 효과적으로 확인할 수 있다. 특정 날짜를 지정하면, 지정시간 이내의 파일을 보여주게 된다. 그 외 옵션들도 제공하므로 다양하게 활용할 수 있는 유용할 도구다.

단, 디스크 성능 향상을 위해 LastAccseeUpdate기능을 비활성화 하였을 경우 마지막 엑세스한 날짜는 확인할 수 없으므로 주의하기 바란다.

[그림 ] 최근 접근한 파일을 확인할 수 있는 Afind

-f: 마지막 수정일자를 보여줌

-s [초] –m [분] –h [시간] –d [날짜]: 지정한 시간 이내에 접근한 파일을 보여줌

-a [특정 날짜]: 지정한 시간 이후로 접근한 파일을 보여줌

-ns: 하위 디렉토리 포함

– or /: 추가 조건 지정

Afind의 내부 동작 방식은 FindFirstFile 함수를 이용하여 파일을 탐색과 필요한 시간값들을 가지고 오게 된다(마지막 접근한 시간, 수정 시간 등). 이렇게 나온 파일의 시간 값은 UTC(Coordinated Universal Time) 방식을 사용하기 때문에, 이를 FileTimeToLocalFileTime, FileTimeToSystemTime 함수를 이용해서 시스템 시간으로 변환하고, 이를 CompareFileTime 함수를 이용해서 비교하게 되는 구조 이다. 아래 Ollydbg로 확인한 해당 내용과 관련된 어셈블리 코드이다. 여러분도 확인해 보기 바란다.

00401450 /$ 55 PUSH EBP

00401451 |. 8BEC MOV EBP,ESP

00401453 |. 81EC 3C0F0000 SUB ESP,0F3C

00401459 |. 53 PUSH EBX

0040145A |. 8B1D 10B04000 MOV EBX,DWORD PTR DS:[40B010] ; kernel32.GetCurrentDirectoryA

00401460 |. 56 PUSH ESI

00401461 |. 8D85 ACFCFFFF LEA EAX,DWORD PTR SS:[EBP-354]

00401467 |. 57 PUSH EDI

00401468 |. 50 PUSH EAX ; /Buffer

00401469 |. 68 F4010000 PUSH 1F4 ; |BufSize = 1F4 (500.)

0040146E |. C645 FF 01 MOV BYTE PTR SS:[EBP-1],1 ; |

00401472 |. FFD3 CALL EBX ; \GetCurrentDirectoryA

00401474 |. 80A5 FBFCFFFF>AND BYTE PTR SS:[EBP-305],0

0040147B |. 8D85 ACFCFFFF LEA EAX,DWORD PTR SS:[EBP-354]

00401481 |. 50 PUSH EAX

00401482 |. 68 28D14000 PUSH 40D128 ; ASCII ”

%-79s”

00401487 |. E8 7A170000 CALL 00402C06 ; Afind.00402C06

0040148C |. 59 POP ECX

0040148D |. 8D85 A0FEFFFF LEA EAX,DWORD PTR SS:[EBP-160]

00401493 |. 59 POP ECX

00401494 |. 50 PUSH EAX ; /pFindFileData

00401495 |. 68 24D14000 PUSH 40D124 ; |FileName = “*.*”

0040149A |. FF15 08B04000 CALL DWORD PTR DS:[40B008] ; \FindFirstFileA

004014A0 |. 8945 E8 MOV DWORD PTR SS:[EBP-18],EAX

004014A3 |> F685 A0FEFFFF>/TEST BYTE PTR SS:[EBP-160],10

004014AA |. 74 56 |JE SHORT 00401502 ; Afind.00401502

004014AC |. 80BD CCFEFFFF>|CMP BYTE PTR SS:[EBP-134],2E

004014B3 |. 74 4D |JE SHORT 00401502 ; Afind.00401502

004014B5 |. 0FBE85 CCFEFF>|MOVSX EAX,BYTE PTR SS:[EBP-134]

004014BC |. 3D 2E2E0000 |CMP EAX,2E2E

004014C1 |. 74 3F |JE SHORT 00401502 ; Afind.00401502

004014C3 |. 807D 08 00 |CMP BYTE PTR SS:[EBP+8],0

004014C7 |. 74 39 |JE SHORT 00401502 ; Afind.00401502

004014C9 |. 8B35 0CB04000 |MOV ESI,DWORD PTR DS:[40B00C] ; kernel32.SetCurrentDirectoryA

004014CF |. 8D85 CCFEFFFF |LEA EAX,DWORD PTR SS:[EBP-134]

004014D5 |. 50 |PUSH EAX ; /Path

004014D6 |. FFD6 |CALL ESI ; \SetCurrentDirectoryA

004014D8 |. FF75 1C |PUSH DWORD PTR SS:[EBP+1C]

004014DB |. C645 FF 01 |MOV BYTE PTR SS:[EBP-1],1

004014DF |. FF75 18 |PUSH DWORD PTR SS:[EBP+18]

004014E2 |. FF75 14 |PUSH DWORD PTR SS:[EBP+14]

004014E5 |. FF75 10 |PUSH DWORD PTR SS:[EBP+10]

004014E8 |. FF75 0C |PUSH DWORD PTR SS:[EBP+C]

004014EB |. FF75 08 |PUSH DWORD PTR SS:[EBP+8]

004014EE |. E8 5DFFFFFF |CALL 00401450 ; Afind.00401450

004014F3 |. 83C4 18 |ADd ESP,18

004014F6 |. 68 30D14000 |PUSH 40D130 ; ASCII “..”

004014FB |. FFD6 |CALL ESI

004014FD |. E9 A3010000 |JMP 004016A5 ; Afind.004016A5

00401502 |> 6A 03 |PUSH 3

00401504 |. BF 34D14000 |MOV EDI,40D134 ; ASCII “..”

00401509 |. 8DB5 CCFEFFFF |LEA ESI,DWORD PTR SS:[EBP-134]

0040150F |. 59 |POP ECX

00401510 |. 33C0 |XOR EAX,EAX

00401512 |. F3:A6 |REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS>

00401514 |. 74 05 |JE SHORT 0040151B ; Afind.0040151B

00401516 |. 1BC0 |SBB EAX,EAX

00401518 |. 83D8 FF |SBB EAX,-1

0040151B |> 85C0 |TEST EAX,EAX

0040151D |. 0F84 82010000 |JE 004016A5 ; Afind.004016A5

00401523 |. 6A 02 |PUSH 2

00401525 |. BF 38D14000 |MOV EDI,40D138

0040152A |. 8DB5 CCFEFFFF |LEA ESI,DWORD PTR SS:[EBP-134]

00401530 |. 59 |POP ECX

00401531 |. 33C0 |XOR EAX,EAX

00401533 |. F3:A6 |REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS>

00401535 |. 74 05 |JE SHORT 0040153C ; Afind.0040153C

00401537 |. 1BC0 |SBB EAX,EAX

00401539 |. 83D8 FF |SBB EAX,-1

0040153C |> 85C0 |TEST EAX,EAX

0040153E |. 0F84 61010000 |JE 004016A5 ; Afind.004016A5

00401544 |. 8D45 E0 |LEA EAX,DWORD PTR SS:[EBP-20]

00401547 |. 50 |PUSH EAX ; /pLocalFileTime

00401548 |. 8D85 ACFEFFFF |LEA EAX,DWORD PTR SS:[EBP-154] ; |

0040154E |. 50 |PUSH EAX ; |pFileTime

0040154F |. FF15 04B04000 |CALL DWORD PTR DS:[40B004] ; \FileTimeToLocalFileTime

00401555 |. 85C0 |TEST EAX,EAX

00401557 |. 0F84 69010000 |JE 004016C6 ; Afind.004016C6

0040155D |. 8D45 EC |LEA EAX,DWORD PTR SS:[EBP-14]

00401560 |. 50 |PUSH EAX ; /pSystemTime

00401561 |. 8D45 E0 |LEA EAX,DWORD PTR SS:[EBP-20] ; |

00401564 |. 50 |PUSH EAX ; |pFileTime

00401565 |. FF15 A8B04000 |CALL DWORD PTR DS:[40B0A8] ; \FileTimeToSystemTime

0040156B |. 85C0 |TEST EAX,EAX

0040156D |. 0F84 53010000 |JE 004016C6 ; Afind.004016C6

00401573 |. 803D 40D04000>|CMP BYTE PTR DS:[40D040],0

0040157A |. 8D45 10 |LEA EAX,DWORD PTR SS:[EBP+10]

0040157D |. 50 |PUSH EAX ; /pFileTime2

0040157E |. 0F84 9D000000 |JE 00401621 ; |Afind.00401621

00401584 |. 8B35 28B04000 |MOV ESI,DWORD PTR DS:[40B028] ; |kernel32.CompareFileTime

0040158A |. 8D45 E0 |LEA EAX,DWORD PTR SS:[EBP-20] ; |

0040158D |. 50 |PUSH EAX ; |pFileTime1

0040158E |. FFD6 |CALL ESI ; \CompareFileTime

00401590 |. 83F8 01 |CMP EAX,1

00401593 |. 74 08 |JE SHORT 0040159D ; Afind.0040159D

[실습 4] Afind 내부 동작 분석

Filetime에 왜 이런 변환 과정이 필요한지 이해를 돕기 위해 파일 시간을 가져올 수 있는 간단한 프로그램을 만들어 이해해 보도록 하자.

getfiletime.cpp
#include “stdio.h”

#include “windows.h”

int GetFileTime(char *szFileName);

int main(int argc,char *argv[])

{

if(argc!=2) printf(“Usage: getfiletime filename\n”);

else GetFileTime(argv[1]);

return 0;

}

// 입력한 인자와 같인 파일 이름의 파일 시간값을 가져와 출력한다.

int GetFileTime(char *szFileName)

{

SYSTEMTIME st_systemTime;

FILETIME ft_localTime;

FILETIME lpCreationTime;

HANDLE hFile;

long retval;

hFile=CreateFile(szFileName,

GENERIC_READ,

NULL,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL);

if(hFile==INVALID_HANDLE_VALUE)

{

printf(“Open File failed!\n”,GetLastError());

CloseHandle(hFile);

return 1;

}

retval=GetFileTime(hFile,&lpCreationTime,NULL,NULL);

if(retval)

{

// CreationTime출력

FileTimeToLocalFileTime(&lpCreationTime,&ft_localTime);

FileTimeToSystemTime(&ft_localTime,&st_systemTime);

printf(“CreationTime_FileTime:%d\n”,

lpCreationTime);

printf(“CreationTime_LocalFileTime:%d \n”,

ft_localTime);

printf(“CreationTime_SystemTime:%d \n”,

st_systemTime

);

CloseHandle(hFile);

return 0;

}

CloseHandle(hFile);

return 0;

}

[예제 18-2] NT 시간 변환 관련 C++ 프로그램

위 프로그램 샘플을 컴파일 하고 Ollydbg와 함께 실행하여 각 함수에 브레이크 포인트(F2키)를 걸어서 확인해 보자. 아래와 같이 파일에 접근한 시간과 생성일자, 수정일 날짜를 확인할 수 있을 것이다.

이렇게 나타나는 원인은 아래와 같이 Filetime 과 Systemtime의 구조체 차이에 있다. Filetime은 1601년 1월 1일(UTC)로부터 100 나노초의 간격으로 증가한 값으로 64비트의 형태이다(NT시간 표준으로 윈도우 운영체제의 많은 시간 표시가 이를 기준으로 한다).

따라서 이 값을 우리가 확인할 수 있는 값으로 변환이 필요하다. 그럼 Winnt.h에서 Filetime과 Systemtimed의 구조체 정보를 확인해 보도록 하자.

//

// File System time stamps are represented with the following structure:

//

typedef struct
_FILETIME {

DWORD dwLowDateTime; //하위 비트

DWORD dwHighDateTime; //상위 비트

} FILETIME, *PFILETIME, *LPFILETIME;

//

// System time is represented with the following structure:

//

typedef struct
_SYSTEMTIME {

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMilliseconds;

}

이 같은 값을 우리가 쉽게 알아볼 수 있는 값을 표시하기 위해 두 번의 보정 과정을 거친다고 생각하면 이해가 쉬울 것이다.

[그림 ] 빌드한 Getfiletime 실행 결과

-박스시작-

디스크 구성 도구 Fsutil

Fsutil은 엔지니어가 많이 접하기 어렵지만, 시스템 디스크 성능 향상을 위해 마이크로소프트에서 제공하는 몇가기 기능을 제공한다. 그 중 NTFS 파티션은 파일에 대한 접근 시간을 기록하는데, 이를 비활성화한다거나 디스크 관련 옵션을 조정할 수 있다. 이를 통해 디스크 성능 향상을 기대할 수 있다.

설정 가능한 옵션중 성능에 영향을 미치는 옵션들에 대해서 확인해 보자(비스타 기준). 그 외 기능들에 대해서도 확인해 보면 좋을 듯 하다.

DisableLastAccess: 마지막 엑세스날짜의 기록여부를 정한다.

Disable8dot3: 도스시절 사용한 파일 이름 표기 형식인 8.3 방식의 지원을 정한다.

MemoryUsage: Quota Event를 기록하거나, NTFS nonpage pool과 NTFS page pool 메모리 캐쉬를 여부를 정한다.

이 옵션들은 대용량 파일 서버용도, SQL 용도에서 비활성화 혹은 설정시 성능 향상을 기대할 수 있다. 위 설정들은 레지스트리를 직접 수정하여서도 변경이 가능하다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem

[그림 ] Filesystem 레지스트리 경로

-박스종료-

네트워크 인터페이스 정보

수집한 정보를 원격지로 옮기기 위해, VPN을 이용했다거나 네트워크 인터페이스에 특정값을 변경하는 등의 행위를 취할 수 있으므로 해당 정보를 수집하는 것도 잊어서는 안 된다. 또한 Promiscuous 모드가 활성화 되었는지, 수동으로 등록된 라우팅 테이블이 있는지, Hosts 파일을 조작하였는지를 확인해 네트워크 패킷 캡쳐/변경 여부도 체크하도록 하자.

먼저 IP 관련 정보는 윈도우 기본 내장 유틸리티인 Ipconfig를 통해 확인할 수 있다.

[그림 ] Ipconfig를 이용한 네트워크 정보 확인

라우팅 테이블 정보는 내부 기본 명령인 Route 명령을 통해 확인이 가능하다. 수동으로 입력한 라우팅 경로의 경우 Persistent Route에 표시된다.

[그림 ] Route를 이용하여 확인한 라우팅 테이블

이제 Promiscuous 모드를 확인하여야 하는데, Promqry.exe라는 도구를 사용하거나, Promiscdetect.exe라는 도구를 통해 현재 네트워크 패킷을 캡처하는지 확인할 수 있다.

[그림 ] 네트워크 스니핑 모드가 활성화 된 상태인지 확인

-박스시작-

네트워크 경로 추가

실제 업무를 하다 보면 생각보다 네트워크 경로 지정(라우트) 관련 내용을 네트워크에 많이 사용되므로, 기본적인 내용이지만 간단히 다루고 넘어가려고 한다.

모든 인터페이스는 기본 게이트웨이 경로를 가지고 있는데, 멀티 인터페이스 환경에서는 다중 게이트웨이 경로를 가지게 된다. 이때 기본 게이트웨이 경로만을 사용할 경우 문제가 되지 않지만, 기본 게이트웨이가 아닌 세컨드 게이트웨이의 네트워크 경로를 이용하고자 할 때, 네트워크 경로를 수동으로 추가해주는 작업이 필요하다.

그럼 가상의 상황을 만들어 보자

서버는 네트워크 인터페이스가 2개이고 2개는 각각 다른 네트워크 경로를 가지고 있다.

인터페이스 1(기본 게이트웨이 설정)

게이트웨이 IP 1.1.1.254 255.255.255.0

인터페이스 2

게이트웨이 IP 2.2.2.254 255.255.255.0

[그림 ] 서버에 네트워크가 2개인 상황

위와 같이 설정된 상황이라면, 2.2.2.0/24 영역을 제외하고는 모든 네트워크 경로가 1.1.1.254 게이트웨이를 통해서 나가게 된다. 이때 2.2.2.254 게이트웨이가 설정된 장비에 192.168.1.0/24 대역을 추가하였다면, 192.168.1.0/24는 2.2.2.254 게이트웨이로 지정해주는 작업을 수동으로 추가해 주어야 한다.

route add 3.3.3.0 255.255.255.0 2.2.2.254 –p

[그림 ] 라우팅 경로 추가

추가로 –p 옵션을 사용하면 재부팅 이후에도 수동으로 입력한 네트워크 경로를 유지하게 된다.

–p 옵션을 사용하지 않으면, 재부팅시 삭제되므로 주의하기 바란다.

-박스 종료-

그럼 다시 본론으로 돌아와, 로컬 PC에서 테스트 목적으로, 간편하게 많이 사용되는 hosts 파일의 수정 여부도 Type 명령을 통해 확인하도록 하자. Host 파일은 DNS를 조작한 결과와 동일하므로, 이를 조작하여 인증 페이지를 변조자가 원하는 서버로 연결하여 계정과 패스워드를 수집하거나, 주요 사이트를 사용하지 못하도록 조정할 수 있다. 실제 악성코드에서도 이를 이용하여 경로를 우회 하는 용도로 종종 사용된다.

[그림 ] Hosts 파일은 테스트용도로 많이 사용된다

-박스시작

VPN 인터페이스 탐지

실무를 진행하다 보면, 특정 국가 대역에만 서비스해야 하는 경우가 많이 발생한다. 국가별 IP를 지정하여 방화벽을 이용해 국내 서비스를 한다거나(IP 리스트는 http://ip.kisa.or.kr에서 확인할 수 있다) 소프트웨어적으로 서버 혹은 프로그램을 IP를 통제하게 된다(ISP에 요청하면 해외 트래픽을 통제해 준다는 소문이 있으나, 내 경험으로는 불가능하였다).

하지만 국가 IP를 통제해도 공격자들은 여전히 접근을 계속한다. 이유인즉 이러한 국가 IP를 우회하기 위해 VPN 서비스를 이용하는 것이다.

VPN을 방화벽을 통해 해결하기에는 역부족이다(네트워크 홉수를 계산하여 하는 솔루션도 존재하지만, 오탐률이 심해 실무 사용은 미지수이다). 이를 VPN 인터페이스를 탐지하여 차단하는 간단한 프로그램을 만들어 보자.

adapter_info.cpp
#include
<winsock2.h>
#include
<iphlpapi.h>
#include
<stdio.h>
#include
<stdlib.h>
#pragma
comment(lib, “IPHLPAPI.lib”)#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))

#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

int main()

{

PIP_ADAPTER_INFO pAdapterInfo;

PIP_ADAPTER_INFO pAdapter = NULL;

DWORD dwRetVal = 0;

UINT i;

struct tm newtime;

char buffer[32];

errno_t error;

ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);

pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO));

if (pAdapterInfo == NULL) {

printf(“Error to call GetAdaptersinfo\n”);

return 1;

}

if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {

FREE(pAdapterInfo);

pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);

if (pAdapterInfo == NULL) {

printf(“Error to call GetAdaptersinfo\n”);

return 1;

}

}

if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {

pAdapter = pAdapterInfo;

while (pAdapter) {

printf(“\tComboIndex: \t%d\n”, pAdapter->ComboIndex);

printf(“\tAdapter Name: \t%s\n”, pAdapter->AdapterName);

printf(“\tAdapter Desc: \t%s\n”, pAdapter->Description);

printf(“\tAdapter Addr: \t”);

for (i = 0; i < pAdapter->AddressLength; i++) {

if (i == (pAdapter->AddressLength – 1))

printf(“%.2X\n”, (int) pAdapter->Address[i]);

else

printf(“%.2X-“, (int) pAdapter->Address[i]);

}

printf(“\tIndex: \t%d\n”, pAdapter->Index);

printf(“\tType: \t”);

if (pAdapter->Type == MIB_IF_TYPE_PPP) {

printf(“PPP\n”);

printf(“*********VPN 사용중입니다. VPN 연결종료후재실행하세요***********”);

FREE(pAdapterInfo);

return 0;

}

printf(“%d\n”, pAdapter->Type);

pAdapter = pAdapter->Next;

printf(“\n”);

}

} else {

printf(“GetAdaptersInfo failed with error: %d\n”, dwRetVal);

}

if (pAdapterInfo)

FREE(pAdapterInfo);

return 0;

}

[예제 18-3] VPN 인터페이스를 사용중인 확인하는 C++ 코드

위 프로그램을 실행하면, 현재 활성화된 네트워크 인터페이스에서 VPN 타입인 PPP(23)이 있는지 확인하게 되며, 활성화된 네트워크 인터페이스 중에 PPP 타입이 있는 경우 프로세스를 종료하게 되며, 그 외 인터페이스는 통과하게 된다(VPN 인터페이스가 있더라도 활성화(연결)되어 있지 않으면 차단되지 않는다).

[그림 ] PPP타입으로 판단후 프로그램 종료

일반적인 인터페이스 타입 종류는 다음과 같다.

번호 의미
1 MIB_IF_TYPE_OTHER 타입을 알수없는 인터페이스
6 MIB_IF_TYPE_ETHERNET 이더넷 인터페이스
9 IF_TYPE_ISO88025_TOKENRING 토큰링 인터페이스
23 MIB_IF_TYPE_PPP 일대일 연결형 인터페이스(VPN)
24 MIB_IF_TYPE_LOOPBACK 로컬 인터페이스
28 MIB_IF_TYPE_SLIP ATM 인터페이스
71 IF_TYPE_IEEE80211 무선 인터페이스(비스타 이상에서 구분 가능)

[표 18-3]
IP_ADAPTER_INFO로 확인 가능한 Type

국내 환경에서 VPN을 이용하는 경우도 있기 때문에 실무에 적용하기 위해서는 더 많은 검토와 개선이 필요할 것으로 보인다. 그리고 본 샘플에는 안티 디버깅 기술이 적용되지 않은 상태로서 이를 그대로 사용하면 공격자들이 쉽게 데이터를 변조할 수도 있으므로, 보안성 프로그램을 만들 때에는 항상 변조 유무는 생각하여, 프로그램에 보호 코드를 넣고, 패킹을 진행하여야 한다. 만약 프로그램을 보호하지 않는다면 아래와 같이 0042740F의 코드를 조작해 항상 우회하도록 만들거나, 004273FD의 호출을 하지 않도록 수정하는 방법 등을 통해 쉽게 우회할 것이다.

[그림 ] Ollydbg 인터페이스 타입을 조사, 비교하는 코드를 우회하도록 조작

-박스종료-

네트워크 사용 정보

네트워크 특성상 네트워크를 사용한 이후 일정 시간 동안 연결을 유지하게 된다. 만약 침해사고가 발생하고 얼마의 시간이 지나지 않았다면, 네트워크 사용 정보를 통해 원격지 정보를 얻을 수 있다. 이 정보를 습득하였다면 이후 근원지를 파악하고 추가 피해를 막을 수 있는 데 큰 힘이 될 것이다. 그리고 현재 서버에 백도어가 설치되어 있다면, 이를 정보를 통해서도 확인할 수 있다.

Netstat
–anob 옵션을 이용하여, 현재 연결된 네트워크 정보를 확인할 수 있다(유용한 옵션을 굵게 표시하였다).

[그림 ] 네트워크 연결 정보 표시

-a: 모든 연결과 수신 대기 포트를 표시한다.

-b: 각 연결 또는 수신 대기 포트 생성과 관련된 실행 파일을 표시한다.

-e: 이더넷 통계를 표시, 이 옵션은 -s 옵션과 함께 사용가능

-f: 외부 주소의 FQDN(정규화된 도메인 이름)을 표시한다

-n: 주소와 포트 번호를 숫자 형식으로 표시

-o: 각 연결의 소유자 프로세스 ID를 표시합니다.

-p proto: proto로 지정한 프로토콜의 연결을 표시합니다. proto는 TCP, UDP, TCPv6, UDPv6 중 하나를 지정하면 된다.. -s 옵션과 함께 사용하여 프로토콜별 통계를 표시할 경우 proto는 IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP, UDPv6 중 하나를 지정할수 있다.

-r: 라우팅 테이블을 표시

-s: 프로토콜별 통계를 표시합니다

-p: 옵션을 사용하여 기본값의 일부 집합에 대한 통계만 표시를 할 수 있다.

-t: 현재 연결 오프로드 상태를 표시

Foundstone에서 제공하는 Fport도 비슷한 기능을 제공하며, Sysinternal사의 Tcpvcon 역시 네트워크 연결 정보를 확인하는 데 유용하다.

[그림 ] Tcpvcon 실행 화면

Tcpvcon는 기본적으로 원격지 호스트 정보를 가져오기 때문에 /q 옵션을 이용하여 실행하면 이를 생략해 빠르게 정보를 수집할 수 있다.

네트워크 공유 리스트

윈도우를 사용하면서, 우리는 파일공유를 많이 사용하게 되는데, 만약 여러분이 공격자라면, 어떠한 방식으로 공격을 해야 할지 정하기 위해 스캔을 진행하게 되고, 시스템 취약점을 확인하게 된다. 이때 SMB 관련 취약점을 진행하면서, 공격자IP의 네트워크 연결 정보를 남기게 된다. 이 리스트를 확인해 해당 호스트를 확인한다면, 공격 경로를 알아낼 수 있는 귀중한 단서를 얻을 수 있으므로 이 정보를 무시해서는 안 된다. 그리고 윈도우는 기본적으로 Netbois의 SMB(Server Message Black)을 이용하도록 되어 있어, 실제 네트워크 공유를 통해서 공격이 많이 이루어 진다.

그럼 Netbios 정보를 확인할 수 잇는 Net file 명령을 통해 최근 연결하였던 호스트 정보를 확인해 보자.

[그림 ] 네트워크 공유로 사용중인 파일을 확인할 수 있다

위 정보대로 test라는 유저가 c:\mysql 폴더에 접근하였음을 확인 할 수 있다. Sysinternals사의 Psfile 명령은 원격지 컴퓨터 이름까지 확인할 수 있으므로 더욱 유용할 것이다.

NBT 캐쉬 정보

원격지를 통해 윈도우에서 제공하는 파일 공유 기능을 이용하여 파일에 접근하였을 경우 NetBIOS Cache Name Table에 남기게 된다.

이 정보를 확인하여 원격지에서 NetBIOS로 접근한 정보를 확인 할 수 있다(단 Life time이 유지된 정보를 확인 할 수 있다). 명령어는 Nbtstat이다.

[그림 ] 네트워크 공유(SMB)를 이용하여 접근한 원격지 컴퓨터 표시

원격지에서 접근한 IP의 Hostname을 확인하고자 할 때에는 –A 옵션을 이용하여 원격서버 IP를 확인할 수 있다.

[그림 ] 원격지 서버의 정보 확인

-박스시작-

자동 숨김 공유 중지

윈도우는 원격 관리목적으로 각 드라이브의 루트에 대해 숨김 공유를 제공하는데, 암호 관리가 허술하거나, 도메인 환경인 경우, 다수 컴퓨터가 공격 당할 수 있는 취약점이 있다고 할 수 있다.

Net use \\IP\C$ 를 통해 접근이 가능하다.

↓전체 드라이브에 대해 원격 접속이 가능하다, 삭제하여도 시스템 재시작시 다시 공유된다.

[그림 ] 삭제하여도 다시 공유된다

위 경고 메시지와 같이 이 공유 리스트는 삭제하여도, 시스템이 재시작하면 다시 생성되므로, 이를 원천적으로 실행을 차단하기 위해서는 레지스트리에 아래와 같이 설정하여야 한다.

HKLM\SYSTEM\CurrentControlSet\service\LanmanServer\Parameters

형식    : DWORD(32비트)

이름    : AutoShareWks

값     : 0

위 내용에 얘기한 레지스트리를 아래 그림과 같이 생성해 주면 된다.

[그림 ] 레지스트리를 설정하면, 더 이상 자동 공유를 생성하지 않는다

-박스종료-

메모리

가장 많은 용도로 활용이 가능한 자료로, 메모리 덤프는 휘발성 데이터 수집에서 가장 먼저 떠오르는 리스트 중 하나이다. 실제 현재 실행 중이던 프로세스들의 정보들이 메모리에 전부 담겨 있으므로 메모리 내용을 전체 덤프하여 프로세스에서 사용하던 다양한 리소스들을 분석할 수 있다 그리고 운영 환경에서 보지 못한 루트킷과 같은 더 많은 정보를 확인할 수 있게 되며, 프로세스가 사용한 네트워크 정보들도 알 수 있으므로 필히 수집해야 할 리스트 1호라 할 수 있다.

중요한 부분인 만큼 유용한 도구들도 많이 존재하는데, 그 중 제일 보편적인 도구로는 Unix 도구였던 Dd라는 도구가 있다. 이 도구는 디스크 덤프용도로 더욱 유명하다(이 도구를 이용하여 파일 역분석을 전문적으로 다룬 도서도 존재한다). 이 도구를 이용하여 메모리 역시 덤프를 생성할 수 있다. 이 책에서는 Dd 이외에도 윈도우에서 메모리를 생성할 수 있는 여러 도구들에 대해 알아보고자 한다.

그리고 우리는 이미 1부에서 메모리 덤프 수집방법에 대해 공부한 적이 있다. 왜 메모리 덤프를 생성하는 방법을 중요한지 알아보자.

이유는 메모리 덤프는 대표적으로 2가지 방식으로 제공되는데 그 중 하나는 우리가 배운 Microsoft에서 장애 분석을 위해 생성하는 메모리 덤프인 크래쉬 덤프(구분을 위해 앞으로 크래쉬 덤프라고 한다)와 이제부터 메모리 내용 분석을 위해 진행하는 메모리 덤프 분석이다.

그럼 윈도우 크래쉬 덤프와 우리가 수집하는 메모리 덤프 도구와 무엇이 다른지 먼저 확인해 보자.

우선 가장 큰 차이점은 크래쉬 덤프의 파일 구조체를 가지고 있어 해당 구조체에 맞게 작성된다. 아래 내용이 크래쉬 덤프의 파일 구조체이다.

크기 유형

항목

설명
0x000 Char

Signature[4]

‘PAGE’
0x004 Char

ValidDump[4]

‘DUMP’
0x008 Uint32

MajorVersion

0x00c Uint32

MinorVersion

윈도우 빌드 번호
0x010 Uint32

DirectoryTableBase

디렉토리 테이블 베이스 주소

0x014 Uint32

PfnDataBase

PFN 베이스 주소
0x018 Uint32

PsLoadedModuleList

0x01c Uint32

PsActiveProcessHead

0x020 Uint32

MachineImageType

머신의 이미지 타입
0x024 Uint32

NumberProcessors

프로세서 개수
0x05c Char

PaeEnabled

PAE 활성화 유무
0x064 Char

PhysicalMemoryBlockBuffer[700]

0xf88 Uint32

DumpType

1 = Full dump, 2 = Kernel dump

0xfa0 Int64

RequiredDumpSpace

덤프 파일 사이즈
0xfb8 Int64

SystemUpTime

100 ns로 계산된 시간

0xfc0 Int64

SystemTime

FILETIME

[내용] Microsoft 덤프 파일 구조체

위 내용은 윈도우에서 사용하는 문제점 발생시 생성되는 크래쉬 덤프로, 메모리 상태를 바이너리 그대로 생성하는 RAW형(바이너리)과 차이를 보인다.

그럼 실제 물리 데이터를 확인해 보자.

↓위 Microsoft 메모리 덤프 타입과 아래 RAW형 타입은 저장 방식이 다르다.

[그림 ] 메모리 덤프 생성 방식에 따라 저장방식이 바뀌게 된다

위와 같은 차이로 인해 메모리 덤프 분석 도구 역시 크래쉬 덤프형과 RAW 덤프형으로 나누어 지므로, 메모리 덤프 생성시 유념하여 덤프 생성 및 분석에 임하기 바란다.

메모리와 프로그램(실행 파일) 분석의 차이와 이유

메모리 분석은 이미 처리되는 결과물을 분석하는 것이고, 프로그램(실행 파일) 분석은 어떻게 처리되는지 처리 과정을 분석하는 것이다. 그리고 우리가 지금 진행하고 있는 장애나 역분석에서는 이미 처리된 결과를 분석해야 한다. 따라서 운영체제의 활동 정보가 들어있는 메모리 영역 분석은 중요한 단서를 잡을 수 있는 주요 거점이라 할 수 있다.

그리고 우리가 직접메모리를 분석해야 하는 이유는 다음과 같다.

메모리와 프로그램 분석 작업은 사전 지식이 많이 필요한 분야(어셈블리, 프로그래밍)다 보니, 쉽게 접근할 수 있도록 자동적으로 분석을 도와주는 도구들도 일부 존재하는데, 메모리 덤프를 자동으로 분석해주는 Debug diagnostic tool과 프로그램 실행 중 변경 내용을 기록해 주는 Inctrl5가 이와 같다.

[그림 ] 일반 이용자를 위해 자동적으로 덤프를 분석해주는 Debug Diagnostic Tool

[그림 ] 의심되는 프로그램을 실행하면 변경된 내용을 보고서로 작성해주는 InCtrl5

하지만 이러한 도구들은 실제 프로그램이 담고 있는 정보를 온전히 보여주지 못한다. 즉 실제 내용이 프로그램에서 나타낸 결과와 다룰 수도 있으며, 특정 날짜에만 동작한다거나, 특정 조건 시에만 실행되는 경우 실행된 결과를 토대로 보고서를 작성하기 때문에, 특정 날짜에만 실행하도록 악성코드를 작성하였다면, InCtrl5는 무용지물이다.

[그림] 위와 같은 결과값은 많은 의구심과 분석을 난해하게 만들 수 있다

그리고 일반적인 정보 이외 본인이 확인하고자 하는 정보는 보지 못하는 경우가 많다. 따라서 이러한 분석 방법은 왜 수정되었을까? 정말 수정되었을까? 이 문제로 인한 원인이 맞을까? 등 여러 의구심을 낳게 한다. 다행이 요즘 나온 Cuckoosandbox는 VM 기반으로 이와 같은 분석의 수고를 덜어준다. 다만 이 역시 100% 해결을 해주는 것은 아니다. https://cuckoosandbox.org/

이러한 의구심을 해결할 수 있는 방법은, 메모리 덤프나 프로그램에 대해 직접 디버깅을 진행하는 것이며, 디버깅을 통해 명확한 결과를 찾을 수 있게 된다. 더욱이 정확한 원인을 원하는 장애와 해킹분야에서 정확한 결과를 찾을 수 있다.

하지만 이 Windbg를 이용한 방법은 실시간과 장애 분석에 효과적이고, 유저모드 디버거를 이용한 방법은 프로그램 분석에 효과적이다.

따라서 여기서 우리는 메모리 역분석에 유리한, 즉 우리가 메모리를 통해 사고 당시 상황을 효과적으로 확인할 수 있는 도구를 사용하기 편리하도록 메모리 덤프를 수집할 필요가 있다.

여기서는 이 효과적으로 분석하기 위해 메모리 영역을 수집할 수 있는 도구들에 대해 알아보고자 한다.

-박스시작-

Debug diagnostic tool

마이크로소프트에서 제공하는 Debug diagnostic tool은 원래 IIS 덤프 분석용도로 제공하였으나, 충돌과 행 증상에서도 유용하게 사용할 수 있다. 본 도구는 아래 링크에서 다운로드 가능하다.

http://www.microsoft.com/download/en/details.aspx?id=26798

해당 도구에서는 다음과 같은 분석 기능을 제공한다.

충돌(Crash)과 행(Hang): 충돌이나 행이 발생한 상황에서 IIS, 서비스등 구분을 통해 편리하게 덤프를 생성할 수 있다.

성능(Performance): 성능 카운터가 특정 값에 도달하거나, URL 모니터링을 통해 설정 조건에 맞는 경우 덤프 생성한다.

[그림] URL 모니터링과 성능 카운터 모니터링 기능이 매력적이다

메모리 누수(Leak): 메모리 누수 증상이 있을 때 관련 정보를 수집할 수 있는 메모리 덤프

위 3가지 상황에 맞게 덤프를 생성할 수 있고, Advanced Analysis 탭을 통해 본인 상황에 맞는 분석 스크립트를 통해 자동화된 분석 레포트를 제공한다(닷넷전용 분석 스크립트도 제공).

[그림 ] 생성한 덤프를 통해 메모리 누수 상황으로 분석 보고서 생성

고급 분석일 필요한지 않은 장애시 쉽게 접근 할 수 있는 도구로서 유용하게 사용될 수 있을 것이다.

-박스종료-

프로세스별 메모리 덤프 생성

그럼 먼저 프로세스 덤프를 생성하는 방법에 대해 알아보자. 여기서는 프로세스 메모리 덤프 생성에만 집중하도록 하겠다.

먼저 Windbg를 설치하면 기본적으로 함께 설치되는 도구로서 adplus.vbs 스크립트 파일을 통해 프로세스 메모리 덤프를 생성할 수 있다. Adplus.vbs는 2가지 모드를 제공하는데 다음과 같다.

-Carsh: 프로세스가 죽는 순간을 감지하여 메모리 덤프를 생성한다.

-Hang: 프로세스가 살아 있으나 더 이상 동작하지 않는 무응답 상태(Hang)일 때 메모리 덤프를 생성한다. 이는 발생시 수동으로 생성하여야 한다.

무응답에 대해서는 명령 방식은 아래와 같이 사용할 수 있다.

cscript adplus.vbs –quiet –hang –p <PID>

또 윈도우 기본 작업 관리자를 통해서도 프로세스의 메모리 덤프를 생성할 수 있다.

[그림 ] 작업관리자에서 프로세스 덤프 생성(비스타 이후 지원)

전체 메모리 덤프 생성

3부에서 진행하는 전체 메모리 덤프는 1부에서 진행하였던 전체 메모리 덤프인 Windbg로 분석할 수 있는 메모리 덤프와 다른 일반적인 메모리 분석도구에서 분석을 진행할 수 있는 RAW 타입(바이너리)의 메모리 덤프이다.

Mdd

ManTech에서 오픈 소스로 제공하는 메모리 덤프 프로그램이다(소스는 http://sourceforge.net/projects/mdd/files/ 에서 다운로드 가능하다).

본 도구는 윈도우 XP부터 Windows 2008까지 지원하며, RAW 바이너리 형태로 저장된다(메모리 저장 형식에는 RAW와 Windbg에 맞는 Crash 형태의 2종류가 있다).

유용한 기능으로 저장 완료시 MD5(Message-Digest Algorithm 5)를 저장하므로 화면 출력 내용을 파일로 함께 저장하면 유용하다.

-o <파일이름>: 생성할 덤프 파일 이름

-q: 오류가 있을시 출력하지 않음

-v: 매핑 실패시 해당 오류 출력

-c, –w: GPL 라이선스 관련 정보 확인

-o 옵션 이외에는 사용되지 않을 정도로 간단하여 유용한 도구라 할 수 있다. 아래와 같이 덤프를 생성하고 실행 메시지를 파일로 저장하도록 하자.

C:\Forensic\Dump>mdd –o %Computername%_Phys.dmp >> %Computername%_dump_result.txt

C:\Forensic\Dump>type %Computername%_dump_result.txt

-> mdd

-> ManTech Physical Memory Dump Utility

Copyright © 2008 ManTech Security & Mission Assurance

-> This program comes with ABSOLUTELY NO WARRANTY; for details use option -w'

This is free software, and you are welcome to redistribute it

under certain conditions; use option -c’ for details.

-> Dumping 511.48 MB of physical memory to file ‘JUHAN-1_Phys.dmp’.

130940 map operations succeeded (1.00)

0 map operations failed

took 20 seconds to write

MD5 is: 9ebaa66c3a0b5a1aa891c41dfd08f7fa

[실습 5] Mdd를 이용한 메모리 덤프 생성

Win32dd(Win64dd)

Win32dd 역시 오픈 소스 도구로서 유용하게 사용할 수 있다.

메모리 덤프 생성에 대한 다양한 옵션을 지원하며, 생성 형태도 RAW와 Crash 형태 2종류 모두 지원한다. 따라서 Crash 덤프 형태로 생성할 경우 마이크로소프트에서 제공하는 디버깅 도구를 이용하여서도 메모리 분석을 진행할 수 있다.

그리고 함께 제공하는 도구로서 Dmp2bin를 통해 마이크로소프트형 메모리 덤프를 RAW 타입으로 변환하거나 Bin2dmp.exe를 통해 그 반대로 가능하다. 추가로 서버모드를 통해 원격지에 메모리 덤프 파일을 바로 내보낼 수 있다.

그럼 실제 메모리 덤프를 아래와 같이 생성해 보도록 하자.

// RAW 형 데이터로 메모리 덤프를 생성하고, 결과는 텍스트 파일에 저장하도록 지정하자.
C:\win32dd>win32dd /m 0 /r /f %Computername%_physmem.bin /a /s 2 >> %Computername%_physmem_result.txt
// 메모리 덤프 생성 결과를 type 명령을 이용하여 확인해 보자.
C:\win32dd>type %Computername%_physmem_result.txtwin32dd – 1.3.1.20100417 – (Community Edition)Kernel land physical memory acquisition

Copyright (C) 2007 – 2010, Matthieu Suiche <http://www.msuiche.net>

Copyright (C) 2009 – 2010, MoonSols <http://www.moonsols.com>

Name Value

—- —–

File type: Raw memory dump file

Acquisition method: MmMapIoSpace()

Content: Memory manager physical memory block

Destination path: JUHAN_physmem.bin

O.S. Version: Microsoft Windows 7 Business, 32-bit Service Pac

k 1 (build 7601)

Computer name: JUHAN

Physical memory in use: 75%

Physical memory size: 3399160 Kb ( 3319 Mb)

Physical memory available: 830300 Kb ( 810 Mb)

Paging file size: 6796564 Kb ( 6637 Mb)

Paging file available: 3347072 Kb ( 3268 Mb)

Virtual memory size: 2097024 Kb ( 2047 Mb)

Virtual memory available: 2064096 Kb ( 2015 Mb)

Extented memory available: 0 Kb ( 0 Mb)

Physical page size: 4096 bytes

Minimum physical address: 0x0000000000001000

Maximum physical address: 0x00000000CF7DF000

Address space size: 3481141248 bytes (3399552 Kb)

–> Are you sure you want to continue? [y/n] y

Acquisition started at: [6/2/2012 (Dd/MM/YYYY) 6:13:1 (UTC)]

Processing….Done.

Acquisition finished at: [2012-02-06 (YYYY-MM-Dd) 6:14:03 (UTC)]

Time elapsed: 1:02 minutes:seconds (62 secs)

Created file size: 3481141248 bytes ( 3319 Mb)

NtStatus (troubleshooting): 0x00000000

Total of written pages: 849790

Total of inacessible pages: 0

Total of accessible pages: 849790

MD5: 7941F73731C49458DA221B3B1D7C7D1D

…중략

[실습 6] Win32dd를 이용한 메모리 덤프 생성

MoonSols은 Win32dd이외에도 Dumpit 역시 공개하였는데, 옵션이 존재하지 않고 실행시 덤프를 생성할지 여부만 확인한다. 아래에서 다운로드 가능하다.

http://www.moonsols.com/ressources/

[그림 ] 간편히 사용할 수 있는 Dumpit

Memoryze

Mandiant에서 제공하는 무료 도구로서 자체 분석기 도구를 통해 보고서를 생성하여 확인할 수 있는 게 특징이다. 윈도우 2000부터 윈도우 2008 R2 32/64비트까지 폭넓게 지원하며, 사전에 만들어 놓은 배치 파일이 이용하여 원하는 메모리 내용만을 골라 덤프할 수 있다.

MemoryDd.bat: 다른 메모리 덤프 프로그램과 같이 메모리 덤프를 생성한다.

ProcessDd.bat: 저정한 프로세스 덤프를 생성한다.

DriverDd.bat: 현재 메모리 상의 전체 드라이버를 덤프 한다.

Process.bat: 현재 메모리 상의 전체 프로세스의 핸들과 가상 메모리, 그리고 사용 네트워크 포트와 저장된 스트링을 출력 한다.(XML형식)

HookDetection.bat: 현재 운영체제에서 후킹 중인 프로세스 혹은 드라이버를 출력한다.(XML형식)

DirverSearch.bat: 드라이버 검색(XML형식)

DriverWalkList.bat: 현재 메모리상의 전체 드라이버를 출력한다.(XML형식)

MemoryDd.bat, ProcessDd, DriverDd.bat를 제외하고 나머지는 XML 형식으로 출력되므로, 출력 결과를 전용 뷰어(https://www.mandiant.com/resources/download/memoryze)로 확인하는 것 유용하다.

전용 뷰어의 경우 Memoryze로 메모리 덤프를 분석해주는 도구로써, 메모리 내 데이터를 분석하여, 원하는 결과값을 생성하여 준다.

↓원하는 정보를 선택하여 분석을 진행한다.

[그림 ] 자동 분석을 통해 프로세스들의 사용중인 네트워크 현황 등을 쉽게 확인할 수 있다

그럼 실습을 통해 확인해 보자.

C:\>memorydd -output C:\Dump

Memoryze.exe by MANDIANT, Inc. (c) 2009 – www.mandiant.com/software/memoryze.htm

Usage: memorydd

-offset optional offset into physical memory. Exclude for all.

-size optional size of physical memory to acquire. Exclude for all.

-output directory to write the results. Default .\Audits

[실습 7] 메모리 덤프를 생성

위와 같이 실행하면, 스크립트가 실행되며 다음과 같이 파일을 생성하게 된다. 자동 분석 도구다 보니, 추가적인 분석용도로 사용해 보는 것도 좋을 듯싶다.

↓스크립트에 의해 아래와 같은 결과 값을 생성한다.

[그림 ] Memorydd.bat 실행 결과

이외에도 많은 메모리 덤프 수집 도구들이 존재 하지만, 이 정도로도 충분하리라 판단되므로 메모리 데이터 수집은 이것으로 마치도록 하겠다.

클립보드 및 명령 사용내역

이 명령은 유닉스의 히스토리 명령과 비슷하다고 생각하면 된다.

커맨드로 무엇인가 입력을 하였거나, 클립보드를 이용해 데이터를 복사하여 붙여 넣었다면, 이 내용 조사를 통해 확인할 수 있다. 실제 해커들이 시스템에 들어왔을 경우 시스템을 조정하기 위해 다양한 명령을 명령 창에서 실행하게 된다. 이때 명령창의 히스토리 관리 기능을 통해 해당 명령을 차후 확인, 사용할 수 있다. 물론 이를 통해 정보를 얻을 가능성은 크지 않지만, 사소한 것에서 단서를 얻을 수 있다는 점을 명심하자.

그럼 먼저 Doskey 명령이다. 하지만 윈도우 GUI 환경에서 Doskey의 활용 빈도는 매우 낮다. 이유인즉, 해당 명령프롬프트 창을 닫으면, 사용했던 키가 정보 사라지기 때문이다. 따라서 Doskey는 CLI 환경으로 구성한 윈도우 운영체제중 코어(Core) 버전, 혹은 명령어 프롬프트 환경에서 유용할 것이다.

[그림] 명령프롬프트에서 입력한 결과를 확인할 수 있다

실제 Doskey는 명령어 재사용 효율성이 좋아 엔지니어들이 평상시 작업 중에 많이 사용된다. 그 중에서도 F7키를 입력하면 기존 명령을 선택하여 재입력할 수 있도록 하는 기능도 유용한다.

그리고, 클립보드의 내용을 확인할 수 있는 도구도 존재하는데 바로 pclip.exe이다.

만약 시스템에 접근하여 중요 파일의 내용을 복사하여 가져갔다면, 클립보드에 내용이 남아 있을 수 있다. 단 클립보드 역시 사용 별로 관리되고, 로그아웃시 정보가 사라지게 되므로, 각별히 신경 써서 수집하여야 한다.

이렇게 메모리 수집을 끝으로 휘발성 데이터를 지나 비휘발성 데이터 수집을 진행해 보자.

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.