Slide 1

Slide 1 text

Reverse Atom Bombing

Slide 2

Slide 2 text

How to Reverse AtomBombing 2 ✘ AtomBombingを強化 ✘ 書き込み速度の向上 ✘ ステルス性の向上 ✘ オリジナルなProcess Injection

Slide 3

Slide 3 text

3 1 AtomBombing 2 Reverse AtomBombing

Slide 4

Slide 4 text

What is Process Injection 4 ✘ プロセスに任意のコードを挿入 ✘ マルウェアは正規のプロセスに対して行う ✘ 効果 ✘ 権限昇格 ✘ セキュリティ製品の回避

Slide 5

Slide 5 text

What is Process Injection 5 payload payload malicious malicious target

Slide 6

Slide 6 text

What is Process Injection 6 payload payload malicious malicious target

Slide 7

Slide 7 text

What is Process Injection 7 payload payload malicious malicious target Inject

Slide 8

Slide 8 text

What is Process Injection 8 payload payload malicious malicious target payload Inject

Slide 9

Slide 9 text

What is Process Injection 9 payload payload malicious malicious target payload Inject

Slide 10

Slide 10 text

What is Process Injection 10 payload payload malicious malicious target payload Inject Inject

Slide 11

Slide 11 text

What is Process Injection 11 payload payload malicious malicious target payload payload Inject Inject

Slide 12

Slide 12 text

What is Process Injection 12 payload payload malicious malicious target payload payload Inject Inject

Slide 13

Slide 13 text

1 AtomBombing 13

Slide 14

Slide 14 text

What is AtomBombing 14 ✘ AtomTable経由のプロセスインジェクション ✘ Process Injection via Atom ✘ Ropを使用したプロセスインジェクション ✘ Rop Injection ✘ Process Injection via Atom Rop Injection ✘ AtomBombing

Slide 15

Slide 15 text

Process Injection via Atom 15 ✘ APC(Asynchronous Procedure Call) ✘ Atom Table

Slide 16

Slide 16 text

“ ✘ What is APC 16 ✘ 各スレッドのコンテキストで非同期的に動作する ✘ スレッドがアラート可能状態になると実行される ✘ 対象のスレッドに任意の関数の処理要求 ✘ QueueUserApc(2) ✘ NtQueueApcThread ✘ injection手法でかなり使われる

Slide 17

Slide 17 text

“ ✘ APC functions 17 ✘ QueueUserApc(2) ✘ 引数が1つまでの関数をキューに追加 ✘ NtQueueApcThread ✘ 引数が3つまでの関数をキューに追加

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

22 malicious payload target Atom Table RW

Slide 23

Slide 23 text

23 malicious payload target Atom Table RW

Slide 24

Slide 24 text

24 malicious payload target payload Atom Table RW

Slide 25

Slide 25 text

25 malicious payload target payload Atom Table RW

Slide 26

Slide 26 text

26 malicious payload target payload Atom Table NtQueueApcThread RW

Slide 27

Slide 27 text

27 malicious payload target payload Atom Table GlobalGetAtomName NtQueueApcThread RW

Slide 28

Slide 28 text

28 malicious payload target payload payload Atom Table RW GlobalGetAtomName NtQueueApcThread

Slide 29

Slide 29 text

29 malicious payload target payload payload Atom Table RW

Slide 30

Slide 30 text

Rop Injection 30 ✘ ターゲットプロセスにインジェクト ✘ Ropコード ✘ シェルコード ✘ 実行フラグのない領域に書き込む

Slide 31

Slide 31 text

“ ✘ What is Rop 31 ✘ Rop(Return Oriented Programming) ✘ DEPやASLRを回避するための技術 ✘ ROPガジェットを使う ✘ メモリ空間にあるret命令終わる一連の命令 ✘ x64呼び出し規約 第1引数 rcx 第2引数 rdx 第3引数 r8 第4引数 r9 以降 スタック

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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);

Slide 38

Slide 38 text

38 NtAllocateVirtualMemory memcpy Reverse AtomBombing#Rop

Slide 39

Slide 39 text

AtomBombing 39 malicious target RW RW payload Rop

Slide 40

Slide 40 text

AtomBombing 40 malicious target RW RW payload Rop

Slide 41

Slide 41 text

AtomBombing 41 malicious target payload RW Rop RW payload Rop

Slide 42

Slide 42 text

AtomBombing 42 malicious target payload RW Rop RW payload Rop

Slide 43

Slide 43 text

AtomBombing 43 malicious target payload RW RW Rop RW RW payload Rop RWX

Slide 44

Slide 44 text

AtomBombing 44 malicious target payload RW Rop RW payload Rop RWX

Slide 45

Slide 45 text

AtomBombing 45 malicious target payload RW Rop RW payload Rop payload RWX

Slide 46

Slide 46 text

AtomBombing 46 malicious target payload RW Rop RW payload Rop payload RWX

Slide 47

Slide 47 text

AtomBombing 47 malicious target payload RW Rop RW payload Rop payload RWX

Slide 48

Slide 48 text

“ ✘ まとめ#AtomBombing 48 ✘ Atom Table injection ✘ ROPとPayloadを書き込む ✘ Atom Table経由の制限 ✘ 一度に最大255バイト書き込める ✘ NULL文字列は1文字ずつ ✘ ROP ✘ NtAllocateVirtualMemory memcpy

Slide 49

Slide 49 text

2 Reverse AtomBombing 49

Slide 50

Slide 50 text

Reverse AtomBombing 50 ✘ AtomBombing ✘ Process Injection via Atom Rop Injection ✘ Reverse AtomBombing ✘ Process Injection via Atom Rop Injection

Slide 51

Slide 51 text

Reverse AtomBombing 51 ✘ AtomBombingの難点 ✘ NULL文字の書き込み ✘ NULL文字は1バイトずつしか書き込めない ✘ ペイロードの書き込み ✘ 1回最大255バイトしか書き込めない ✘ 大きなペイロードでは時間がかかる

Slide 52

Slide 52 text

“ ✘ NULL文字の書き込み 52 ✘ NULL文字を1バイトずつしか書き込めない ✘ ROP、Payloadには多くのNULL文字が含まれる ✘ memset ✘ 特定の文字を任意のサイズ書き込める ✘ 引数が3つであるため、NtQueueApcThread ✘ 文字列を書き込む前にmemset関数で0で初期化 void *memset( void *dest, int c, size_t count);

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

“ ✘ ペイロードの書き込み 65 ✘ 1回最大255バイトしか書き込めない ✘ payloadの書き込みに時間がかかる ✘ NtReadVirtualMemory ✘ 別プロセスのメモリからデータを読み取る ✘ ターゲット(正規のプロセス)にpayloadを読み込んでもらう ✘ AV製品のバイパスを狙う NTSTATUS NtReadVirtualMemory( HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToRead, PULONG NumberOfBytesReaded);

Slide 66

Slide 66 text

Reverse AtomBombing#Rop 66 NtAllocateVirtualMemory NtReadVirtualMemory

Slide 67

Slide 67 text

ペイロードの書き込み 67 malicious target RW Rop payload

Slide 68

Slide 68 text

ペイロードの書き込み 68 malicious target RW Rop payload

Slide 69

Slide 69 text

ペイロードの書き込み 69 malicious target Rop payload Rop RW

Slide 70

Slide 70 text

ペイロードの書き込み 70 malicious target Rop payload Rop RW

Slide 71

Slide 71 text

ペイロードの書き込み 71 malicious target Rop payload Rop RW

Slide 72

Slide 72 text

ペイロードの書き込み 72 malicious target Rop payload Rop RW RWX

Slide 73

Slide 73 text

ペイロードの書き込み 73 malicious target Rop payload Rop RW RWX

Slide 74

Slide 74 text

ペイロードの書き込み 74 malicious target Rop payload Rop RW RWX

Slide 75

Slide 75 text

ペイロードの書き込み 75 malicious target Rop payload Rop RW payload RWX

Slide 76

Slide 76 text

ペイロードの書き込み 76 malicious target Rop payload Rop RW payload RWX

Slide 77

Slide 77 text

ペイロードの書き込み 77 malicious target Rop payload Rop RW payload RWX

Slide 78

Slide 78 text

“ ✘ まとめ#Reverse AtomBombing 78 ✘書き込み速度の向上 ✘ NULL文字の書き込みに時間がかからない ✘ Rop、Payload Rop ✘ステルス性の向上 ✘ Atom Table Atom Table、memset ✘ 正規プロセスにPayloadを読み込む

Slide 79

Slide 79 text

3 Demo 79

Slide 80

Slide 80 text

80

Slide 81

Slide 81 text

thanks! Any questions? 81