tmxklab
[Volatility] DLL 조사 본문
1. dlllist 플러그인
- 로드된 DLL을 나열, DKOM 공격에 취약
- dlllist플러그인은 PEB구조체를 찾아서 로드한 모듈 정보를 얻는다.
- _EPROCESS구조체에 PEB포인터를 포함하는 peb라는 필드를 가지고 있음
- 따라서, _EPROCESS구조체를 찾으면 PEB를 찾을 수 있음
vol_2.6.exe -f <메모리 이미지 파일> --profile=<프로파일 명> dlllist
- -p옵션을 사용하여 pid값을 줘서 해당 프로세스에 로드된 모듈들을 확인할 수 있음
이제 커널 디버깅을 통해서 dlllist 플러그인이 어떻게 dll목록을 가져오는지 확인해보자
- 먼저 현재 실행 중인 "explorer.exe"프로세스를 대상으로 확인해보자
- explorer.exe의 _EPROCESS구조체 주소는 0xffffe2897d03d080이며 peb값은 0x0030d000이다.
- _EPROCESS구조체로 확인해보면 peb멤버 값과 위에서 확인한 값이 동일함을 알 수 있다.
0: kd> .process 0xffffe2897d03d080
Implicit process is now ffffe289`7d03d080
- PEB를 확인하기 위해서 PEB의 프로세스 콘텍스트 전환(.process 명령어를 통해)
- !peb 명령어를 통해 explorer.exe의 peb정보를 확인할 수 있으며 아래 3개의 Double Linked List구조로 이루어진 멤버들을 통해 프로세스 실행 파일 및 DLL 정보를 얻을 수 있다.
- InInitializationOrderModuleList : 함수가 실행된 순서대로 모듈 구성(프로세스 실행 파일에 대한 정보 포함x)
- InLoadOrderModuleList : 모듈이 로드된 순서대로 모듈 구성
- InMemoryOrderModuleList : 프로세스 메모리에 상주하는 순서대로 모듈 구성
여기서 dlllist 플러그인은 InLoadOrderModuleList를 탐색해 모듈 정보를 얻는다.
dlllist는 InLoadOrderModuleList에 의존해 로드된 모듈 정보를 탐색하므로 만약 공격자가 저 리스트를 끊어 놓게된다면 은닉가능하다. 따라서, 다음 ldrmodules플러그인을 사용해 해결한다.
2. ldrmodules 플러그인
- 숨겨진 DLL 탐색하는데 유용
- 유저 메모리에 존재하는 3개의 PEB 리스트(InInitializationOrderModuleList, InLoadOrderModuleList, InMemoryOrderModuleList)에 존재하는 모듈 정보와 커널 메모리에 상주하는 VAD(Virtual Address Descriptors)와 비교
vol_2.6.exe -f <메모리 이미지 파일> --profile=<프로파일 명> ldrmodules -p <PID>
VAD(Virtual Address Descriptors)
VAD는 커널 메모리에 상주하며 프로세스 메모리에 가상적으로 연속된 메모리 영역의 정보를 저장한 self-balanceself balanced binary tree 구조체이다. VAD트리는 Windows 메모리 관리자가 할당된 프로세스에서 사용하는 메모리 범위를 알 수 있도록 사용된다. 예를 들어 프로세스가 VirtualAlloc과 같은 API함수를 사용하여 메모리 할당을 받으면 메모리 관리자가 VAD 트리에 항목을 생성한다. 메모리 관리자는 VAD를 사용해 프로세스 메모리에서 예약된 가상 주소를 추적할 수 있고 각각의 프로세스에 대해 VAD를 관리한다. 프로세스 메모리 영역이 메모리 매핑 파일을 포함하면 VAD 노드는 Base Address, 파일 경로, 메모리 보호에 대한 정보를 저장한다.
이를 통해 ldrmodules 플러그인은 매핑된 실행 파일 이미지를 포함하는 VAD 노드 모듈을 나열하고 유저 공간에 있는 PEB 리스트 3개와 비교하여 일치 여부를 확인한다.
참고로, InInit 리스트는 앞서 설명했듯이 프로세스 실행 파일에 대한 정보 포함하지 않으므로 False라고 뜬다.
3. dlldump 플러그인
- DLL 파일 덤프
- 악의적인 DLL 식별 후 추가 조사를 위해 덤프
vol_2.6.exe -f <메모리 이미지 파일> --profile=<프로파일 명> dlldump -p <PID> -b <Base Address> -D <dump directory>
DLL을 로드한 PID(-p옵션) DLL의 Base Address 주소를 지정(-b옵션)
'Security > Volatility' 카테고리의 다른 글
[Volatility] 명령어 히스토리 조사 (0) | 2021.04.28 |
---|---|
[Volatility] 서비스 조사 (0) | 2021.04.28 |
[Volatility] 레지스트리 조사 (0) | 2021.04.28 |
[Volatility] 네트워크 및 소켓 조사 (0) | 2021.04.28 |
[Volatility] 프로세스 조사 (0) | 2021.04.28 |