2. forensicinsight.org Page
2
소개
§ 닉네임 : n0fate
§ 블로그 : forensic.n0fate.com
§ 개발도구
• Volafox : OS X Memory Forensic Toolkit (칼리 리눅스에서 볼 수 있어요..)
• chainbreaker : OS X Keychain Breaker
• iChainbreaker : iCloud Keychain Breaker (아직까진 비공개)
• walitean : SQLite WAL Log Parser
• 등등…
3. forensicinsight.org Page
3
§ 라이브 분석
• 악성코드를 빠르게 식별하기 위해 활성 상태에서 주요 아티팩트 분석
• 조기 식별에 유용하나 최근 악성코드의 대응 능력 확대
ü 라이브 분석 도구 탐지/대응 기법
ü 메모리 조작 악성코드
ü 루트킷
§ 디스크 분석
• 라이브 분석에서 발견되지 않을 경우 이미징 -> 분석
• 사전 정보가 없다면 매우 많은 시간이 소요됨
• 디스크 분석 대응 악성코드 존재
ü 디스크에 존재하지 않는 악성코드
침해 대응 시 이슈
4. forensicinsight.org Page
4
침해 대응 시 이슈 대안책
§ 메모리 분석
• 특정 시점의 메모리를 이미징하여 이미지에서 찾고자 하는 요소를 채취하는 기법
• 포렌식 기법을 이용하여 침해 대응 시 악성코드 분석에 활용(메모리 분석)
§ 침해 대응 시 메모리 분석의 장점
• 라이브 분석의 장점을 포함
ü 라이브 분석 시 획득하는 아티팩트 대부분 수집 가능
ü 상대적으로 높은 신뢰도
• 메모리 조작 악성코드 식별에 특화
• 안티 분석 기법 대응 가능
5. forensicinsight.org Page
5
메모리 분석의 효용성
수집 대상 라이브 분석 메모리 분석
프로세스 목록 O O + 삭제된 프로세스 목록
로드된 라이브러리 O O
로드된 파일 O O
네트워크 세션 목록 O O + 삭제된 세션 목록
이벤트 로그 O O
자동 실행 목록 O O(레지스트리에 한해)
서비스 목록 O O
드라이버 목록 O O
웹 브라우저 정보 O O(IE에 대해)
사용자 패스워드 해시 O O
라이브 vs 메모리
6. forensicinsight.org Page
6
라이브 포렌식 무용론?
§ 메모리 분석을 한다면 라이브 분석은 의미가 없을까?
• 메모리 분석은 라이브 분석에서 수집하는 대부분의 정보를 수집 가능
• 상대적으로 높은 신뢰도를 가지고 있음 (상황에 따라 다름)
§ 라이브 분석의 낮은 신뢰도가 오히려 분석에 도움을 줄 수 있음
• 신뢰된 시스템에서 수집된 라이브 분석 정보와 메모리 분석 정보는 일치
• 두 정보가 다르다면?
ü 해당 정보는 악의적인(가끔 보안적인) 목적으로 변조되었을 수 있음
ü 예) 프로세스 은닉, 네트워크 세션 은닉 등
§ 두 정보 모두 수집하여 분석 결과를 비교하면 분석 효율을 향상시킬 수 있음
7. forensicinsight.org Page
7
메모리 분석으로 악성요소 찾기
§ 메모리 분석을 통해 악성 요소를 효과적으로 식별 가능
• 하지만..
ü Q) 메모리 분석 도구 사용은 해봤는데 어떤 경우에 유용한지 알고 싶다.
• 그래서..
ü A) 몇몇 악성코드 기법을 메모리 분석으로 쉽게 찾아내는 사례를 알아본다.
ü A) volatility를 효과적으로 사용하는 방법을 알아본다.
§ 본 발표에서 사용할 도구 - volatility
• 뛰어난 오픈소스 메모리 포렌식 도구
ü 참고문서 : The Art of Memory Forensics
• 다양한 운영체제 제공
ü Windows, Linux, OS X, Android
9. forensicinsight.org Page
9
악성 요소 찾기
§ 시스템에는 대부분의 정상 요소와 소수의 악성 요소가 혼재되어 있음
• 분석가는 수많은 데이터 중에서 의심되는 요소를 식별 후 그와 관계된 추가 요소를 식별
• 문제는 악성 요소 자체를 찾는 것
§ 악성 요소는 자신이 악성 요소로 보이지 않기 위해 다양한 트릭을 사용
• 연구된 침해사고 대응 기술을 토대로 안티-대응 기법을 연구 및 반영
11. forensicinsight.org Page
11
악성 프로세스 찾기
윈도의 프로세스 관리 구조 이해
프로세스
구조체
프로세스
구조체
프로세스
구조체
커널 디버그
(KDBG)
로딩된
모듈
로딩된
모듈
로딩된
모듈
스레드
스레드
스레드
가상주소디스크립터(VAD)
할당된 메모리 페이지 주소
페이지 권한 등을 다룸
핸들 테이블
프로세스가 접근하는
자원(파일,
13. forensicinsight.org Page
12
악성 프로세스 찾기
§ 프로세스 탐지를 회피하기 위한 가장 효과적인 방법
• 커널 레벨 루트킷을 이용하여 객체를 변조하는 방법
• 라이브 포렌식 무력화
§ 지속적인 창과 방패의 싸움
• 방패는 은닉 기법을 분석하여 이를 탐지하기 위한 기술을 개발
• 창은 탐지 기술을 분석하여 새로운 은닉 기법을 연구
은닉된 프로세스 찾기
프로세스
구조체
프로세스
구조체
프로세스
구조체
커널 디버그
(KDBG)
14. forensicinsight.org Page
13
악성 프로세스 찾기
§ 메모리 분석은 최고의 안티 루트킷 기법
• 다양한 분석 기법이 존재
• But, 분석에 많은 내공을 필요하게 구성
§ 볼라틸리티에서 제공되는 분석 기법
• 프로세스 객체 검색(psscan) – 프로세스 객체에 있는 풀 태그를 이용하여 수집
• 스레드 스캔(thrdproc) – 스레드(ETHREAD) 객체를 이용하여 프로세스를 추적
• CSRSS 핸들 테이블(csrss) – 모든 프로세스와 스레드 생성을 관리하는 csrss.exe 이용
• PspCid 테이블(pspcid) – PspCidTable로 모든 프로세스 핸들 수집
• 세션 프로세스(session) – 현재 세션의 프로세스 수집
• 데스크탑 스레드(deskthrd) – 윈도 데스크탑에 연결된 모든 스레드 목록을 수집
은닉된 프로세스 찾기
15. forensicinsight.org Page
14
악성 프로세스 찾기
§ 일단 psxview 명령어를 실행한다.
§ 규칙
• 모든 것이 True인 프로세스는 은닉된 게 아니다.
• 예외
ü system - csrss, session, deskthrd가 False
ü smss.exe - csrss, session, deskthrd가 False
ü csrss.exe - csrss가 False
ü -R(--apply-rules) 옵션으로 처리 가능
• 종료된 프로세스(ExitTime이 존재)는 일반적으로 psscan에서만 True
ü 단, 종료 후, 커널 객체 소멸 이전에 덤프한 경우 pslist, thrdproc도 True인 경우가 있음
ü 루트킷이 ExitTime을 0으로 변경한 경우를 유의
프로세스 분석(psxview) – 쉽게 이해하자
17. forensicinsight.org Page
16
악성 프로세스 찾기
§ 접근 토큰(Access Token)
• 프로세스/스레드가 구동 중에 필요한 다양한 권한을 가지기 위한 정보
• 자원 접근 제어에 사용
ü 특정 객체에 접근하거나 API 호출 시 프로세스 토큰 정보로 권한 검사 수행
• 접근 토큰에는 보안 식별 디스크립터(SID)와 사용자 계정의 권한이 정의
§ 메모리 분석 시 활용 분야
• 프로세스 토큰에 저장되는 SID를 이용한 사용자 권한 확인
• Lateral Movement 확인
• 프로세스 행위 유추
• 권한 상승 검증
할당된 접근 토큰을 이용한 식별
18. forensicinsight.org Page
17
악성 프로세스 찾기
§ 정상 프로세스/스레드에서 사용하진 않지만 악성코드가 주로 사용하는 토큰이 존재
• 프로세스/스레드에 부여된 토큰의 권한(privilege) 정보를 통해 악성 여부 판단
§ 악성코드가 주로 사용하는 권한
• SeDebugPrivilege – 권한이 없는 시스템 프로세스의 메모리 접근 가능
• SeTakeOwnershipPrivilege – 특정 객체에 대한 소유주를 변경
• SeLoadDriverPrivilege – 디바이스 드라이버 로드 권한
§ Windows 7 이후 운영체제에선 사용 제한적
• Session 0 Isolation
• 하지만 우회 기법도 연구되고 있음 J
§ 볼라틸리티에선 ‘privs’ 플러그인으로 분석 가능
할당된 프로세스 토큰을 이용한 식별
20. forensicinsight.org Page
19
악성 프로세스 찾기
§ 특정 프로세스의 메모리 영역에 코드를 삽입하는 방법
• 다른 프로세스에 기생하여 자기자신을 은닉
• 코드만 삽입하므로 프로세스나 라이브러리에 나타나지 않음
§ 메모리 조작으로 악성코드를 분석해야만 행위를 파악할 수 있음
§ 사례 분석
• 프로세스 교체(Process Hollowing aka Process Replacement)
• DLL 인젝션(악성 라이브러리 찾기)
코드 인젝션
21. forensicinsight.org Page
20
악성 프로세스 찾기 – 코드 인젝션
디스크 분석 vs 메모리 분석
대상 선정
코드 인젝션
인지
인젝션된
코드 식별
인젝션 페이지 식별,
인젝션 대상 식별
분석
코드 덤프
인젝션
범위 식별
메모리 분석
분석
디스크 분석
22. forensicinsight.org Page
21
악성 프로세스 찾기
§ 코드 서명된 프로그램을 화이트리스트로 처리
• 코드 서명 : PE 파일의 변조 여부를 판단하기 위한 디지털 서명
• 디지털 서명된 프로그램은 바이너리 조작 시 실행 불가
ü 실행파일 로드 시점에 디지털 서명을 검증
§ 메모리에서 조작한다면?
• 신뢰된 프로세스가 로드된 후에 할당된 메모리 변조 가능
• 악성코드가 서명된 실행 파일의 코드가 실행되기 전에 코드를 변경하면 악의적 행위 가능
ü 디지털 서명된 프로세스도 더이상 신뢰할 수 없다.
프로세스 교체
23. forensicinsight.org Page
22
악성 프로세스 찾기
프로세스 교체 방법
프로세스
메모리
페이로드
코드영역
데이터
영역
스택/힙
PAGE_EXECUTE_READ
PAGE_READ
PAGE_READWRITE
2.
24. 코드 시작 지점 식별
코드 영역
(PAGE_EXECUT
E_READWRITE)
3.
31. forensicinsight.org Page
23
악성 프로세스 찾기
§ 디스크 및 라이브 분석 시 악성코드 직접 분석 필요
• 메모리에서만 변조가 이루어짐.
§ VAD의 보호 페이지 속성 정보를 확인하여 식별 가능
• VAD(Virtual Address Descriptor) : 프로세스의 할당된 메모리 페이지를 관리
• 메모리 페이지 속성 정보를 분석하면 악성 페이지를 식별할 수 있음
프로세스 교체 분석 방법
http://www.codemachine.com/figures/figure_protopte_2.png
32. forensicinsight.org Page
24
악성 프로세스 찾기
§ malfind 플러그인의 탐지 방법
• VAD 타입이 __MMVAD_SHORT(VadS)인지 확인
ü 정상적인 경우 _MMVAD 또는 _MMVAD_LONG 타입
• 보호 속성이 PAGE_EXECUTE_READWRITE인지 확인
ü 정상적인 경우 3가지 속성을 다 가지지 않음
§ 두 속성에 해당하는 페이지를 추출 (사례 – EvilBunny)
프로세스 교체 분석 방법
33. forensicinsight.org Page
25
악성 프로세스 찾기
§ 메모리 분석을 방해하기 위해 PE헤더 제거
• PE 헤더는 메모리에 로드된 후에는 필요 없음
ü 1페이지 정도(4096바이트)의 헤더 정보를 제거함으로 분석을 까다롭게 함.
• malfind에서는 의심되는 페이지로 추출 가능
§ 두 속성에 해당하는 페이지를 추출 (사례 – Casper)
프로세스 교체 분석 방법
34. forensicinsight.org Page
26
악성 라이브러리 찾기
§ DLL 형태로 구성하여 프로세스에 로드되어 동작
• 프로세스 형태로 노출 시 감지 위험이 높음
• 다양한 실행 파일에 코드를 인젝션하고자 할 때 활용
§ DLL 인젝션 시, 분석 시점에는 악성 프로세스는 존재하지 않는 경우가 많음
• 악성 프로세스는 DLL을 인젝션 후 자기자신을 종료
• 단순히 DLL을 인젝션하는 기능만 내장
ü 보안 솔루션에서 감지하기 어려움
• 각 프로세스가 로드한 라이브러리 정보를 수집하여 의심가는 파일을 추출
§ 악성 프로세스 찾는 과정에서 선별한 프로세스가 주요 대상
• 악성 프로세스로 분류되었으나 프로세스 자체는 정상인 경우를 중심으로 진행
35. forensicinsight.org Page
27
악성 라이브러리 찾기
§ 로드된 라이브러리 목록 수집(dlllist)
• 수많은 로드된 라이브러리 전체를 전시
• 언로드되었지만 메모리에 맵핑 상태인 라이브러리는 확인 불가
• 비정상적인 방법으로 로딩되는 라이브러리 확인 불가
§ 프로세스에 맵핑된 파일 중 라이브러리만 추출(ldrmodules)
• 파일 중 DLL을 목록화하여 출력
ü 프로세스의 가상 주소 디스크립터(VAD)를 이용하여 맵핑된 파일을 찾음
• 언로드되더라도 IAT로 가리키는 메모리 페이지를 소유하는 DLL 감지
• 로드/메모리 맵핑된 모든 DLL 식별 가능
라이브러리 목록 수집
36. forensicinsight.org Page
28
악성 라이브러리 찾기
§ 프로세스의 IAT, EAT, 인라인 후킹 수행
• 프로세스의 행위 모니터링/변조 목적으로 사용
• 분석 방법
ü apihooks 플러그인으로 IAT, EAT, 인라인 후킹된 프로세스 식별하여 분석(사례 : Zeus)
§ DLL 인젝션
• 특정 프로세스의 메모리 영역을 할당받아 로드할 DLL의 이름을 기록(PAGE_READWRITE)
• LoadLibrary 함수를 스레드 형태로 실행하면 해당 프로세스에 동적으로 DLL이 로딩
• malfind 플러그인으로 식별 안됨 - PAGE에 실행권한이 없음
• 분석 방법
ü threads 플러그인으로 다른 스레드와 다른 시간에 구동된 스레드 확인(프로세스 생성 시간과 비교)
ü 해당 프로세스에서 로드한 모듈을 dlllist 플러그인으로 식별
악성 라이브러리 분석 방법
37. forensicinsight.org Page
29
악성 라이브러리 찾기
사례) DLL 인젝션 (Shadowbot)
Memory
Allocated
Memory
Process
Memory
Kernel32.dll
User32.dll
1. 프로세스 로딩
디버깅 권한 설정
2. 메모리 할당(VirtualAlloc) – PAGE_READWRITE
코드 작성(WriteProcessMemory) – DLL 경로
스레드 실행(CreateRemoteThread) – LoadLibrary 주소
3. LoadLibrary
함수 호출
Malicious
DLL
4. 악성 DLL 로드
38. forensicinsight.org Page
30
악성 라이브러리 찾기
§ 공격자가 서비스나 라이브러리를 실행하는 경우..
• 프로세스 로드 시 입력된 커맨드 명령어 수집 필요
• Regsvr32.exe나 svchost.exe와 같이 다른 객체(서비스, 라이브러리)를 로드하는 프로세스의 실행
인자 파악에 유용
• cmdline 플러그인을 이용하여 수집
§ 사례) cmdline 플러그인으로 regsvr32.exe의 인자 파악 (babar)
명령줄 분석
/s
47. forensicinsight.org Page
31
악성 디바이스 드라이버 찾기
§ 커널 레벨에서 동작
• 커널의 리소스를 자유자재로 수정 가능
• 윈도에서 드라이버를 로드하려면 서비스 형태로 동작 (svcscan 플러그인 활용 가능)
• 악성 디바이스 드라이버의 대부분은 루트킷으로 봐도 됨
§ EXE/DLL에 비해 높은 위험도를 가짐
• 커널 레벨 접근은 안정성을 보장할 수 없음.
ü 커널 충돌 발생 시 바로 블루스크린 발생
• 디바이스 드라이버에서만 할 수 있는 일을 수행
ü 특정 개체(프로세스, 파일, 레지스트리 등)를 은닉에 주로 사용
ü 특정 정보를 올바른 것처럼 보이게 만들어 분석가가 잘못된 판단을 하도록 함
§ 기존 포렌식 기법으로 조기 탐지 불가
• 은닉을 위해 동적으로 메모리를 조작하므로, 디스크에는 은닉 흔적이 없음
48. forensicinsight.org Page
32
악성 디바이스 드라이버 찾기
예) 커널 함수 테이블 조작
커널
커널 함수 A
라이브러리
커널 함수 B
애플리케이션 애플리케이션 애플리케이션
커널 레벨
유저 레벨
변조된
결과 전달
49. forensicinsight.org Page
33
악성 디바이스 드라이버 찾기
§ 프로세스 은닉 탐지
• Psscan – 프로세스 구조체를 패턴 기반으로 수집
• Psxview 플러그인 – 6가지 방법으로 프로세스 구조체 목록을 수집하여 전시
§ 네트워크 세션 은닉
• connscan - 네트워크에 세션 정보를 가지는 구조체를 패턴 기반으로 수집
§ 커널 함수 테이블 은닉
• 커널 함수 포인터를 조작하는 루트킷을 감지하는 기술
• ssdt – 시스템 서비스 디스크립터 테이블을 분석하여 변조된 함수를 판단
• Idt – 인터럽트 디스크립터 테이블을 분석하여 변조된 함수를 판단
• gdt – 전역 디스크립터 테이블을 분석
커널 레벨 은닉 탐지 플러그인
50. forensicinsight.org Page
34
악성 디바이스 드라이버 찾기
§ SSDT 후킹 확인(ssdt)
• 디바이스 드라이버 통신, 레지스트리 및 파일 관리 함수 후킹
§ 드라이버 덤프(moddump)
• 대부분 덤프하면 온전한 바이너리 획득 가능
ü 대부분 루트킷 드라이버는 페이지 아웃되지 않도록 함
ü 커널 함수 후킹 시 페이지 아웃되면 블루스크린 발생
사례) SSDT 후킹 감지 (DFIRCON 2014)
51. forensicinsight.org Page
35
악성 요소 덤프하기
§ 메모리에 있는 프로세스를 정적분석할 수 있도록 덤프하는 방법
• 각 프로세스 별로 B-Tree 형태로 관리(VAD)되는 메모리 페이지를 조립하여 바이너리 생성
• 페이징되지 않은 메모리 영역만 덤프할 수 있음
ü 필요성이 낮아 페이징된 메모리는 덤프하지 못함
ü 단, 일부 도구의 경우 페이지 파일을 분석하여 페이징된 메모리도 덤프하는 기능 제공
§ PE 파일 덤프엔 다음과 같은 명령어 사용
• procdump – 프로세스를 EXE 파일 형태로 덤프하는 플러그인
• dlldump – 로드된 라이브러리를 DLL 파일 형태로 덤프하는 플러그인
• moddump – 로드된 디바이스 드라이버를 sys 파일 형태로 덤프하는 플러그인
§ 팩킹된 바이너리의 경우 언패킹된 코드 획득 가능
52. forensicinsight.org Page
36
악성 요소 덤프하기
예) 패킹된 바이너리 추출
바이너리
코드
데이터
바이너리
압축된
바이너리
언팩코드
바이너리
언팩코드
코드
데이터
언팩코드 추가
기존 코드/데이터 압축
패킹할
실행파일
패킹한
실행파일
메모리에서
언팩된
실행파일
추출
53. forensicinsight.org Page
37
악성 요소 덤프하기
§ 심볼 정보가 제거되어 있을 수 있음
• 동작 후 어느정도 시간이 흐르면 심볼 정보를 가지는 테이블이 제거
• 분석 시 심볼 정보를 확인할 수 없어서 분석 지연
• 방안 : impscan 플러그인으로 라이브러리 함수 주소에 해당하는 심볼 명 확인 가능
§ DLL의 경우 베이스 주소 변경(Relocation)으로 분석에 영향을 미칠 수 있음
• 방안 : PE파일의 Optional Header의 EntryPoint를 덤프하는 DLL의 메모리 상 베이스 주소로 변경
• --fix 옵션 사용
§ 가상주소와 물리주소간의 차이 보정
§ 방안 : PE 파일의 섹션 헤더의 주소 값을 가상주소와 일치되게 변경
§ --memory 옵션 사용
복원된 EXE/DLL 분석 시 이슈
54. forensicinsight.org Page
38
악성 요소 덤프하기
§ 커널 후킹 함수 빠르게 식별
• ssdt, idt와 같은 커널 함수 후킹 탐지 플러그인으로 함수 식별
• 후킹된 함수가 가리키는 주소로 커널 후킹 함수 파악
§ 심볼 정보가 제거
• 커널 메모리는 성능 목적으로 항상 사용하는 페이지(Non-Paged) 영역을 제외하곤 페이지 아웃
• 로드 타임에 커널 함수와 주소 매핑 후 심볼 정보가 제거
• 방안 : impscan 플러그인으로 심볼 확인
§ 베이스 주소 변경
• 커널 드라이버는 무조건 주소가 변경되어 있음
• 덤프 후 이미지베이스를 변경하거나, 덤프 시 --fix 옵션으로 해결
복원된 SYS 분석 시 이슈
56. forensicinsight.org Page
40
결론
§ 메모리 분석. 이제는 제대로 활용할 때!
• 5년 전부터 중요하다고 했는데 요즘에서야 관심을 가지는 것 같아요..
• 운영체제 상관없이 메모리 포렌식은 필수 항목
§ 실제 경험이 중요하다!
• 메모리 만으로 뽑아낼 수 있는 정보의 한계치를 확인
• Grrcon, DFIRCON 2014의 메모리 이미지 분석 챌린지를 추천
§ 이 발표 내용 외에도 다양한 분야에 활용 가능
• 암호화된 키 또는 사용자 패스워드 추출
• 접근했던 웹 페이지 캐시 추출
• 암호화된 패스워드 셋 추출 및 패스워드 복호화 가능
ü https://gist.github.com/n0fate/790428d408d54b910956