前情提要
大约在5年前铁通倒闭了, 我家的宽带运营商就换成了移动, 同时也升级到了百兆光纤. 但是送的光猫用起来很不爽啊, 虽然是白嫖的不能要求太高, 但是SSID必须要有个”CMCC-“的前缀就令人非常不爽, 于是在2年前我就小折腾了一下, 最近鼓捣nas又大折腾了一下, 于是就有了本文.
黑入
看门狗玩多了属于是由于各大运营商, 各个地区, 各个厂家的光猫可能都不一样, 因此这里先讲一下思路:
主要就是想尽各种办法拿到超级管理员/telnet/ftp/串口账号密码, 其中ftp也可以用ftp客户端或者u盘替代.
例如说有的光猫可以在网上搜到超级管理员的账号密码, 而有的会变的也可以通过贿赂上门安装的师傅得到. 然后通过超级管理员登录管理界面开启telnet, 再备份固件拿到telnet的账号密码, 有的可能需要访问后门才能开启telnet. 然后要想办法传文件, 有ftp服务器的可以直接用ftp, 有ftpput和ftpget的可以在电脑上搭ftp服务器, 有usb接口的可以插u盘. 或者如果默认开启了ftp服务器的干脆可以先暴力/在网上搜到ftp的账号密码, 然后把超管和telnet的账号密码下载下来. 这里只是讲了些我在网上看到过的情况, 实际情况多种多样, 还请随机应变.
然后以我所在的辽宁移动PT939G为例:
我这台光猫十分的巧, 不仅密码都是固定的, 而且还什么都有, 很适合作为例子
首先在网上能搜到超级管理员的账号密码, 账号: CMCCAdmin
, 密码: aDm8H%MdA
, 但是登进去以后也只是多了一堆光猫的配置, 并没有备份固件, 也没有telnet设置, 改改桥接还行
PS: 据说联通的是yhtcAdmin
, 密码是Cuc@YHfw
然后按照网上的教程访问http://192.168.1.1/cgi-bin/abcdidfope94e0934jiewru8ew414.cgi
就能开启telnet, 用户名: yhtcAdmin
, 密码: Cm1@YHfw
, 成功拿到shell
这里已经拿到shell了, 而且也不想刷机, 所以就不折腾串口了
最后是想办法传文件, 这台光猫是什么都有的, 既可以当ftp服务端和客户端, 又可以用usb, 但是我发现了ftp的配置文件/etc/bftpd.conf, 所以决定用ftp, 在/etc下可以发现加密的ftp账号和密码, cat一下然后保存到本地, 再用john就能破解(弱密码还默认开启ftp, 真是毫无安全意识…), 即使破解不出来也没事, 我们连root shell都拿到了, 可以直接改密码的, 这里只是想试试john(
; #开头代表光猫的shell, $开头代表本地shell # cat /etc/ftppasswd ; 把输出的内容保存到本地的ftppasswd.txt里, 然后john一下 $ john ftppasswd.txt --show ; 然后你还可以修改ftp的配置文件, 是/etc/bftpd.conf ; 修改完之后先停止当前的bftpd # ps | grep bftpd # kill <bftpd的pid> ; 再运行下列命令启动新的 # bftpd -d -c /etc/bftpd.conf
都搞定后这台光猫就被我们看光啦~
光猫配置
首先要做的事当然就是看看配置了, 看看平时卡的罪魁祸首让我康康
目录分析
然后结合网上大神的文章和自己的理解分析一下目录结构
romfile.cfg: 这是最重要的文件, 所有的光猫配置都保存在这里, 例如说所有账户的明文密码都在<Account>标签里(真是脑残……), 然后用一个叫tcapi的程序管理
PS: 所以其实只要想办法拿到这个文件账号密码就全知道了, 不过现在好多猫的密码都是动态变化的, 以后遇到再分析吧
PS2: 这里面还有个”第三者”管理账户user3, 但是登录不上去
但是这个配置文件有好几份:
- /tmp/ctromfile.cfg 头部加上了疑似版本号和校验和的东西
- /var/romfile.cfg 完整的配置
- /boaroot/html 完整的配置, 好像是管理页面用来备份配置文件的(http://192.168.1.1/cgi-bin/romfile_setting.asp), 但是用不了
- /var/tmp/romfile.cfg 只包括VOICE_XML的配置
- /userfs/ctromfile_XX.cfg 按照地区区分的默认配置文件, 没有加密, 而是gzip压缩
/boaroot 管理界面的网页和代码, 还是asp写的, 而且代码写的贼烂, 看来这管理页面卡不是没有原因的
/etc 里能翻到linux和ftp的用户密码
/usr/etc 能翻到串口的用户密码, 波特率115200, 密码同telnet
/usr/script 一些常用功能的脚本
/userfs 一看就是存放光猫程序的目录
/userfs/profile.cfg 系统的配置文件, 由启动脚本/etc/init.d/rcS加载
逆向tcapi
本来打算随便改改配置文件玩, 结果发现文件系统都是只读挂载的, 啥也改不了, 重新挂载提示没有权限
本来都打算放弃了, 然后看到romfile.cfg的TelnetEntry标签里的ActiveLan属性为Yes, 这个应该就是允许lan口telnet客户端连接, 突然想到之前访问的开启telnet的后门, 于是打开看一下其源码
# cat /boaroot/cgi-bin/abcdidfope94e0934jiewru8ew414.cgi #!/bin/sh echo -e "Content-Type: text/html\n" echo "<html><body>200ok</body></html>" /userfs/bin/tcapi set Account_TelnetEntry ActiveLan "Yes" /userfs/bin/tcapi commit Account_TelnetEntry /userfs/bin/tcapi save
居然是调用了tcapi这个程序编辑配置, 那么他一定能写这个只读文件系统, 赶紧把这个文件down下来反编译一下
$ file tcapi tcapi: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 2.6.32, stripped
很好, 是时候祭出我的大杀器ida了, 程序是32位的, 记得用32位ida打开. 反编译后看到这程序似乎只是个shell, 它调用的tcapi都是extern的, 所以看一下程序链接了哪些库
$ objdump -x tcapi | grep NEEDED NEEDED libtcapi.so.1 NEEDED libcompileoption.so.1 NEEDED libc.so.6
接下来把/lib/libtcapi.so.1.4这个库下载下来, 然后再次反编译看看, 发现这个库里的函数最终都调用了send2CfgManager函数, 将实际动作发送给了CfgManager执行. 这个CfgManager我也见到过, 似乎是/userfs/bin/cfg_manager, 所以接下来再反编译它
TODO 然后就没有然后了, cfg_manager这个程序太大了, ida还没法f5, 所以我又卡住了, 以后有机会或者等我技艺精进了再说吧
但是, 至少我们发现了tcapi怎么用, 也就是说, 可以直接拿它修改配置, 至少可以永久实现2年前我想做的事, 把WIFi SSID前缀改没, 具体方法请见文末
玩点大的
既然这是MIPS架构的linux, 我又灵光一现, 那能不能交叉编译它的程序呢, 结果还真行. 我用的是Ubuntu, apt安装gcc-mips-linux-gnu
, 然后使用mips-linux-gnu-gcc
即可编译, 用ftp或者u盘上传到光猫上也能成功运行
参考
友华PT939G移动光猫开启telnet获取配置文件: https://blog.csdn.net/gsls200808/article/details/106307953
移动光猫GS3101系统分析: https://www.jianshu.com/p/4e347b547a87
移动GS3101光猫分析 —— 狸猫换太子: https://www.anquanke.com/post/id/267397
以下文章写于2020年, 补充于2022/6/27
tr069是用来下发配置的协议, 我把它删掉了, 在这里留个备份:
修改WIFI SSID前缀
已经不用写脚本了, 如果能拿到shell可以用tcapi直接取消前缀
# /userfs/bin/tcapi set WLan_Common SSIDPre "" # /userfs/bin/tcapi commit WLan_Common # /userfs/bin/tcapi save
搞定, 收工
PS: 这还得感谢他们工程师没把前缀写死, 而是写在了配置文件里??? 但是本身把这个前缀发给前端, 让前端判断, 这不就是故意留的漏洞吗, 有点想不通