Ref: https://herowong.org/archives/a-special-experience-of-hacking-tplink-router.html

我在之前就发过文章,解决了学校校园网的设备限制问题,但是R2S存在一个问题,就是它没有WIFI,而有的时候就是需要那么点WIFI。正巧,我从某些地方薅了一些淘汰下来的路由回来,它们分别是TP-LINK TL-WDR5620Tenda AC5TP-LINK TL-WAR308

而我的要求是路由器必须得能刷openwrt来修改UA(不然一样会触发设备限制),经过在网上的一顿搜索后,对于三个路由器的情况分别是这样的

  • TL-WDR5620:能刷,但是要拆机用编程器
  • Tenda AC5:Openwrt官方明确说明不支持
  • TL-WAR308:自带定制版openwrt,但是没有权限

在没有编程器的情况下,我选择对TL-WAR308下手,然后我又开始高强度网上冲浪,终于找到了能够获取root权限的方法

破解基础

我手上这个路由器的系统版本是1.2.1 Build 20190117 Rel.51148,硬件版本是v3.0

这个路由器存在一个备份配置文件的漏洞,具体来说就是在路由器的备份界面,备份当前用户配置的时候,会连同/etc/passwd/etc/shadow一起拉下来

并且这个路由器每次重启会自动修改root密码,root密码的生成跟路由器的MAC地址有关,这个脚本在/etc/config/dropbear,同样会被备份下来

而熟悉linux的小伙伴都知道,在/etc/passwd中储存在用户的信息,而在/etc/shadow中储存着用户加密过后的密码,这样就能给我们提供切入点了

添加用户并打开SSH

添加用户

备份文件的目录结构大概是这样的

1
2
3
4
5
backup.bin
└ tmp
└ userconfig
├ etc
└ www

而我们直接打开etc文件夹的passwdshadow,加入我们的用户信息

tmp/userconfig/etc/passwd

1
2
3
4
5
6
root:x:0:0:root:/root:/bin/ash
daemon:*:1:1:daemon:/var:/bin/false
ftp:*:55:55:ftp:/home/ftp:/bin/false
network:*:101:101:network:/var:/bin/false
nobody:*:65534:65534:nobody:/var:/bin/false
user:x:0:0::/home/user:/bin/ash

tmp/userconfig/etc/shadow

1
2
3
4
5
6
root:$1$THIS_IS_A_FAKE_PASSWD:16800:0:99999:7:::
daemon:*:0:0:99999:7:::
ftp:*:0:0:99999:7:::
network:*:0:0:99999:7:::
nobody:*:0:0:99999:7:::
user:$1$.4M0yZly$FNS0YgMD.hda5ASGmFUbY.:18722:0:99999:7:::

我把user的密码设置为了123456,接着我们还要打开ssh。根据参考文献,我们可以在etc/config/dropbear文件打开它

这个密码值是通过计算得到的:openssl passwd -1 123456

tmp/userconfig/etc/config/dropbear

1
2
3
4
5
6
7
config dropbear
option PasswordAuth 'on'
option RootPasswordAuth 'on'
option Port '33400'
option ssh_port_switch 'on'
# option BannerFile '/etc/banner'

把那个ssh_port_switch改成on就能够打开了

打包配置文件

通过file命令,我们可以看到这个文件的压缩方式

1
2
3
┌──(ctfos㉿Hello-CTF)-[/mnt/c/Users/HelloCTF_OS/Desktop/tp/backup-TP-LINK-2018-01-01]
└─$ file backup-TP-LINK-2018-01-01.bin
backup-TP-LINK-2018-01-01.bin: gzip compressed data, last modified: Sun Dec 31 16:06:24 2017, max compression, from Unix, original size modulo 2^32 663552

所以我们要用同样的压缩方式压缩回去,要不然会提示配置文件格式错误(别问我怎么知道的,因为我就那么干了)

我们逐步运行下面的命令

1
2
3
$ tar -cvf tmp.tar tmp
$ gzip -9 tmp.tar
$ mv tmp.tar.gz new_backup-gzip.bin

这样子,当我们运行file的时候就会发现,我们的文件格式一致了

1
2
3
┌──(ctfos㉿Hello-CTF)-[/mnt/c/Users/HelloCTF_OS/Desktop/tp/backup-TP-LINK-2018-01-01/backup-TP-LINK-2018-01-01]
└─$ file new_backup-gzip.bin
new_backup-gzip.bin: gzip compressed data, was "tmp.tar", last modified: Sat Nov 9 07:02:50 2024, max compression, from Unix, original size modulo 2^32 665600

然后回到路由器中,执行备份的还原操作

获得root密码

此时我们再根据参考资料,找到/etc/init.d/dropbear,发现生成密码的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
getNewPasswd()
{
. /lib/functions.sh
local macAddr=""
macAddr=$(uci_get tddp macaddr macaddr)
#echo "macAddr is $macAddr" > /dev/console

local key=$(echo -n "$macAddr" | md5sum)
key=$(echo ${key:0:8})
#echo "key is $key" > /dev/console

echo ${key}
}

setNewPasswd()
{
local newPasswd=`getNewPasswd`
#echo "newPasswd is $newPasswd" > /dev/console
(echo "$newPasswd";sleep 1;echo "$newPasswd") | passwd > /dev/null
}

就是通过mac地址的md5运算后取前8位,所以就能够得到root密码了,我这里的root密码为b0b7e6e20

root账户登录

使用我们刚刚获得的密码就可以进行登录了

查看了一下架构

1
2
root@TP-LINK:~# uname -a
Linux TP-LINK 3.3.8 #1 Thu Jan 17 14:11:22 CST 2019 mips GNU/Linux

然而这个版本的openwrt已经停止支持了,这个路由器在openwrt官网也没有找到官方的固件,再结合TPLINK的习惯,我感觉我没法用这个东西来编译ua2f,不过目前还没有触发学校网的限制,先用着再说吧

小工具

经过我自己手上这台和各种不完全教程里面的dropbear,基本可以判定root的密码就是固定的算法,于是就写了一个计算root密码的小工具 => TP-LINK WAR308路由器root密码计算器