
Tivoli FastBack Server (6.1.4) はスタックベースのバッファオーバーフローの脆弱性があり、脅威アクターがリモートTCP接続を介して任意のコード実行 (ACE) を達成することを可能にします。このリポジトリで提供されるPoCは、この脆弱性を利用してリバースシェルを確立します。
Tivoli FastBack Server (6.1.4) アプリケーションはスタックベースのバッファオーバーフローに対して脆弱であり、脅威アクターがリモートTCP接続を介して任意コード実行 (ACE) を達成することを可能にします。このリポジトリで提供されるPoCは、この脆弱性を利用して、ターゲット上でCMD.exeを実行すると同時に、着信接続を処理してリバースシェルを確立します。

[!NOTE] このPoCは以前に公開されたPoCに基づいており、一般的なソフトウェアエンジニアリングパラダイムに従った改善されたアーキテクチャに加えて、ASLRバイパスが拡張されています。推奨されるマルチファイル構造がすべてのケースで望ましいとは限らないため、エクスプロイトの単一ファイル版が
assets/single.pyで提供されています。
PoCは脆弱なアプリケーションとTCPポート 11460 を介して通信します。このポートに送信されるデータは、以下に定義された構造に従わなければなりません:
0x00000123 0x00000000 0x00000000 0x00000000
0x00000ABC 0x00000AAA 0x00000111 0x00000BBB
0x00000222 0x00000CCC 0x00000333 0x00000000
0x00000000 0x00000000 0x00000000 0x00000000
<buffer 1> ...
<buffer 2> ...
<buffer 3> ...
前述のパケット構造を使用して、PoCはオペコード 0x534 で識別される _FXCLI_SetConfFileChunk 関数を呼び出します。ここから、実行は sscanf の呼び出しにつながり、その引数は適切なサニタイズなしにバッファ(1)から読み取られます。正確に 0x118 バイトのブロックを提供することで、eip ポインタは 最後 の4バイトにある値で上書きされます。
ASLRを回避するために、PoCはオペコード 0x2000 を持つ前述のネットワークパケットを送信して FXCLI_DebugDispatch 関数を呼び出します。この関数は最初のバッファを読み取り、特定の機能を実行します。その一部を以下に示します:
DumpMemoryPoolsReadRepositorySectorsSymbolOperationPoCは SymbolOperation 機能を使用します。これは任意のシンボルを入力として受け取り、そのベースアドレスを返します。これにより、N98E_CRYPTO_get_new_lockid のアドレスが解決され、そのオフセット (0x14E0) が減算されます。これにより、最終的に libeay32IBM019.dll のベースアドレスが得られます。これは次の回避段階で広く使用されます。
ROPが構築される前に、ベースアドレスに潜在的な不正文字がないかチェックされます。_もし_存在する場合、バッファをオーバーフローさせて eip を無意味な値 0x90909090 で上書きすることで、脆弱なアプリケーションが再起動されます。その後、アプリケーションがオンラインに戻るまでプローブされ、サイクルが再開されます。
以前の回避段階で取得したベースアドレスを使用してROPチェーンが構築されます。このROPチェーンは WriteProcessMemory を呼び出し、"invite" の内容を libeay32IBM019.dll の.textセクションのコードケーブにコピーします。
ROPチェーンが構築されると、その(解決された)内容すべてが再度潜在的な不正文字についてチェックされます。_もし_存在する場合、前の回避段階と同じ方法でアプリケーションが再起動され、サイクルが再開されます。
[!NOTE] 回避フェーズ中に無限ループを防ぐため、PoCは最大 10分間 回避を再試行するように設定されています。その後、タイムアウトに達したためエクスプロイトは終了します。
エクスプロイトの緩和策が回避された後、一般的なACEがすでに達成されています。このACEを利用して、CreateProcessA で CMD.exe のプロセスを作成する特定のシェルコードを実行します。この呼び出しの引数は、すべてのパイプ(STDIN, STDOUT, STDERR)をlocalhostに接続されたソケット接続にリダイレクトするように設定されています。
同時に、PoCはlocalhostでリスナーを起動し、リモートホストからの着信要求をキャッチし、作成された CMD.exe プロセスと対話するための 非常に基本的な CLIインターフェースを開始します。
graph
a("Start")
b("Buffer overflow: crash")
c("Buffer overflow: hijack")
subgraph sa["ASLR Bypass"]
a1["Resolve API with 'SymbolOperation'"]
a2["Subtract offset (0x14E0)"]
a3{"Base contains bad-chars?"}
a1 -->| N98E_CRYPTO_get_new_lockid | a2
a2 -->| libeay32IBM019.dll | a3
end
subgraph sb["DEP Bypass"]
b1["Construct ROP"]
b2{"ROP contains bad-chars?"}
b3["Locate shellcode"]
b4["Locate code-cave"]
b5["Invoke WriteProcessMemory"]
b6["Return to shellcode"]
b1 --> b2
b2 -->| no | b3
b3 --> b4
b4 --> b5
b5 --> b6
end
subgraph sc["Reverse Shell"]
c1["(Remote) connect to localhost"]
c2["(Local) listen on available port"]
c3["(Local) accept connection"]
c4["(Local) loop over CMDs"]
c1 --> c2
c2 --> c3
c3 --> c4
end
a3 -->| no | sb
b2 -->| yes | b
a3 -->| yes | b
a --> sa
b --> a
b6 --> c --> sc
| フィールド | 説明 | 対象 |
|---|
123 | サイズ | パケット |
ABC | オペコード | 関数 |
AAA, 111 | オフセット, サイズ | バッファ (1) |
BBB, 222 | オフセット, サイズ | バッファ (2) |
CCC, 333 | オフセット, サイズ | バッファ (3) |