Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Abusing Interrupts for
Reliable Windows Kernel Exploitation
2015/11/14
AVTOKYO2015
inaz2
About me
• inaz2
• Security engineer & Python programmer
• Working at NTT Communications
• ブログ「ももいろテクノロジー」
• http://inaz2....
Windows kernel exploitation
• カーネルランドの脆弱性を突くタイプの攻撃
• デバイスドライバの脆弱性を含む
• Write-what-where condition/vulnerabilityが広く利用される
• ...
Classic technique: halDispatchTable overwrite
• nt!NtQueryIntervalProfile 内部API
• nt!KeQueryIntervalProfile 経由で [nt!halDis...
Replace token shellcode
• Systemプロセス (PID=4) のToken Objectをコピー
5
41414141hは対象となる
プロセスのPIDに置き換える
It works but …
• nt!NtQueryIntervalProfile の実装に依存
• 将来的に実装が変更される可能性がある(つまり、確実ではない)
• より確実な書き換えのターゲットは存在するか?
6
It works but …
• nt!NtQueryIntervalProfile の実装に依存
• 将来的に実装が変更される可能性がある(つまり、確実ではない)
• より確実な書き換えのターゲットは存在するか?
7
x86 interrupt handling
• ハードウェア割り込み(キーボード入力など)とソフトウェア割り込み
(ゼロ除算など)がある
• ソフトウェア割り込みは “int n” 命令で発生させることができる
• Interrupt Des...
x86 privilege levels (protection rings)
• 0から3までの4つの権限レベル
• 数字が大きいほど権限が低い
• Windowsを含むほとんどのOSは、2つのRingのみを利用する
• Ring 0はカーネ...
Interrupt Descriptor Table (1/4)
• Intel Developer’s Manual Volume 3, Chapter 6
10
Interrupt Descriptor Table (2/4)
• Intel Developer’s Manual Volume 3, Chapter 6
11
DPL=3 ならRing 3から
割り込み可能
Interrupt Descriptor Table (3/4)
• WinDbg (KD) view
12
Interrupt Descriptor Table (4/4)
• Interrupt #0に対応するInterrupt Gateの書き換え
13
414184fc
000884fc 4141ee00
DPL=3
IDT overwrite technique
14
IDTが置かれているアドレスを取得する
Interrupt #nに対応するInterrupt Gateを書き換える
“int n” 命令でInterrupt #nを発生させる
Shellco...
Detailed procedure
16
Find the write-what-where vulnerability
• ここでは、脆弱なデバイスドライバを用意しインストールする
• IOCTL経由でwrite-what-where脆弱性への攻撃を可能にする
17
Get the IDT address (1/2)
18
Ring 3でも使える!
Get the IDT address (2/2)
• IDTが置かれているアドレスを返す関数
19
alignmentを無効化
Write the Interrupt Software Routine (ISR)
• fsセグメントレジスタの値を切り換える
• 0x33 (TEB) → 0x30 (KPCR)
• ISRの直後にあるShellcodeをcallする
• ...
Allocate memory & put the codes
• 0x41410000から0x41420000にnop-sledを確保する
• 0x41420000にISR code + shellcodeを置く
21
Overwrite the Interrupt Gate
• Interrupt #32に対応するInterrupt Gateの後半4バイトを0x4141ee00
で書き換える
• #32-255はuser-defined interrupts...
Trigger the software interrupt
• “int 32” を実行する
• ISRを経由してShellcodeが実行される
• 続けて、cmd.exeを起動する
23
Demo
24
What about 64 bit Windows?
• Interrupt Gateのサイズが16バイトになる
• 0x100000000バイトのnop-sledは厳しいため、Interrupt Gate全体を
書き換える必要がある(つまり、...
Comparison with halDispatchTable overwrite
• Pros
• あらゆるバージョンのx86-based Windowsに対して確実
• 書き換えのターゲットとなるアドレスの特定が簡単
• Cons
• I...
Recap
• IDT overwriteはあらゆるバージョンのx86-based Windowsに対して
確実
• カーネル実装の変更に依存しない
• IDTが置かれているアドレスはRing 3でも取得できる
• There’s more t...
References
• Windowsでデバイスドライバの脆弱性からの権限昇格をやってみる - もも
いろテクノロジー
• http://inaz2.hatenablog.com/entry/2015/09/15/121926
• Proje...
Thank you!
inaz2
29
Upcoming SlideShare
Loading in …5
×

Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)

4,797 views

Published on

2015/11/14 AVTOKYO2015
English version is available at http://www.slideshare.net/inaz2/abusing-interrupts-for-reliable-windows-kernel-exploitation-en

Published in: Technology
  • Be the first to comment

Abusing Interrupts for Reliable Windows Kernel Exploitation (ja)

  1. 1. Abusing Interrupts for Reliable Windows Kernel Exploitation 2015/11/14 AVTOKYO2015 inaz2
  2. 2. About me • inaz2 • Security engineer & Python programmer • Working at NTT Communications • ブログ「ももいろテクノロジー」 • http://inaz2.hatenablog.com/ 2
  3. 3. Windows kernel exploitation • カーネルランドの脆弱性を突くタイプの攻撃 • デバイスドライバの脆弱性を含む • Write-what-where condition/vulnerabilityが広く利用される • 任意のアドレスに任意の値を書き込むことが可能な脆弱性 • 自身のプロセスの権限を昇格させるShellcodeを実行させる • その後、管理者コマンドプロンプトを起動する 3
  4. 4. Classic technique: halDispatchTable overwrite • nt!NtQueryIntervalProfile 内部API • nt!KeQueryIntervalProfile 経由で [nt!halDispatchTable+4] が呼ばれる • [nt!halDispatchTable+4] の値をShellcodeのアドレスに書き換える 4
  5. 5. Replace token shellcode • Systemプロセス (PID=4) のToken Objectをコピー 5 41414141hは対象となる プロセスのPIDに置き換える
  6. 6. It works but … • nt!NtQueryIntervalProfile の実装に依存 • 将来的に実装が変更される可能性がある(つまり、確実ではない) • より確実な書き換えのターゲットは存在するか? 6
  7. 7. It works but … • nt!NtQueryIntervalProfile の実装に依存 • 将来的に実装が変更される可能性がある(つまり、確実ではない) • より確実な書き換えのターゲットは存在するか? 7
  8. 8. x86 interrupt handling • ハードウェア割り込み(キーボード入力など)とソフトウェア割り込み (ゼロ除算など)がある • ソフトウェア割り込みは “int n” 命令で発生させることができる • Interrupt Descriptor Table (IDT) • Interrupt Software Routines (ISR) と呼ばれる割り込みハンドラ関数のアドレ スを保持 • ISRはRing 0で実行される • 要するに、なんでもできる 8
  9. 9. x86 privilege levels (protection rings) • 0から3までの4つの権限レベル • 数字が大きいほど権限が低い • Windowsを含むほとんどのOSは、2つのRingのみを利用する • Ring 0はカーネルモード、Ring 3はユーザモードに対応 9
  10. 10. Interrupt Descriptor Table (1/4) • Intel Developer’s Manual Volume 3, Chapter 6 10
  11. 11. Interrupt Descriptor Table (2/4) • Intel Developer’s Manual Volume 3, Chapter 6 11 DPL=3 ならRing 3から 割り込み可能
  12. 12. Interrupt Descriptor Table (3/4) • WinDbg (KD) view 12
  13. 13. Interrupt Descriptor Table (4/4) • Interrupt #0に対応するInterrupt Gateの書き換え 13 414184fc 000884fc 4141ee00 DPL=3
  14. 14. IDT overwrite technique 14 IDTが置かれているアドレスを取得する Interrupt #nに対応するInterrupt Gateを書き換える “int n” 命令でInterrupt #nを発生させる Shellcodeが実行される
  15. 15. Detailed procedure 16
  16. 16. Find the write-what-where vulnerability • ここでは、脆弱なデバイスドライバを用意しインストールする • IOCTL経由でwrite-what-where脆弱性への攻撃を可能にする 17
  17. 17. Get the IDT address (1/2) 18 Ring 3でも使える!
  18. 18. Get the IDT address (2/2) • IDTが置かれているアドレスを返す関数 19 alignmentを無効化
  19. 19. Write the Interrupt Software Routine (ISR) • fsセグメントレジスタの値を切り換える • 0x33 (TEB) → 0x30 (KPCR) • ISRの直後にあるShellcodeをcallする • ret命令の代わりにiretd命令でリターンする 20
  20. 20. Allocate memory & put the codes • 0x41410000から0x41420000にnop-sledを確保する • 0x41420000にISR code + shellcodeを置く 21
  21. 21. Overwrite the Interrupt Gate • Interrupt #32に対応するInterrupt Gateの後半4バイトを0x4141ee00 で書き換える • #32-255はuser-defined interruptsと定義されている(予約されていない) 22
  22. 22. Trigger the software interrupt • “int 32” を実行する • ISRを経由してShellcodeが実行される • 続けて、cmd.exeを起動する 23
  23. 23. Demo 24
  24. 24. What about 64 bit Windows? • Interrupt Gateのサイズが16バイトになる • 0x100000000バイトのnop-sledは厳しいため、Interrupt Gate全体を 書き換える必要がある(つまり、2回書き込む) • なぜか割り込みを発生させたタイミングでVirtualBox VMがハング アップしてしまう(PatchGuard??) 25
  25. 25. Comparison with halDispatchTable overwrite • Pros • あらゆるバージョンのx86-based Windowsに対して確実 • 書き換えのターゲットとなるアドレスの特定が簡単 • Cons • ISRのコードを用意する必要がある • nop-sledを確保する必要がある • 64 bitでの動作を検証できていない 26
  26. 26. Recap • IDT overwriteはあらゆるバージョンのx86-based Windowsに対して 確実 • カーネル実装の変更に依存しない • IDTが置かれているアドレスはRing 3でも取得できる • There’s more than one way to do it  27
  27. 27. References • Windowsでデバイスドライバの脆弱性からの権限昇格をやってみる - もも いろテクノロジー • http://inaz2.hatenablog.com/entry/2015/09/15/121926 • Project Zero: One font vulnerability to rule them all #4: Windows 8.1 64-bit sandbox escape exploitation • http://googleprojectzero.blogspot.jp/2015/08/one-font-vulnerability-to-rule- them-all_21.html • Interrupt Service Routines - OSDev Wiki • http://wiki.osdev.org/Interrupt_Service_Routines • SIMPLE IS BETTER: Kernel Information Leak with Unprivileged Instructions (SIDT, SGDT) on x86 - WHY ? • http://hypervsir.blogspot.jp/2014/10/kernel-information-leak-with.html 28
  28. 28. Thank you! inaz2 29

×