본문 바로가기

[+] Forensic

ADD(Attention-Deficit-Disorder)에 대하여

얼마 전 Shmoocon 컨퍼런스에서 물리 메모리를 대상으로 한 안티 포렌식 기술이 발표되었다. 

ADD(Attention-Deficit-Disorder)라고 하는 PoC Tool과 함께 발표되었는데 아이디어는 상당히 간단하다. 이번 글에서는 해당 기술의 원리를 알아보고 탐지 방법을 알아 볼 예정이다.


1. 들어가며

메모리 포렌식은 지금까지 굉장히 빠른 발전을 해 왔다. 그 중에서 Volatility가 단연 사람들에게 많이 알려지고 발전도 가장 많이 되어 있는데, ADD는 Volatility가 메모리를 분석 할 때의 방법을 역으로 이용 해 허위 메모리 정보를 삽입 해 분석가의 분석 시간과 시야를 방해 한다. 예를 들어, 프로세스 목록에서 허위 프로세스를 삽입 해 분석가가 허위 프로세스와 진짜 목적의 프로세스를 구분하는데 시간을 오래 걸리게 한다던가, 네트워크 연결 정보를 허위로 삽입하여 분석가의 분석 시간을 늘린다던가 하는 방법이 있다.


현재 해당 기술은 Process, Network Connection, File Object에 대해서만 구현이 되어 있는 상황인데, 발표자는 발표를 통해 해당 기술을 더 발전 시켜 Mutexes, Symlinks, Drivers, DLL 등을 추가로 연구 해 구현하겠다고 밝혔다. 발표가 나고 얼마 지나지 않아 그 자리에서 발표를 듣던 사람이 해당 기술을 분석 할 수 있는 방안을 블로그를 통해 내놓았는데 글을 살펴본 결과, ADD 도구를 사용 했을 때의 아티팩트를 수집 해 허위 아티팩트를 구별 해 내는 방법이었다. 하지만 이 기술은 도구가 아닌 악성 프로세스(루트킷 등)이 많이 사용 할 수 있는 기술이기 때문에 조금 더 범용적으로 해결 방안을 찾아야 한다.


위 블로그 글에서 제시한 방법은 굉장히 간단하면서 정확하다. 하지만 도구에만 적용이 되기 때문에 활용범위는 그다지 크지 않다. 방법은 다음과 같다.


[블로그 글에서 제시한 방법]

 1. 메모리에서 유니코드 문자열을 모두 추출 한다.


 2. 유니코드 문자열 목록에서 도구에서 사용 된 옵션 또는 프로그램의 이름 등의 특정 문자열을 검색한다.


 3. 명령 행에서 사용 된 인자 값들을 보고 허위 아티팩트들을 가려낸다.


위 방법은 사용자가 직접, 또는 프로그램에서 System() 함수를 사용 했을 때 메모리에 남는 명령 줄로 허위 아티팩트르 가려내는 간단한 방법이지만 앞에서 말했듯이 해당 기술은 악성코드가 사용 했을 때 그 위력이 더 크기 때문에 악성코드에서 사용 했을 때와 사용자가 사용 했을 때를 모두 감안한 측면에서 바라보아야 한다. 


이제부터 기술의 원리, 탐지 방안등에 대해서 이야기 해 보도록 하겠다.


2. ADD 원리

Volatility는 메모리 이미지에서 여러가지 검증 단계를 거쳐 정보들을 분석 해 사용자에게 보여준다. 하지만 이 검증 단계만 모두 만족한다면 허위 정보 또한 진짜 정보로 둔갑 할 수 있다.


 2.1 Fake Process

 ADD는 Fake Process 정보를 다음과 같은 검증 단계를 모두 만족 할 수 있도록 인위적으로 생성 해 메모리에 삽입한다.


그림 1 - Process Check 1


그림 2 - Process Check 2


위와 같은 Volatility의 검증 단계를 ADD는 다음과 같이 만족하였다.


그림 2 - ADD Fake Process


간단하게 살펴보면 사용자에게 Process Name, PID, CimeL, CTimeH, ExitTmeL, ExitTimeH을 받고 EPROCESS에 삽입 할 최소한의 정보와 함께 EPROCESS를 생성하기 위해 만든 허위 EPROCESS 구조체에 넣고 OBJECT_HEADER 구조체와 함께 해당 구조체를 메모리에 임시저장 해 둔다. 허위 EPROCESS 구조체는 다음과 같다.


그림 3 - 허위 EPROCESS 구조체


여기서 중요한 사실은 EPROCESS의 구조체 모두에 대한 정보를 생성하지 않는다는 것이다. 넣을 부분만 알아보기 편하게 기존의 EPROCESS 구조체 멤버와 동일하게 변수를 선언하고 다른 부분들은 DWORD f<숫자>형태로 선언해 크기만 맞추어 주었다. 사실 EPROCESS의 모든 정보를 생성하여 실제 프로세스처럼 넣어주게 될 경우, 새롭게 프로세스를 하나 생성하는 편이 훨씬 제작자나 퍼포먼스 측면에서 좋기 때문에 굳이 생성하여 넣어 줄 필요가 없는 것이다.


임시저장 된 구조체는 디바이스 드라이버로 전송 되어 커널 메모리에 적재되는데 이 부분은 모든 기능을 알아본 후에 살펴보도록 하자.


 2.2 Fake Network Connection

 Network Connection에 대한 Volatility의 검증 단계는 다음과 같다.


그림 4 - Network Connection Check


ADD는 위 검증 단계를 모두 만족하기 위해 다음과 같은 허위 정보를 생성하였다.


그림 5 - Fake Network Connection


들어가는 정보가 Fake Process와 다를 뿐 순서나 원리는 동일하다.


 2.3 Fake File Object

 File Object에 대한 Volatility의 검증은 다음과 같다.


그림 6 - File Object Check


그림 - 7 Fake File Object


위 세가지 방법들로 생성 된 허위 구조체 정보는 다음과 같이 DeviceIOControl() 함수를 통해 디바이스 드라이버 파일(ADDdriver.sys)로 전송 된다.


그림 8 - DeviceIOControl()


방법들을 보면 공통적으로 Tag가 보인다는 것을 알 수 있다. 그래서 ADD는 드라이버 파일에서 커널 메모리를 할당 받아 Tag를 부여하고 바로 뒷 공간에 유저영역에서 생성한 구조체들을 저장 해 Volatility가 EPROCESS를 스캐닝 할 때 허위 정보로 판단하지 못하도록 한다.


드라이버 파일에는 ADDDeviceControl() 함수가 있고 DeviceIOControl() 함수가 실행되면서 드라이버 파일에 있는 DriverEntry() 함수에 IRP_MJ_DEVICE_CONTROL 메시지가 전달 되어 MajorFunction[]에 있는 ADDDeviceControl() 함수가 실행 된다.


ADDDeviceControl() 함수에는 다음과 같이 ExAllocatePoolWithTag() 함수로 태그와 함께 커널 메모리를 할당 받는 부분을 확인 할 수 있다.


그림 9 - ExAllocatePoolWithTag()


커널 메모리를 할당 받을 때 부여하는 태그는 총 3개로 각 태그가 의미하는 바는 다음과 같다.


 - 0xE56C6946 : File Object Artifact


 - 0xE36F7250 : Process Artifact


 - 0x45706354 : Network Artifact


즉, Volatility는 EPROCESS Scanning 방법을 이용 할 때 Tag를 먼저 찾고 그 이후에 있는 EPROCESS를 파싱하기 때문에 해당 방법을 사용하면 허위 정보도 Volatility는 진짜 정보로 인식하게 되는 것이다. 허위 정보가 삽입 된 메모리 이미지를 Volatility로 분석하였을 경우 다음과 같이 나오게 된다.


그림 10 - 허위 프로세스 정보


허위 정보는 pslist로는 나오지 않고 psscan으로 스캔해야 나온다. 이런 결과를 자세히 보지 않는다면 숨겨진 악성 프로세스라고 오해를 할 수 있다. 이제 이에 대한 탐지 방법을 알아보도록 하자.


3. ADD 탐지 방법

먼저 제작자가 밝힌 탐지 방법에 대해서 잠깐 보도록 하자. 발표자는 발표 당시, ADD 탐지 방안으로 "고양이와 쥐 게임", ADD Driver Hunt 등을 언급하였다. "고양이와 쥐 게임"은 서로 계속해서 단점을 보완해 나가는 것을 말하며, ADD Driver Hunt는 커널 메모리를 받기 위해 사용하는 디바이스 드라이버를 찾아내는 것을 말한다. 하지만 필자는 이번 글에서 이와 다른 방법을 소개 해 보고자 한다. 필자가 밝히는 방법은 영구적인 방법이 아닌 한시적인 방법이고 완벽하지 않은 방법이라는 것을 알아두기 바란다. 이 기술에 대한 최종적인 탐지 방안은 제작자가 밝힌 "고양이와 쥐 게임"이 가장 현실적인 방안이다.


 3.1 Fake Process 탐지 방법

위에서 보았듯이 허위 EPROCESS 구조체를 작성하여 허위 정보를 생성하지만 모든 필드를 사용하지는 않는다. 허위 프로세스는 Volatility에서 제공하는 Volshell로 EPROCESS를 보면 쉽게 파악이 가능하다.


그림 11 - Fake Proces EPROCESS DeviceMap 필드


대표적으로 EPROCESS에는 필수적으로 들어가야 할 필드들이 존재한다. 그 중에 DeviceMap이라는 필드가 존재하는데 해당 필드는 사용자 별로 사용자 상태 정보를 저장하는 필드이기 때문에 값이 필수적으로 삽입되어야 한다.


또, 허위 프로세스는 스레드를 가지고 있지 않다. 그렇기 때문에 thrdscan 등의 플러그인을 사용 해 ETHREAD 구조체를 스캔 해 보면 쉽게 허위 프로세스를 파악 할 수 있다.


마지막으로 아직 기술이 초기 상황이어서 그런지 어딘가 모르게 허술하다. 실제 프로세스의 EPROCESS와 비교해 보면 크기부터 조금씩 다르며 필드 또한 모두 쓰이지 않기 때문에 내포하고 있는 정보가 거의 없어 프로세스라고 하기에 조금 무리가 있어 보인다. 그래서 아직까지는 EPROCESS와 여러 프로세스적 요소들을 결합하여 분석하면 쉽게 허위 프로세스를 찾아 낼 수 있다.


해당 기술에 대한 대응방안이 계속해서 공개되고 안티 포렌식 기술에서 이를 대응하면 할수록 점점 CreateProcess()를 통해 프로세스를 생성하는 것이 오히려 더 편하게 느껴지므로 해당 방법은 더 이상 발전은 무의미 할 것으로 생각 된다.


 3.2 Fake Network Connection

해당 기술에 대한 대응방안은 뚜렷하게 없다. 하지만 분석하는데 해당 기술은 크게 영향을 미치지 못한다. 허위 프로세스를 식별하여 진짜 프로세스를 찾아내면 진짜 프로세스를 분석하여 진짜 네트워크 연결을 판별 할 수 있기 때문에 해당 기술에 대한 탐지 방안은 독립적으로 존재하지 않지만 독립적으로 존재할 필요도 없다.


 3.3 Fake File Object

해당 기술에 탐지 방안은 굉장히 쉽다. 해당 메모리를 이미징 한 PC의 디스크와 대조해 보면 된다. Volatility에서 filescan 플러그인을 사용하면 Root 경로부터 파일의 경로를 표시하여 준다. 그러므로 디스크에서 해당 경로에 실제로 파일이 존재하는지만 확인하면 된다.



4. 마치며

정말 재밌는 기술이다. 물리메모리를 대상으로 한 안티 포렌식 기술은 지금까지 별로 없었다. 하지만 해당 기술로 안티 포렌식 기술은 메모리를 대상으로 하여 한단계 발전하였음을 느낄 수 있었다. 아직은 많이 부족한 기술이지만 앞으로 악성 프로그램들이 사용하지 말란 법도 없으며, 또 사용 했을 경우 그 효과는 꽤 클 것으로 예상이 되는 만큼 해당 기술의 탐지 방안도 미래를 내다보며 연구되어야 한다고 생각 된다.