-
[악성문서분석] MS 오피스 - 이론보안/악성문서분석 2024. 10. 29. 00:13
1. 이론
1.1 악성 문서 파일의 일반적인 구성 요소
- 악성 문서 파일은 일반적으로 익스플로잇, 쉘코드, 스크립트, 실행파일 등의 악성개체를 포함
- 이러한 악성 개체를 포함해야 하는 악성 문서 파일들의 특성상 이상 징후 식별이 가능
- 악성 문서 파일의 목표 중 하나는 쉘코드를 찾는 것이다
- 익스플로잇을 찾는 것이 중점이 아님.
- 익스플로잇은 취약점을 이용하여 쉘코드를 실행시키는데 사용되는 도구일 뿐 공격자의 의도를 이해하기 위해선 쉘코드를 얻어 분석해야 함
1.2 악성 문서 파일 분석 절차
- 파일의 포맷 확인
- 악성징후 식별
- 악성개체 식별 및 추출
- 악성개체의 기능 분석
- 여기서 분석 대상은 쉘코드, 스크립트, 실행파일(PE 파일)일 수 있음
- 분석의 목표는 IOC 추출
1.3 악성 MS 오피스 문서 파일 트리아지를 위한 징후
- 매크로를 포함하고 있는가? (OLEDUMP를 활용하면 파악 가능)
- OLEDUMP를 이용하여 조사해 보았을 때 "M" 플래그가 지정된 스트림이 존재하는지 확인
- DDE/DDEAUTO 명령어를 포함하고 있는가?
- MSODDE를 이용하여 조사해 보았을 떄 명령어들이 내장되어 있는지 확인
- 쉘코드를 포함하고 있는가?
- YARA를 이용하여 쉘코드 및 악성 문서 패턴을 조사하였을 때 식별되는지 확인
1.4 파일리스 공격
- 디스크에 터치가 이루어질 경우 흔적이 메모리에서 바로 실행될때에 명확하게 남음
- 공격자는 이러한 상황을 우회하기 위해 시스템에서 정상적으로 사용되는 LOL Binary를 이용하여 정상 프로세스에 악성코드를 인젝션해 디스크 터치가 이루어지지 않고 메모리 상에서 공격이 실행되게 하는 공격
- 예 : 프로세스 인젝션
1.5 실행 파일의 메모리 상 동작 방식과 쉘코드
1.6 쉘코드 분석 방법
- 문자열 분석
- 예 : Strings
- 동적 분석
- 에뮬레이터를 이용하는 방법
- 예 : scdbg
- 에뮬레이터를 이용하는 방법
- 동적 분석
- 디버거를 이용하는 방법
- 예 : xDbg, OllyDbg, Immunity Debugger
- 디버거를 이용하는 방법
- 정적 분석
- 디컴파일러/디스어셈블러를 이용하는 방법
- 예 : IDA, Ghidra
- 디컴파일러/디스어셈블러를 이용하는 방법
1.7 쉘코드가 일을 하기 위해서 임베드 하고 있을만한 데이터
- API/DLL 문자열
- 통신하는 C2 서버의 도메인 혹은 IP
- 통신에 사용하는 HTTP 헤더의 내용(User-Agent, URI 등)
- 파일, 레지스트리 관련 문자열
1.8 쉘코드 레이아웃
경우에 따라 다를 수 있지만 쉘코드는 다음과 같은 루틴으로 구성되어 있음
- GetPC 루틴
- 쉘 코드는 처음 실행될 때 자신이 로드된 가상주소를 알지 못함. 그래서 디코딩, 문자열 참조를 할 수 없음
- PEB를 통한 KERNEL32.DLL 베이스 주소 추적 루틴
- Self-Decoding(Decryption) 루틴
- 일반적으로 루프 패턴을 가짐. XOR 연산을 이용하는 경우가 많음
- 인코딩(암호화)된 상태로는 실행이 불가능해서 디코딩(복호화) 수행 필요
- 인코딩 하는 이유는 센서(AV 시스템)에 대한 우회를 목적으로 함
- API 해시 값 계산 루틴
- 셀프 바인딩을 하는데 사용되는 문자열(API 문자열, DLL 문자열)을 해시화 해서 센서(AV 시스템)의 우회를 목적으로 함
- API 주소 확보 루틴
- 쉘코드는 메모리상에 있는 API들의 주소를 알지 못하므로, Loadlibrary/GetProcAddress 함수를 통해 API의 주소 값들을 확보 해야함
- API를 이용한 쉘코드 기능 구현 루틴
- API 세트를 이용하여 프로세스 인젝션, 프로세스 워킹, 임베드된 파일 추출 및 실행, URL을 통한 파일 다운로드, 키로깅 등 주요 악성 기능을 수행
1.9 악성코드의 주요 기능
- 기능이름: 프로세스워킹(Process Walking)
- 기능설명: 공격대상 시스템의 프로세스 정보 확보
- 관련함수: CreateToolHelp32Snapshot, Process32Fisrt, Process32Next
- 기능목표: 시스템에서 동작중인 프로세스들의 이름, PID 등의 정보를 확보하여 특정(AV, 모니터링 프로그램) 프로세스를 강제 종료 시키거나, 향후 프로세스 인젝션을 하기 위함
- 기능이름: 프로세스인젝션(Process Injection)
- 기능설명: 다른 프로세스의 메모리 공간에 코드 혹은 실행파일등을 삽입한 후 실행 시키는 공격
- 관련함수: OpenProcess(PID), VirtualAllocEx, WriteProcessMemory, CreateRemoteThread or RtlCreateUserThread
- 기능목표: Fileless 공격 개념의 기술적 구현. AV의 탐지를 우회 및 권한상승
- 기능이름: 동적바인딩(Dynamic Binding)
- 기능설명: 프로그램이 동작하면서 메모리상에 매핑된 DLL의 VA와 익스포트하고 있는 API의 VA를 확보하는 작업
- 관련함수: Loadlibary, GetProcAddress
- 기능목표: 악성코드의 기능 수행에 필요한 API들의 VA를 확보
1.10 쉘코드의 루핑 수행 목적
- 암호화된 데이터(쉘코드 본체, DLL/API 이름, 도메인/IP 등) 복호화
- DLL 익스포트 테이블의 API 해시 값을 계산하는 경우
- 바인딩
- 참조할 데이터가 존재하는 위치까지 탐색을 수행할 때
1.11 GetPC
- 프로세스의 가상주소공간 내에서 쉘 코드가 자신의 주소위치를 확인하는데 사용되는 루틴
- 암호화된 쉘코드는 자가 복호화 등의 작업을 위해 포인터를 확보해야 하는데 이떄 GetPC 코드가 필요
- 유형 :
- CALL/POP(JMP/CALL/POP) 루틴
- POP 레지스터 명령이 실행 되면서 오퍼랜드인 레지스터에 포인터가 저장
- CALL $+N 루틴
- CALL/POP 과 유사하나, POP 코드와 붙어 있다는 차이점을 가짐
- FSTENV 루틴
- 부동소수점(Floating Point)를 다루는 명령을 기반으로 하는 루틴
- 부동소수점을 다루는 명령이면 어떤 것이든 상관없이(FLDZ, FCMOVNE 등) 해당 명령이 실행된 직후 FSTENV 명령을 실행하면 스택에 부동소수점이 실행된 주소가 보관됨
- FSTENV 명령은 부동소수점을 다루는 환경정보 값들을 스택에 저장하는 명령이며, 이때 이전 실행되었던 부동소수점 관련 명령의 주소도 저장
- SER(Structured Exception Handler) 조사 루틴
- 쉘코드가 커스텀 핸들러를 SEH에 등록함. 그리고 임의로 예외 상황을 발생하여 핸들러 루틴을 호출
- 핸들러는 예외를 발생시킨 명령어의 주소 값을 전달
- CALL/POP(JMP/CALL/POP) 루틴
1.12 바인딩
- 참조하는 API의 주소 값을 확보하여 별도의 주소 테이블에(IAT) 기록하는 작업
- 바인딩은 실행되는 시기에 따라 정적 바인딩과 동적 바인딩으로 나누어짐