Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reverse Atom Bombing

FFRI Security, Inc.
December 25, 2023
450

Reverse Atom Bombing

新ローレイヤー勉強会#1 "Reverse Atom Bombing"
(https://ffri-security.connpass.com/event/304019/)

FFRI Security, Inc.

December 25, 2023
Tweet

Transcript

  1. How to Reverse AtomBombing 2 ✘ AtomBombingを強化 ✘ 書き込み速度の向上 ✘

    ステルス性の向上 ✘ オリジナルなProcess Injection
  2. What is AtomBombing 14 ✘ AtomTable経由のプロセスインジェクション ✘ Process Injection via

    Atom ✘ Ropを使用したプロセスインジェクション ✘ Rop Injection ✘ Process Injection via Atom Rop Injection ✘ AtomBombing
  3. “ ✘ What is APC 16 ✘ 各スレッドのコンテキストで非同期的に動作する ✘ スレッドがアラート可能状態になると実行される

    ✘ 対象のスレッドに任意の関数の処理要求 ✘ QueueUserApc(2) ✘ NtQueueApcThread ✘ injection手法でかなり使われる
  4. “ ✘ APC functions 17 ✘ QueueUserApc(2) ✘ 引数が1つまでの関数をキューに追加 ✘

    NtQueueApcThread ✘ 引数が3つまでの関数をキューに追加
  5. “ ✘ How to run APC 18 ✘ スレッドをサスペンド状態で作成、実行 ✘

    CreateRemoteThread(..., CREATE_SUSPENDED, ...) ✘ 対象プロセスで実行させる ✘ SleepEx, WaitForMultipleObject, WaitForSingleObjectEx, etc... ✘ ワーカーファクトリのスレッドのQueueに追加 ✘ NtWaitForWorkViaWorkerFactory
  6. “ ✘ How to run APC 19 ✘ スレッドをサスペンド状態で実行 ✘

    CreateRemoteThread(..., CREATE_SUSPENDED, ...) ✘ 対象プロセスで実行させる ✘ SleepEx, WaitForMultipleObject, WaitForSingleObjectEx, etc... ✘ ワーカーファクトリのスレッドのQueueに追加 ✘ NtWaitForWorkViaWorkerFactory
  7. “ ✘ What is atom table 20 ✘ 文字列を整数(Atom)として扱える ✘

    Atomは16ビットの整数 ✘ 文字列は255バイト以下 ✘ NULL文字は1バイトずつ ✘ Local Atom Table ✘ 1つのProcessからアクセス可能 ✘Global Atom Table ✘ 複数のProcessからアクセス可能
  8. “ ✘ What is atom table 21 ✘ 文字列を整数(Atom)として扱える ✘

    Atomは16ビットの整数 ✘ 文字列は255バイト以下 ✘ Local Atom Table ✘ 1つのProcessからアクセス可能 ✘Global Atom Table ✘ 複数のProcessからアクセス可能
  9. “ ✘ What is Rop 31 ✘ Rop(Return Oriented Programming)

    ✘ DEPやASLRを回避するための技術 ✘ ROPガジェットを使う ✘ メモリ空間にあるret命令終わる一連の命令 ✘ x64呼び出し規約 第1引数 rcx 第2引数 rdx 第3引数 r8 第4引数 r9 以降 スタック
  10. 32 rcx rdx … … … … 0x2222: pop rcx

    ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0x0000 0x0000 rsp rip
  11. 33 rcx rdx … … … … 0x2222: pop rcx

    ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0x0000 0x0000 rsp rip
  12. 34 rcx rdx … … … … 0x2222: pop rcx

    ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0x0000 0xaaaa rsp rip
  13. 35 rcx rdx … … … … 0x2222: pop rcx

    ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0x0000 0xaaaa rsp rip
  14. 36 rcx rdx … … … … 0x2222: pop rcx

    ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0xbbbb 0xaaaa rsp rip
  15. 37 rcx rdx … … … … 0x2222 0xaaaa 0x3333

    0xbbbb function 0xbbbb 0xaaaa rsp rip function: mov rcx,qword ptr [rsp+18h] mov rax,rcx mov r9,rsp ・・・ function(0xaaaa, 0xbbbb);
  16. “ ✘ まとめ#AtomBombing 48 ✘ Atom Table injection ✘ ROPとPayloadを書き込む

    ✘ Atom Table経由の制限 ✘ 一度に最大255バイト書き込める ✘ NULL文字列は1文字ずつ ✘ ROP ✘ NtAllocateVirtualMemory memcpy
  17. Reverse AtomBombing 50 ✘ AtomBombing ✘ Process Injection via Atom

    Rop Injection ✘ Reverse AtomBombing ✘ Process Injection via Atom Rop Injection
  18. Reverse AtomBombing 51 ✘ AtomBombingの難点 ✘ NULL文字の書き込み ✘ NULL文字は1バイトずつしか書き込めない ✘

    ペイロードの書き込み ✘ 1回最大255バイトしか書き込めない ✘ 大きなペイロードでは時間がかかる
  19. “ ✘ NULL文字の書き込み 52 ✘ NULL文字を1バイトずつしか書き込めない ✘ ROP、Payloadには多くのNULL文字が含まれる ✘ memset

    ✘ 特定の文字を任意のサイズ書き込める ✘ 引数が3つであるため、NtQueueApcThread ✘ 文字列を書き込む前にmemset関数で0で初期化 void *memset( void *dest, int c, size_t count);
  20. 53 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC Reverse AtomBombing
  21. 54 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC Reverse AtomBombing
  22. 55 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 00 62 0A 00 00 00 CC CC CC CC CC CC CC CC CC CC Reverse AtomBombing
  23. 56 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 00 62 0A 00 00 00 00 CC CC CC CC CC CC CC CC CC Reverse AtomBombing
  24. 57 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 00 62 0A 00 00 00 00 00 CC CC CC CC CC CC CC CC Reverse AtomBombing
  25. 58 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 00 62 0A 00 00 00 00 00 CC CC CC CC CC CC CC CC Reverse AtomBombing
  26. 59 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 CC CC CC CC CC CC CC CC Reverse AtomBombing 00 62 0A 00 00 00 00 00
  27. 60 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 Reverse AtomBombing 00 62 0A 00 00 00 00 00
  28. 61 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 00 62 0A 00 00 00 00 00 Reverse AtomBombing 00 62 0A 00 00 00 00 00
  29. 62 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 00 62 0A 00 00 00 00 00 Reverse AtomBombing 00 62 0A 00 00 00 00 00
  30. 63 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 00 62 0A 00 00 00 00 00 Reverse AtomBombing 00 62 0A 00 00 00 00 00
  31. 64 00 62 0A 00 00 00 00 00 malicious

    target AtomBombing NULL文字の書き込み 00 62 0A 00 00 00 00 00 00 62 0A 00 00 00 00 00 Reverse AtomBombing 00 62 0A 00 00 00 00 00
  32. “ ✘ ペイロードの書き込み 65 ✘ 1回最大255バイトしか書き込めない ✘ payloadの書き込みに時間がかかる ✘ NtReadVirtualMemory

    ✘ 別プロセスのメモリからデータを読み取る ✘ ターゲット(正規のプロセス)にpayloadを読み込んでもらう ✘ AV製品のバイパスを狙う NTSTATUS NtReadVirtualMemory( HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToRead, PULONG NumberOfBytesReaded);
  33. “ ✘ まとめ#Reverse AtomBombing 78 ✘書き込み速度の向上 ✘ NULL文字の書き込みに時間がかからない ✘ Rop、Payload

    Rop ✘ステルス性の向上 ✘ Atom Table Atom Table、memset ✘ 正規プロセスにPayloadを読み込む
  34. 80