부트킷 및 루트킷 샘플 분석은(는) 무엇을 하나요?
사용 시점
- OS 재설치 후에도 손상 징후가 지속되는 시스템
- 명확한 손상 증거가 있음에도 바이러스 백신 및 EDR이 악성코드를 탐지하지 못하는 경우
- UEFI 시큐어 부트가 비활성화되었거나 무결성 위반이 발견된 경우
- 메모리 포렌식에서 루트킷 행위(숨겨진 프로세스, 후킹된 시스템 콜)가 발견된 경우
- 부트킷을 배포하는 것으로 알려진 국가 수준 위협(APT28, APT41, Equation Group)을 조사하는 경우
표준 사용자 모드 멀웨어에는 사용하지 마십시오. 부트킷과 루트킷은 근본적으로 다른 수준에서 작동하며 특수 분석 기술이 필요합니다.
사전 요구 사항
- 디스크 이미징 도구(dd, FTK Imager): MBR/VBR 섹터 확보
- UEFITool: UEFI 펌웨어 볼륨 분석 및 모듈 추출
- chipsec: 하드웨어 수준 펌웨어 보안 평가
- Ghidra(x86 리얼 모드 및 16비트 지원): MBR 코드 분석
- Volatility 3: 커널 수준 루트킷 아티팩트 탐지
- 부팅 가능한 Linux 라이브 USB: 오프라인 시스템 분석
워크플로우
1단계: 부트 섹터 및 펌웨어 확보
MBR, VBR 및 UEFI 펌웨어를 오프라인 분석을 위해 추출합니다:
# MBR 확보 (디스크의 첫 512바이트)
dd if=/dev/sda of=mbr.bin bs=512 count=1
# 첫 번째 트랙 확보 (일반적으로 MBR 이후 부트킷 코드 포함)
dd if=/dev/sda of=first_track.bin bs=512 count=63
# VBR 확보 (볼륨 부트 레코드 - 파티션의 첫 번째 섹터)
dd if=/dev/sda1 of=vbr.bin bs=512 count=1
# UEFI 시스템 파티션 확보
mkdir /mnt/efi
mount /dev/sda1 /mnt/efi
cp -r /mnt/efi/EFI /analysis/efi_backup/
# UEFI 펌웨어 덤프 (chipsec 또는 flashrom 필요)
# chipsec 사용:
python chipsec_util.py spi dump firmware.rom
# flashrom 사용:
flashrom -p internal -r firmware.rom
# 펌웨어 덤프 무결성 확인
sha256sum firmware.rom
2단계: 부트킷 코드에 대한 MBR/VBR 분석
악의적인 수정 사항을 찾기 위해 부트 섹터 코드를 검사합니다:
# MBR 코드 디스어셈블 (16비트 리얼 모드)
ndisasm -b16 mbr.bin > mbr_disasm.txt
# 알려진 양호한 Windows MBR과 비교
# 표준 Windows MBR 시작: EB 5A 90 (JMP 0x5C, NOP)
# 표준 Windows 10 MBR: 33 C0 8E D0 BC 00 7C (XOR AX,AX; MOV SS,AX; MOV SP,7C00h)
python3 << 'PYEOF'
with open("mbr.bin", "rb") as f:
mbr = f.read()
# MBR 시그니처 확인 (바이트 510-511은 0x55AA여야 함)
if mbr[510:512] == b'\x55\xAA':
print("[*] 유효한 MBR 시그니처 (0x55AA)")
else:
print("[!] 유효하지 않은 MBR 시그니처")
# 알려진 부트킷 시그니처 확인
bootkit_sigs = {
b'\xE8\x00\x00\x5E\x81\xEE': "TDL4/Alureon 부트킷",
b'\xFA\x33\xC0\x8E\xD0\xBC\x00\x7C\x8B\xF4\x50\x07': "표준 Windows MBR (깨끗함)",
b'\xEB\x5A\x90\x4E\x54\x46\x53': "표준 NTFS VBR (깨끗함)",
}
for sig, name in bootkit_sigs.items():
if sig in mbr:
print(f"[{'!' if '깨끗함' not in name else '*'}] 시그니처 일치: {name}")
# 파티션 테이블 항목 확인
print("\n파티션 테이블:")
for i in range(4):
offset = 446 + (i * 16)
entry = mbr[offset:offset+16]
if entry != b'\x00' * 16:
boot_flag = "활성" if entry[0] == 0x80 else "비활성"
part_type = entry[4]
start_lba = int.from_bytes(entry[8:12], 'little')
size_lba = int.from_bytes(entry[12:16], 'little')
print(f" 파티션 {i+1}: 유형=0x{part_type:02X} {boot_flag} 시작=LBA {start_lba} 크기={size_lba} 섹터")
PYEOF
3단계: 임플란트에 대한 UEFI 펌웨어 분석
승인되지 않은 모듈이 있는지 UEFI 펌웨어 볼륨을 검사합니다:
# UEFITool로 UEFI 펌웨어 구성 요소 추출
# GUI: firmware.rom 열기 -> 펌웨어 볼륨 검사
# CLI:
UEFIExtract firmware.rom all
# 모든 DXE 드라이버 나열 (UEFI 임플란트의 가장 일반적인 대상)
find firmware.rom.dump -name "*.efi" -exec file {} \;
# 알려진 양호한 펌웨어 모듈 목록과 비교
# 각 UEFI 모듈에는 GUID가 있음 - 공급업체 기준과 비교
# 시큐어 부트 구성 확인
python chipsec_main.py -m common.secureboot.variables
# SPI 플래시 쓰기 보호 확인
python chipsec_main.py -m common.bios_wp
# 알려진 UEFI 악성코드 패턴 확인
yara -r uefi_malware.yar firmware.rom
알려진 UEFI 부트킷 탐지 포인트:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
LoJax (APT28):
- 수정된 SPI 플래시
- Windows에 에이전트를 떨어뜨리는 DXE 드라이버 추가
- OS 재설치 및 디스크 교체 후에도 지속됨
BlackLotus:
- 시큐어 부트 우회를 위해 CVE-2022-21894 악용
- EFI 시스템 파티션 부트로더 수정
- 부팅 중 커널 드라이버 설치
CosmicStrand:
- CORE_DXE 펌웨어 모듈 수정
- 부팅 중 커널 초기화 후킹
- Windows 커널 메모리에 셸코드 주입
MoonBounce:
- CORE_DXE 모듈의 SPI 플래시 임플란트
- 수정된 GetVariable() 함수
- 부트 체인을 통해 사용자 모드 임플란트 배포
ESPecter:
- ESP에서 Windows 부트 관리자 수정
- DSE 비활성화를 위해 winload.efi 패치
- 서명되지 않은 커널 드라이버 로드
4단계: 커널 수준 루트킷 행위 탐지
실행 중인 시스템에서 루트킷 아티팩트를 분석합니다:
# 루트킷 탐지를 위한 메모리 포렌식
# SSDT 후크 탐지
vol3 -f memory.dmp windows.ssdt | grep -v "ntoskrnl\|win32k"
# 숨겨진 프로세스 (DKOM)
vol3 -f memory.dmp windows.psscan > psscan.txt
vol3 -f memory.dmp windows.pslist > pslist.txt
# 차이점을 비교하여 숨겨진 프로세스 찾기
# 커널 콜백 등록 (루트킷은 필터링을 위해 콜백을 등록함)
vol3 -f memory.dmp windows.callbacks
# 드라이버 분석
vol3 -f memory.dmp windows.driverscan
vol3 -f memory.dmp windows.modules
# 서명되지 않은 드라이버 확인
vol3 -f memory.dmp windows.driverscan | while read line; do
driver_path=$(echo "$line" | awk '{print $NF}')
if [ -f "$driver_path" ]; then
sigcheck -nobanner "$driver_path" 2>/dev/null | grep "Unsigned"
fi
done
# IDT 후크 탐지
vol3 -f memory.dmp windows.idt
5단계: 부트 프로세스 무결성 검증
전체 부트 체인의 무결성을 확인합니다:
# Windows 부트 관리자 서명 확인
sigcheck -a C:\Windows\Boot\EFI\bootmgfw.efi
# winload.efi 확인
sigcheck -a C:\Windows\System32\winload.efi
# ntoskrnl.exe 확인
sigcheck -a C:\Windows\System32\ntoskrnl.exe
# 측정 부트 로그 확인 (TPM 사용 가능한 경우)
# Windows: BCDEdit /enum firmware
bcdedit /enum firmware
# 시큐어 부트 상태 확인
Confirm-SecureBootUEFI # PowerShell cmdlet
# 부트 구성 변조 확인
bcdedit /v
# 부트 구성 변경 사항 확인
# testsigning: No여야 함
# nointegritychecks: No여야 함
# debug: No여야 함
bcdedit | findstr /i "testsigning nointegritychecks debug"
6단계: 부트킷/루트킷 분석 문서화
포괄적인 분석 결과를 문서로 정리:
분석에는 다음 사항이 문서화되어야 함:
- 부트 섹터 (MBR/VBR) 무결성 상태 및 16진수 비교
- UEFI 펌웨어 모듈 인벤토리 및 무결성 검증
- 시큐어 부트 상태 및 탐지된 우회 메커니즘
- 식별된 커널 수준 후크 (SSDT, IDT, IRP, 인라인)
- 발견된 숨겨진 프로세스, 드라이버 및 파일
- 지속성 메커니즘 (SPI 플래시, ESP, MBR, 커널 드라이버)
- 부트 체인 무결성 검증 결과
- 가능한 경우 알려진 부트킷 패밀리에 대한 귀속
- 치료 단계 (펌웨어 재플래시, MBR 재구축, 하드웨어 교체)
주요 개념
| 용어 | 정의 |
|---|---|
| 부트킷 | 운영 체제가 로드되기 전에 부트 프로세스(MBR, VBR, UEFI)를 감염시켜 지속적인 저수준 제어를 얻는 악성코드 |
| MBR (마스터 부트 레코드) | 부트스트랩 코드와 파티션 테이블이 포함된 디스크의 첫 512바이트; MBR 부트킷은 이 코드를 악성 로더로 교체함 |
| UEFI (통합 확장 펌웨어 인터페이스) | BIOS를 대체하는 최신 펌웨어 인터페이스; UEFI 부트킷은 펌웨어 볼륨에 악성 모듈을 주입하거나 ESP를 수정함 |
| 시큐어 부트 | 부트 구성 요소의 디지털 서명을 확인하는 UEFI 보안 기능; BlackLotus와 같은 부트킷은 취약점을 악용하여 이를 우회함 |
| SPI 플래시 | UEFI 펌웨어를 저장하는 플래시 메모리 칩; LoJax 및 MoonBounce와 같은 고급 부트킷은 SPI 플래시를 수정하여 펌웨어 수준 지속성을 얻음 |
| DKOM (직접 커널 개체 조작) | 함수를 후킹하지 않고 커널 구조를 수정하여 프로세스, 파일 및 네트워크 연결을 숨기는 루트킷 기술 |
| DSE (드라이버 서명 적용) | 커널 드라이버에 디지털 서명을 요구하는 Windows 보안 기능; 부트킷은 부팅 중 DSE를 비활성화하여 서명되지 않은 루트킷 드라이버를 로드함 |
도구 및 시스템
- UEFITool: 펌웨어 볼륨, 드라이버 및 모듈 검사를 위한 오픈 소스 UEFI 펌웨어 이미지 편집기 및 파서
- chipsec: SPI 플래시 보호, 시큐어 부트 및 UEFI 구성을 확인하기 위한 Intel 하드웨어 보안 평가 프레임워크
- Volatility: 커널 루트킷 탐지를 위한 SSDT, IDT, 콜백 및 드라이버 분석 플러그인이 포함된 메모리 포렌식 프레임워크
- GMER: SSDT 후크, IDT 후크, 숨겨진 프로세스 및 수정된 커널 모듈을 스캔하는 Windows 루트킷 탐지 도구
- Bootkits Analyzer: 알려진 양호한 기준과의 디스어셈블리 및 비교를 포함하여 MBR/VBR 코드 분석을 위한 특수 도구
일반적인 시나리오
시나리오: OS 재설치 후에도 지속되는 손상 조사
상황: 조직이 손상된 워크스테이션을 재설치했지만 몇 시간 내에 동일한 C2 비콘 활동이 재개되었습니다. 표준 디스크 포렌식에서는 악성코드가 발견되지 않습니다. UEFI 부트킷이 의심됩니다.
접근 방식:
- 손상된 OS 구성 요소 실행을 방지하기 위해 Linux 라이브 USB로 부팅
- chipsec 또는 flashrom을 사용하여 오프라인 분석을 위해 SPI 플래시 펌웨어 덤프
- dd를 사용하여 부트 섹터 분석을 위해 MBR 및 VBR 섹터 덤프
- 부트로더 무결성 확인을 위해 EFI 시스템 파티션 복사
- UEFITool에서 SPI 덤프를 열고 모듈 GUID를 공급업체 제공 펌웨어와 비교
- 존재하지 않아야 하는 추가 또는 수정된 DXE 드라이버 찾기
- Ghidra(x86_64 UEFI 모듈 형식)로 의심스러운 모듈 분석
- 시큐어 부트 구성 확인 및 익스플로잇 기반 우회 확인
함정:
- 손상된 OS가 실행 중인 상태에서 시스템 분석 (루트킷이 라이브 분석에서 숨을 수 있음)
- SPI 플래시를 확인하지 않음 (디스크 기반 부트 구성 요소만 분석하면 펌웨어 수준 임플란트를 놓침)
- 시큐어 부트가 모든 부트킷을 차단한다고 가정 (알려진 우회 방법 존재, 예: CVE-2022-21894)
- 재플래시 전에 원본 펌웨어 덤프를 보존하지 않음 (귀속을 위한 중요한 증거)
출력 형식
부트킷 / 루트킷 분석 보고서
====================================
시스템: Dell OptiPlex 7090 (UEFI, TPM 2.0)
펌웨어 버전: 1.15.0 (Dell)
시큐어 부트: 활성화됨 (그러나 우회됨)
캡처 방법: Linux 라이브 USB + chipsec SPI 덤프
MBR/VBR 분석
MBR 시그니처: 유효 (0x55AA)
MBR 코드: 표준 Windows 10 MBR과 일치 (깨끗함)
VBR 코드: 표준 NTFS VBR과 일치 (깨끗함)
UEFI 펌웨어 분석
총 모듈: 287
공급업체 예상: 285
추가 모듈: 2개 승인되지 않음
[!] DXE 드라이버 GUID: {ABCD1234-...} "SmmAccessDxe_mod" (수정됨)
원본 크기: 12,288 바이트
현재 크기: 45,056 바이트 (32KB 추가됨)
엔트로피: 7.82 (높음 - 암호화된 페이로드)
[!] DXE 드라이버 GUID: {EFGH5678-...} "UefiPayloadDxe" (신규 - 공급업체 펌웨어에 없음)
크기: 28,672 바이트
기능: 부팅 중 지속성 에이전트 주입
부트 체인 무결성
bootmgfw.efi: 수정됨 (해시 불일치, CVE-2022-21894를 통한 시큐어 부트 우회)
winload.efi: 수정됨 (로드 시 DSE 비활성화됨)
ntoskrnl.exe: 깨끗함 (그러나 부팅 후 서명되지 않은 드라이버 로드됨)
커널 루트킷 구성 요소
드라이버: C:\Windows\System32\drivers\null_mod.sys (서명되지 않음, 숨겨짐)
SSDT 후크: 3 (NtQuerySystemInformation, NtQueryDirectoryFile, NtDeviceIoControlFile)
숨겨진 프로세스: 2 (PID 6784: beacon.exe, PID 6812: keylog.exe)
숨겨진 파일: C:\Windows\System32\drivers\null_mod.sys
귀속
패밀리: BlackLotus 변종
신뢰도: 높음 (CVE-2022-21894 익스플로잇, ESP 수정 패턴 일치)
치료
1. 하드웨어 프로그래머를 사용하여 깨끗한 공급업체 이미지로 SPI 펌웨어 재플래시
2. 깨끗한 Windows 설치 미디어에서 EFI 시스템 파티션 재구축
3. 검증된 미디어에서 OS 재설치
4. 모든 펌웨어 쓰기 보호 활성화
5. 펌웨어를 최신 버전으로 업데이트 (CVE-2022-21894 패치)