読者です 読者をやめる 読者になる 読者になる

The Malloc Maleficarum (Bugtraq 2005)

この記事は「CTF Advent Calendar 2016」24日目の記事です。 「glibc malloc exploit techniques」では主要なmalloc系exploitテクニックについて説明したが、歴史的には他にもさまざまな手法が公表されている。 ここでは、2005年にBugtraqメーリングリストに…

Exploit系複合テクニックのメモ

この記事は「CTF Advent Calendar 2016」17日目の記事です。 ちょいちょい見かけてはいるのだが、実戦でよく忘れてしまうので応用の効きそうなものをまとめておく。 ROPからのGOT overwrite 単純なROP問題の場合、GOTに置かれた関数アドレスを読み出した後of…

glibc malloc exploit techniques

malloc系exploitテクニックのうち、応用しやすそうなもののメモ。 環境 Ubuntu Server 16.04.1 LTS 64bit版、GLIBC 2.23 $ uname -a Linux vm-ubuntu64 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ lsb…

WindowsでIDT overwriteによる権限昇格をやってみる

「Windowsでデバイスドライバの脆弱性からの権限昇格をやってみる」では、HalDispatchTableの書き換えを行うことでシェルコードの実行を行った。 しかし、HalDispatchTableやその中のポインタを呼び出す関数の実装はOSのメジャーアップデートなどで変更され…

WindowsでNulling out ACLs Shellcodeによる権限昇格をやってみる

「Windowsでデバイスドライバの脆弱性からの権限昇格をやってみる」では、SystemプロセスのTokenを自身のプロセスのTokenにコピーするシェルコードを使って権限昇格を行った。 この方法のほかに、System権限で動作するプロセスのACL(Access Control List)…

Windowsでデバイスドライバの脆弱性からの権限昇格をやってみる

Windowsにおいて、任意アドレス書き換え(arbitrary address write)の脆弱性があるデバイスドライバを作り、この脆弱性を利用した権限昇格をやってみる。 環境 Windows 8.1 Enterprise Evaluation 32 bit版、Visual Studio Community 2015 >systeminfo OS N…

Linux x64でDynamic ROPによるシェルコード実行をやってみる

ASLR+DEP+FullRELROが有効な環境で、Dynamic ROP(JIT-ROP)により任意のシェルコードを実行してみる。 これは、セキュリティ・キャンプ全国大会2015の講義にて行った演習に若干の修正を加えたものである。 環境 Ubuntu Server 14.04.2 64bit版 $ uname -a L…

WindowsでEMETを回避するシェルコードを書いてみる

「Windowsで電卓を起動するシェルコードを書いてみる」では、32ビットのWindows環境で動作するシェルコードを書いた。 ここでは、Microsoftが提供する脆弱性緩和ツールEMET(Enhanced Mitigation Experience Toolkit)の検知機構を回避するシェルコードを書…

Windows x64でReturn-oriented Programming(ROP)によるDEP回避をやってみる

「WindowsでReturn-oriented Programming(ROP)によるDEP回避をやってみる」では、Windows 32ビット環境でROPによるDEP回避を行った。 ここでは、Windows 64ビット環境でのROPをやってみる。 環境 Windows 8.1 Pro 64 bit版、Visual Studio Community 2013 …

Windowsでdownload-execシェルコードを書いてみる

「Windowsでconnect-backシェルコードを書いてみる」ではプログラムがWinsockを利用していることを前提に、connect-back shellを起動するシェルコードを書いた。 この他に、Windowsではインターネットから実行ファイルをダウンロードし実行するシェルコード…

Windows x64で電卓を起動するシェルコードを書いてみる

「Windowsで電卓を起動するシェルコードを書いてみる」では、Windows 32bitアプリケーション用のシェルコードを作成した。 ここでは、Windows 64bitアプリケーションから電卓を起動するシェルコードを書いてみる。 環境 Windows 8.1 Pro 64 bit版、Visual St…

WindowsでUNC LoadLibraryによる任意コード実行をやってみる

LoadLibrary関数は実行時にDLLをロードする関数であるが、引数にUNCパスを与えることにより、SMBプロトコル(Windowsファイル共有)を介してリモートホストにあるDLLをロードできることが知られている。 また、DLLはロード時にDLLMain関数が自動的に呼び出さ…

Metasploitのexploitモジュールを書いてみる

Metasploit Frameworkは、エクスプロイトコード実行をはじめとした種々のタスクを統一されたインタフェースで扱うための統合環境(フレームワーク)である。 ここでは、スタックバッファオーバーフロー脆弱性のあるプログラムを用意し、これに対するexploit…

Windowsでスタックバッファオーバーフロー脆弱性からMeterpreterに接続してみる

主にWindows環境に対して使われる高機能なリモート操作コンソールとして、Meterpreterと呼ばれるものがある。 ここでは、Metasploit Frameworkを使いMeterpreter用のシェルコードを生成してみる。 さらに、スタックバッファオーバーフロー脆弱性を利用してこ…

WindowsでSEH overwriteによるstack canary(/GS)回避をやってみる

スタックバッファオーバーフロー攻撃に対する防御手法のひとつにstack canaryがある。 これは関数の先頭でcanaryと呼ばれるランダムな値をスタックに積んでおき、関数の末尾でこの値が書き換えられていないかチェックすることで攻撃を検知するというものであ…

Windowsでnon-ASLR DLLを利用したROPによるDEP回避をやってみる

「WindowsでReturn-oriented Programming(ROP)によるDEP回避をやってみる」では、実行ファイル中でVitrualProtect関数が使われていることを前提にROPを行った。 ここでは、ASLRが無効な古いシステムDLLを利用することにより、VirtualProtect関数を呼び出し…

WindowsでReturn-oriented Programming(ROP)によるDEP回避をやってみる

「Windowsで単純なスタックバッファオーバーフロー攻撃をやってみる」では、DEPを無効にした状態でシェルコードの実行を行った。 ここでは、DEPが有効な環境下において、ROP(Return-oriented Programming)によるシェルコード実行をやってみる。 環境 Windo…

Windowsで単純なスタックバッファオーバーフロー攻撃をやってみる

Windowsで各種セキュリティ機構をオフにして、単純なスタックバッファオーバーフローによるシェルコード実行をやってみる。 環境 Windows 8.1 Pro 64 bit版、Visual Studio Community 2013 with Update 4 >systeminfo OS 名: Microsoft Windows 8.1 Pro OS …

Linux x64でchroot jailから脱出するシェルコードを書いてみる

仙石浩明の日記: chroot されたディレクトリから脱出してみる 上の記事では、chrootがsuperuserならば脱出可能であることについて書かれている。 また、実際にマニュアルを確認すると、確かにそのことが記載されている。 CHROOT(2) Linux Programmer's Manua…

Windowsでconnect-backシェルコードを書いてみる

「Windowsで電卓を起動するシェルコードを書いてみる」ではPEBからライブラリ関数のアドレスを特定し、WinExec関数を使って電卓を起動するシェルコードを書いた。 ここでは、プログラムがWinsockを利用していることを前提に、connect-back shellを起動するシ…

Windowsで電卓を起動するシェルコードを書いてみる

「Windowsで電卓を起動するアセンブリコードを書いてみる」では呼び出すライブラリ関数のアドレスをハードコードした形でアセンブリコードを書いたが、ASLRが有効なDLLについてはDLLが読み込まれるたびにベースアドレスが変化するため常には機能しない。 こ…

Windowsで電卓を起動するアセンブリコードを書いてみる

限定的な環境において電卓を起動するアセンブリコードを書き、シェルコードとして実行してみる。 環境 Windows 8.1 Pro 64 bit版、Visual Studio Community 2013 with Update 4 >systeminfo OS 名: Microsoft Windows 8.1 Pro OS バージョン: 6.3.9600 N/A …

LinuxカーネルモジュールでStackjackingによるSMEP+SMAP+KADR回避をやってみる

「Linuxカーネルモジュールでret2usrによる権限昇格をやってみる」では、Kernel Address Display Restriction(KADR)を無効にした上で/proc/kallsymsからカーネルシンボルのアドレスを取得し、カーネル空間からユーザ空間の関数を実行させることにより権限…

Linuxカーネルモジュールでret2usrによる権限昇格をやってみる

Linuxカーネルモジュールにおける任意アドレス書き換え(Arbitrary address write)の脆弱性を利用し、ret2usr(Return-to-user)と呼ばれる手法によるroot権限への権限昇格をやってみる。 環境 Ubuntu 14.04.1 LTS 64bit版、Intel SMEP無効 $ uname -a Linu…

無条件で権限昇格するLinuxカーネルモジュールを書いてみる

Linuxにおけるカーネルエクスプロイトの下準備として、無条件で権限昇格する(安全でない)カーネルモジュールを書いてみる。 環境 Ubuntu 14.04.1 LTS 64bit版 $ uname -a Linux vm-ubuntu64 3.13.0-44-generic #73-Ubuntu SMP Tue Dec 16 00:22:43 UTC 201…

ARMでstack pivot、Dynamic ROPをやってみる

「ARMでReturn-oriented Programming(ROP)をやってみる」ではlibcのベースアドレス、libc関数のオフセットを調べた上でROPを行った。 ここでは、ASLRが有効となっている場合を想定し、GOTアドレスの書き出しおよびstack pivotをもとにしたDynamic ROP(JIT…

ARMでReturn-oriented Programming(ROP)をやってみる

ARM EABI(armel)環境でReturn-oriented Programming(ROP)をやってみる。 環境 Ubuntu 14.04.2 LTS ARM版(ユーザモードQEMU利用) # uname -a Linux c7b94bb2fc1e 2.6.32 #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 armv7l armv7l armv7l GNU/Linux #…

ARMで単純なスタックバッファオーバーフロー攻撃をやってみる

「単純なスタックバッファオーバーフロー攻撃をやってみる」と同様に、Linux ARM(armel)環境でスタックバッファオーバーフローからのシェルコード実行をやってみる。 環境 Ubuntu 14.04.2 LTS ARM版(ユーザモードQEMU利用) # uname -a Linux c7b94bb2fc1…

Linux ARM用のシェルコードを書いてみる

「Linux x86用のシェルコードを書いてみる」と同様に、Linux ARM(armel)用のシェルコードを書いてみる。 環境 Ubuntu 14.04.2 LTS ARM版(ユーザモードQEMU利用) # uname -a Linux c7b94bb2fc1e 2.6.32 #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 armv…

x64でuse-after-freeからのC++ vtable overwriteとheap sprayによるASLR+DEP回避をやってみる

「use-after-freeによるC++ vtable overwriteをやってみる」では、ASLRを無効にした条件下でシェル起動を行った。 ASLRが有効の場合、書き換えるvtableの関数ポインタが指すアドレスが推測可能でなければならないが、ヒープ領域に任意の数のオブジェクトを生…

x64でのReturn-to-dl-resolve + __libc_csu_init gadgetsにfiniセクションを使う

「x64でROP stager + Return-to-dl-resolve + __libc_csu_init gadgetsによるASLR+DEP回避をやってみる」では、ASLR+DEPが有効なx64環境でReturn-to-dl-resolve + __libc_csu_init gadgetsを使ってシェル起動を行った。 この際、事前に固定アドレスにret命令…

x64で__libc_csu_init gadgetを使ったstack pivotをやってみる

「x64でDynamic ROP + Return-to-vulnによるASLR+DEP+RELRO回避をやってみる」では、leave命令がない実行ファイルに対してstack pivotを行わずに複数回のROPシーケンス実行を行った。 しかし、コンパイラによってはleave命令がない場合でも__libc_csu_init関…

x64でPartial overwriteとsystem関数を使ったASLR+PIE+DEP+FullRELRO回避について考えてみる

「x64でBuffer over-read+Partial overwrite他によるASLR+PIE+DEP+FullRELRO回避をやってみる」では、Buffer over-readによるInformation leakを利用してx64環境かつPIEが有効な条件下におけるシェル起動を行った。 ここでは、Information leakを利用する代…

x64でBuffer over-read+Partial overwrite他によるASLR+PIE+DEP+FullRELRO回避をやってみる

「ROP stager + Return-to-dl-resolve + ブルートフォースによる32bit ASLR+PIE+DEP回避」では、8bitのブルートフォースを行うことでx86環境かつPIEが有効な条件下でのシェル起動を行った。 しかし、x64環境ではASLRによりランダム化されるbit数が28bitとな…

x64でROP stager + Return-to-dl-resolve + DT_DEBUG read + __libc_csu_init gadgetsによるASLR+DEP+RELRO回避をやってみる

「x64でROP stager + Return-to-dl-resolve + DT_DEBUG readによるASLR+DEP+RELRO回避をやってみる」では、rdi、rsi、rdxの各レジスタをpopするROP gadgetを意図的に埋め込んだ上でシェル起動を行った。 ここでは代わりに__libc_csu_init gadgetsを使い、x64…

x64でDynamic ROP + Return-to-vulnによるASLR+DEP+RELRO回避をやってみる

「x64でDynamic ROPによるASLR+DEP+RELRO回避をやってみる」では、libcバイナリを読み出しその中に含まれるgadgetを利用してROPを行うことでシェル起動を行った。 しかし、コンパイラによっては実行ファイルにleave命令が存在しない場合があり、このような場…

x64でDynamic ROPによるASLR+DEP+RELRO回避をやってみる

「x64でROP stager + Return-to-dl-resolve + DT_DEBUG readによるASLR+DEP+RELRO回避をやってみる」では、x64環境において次のようなステップを踏むことでスタックバッファオーバーフローからのシェル起動を行った。 DT_DEBUG readによりlink_map構造体およ…

x64でROP stager + Return-to-dl-resolve + __libc_csu_init gadgetsによるASLR+DEP回避をやってみる

x64環境においてROPを行うには複数のレジスタをセットする必要があるが、glibcの__libc_csu_init関数を利用すると任意の3引数関数が呼び出せることが知られている。 ここでは、ROP stager + Return-to-resolveに加えてこれを利用することで、ASLR+DEPが有効…

x64でSigreturn Oriented ProgrammingによるASLR+DEP+RELRO回避をやってみる

x64環境では、x86環境とは異なり関数の引数はレジスタにセットされる。 このため、ROPにおいてはpop rdi; retなどのgadgetを使い、複数のレジスタに値をセットしてから関数にジャンプする必要がある。 また、x64ではx86に存在したpushad、popad命令がなくな…

x64でROP stager + Return-to-dl-resolve + DT_DEBUG readによるASLR+DEP+RELRO回避をやってみる

「ROP stager + Return-to-dl-resolve + DT_DEBUG readによるASLR+DEP+RELRO回避」では、x86環境かつASLR+DEP+RELROが有効な条件下でlibcバイナリに依存しないシェル起動を行った。 ここでは、x64環境のもとで同様の方法によるASLR+DEP+RELRO回避をやってみ…

x64でROP stager + Return-to-dl-resolveによるASLR+DEP回避をやってみる

「ROP stager + Return-to-dl-resolveによるASLR+DEP回避」では、ASLR+DEPが有効なx86環境においてlibcバイナリに依存しない形でシェル起動を行った。 ここでは、ASLR+DEPが有効なx64環境において同様のシェル起動をやってみる。 環境 Ubuntu 12.04 LTS 64bi…

ulimit -s unlimitedによる32bit ASLR無効化

一般に、ASLRはsysctlコマンドなどでカーネルパラメータを変更することにより有効化・無効化できる。 $ sudo sysctl -w kernel.randomize_va_space=2 # enable kernel.randomize_va_space = 2 $ sudo sysctl -w kernel.randomize_va_space=0 # disable kerne…

ROP stager + Return-to-dl-resolve + DT_DEBUG readによるASLR+DEP+RELRO回避

「ROP stager + Return-to-dl-resolveによるASLR+DEP回避」では、libcバイナリに依存しない形でASLR+DEPが有効な条件下におけるシェル起動を行った。 ここでは、さらにRELROが有効な場合について、DT_DEBUGシンボルを利用したシェル起動をやってみる。 環境 …

ROP stager + Return-to-dl-resolve + ブルートフォースによる32bit ASLR+PIE+DEP回避

「ROP stager + Return-to-dl-resolveによるASLR+DEP回避」では、libcバイナリに依存しない形でASLR+DEPが有効な条件下におけるシェル起動を行った。 ここでは、さらに実行ファイルがPIEの場合についてブルートフォースによるシェル起動をやってみる。 環境 …

ROP stager + Return-to-dl-resolveによるASLR+DEP回避

「ROP stager + read/writeによるASLR+DEP回避」では、PLT中のwrite関数を使うことでlibcのベースアドレスを特定し、system関数によるシェル起動を行った。 この方法では各ライブラリ関数のオフセットを調べておく必要があるが、このオフセットはlibcの種類…

シェルコードが置かれているアドレスを得る

シェルコード実行中にシェルコードが置かれているアドレスを得る方法についてのメモ。 callを使う callを実行したとき、スタックにリターンアドレスとしてcallの次の命令のアドレスが積まれることを利用する。 /* geteip_call.s */ .intel_syntax noprefix .…

x86 alphanumeric shellcode encoderを書いてみる

「x86 alphanumeric shellcodeを書いてみる」では、主にxorを使いシェルコードを展開した。 ここで使わなかった命令としてcmp命令、jmp系命令、imul命令があるが、これらも使うとより短いalphanumeric shellcodeを作ることができる。 ここでは、ALPHA3エンコ…

x86 alphanumeric shellcode stagerを書いてみる

「x86 alphanumeric shellcodeを書いてみる」では、アルファベットと数字のみを使ったシェルコードでシェル起動を行った。 任意のシェルコードを実行する場合も同様にしてalphanumericな形に変換すればよいが、別の方法としてshellcode stagerを使うこともで…

x86 alphanumeric shellcodeを書いてみる

Linux x86環境を対象に、アルファベットと数字のみからなるシェルコードを書いてみる。 このようなシェルコードはalphanumeric shellcodeと呼ばれる。 環境 Ubuntu 12.04 LTS 32bit版 $ uname -a Linux vm-ubuntu32 3.11.0-15-generic #25~precise1-Ubuntu S…

x86とx64の両方で動くシェルコードを書いてみる

オペコードの解釈の違いを利用し、Linux x86とLinux x64の両方で動くシェルコード(polyglot shellcode)を書いてみる。 環境 Ubuntu 12.04 LTS 32bit版および64bit版 $ uname -a Linux vm-ubuntu32 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 1…