How to decrypt malicious file in MS Defender Quarantine from Forensic image files

Intro.

대부분의 현대 Anti-Virus 제품은 시그니처 방식과 휴리스틱 방식을 활용해 악성으로 의심되는 파일(Malicious file)을 탐지 및 차단하고 있다. 악성으로 의심되는 파일은 악성코드로 간주하고 검역소로 이동 후 사용자에게 알림과 확인 절차를 통해 악성코드 판별을 유도한다.

이런 이유로 DFIR 분석 과정에서 Anti-Virus 검역소에 저장되어 있는 공격자의 공격 도구를 심심찮게 볼 수 있다. 다만 검역소 내역만 여러 로그로 확인할 수 있을 뿐, 대부분의 Anti-Virus 제품은 검역소에 탐지된 파일을 암호화하여 저장하기 때문에 원본 파일을 확인할 수는 없다.

암호화된 검역소 내 파일은 시스템이 활성화된 상태에서 Anti-Virus 제품의 관리 패널에서 추출 기능을 활용하지 않으면 그 내용을 알 수가 없는데, 이번 글에서는 침해사고 분석을 위해 이미지 파일을 획득했다는 가정하에 제품의 도움을 받지 않고 MS Defender의 검역소 내 암호화된 파일의 복호화 방법을 알아보고자 한다.

Summary

MS Defender 검역소를 분석해 획득할 수 있는 정보
* 관리 패널에서 확인 불가능한 정보

  1. Detection Path/Name/Time
  2. Quarantine/Scan/Threat/Resource ID*
  3. Original File MAC Timestamp*
  4. SHA1 hash of Original file*
  5. Original malicious file
  6. File Owner SID*
  7. File Download URL in NTFS ADS*

Qurantitine folder

검역소는 총 3개의 폴더(Entries, ResourceData, Resource)로 구성되어 있다. 다만 Resource 폴더는 파일 내용이 분석과 관련이 없어 설명을 생략한다.

Entries folder

본 폴더는 GUID로 구성된 파일이 존재하고, GUID 파일은 Detection metadata 영역과 ResourceData 폴더에서 원본 파일을 식별하고 원본 파일의 파일시스템 메타데이터를 저장하고 있는 Resource 영역으로 구분된​다.

  1. Detection metadata
    탐지 메타데이터는 악성코드를 탐지했을 때 탐지 Task를 식별할 수 있는 정보를 의미한다. 같은 파일이 디펜더에 의해 탐지되더라도 탐지 메타데이터는 다를 수 있다.
Detection metadata in entries GUID file

  1. Resource 영역
    Resource 영역은 ResourceData에서 원본 파일을 찾기 위한 ID 값과 악성 의심 파일로 탐지될 시점에 원본 파일의 파일시스템 메타데이터를 저장하고 있다.
Metadata in Resource area

ResourceData

본 폴더에는 탐지될 시점의 원본 파일 혹은 원본 파일의 파일시스템 메타데이터의 Raw 데이터가 저장되어 있다. ResourceData 폴더의 파일은 Entries에서 확인된 Resource ID의 첫 바이트를 폴더명으로 한 폴더에 저장되어 있고, 파일 데이터 첫 부분에는 Win32 Stream ID가 기록되어 있어 해당 파일의 데이터가 어떤 데이터인지 식별할 수 있도록 구성되어 있다.

typedef struct _WIN32_STREAM_ID {
  DWORD         dwStreamId;
  DWORD         dwStreamAttributes;
  LARGE_INTEGER Size;
  DWORD         dwStreamNameSize;
  WCHAR         cStreamName[ANYSIZE_ARRAY];
} WIN32_STREAM_ID, *LPWIN32_STREAM_ID;

WIN32_STREAM_ID

WIN32_STREAM_ID_VALUES

현재까지 확인된 데이터 유형은 SECURITY_DATA, ALTERNATE_DATA(ADS), DATA(Original File)이다.

  1. SECURITY_DATA는 사용자의 SID 정보를 담고 있는 파일시스템 메타데이터이다. 악성 의심 파일을 누가 생성했는지 정확히 확인할 수 있는 데이터이다.
  2. ALTERNATE_DATA는 NTFS에서 추가적인 데이터 스트림으로 알려진 ADS(Alternative Data Stream)로 NTFS에서는 파일의 라벨링, 보안과 관련된 기능에 주로 사용하는 영역이다. Windows 운영체제에서 ADS를 이용한 기능 중 대표적인 기능으로는 "MOTW(Mark Of The Web)" 기능이 있다. 어떤 네트워크에서 파일을 다운로드 받았고(ZoneID), 다운로드 받은 URL이 어떤 것인지(HostURL, ReferURL) 기록하는 기능인데, 로컬 시스템에 파일이 유입된 원인을 파악하는 데 주로 사용된다.
  3. DATA는 NTFS에서 Data Stream으로 알려진 데이터로 원본 파일의 내용을 저장한다.

Encrypt malicious file of MS Defender

MS Defender는 악성코드로 의심되는 파일이 탐지되면 "mpengine.dll" 파일에서 RC4 암호 알고리즘을 활용해 악성코드를 암호화하여 "ResourceData" 경로에 저장한다. 암호화하는 이유는 여러 가지가 있겠지만 개인적으로 추측하는 이유는 악성코드의 안전한 보관과 재탐지를 방지하기 위함이다. 암호화의 목적 중 데이터를 노출하지 않겠다는 목적이 없으므로 MS Defender는 암호화할 때 사용하는 RC4 Key의 관리를 생각보다(?) 중요하게 생각하지 않는 것 같다.

Part of mpengine.dll's Quarantine routine

여러 조건을 거쳐 검역 루틴에 진입하면 준비되어 있는 RC4 key를 이용해 SBOX를 생성(Key Scheduling Algorithm)한 후 암호화를 진행한다.

Encryption routine of RC4
Key of RC4

MS Defender는 탐지된 악성코드의 메타데이터를 RC4 암호 알고리즘으로 암호화하고 원본 파일을 암호화한다. 메타데이터는 영역별로 암호화를 수행하므로 복호화할 때도 영역 별로 복호화를 진행해야 하고, 각 영역을 찾기 위해서는 헤더를 먼저 복호화하고 영역의 위칫값(offset)을 확인해야 한다.

Metadata(Encrypted/Original) of Detected malicious file

Let's Decrypt!

복호화를 위해 제작한 도구는 로컬 드라이브와 검역소 폴더를 입력받아 복호화를 수행한다. 보통 이미지 파일은 로컬 드라이브로 마운트를 할 수 있어 어떤 방법을 사용해도 복호화가 가능하다. (콘솔 출력은 간단하지만, 도구는 사용자 SID 등 상세 정보를 별도의 파일로 저장한다.)


Endless

DFIR 수행 과정에서 MS Defender의 탐지 정보는 필수 정보가 아니지만 정보가 존재한다면 DFIR 수행 시간을 굉장히 단축해 주는 것은 틀림 없다.

복호화를 위해 제작한 도구는 향후 플레인비트 분석 도구 제품군에 기능으로 포함될 예정이어서 당장 공개되진 않겠지만, 추후 공개되어 많은 분석가에게 도움이 되길 바란다.

도구는 MS Defender의 여러 정보(로그, 검역소 정보 등)를 기존 아티팩트와 연계하여 분석할 수 있는 도구로 발전시킬 계획이다. 단일 도구로 포함하기 어려운 기능은 현재 개발 중인 통합 도구의 여러 기능과 연계하여 부족한 부분을 보완할 예정이다.

You've successfully subscribed to PLAINBIT
Great! Next, complete checkout to get full access to all premium content.
Error! Could not sign up. invalid link.
Welcome back! You've successfully signed in.
Error! Could not sign in. Please try again.
Success! Your account is fully activated, you now have access to all content.
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.