Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Reverse Atom Bombing
Search
FFRI Security, Inc.
December 25, 2023
0
450
Reverse Atom Bombing
新ローレイヤー勉強会#1 "Reverse Atom Bombing"
(
https://ffri-security.connpass.com/event/304019/
)
FFRI Security, Inc.
December 25, 2023
Tweet
Share
More Decks by FFRI Security, Inc.
See All by FFRI Security, Inc.
任意コード実行の原理
ffri
0
710
Out of Bytecode - Python スクリプトからメモリ上の関数オブジェクトを呼ぶまで
ffri
0
480
Arm TrustZoneを利用したTEEシステムのアーキテクチャと脆弱性の紹介
ffri
0
850
Featured
See All Featured
Six Lessons from altMBA
skipperchong
27
3.5k
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
Site-Speed That Sticks
csswizardry
2
190
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
GraphQLとの向き合い方2022年版
quramy
44
13k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Git: the NoSQL Database
bkeepers
PRO
427
64k
The Cult of Friendly URLs
andyhume
78
6.1k
Transcript
Reverse Atom Bombing
How to Reverse AtomBombing 2 ✘ AtomBombingを強化 ✘ 書き込み速度の向上 ✘
ステルス性の向上 ✘ オリジナルなProcess Injection
3 1 AtomBombing 2 Reverse AtomBombing
What is Process Injection 4 ✘ プロセスに任意のコードを挿入 ✘ マルウェアは正規のプロセスに対して行う ✘
効果 ✘ 権限昇格 ✘ セキュリティ製品の回避
What is Process Injection 5 payload payload malicious malicious target
What is Process Injection 6 payload payload malicious malicious target
What is Process Injection 7 payload payload malicious malicious target
Inject
What is Process Injection 8 payload payload malicious malicious target
payload Inject
What is Process Injection 9 payload payload malicious malicious target
payload Inject
What is Process Injection 10 payload payload malicious malicious target
payload Inject Inject
What is Process Injection 11 payload payload malicious malicious target
payload payload Inject Inject
What is Process Injection 12 payload payload malicious malicious target
payload payload Inject Inject
1 AtomBombing 13
What is AtomBombing 14 ✘ AtomTable経由のプロセスインジェクション ✘ Process Injection via
Atom ✘ Ropを使用したプロセスインジェクション ✘ Rop Injection ✘ Process Injection via Atom Rop Injection ✘ AtomBombing
Process Injection via Atom 15 ✘ APC(Asynchronous Procedure Call) ✘
Atom Table
“ ✘ What is APC 16 ✘ 各スレッドのコンテキストで非同期的に動作する ✘ スレッドがアラート可能状態になると実行される
✘ 対象のスレッドに任意の関数の処理要求 ✘ QueueUserApc(2) ✘ NtQueueApcThread ✘ injection手法でかなり使われる
“ ✘ APC functions 17 ✘ QueueUserApc(2) ✘ 引数が1つまでの関数をキューに追加 ✘
NtQueueApcThread ✘ 引数が3つまでの関数をキューに追加
“ ✘ How to run APC 18 ✘ スレッドをサスペンド状態で作成、実行 ✘
CreateRemoteThread(..., CREATE_SUSPENDED, ...) ✘ 対象プロセスで実行させる ✘ SleepEx, WaitForMultipleObject, WaitForSingleObjectEx, etc... ✘ ワーカーファクトリのスレッドのQueueに追加 ✘ NtWaitForWorkViaWorkerFactory
“ ✘ How to run APC 19 ✘ スレッドをサスペンド状態で実行 ✘
CreateRemoteThread(..., CREATE_SUSPENDED, ...) ✘ 対象プロセスで実行させる ✘ SleepEx, WaitForMultipleObject, WaitForSingleObjectEx, etc... ✘ ワーカーファクトリのスレッドのQueueに追加 ✘ NtWaitForWorkViaWorkerFactory
“ ✘ What is atom table 20 ✘ 文字列を整数(Atom)として扱える ✘
Atomは16ビットの整数 ✘ 文字列は255バイト以下 ✘ NULL文字は1バイトずつ ✘ Local Atom Table ✘ 1つのProcessからアクセス可能 ✘Global Atom Table ✘ 複数のProcessからアクセス可能
“ ✘ What is atom table 21 ✘ 文字列を整数(Atom)として扱える ✘
Atomは16ビットの整数 ✘ 文字列は255バイト以下 ✘ Local Atom Table ✘ 1つのProcessからアクセス可能 ✘Global Atom Table ✘ 複数のProcessからアクセス可能
22 malicious payload target Atom Table RW
23 malicious payload target Atom Table RW
24 malicious payload target payload Atom Table RW
25 malicious payload target payload Atom Table RW
26 malicious payload target payload Atom Table NtQueueApcThread RW
27 malicious payload target payload Atom Table GlobalGetAtomName NtQueueApcThread RW
28 malicious payload target payload payload Atom Table RW GlobalGetAtomName
NtQueueApcThread
29 malicious payload target payload payload Atom Table RW
Rop Injection 30 ✘ ターゲットプロセスにインジェクト ✘ Ropコード ✘ シェルコード ✘
実行フラグのない領域に書き込む
“ ✘ What is Rop 31 ✘ Rop(Return Oriented Programming)
✘ DEPやASLRを回避するための技術 ✘ ROPガジェットを使う ✘ メモリ空間にあるret命令終わる一連の命令 ✘ x64呼び出し規約 第1引数 rcx 第2引数 rdx 第3引数 r8 第4引数 r9 以降 スタック
32 rcx rdx … … … … 0x2222: pop rcx
ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0x0000 0x0000 rsp rip
33 rcx rdx … … … … 0x2222: pop rcx
ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0x0000 0x0000 rsp rip
34 rcx rdx … … … … 0x2222: pop rcx
ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0x0000 0xaaaa rsp rip
35 rcx rdx … … … … 0x2222: pop rcx
ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0x0000 0xaaaa rsp rip
36 rcx rdx … … … … 0x2222: pop rcx
ret 0x3333: pop rdx ret 0x1111: ret 0x2222 0xaaaa 0x3333 0xbbbb function 0xbbbb 0xaaaa rsp rip
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);
38 NtAllocateVirtualMemory memcpy Reverse AtomBombing#Rop
AtomBombing 39 malicious target RW RW payload Rop
AtomBombing 40 malicious target RW RW payload Rop
AtomBombing 41 malicious target payload RW Rop RW payload Rop
AtomBombing 42 malicious target payload RW Rop RW payload Rop
AtomBombing 43 malicious target payload RW RW Rop RW RW
payload Rop RWX
AtomBombing 44 malicious target payload RW Rop RW payload Rop
RWX
AtomBombing 45 malicious target payload RW Rop RW payload Rop
payload RWX
AtomBombing 46 malicious target payload RW Rop RW payload Rop
payload RWX
AtomBombing 47 malicious target payload RW Rop RW payload Rop
payload RWX
“ ✘ まとめ#AtomBombing 48 ✘ Atom Table injection ✘ ROPとPayloadを書き込む
✘ Atom Table経由の制限 ✘ 一度に最大255バイト書き込める ✘ NULL文字列は1文字ずつ ✘ ROP ✘ NtAllocateVirtualMemory memcpy
2 Reverse AtomBombing 49
Reverse AtomBombing 50 ✘ AtomBombing ✘ Process Injection via Atom
Rop Injection ✘ Reverse AtomBombing ✘ Process Injection via Atom Rop Injection
Reverse AtomBombing 51 ✘ AtomBombingの難点 ✘ NULL文字の書き込み ✘ NULL文字は1バイトずつしか書き込めない ✘
ペイロードの書き込み ✘ 1回最大255バイトしか書き込めない ✘ 大きなペイロードでは時間がかかる
“ ✘ NULL文字の書き込み 52 ✘ NULL文字を1バイトずつしか書き込めない ✘ ROP、Payloadには多くのNULL文字が含まれる ✘ memset
✘ 特定の文字を任意のサイズ書き込める ✘ 引数が3つであるため、NtQueueApcThread ✘ 文字列を書き込む前にmemset関数で0で初期化 void *memset( void *dest, int c, size_t count);
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
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
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
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
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
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
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
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
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
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
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
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
“ ✘ ペイロードの書き込み 65 ✘ 1回最大255バイトしか書き込めない ✘ payloadの書き込みに時間がかかる ✘ NtReadVirtualMemory
✘ 別プロセスのメモリからデータを読み取る ✘ ターゲット(正規のプロセス)にpayloadを読み込んでもらう ✘ AV製品のバイパスを狙う NTSTATUS NtReadVirtualMemory( HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToRead, PULONG NumberOfBytesReaded);
Reverse AtomBombing#Rop 66 NtAllocateVirtualMemory NtReadVirtualMemory
ペイロードの書き込み 67 malicious target RW Rop payload
ペイロードの書き込み 68 malicious target RW Rop payload
ペイロードの書き込み 69 malicious target Rop payload Rop RW
ペイロードの書き込み 70 malicious target Rop payload Rop RW
ペイロードの書き込み 71 malicious target Rop payload Rop RW
ペイロードの書き込み 72 malicious target Rop payload Rop RW RWX
ペイロードの書き込み 73 malicious target Rop payload Rop RW RWX
ペイロードの書き込み 74 malicious target Rop payload Rop RW RWX
ペイロードの書き込み 75 malicious target Rop payload Rop RW payload RWX
ペイロードの書き込み 76 malicious target Rop payload Rop RW payload RWX
ペイロードの書き込み 77 malicious target Rop payload Rop RW payload RWX
“ ✘ まとめ#Reverse AtomBombing 78 ✘書き込み速度の向上 ✘ NULL文字の書き込みに時間がかからない ✘ Rop、Payload
Rop ✘ステルス性の向上 ✘ Atom Table Atom Table、memset ✘ 正規プロセスにPayloadを読み込む
3 Demo 79
80
thanks! Any questions? 81