文章

路由器设备调试之getshell

Cisco RV110w 开启telnet

本文以Cisco RV110w为例,简述路由器设备调试getshell的思路。

前言

最近想要学习一下upnp相关的知识,手中恰好有一台Cisco RV110w,而且2021年8月爆出了几个和upnp相关的洞,官方也表示由于设备太老不会修复这几个洞。于是想要调试一下当作练手,但是网上并没有相关的漏洞分析文章或者PoC,所以只能自己去挖掘。那么首先就需要拿到设备的shell,然后去调试挖掘。但是之前调试Cisco RV110w都是通过弱口令或者RCE的洞拿到的shell,对于最新版本的固件(8aj5),并没有telnet和线程的PoC,因此需要另辟蹊径。

改包

由于路由器的固件是没有被加密的,可以轻松的通过解包工具和封包工具对固件进行修改,解包和打包的工具firmware-mod-kit 。对于Linux系统而言都会以一号进程init,首先执行,然后fork出其他的子进程。考虑劫持在路由器正常启动前一定会执行的程序,劫持开启telnet后需要执行原有程序,不然服务可能会崩掉。

劫持dnsmasq

由于没有最新固件的shell,这里通过分析老版本固件(有shell)启动的逻辑,去劫持程序的启动。

Untitled

找不到原图了,用开启telnet的图凑一下,马赛克是utelnetd进程

可以看到开机之后,会启动httpd、tftpd、dnsmasq、epad、cron、nas、wps_monitor等等一系列的程序,那么只要劫持这些程序的任意一个,开启telnet就行了。比如笔者这里劫持的是dnsmasq即dns服务器。劫持的方法也比较简单,将dnsmasq改成一个shell脚本,内容如下

#!/bin/sh

utelnetd -l /bin/sh -p 23 &

/usr/sbin/my_dnsmasq -C /tmp/dnsmasq.conf -r /tmp/resolv.conf

这里的my_dnsmasq其实就是原来的dnsmasq二进制程序。

添加utelnetd

由于最新固件中并没有utelnetd,且自带的busybox也没有telnetd,所以是无法通过劫持dnsmasq开启telnet的(我没有这个功能你怎么打开。

所以需要自己编译一份utelnetd,然后打包到固件中,这样子就可以开启telnet了。交叉编译方法参考 telnet在arm上的移植 utelnetd源码 。首先尝试的是静态链接(静态链接香,不需要考虑链接库的依赖),但是由于编译后的文件太大(104kb),使用firmware-mod-kit打包时报错,"新的固件比原有固件要大"。改成动态链接后,文件只有18kb了,但是打包的时候仍然会报错。经过一番检索和翻阅后发现,修改后的固件只能比原来的固件小(虽然可以小,但是firmware-mod-kit会在末尾pad一些东西),不能比原来的大,不然固件升级的时候无法过校验。

这里只需要开启telnet就行,所以不需要添加自己编译的busybox,因为busybox实在太大了

那么如何解决新固件体积过大的问题了?考虑到路由器的后端是一个web服务,必然有一些静态的html文件(这里是asp文件),删几个没用的静态文件可以缩减固件的体积。

文件hash

在路由器文件系统的etc下有一个md5sum.txt文件保存的是所有文件的md5sum值,考虑到可能会进行检验,更改固件中的文件后,需要更新这个md5sum.txt文件。更新的方法参考递归列出文件和子文件的md5sum 。修改完所有的文件后,在文件系统根目录执行如下命令即可

rm -rf ./etc/md5sum.txt
find -type f -exec md5sum '{}' \; > .md5sum.txt
mv .md5sum.txt ./etc/md5sum.txt

如果嫌麻烦的话,可以直接从这里下载打包好的开启telnet的固件

链接:https://pan.baidu.com/s/1xOGRf9MsjJpIIq86iRAAFQ
提取码:utuf

UART调试

相比于修改固件包,UART调试更加简单粗暴,而且不怕固件改坏了之后,路由器变砖。但是需要一定的动手能力,先上淘宝链接(

微雪FT232 工业级USB转TTL转换器 原装FT232RL UART 串口模块

2.54mm 单排排针 1*2P/3/4/5/6/7/8/9/10/11/12/40P 针总长11.3mm

德力西电烙铁家用焊锡枪内热式烙铁电焊笔套装学生用大功率电洛铁

首先就是把板子给拆下来,找UART口

uart1.jpg

由于本人焊工太烂,只能凑合着用(烙铁太破

uart3-min.jpg

uart2-min.jpg

转ttl的时候注意要交叉连线,板子的TX接RX口,RX接TX口,GND正常接即可。

连好线之后,可以通过串口调试助手(随便找一个,这里windows用的是友善串口调试助手)连接,选择对应的串口,波特率调整为115200,然后就可以连上去了,不过发送指令还需要每次点发送,最后改用putty,不过putty的缺点是无法自动识别串口和波特率,但是发送数据不需要点发送(

可以看到劫持dnsmasq的指令如下

Untitled

救砖

如果在改包的时候,由于各种问题导致路由器的http服务没有正常的启动,就会导致路由器变砖(在没有UART调试接口的前提下)。有了UART调试接口之后,可以拯救变砖的机器。

通过UART口可以进入busybox,开机时按回车就行。

救机的思路是,先把改过的包修复回来,比如dnsmasq被修改了,但是改的有问题导致服务崩了,首先修复dnsmasq,然后执行init(不同的机器的init进程可以不一样,比如cisco rv110w就是preinit)进程,虽然它是一号进程,但是一号进程出错了,所以需要重新执行。然后http服务就可以正常访问了,通过路由器的管理后端将官方的固件(或者修复后好用的固件)刷写到flash中,在putty中可以看到对应的进度,不过由于此init进程并不是一号进程,所以无法真正的更新固件,但是固件已经被刷写到flash中了,所以先kill掉此init进程,然后exit出busybox,就会发现一号进程会继续执行,然后读入flash中的固件,成功的将救回机器。

License:  CC BY 4.0