真正入坑IOT的第一次

去年写10月份的一篇文章 在这里挂一下 接下来会继续写几篇

真正入坑IOT的第一次

写在前面

暑假里参加了xman和华为的HWS夏令营 只能说当时太划水 导致实操一点都没跟上 现在开始真正入坑IOT了 希望以后能在IOT技术上有所成就

下载固件

直接谷歌就可以搜得到资源

解压固件

会发现 zip 文件有加密 拿个爆破工具直接爆破就好 ( 我直接搜到了密码 怪我咯

Binwalk提取固件

1
2
3
4
5
6
7
8
9
10
11
12
13
da39a3ee5e6b4b0d3255bfef95601890afd80709  02.02EU
dcee0a4028a5a9acaf012532b4c8ad454ae0dcd8 2K-mdm-image-boot-mdm9625.img
362a9ba52ec960850118f959c35acef7a9a43613 2K-mdm-image-mdm9625.yaffs2
7b2ebcae636f12d94f1ddea1cf108b02df0c0c32 2K-mdm-recovery-image-boot-mdm9625.img
19e59adb303206cd5b234a36848f37e7774680c8 2K-mdm-recovery-image-mdm9625.yaffs2
c58b219f2f30509ff616876b3974e8e4250c54d1 2K-mdm9625-usr-image.usrfs.yaffs2
9b0f2fce3c932bc3ba1f1f929a198f3d10a457be appsboot.mbn
a1fabcd1d98090dbcb778288b45fcf75dbe9e474 mba.mbn
d8a5eb2ee3ea47214f6a30838c45485921ec686d qdsp6sw.mbn
75ee33b48c2f3b80e3f476c80099ae2694ce54e3 rpm.mbn
94317de508e9f0007b2c8d0e108c23bde286f839 sbl1.mbn
a5fd3f79d497dbf38a87d6db7ae9bc63bc3635dc tz.mbn
264c0ef78a11700e1c030f312322a51ff190a066 wdt.mbn

好家伙 文件都在这了

我们可以看到有一些 yaffs2 文件 我们可以 binwalk 一把梭 或者用针对 yaffs2 格式的工具直接开搞

这里我直接binwalk 2333

1
binwalk -Me 2K-mdm-image-mdm9625.yaffs2

然后得到了一个tar包

1
2
3
┌──(godrun㉿kali)-[~/IOT/dlink-dwr932b/DWR-932_B1_FW v.02.02EU/_2K-mdm-image-mdm9625.yaffs2.extracted]
└─$ ls
0.yaffs 8B8C0B.tar

看一下是不是我们想要的 tar包

显示这个tar格式损坏 emmmm 查了下

Yaffs(Yet Another FlashFile System)文件系统是专门针对NAND闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于YAFFS2能够更好的支持大容量的NAND FLASH芯片

还是用 unyaffs 吧 害

搜了半天怎么下 结果试了下 直接 apt (吐了)

1
apt-get install unyaffs

然后搞 yaffs 文件 ( 要在root权限下运行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
┌──(root💀kali)-[/home/…/IOT/dlink-dwr932b/DWR-932_B1_FW v.02.02EU/yaffs2-root]
└─# ls -la
总用量 96
drwxr-xr-x 21 root root 4096 7月 19 2014 .
drwxr-xr-x 3 godrun godrun 4096 10月 5 15:04 ..
drwxr-xr-x 2 root root 12288 7月 19 2014 bin
drwxr-xr-x 2 root root 4096 7月 19 2014 boot
-rw-r--r-- 1 root root 38 7月 19 2014 build.prop
drwxr-xr-x 2 root root 4096 7月 19 2014 cache
drwxr-xr-x 2 root root 4096 7月 19 2014 config
drwxr-xr-x 2 root root 4096 7月 19 2014 config2
drwxr-xr-x 2 root root 4096 7月 19 2014 dev
drwxr-xr-x 2 root root 4096 7月 19 2014 disk
drwxr-xr-x 31 root root 4096 7月 19 2014 etc
drwxr-sr-x 3 root root 4096 7月 19 2014 home
drwxr-xr-x 4 root root 4096 7月 19 2014 lib
lrwxrwxrwx 1 root root 12 7月 19 2014 linuxrc -> /bin/busybox
drwxr-xr-x 10 root root 4096 7月 19 2014 media
drwxr-xr-x 2 root root 4096 7月 19 2014 mnt
drwxr-xr-x 2 root root 4096 7月 19 2014 proc
drwxr-xr-x 2 root root 4096 7月 19 2014 sbin
lrwxrwxrwx 1 root root 11 7月 19 2014 sdcard -> /media/card
drwxr-xr-x 2 root root 4096 7月 19 2014 sys
drwxrwxrwt 2 root root 4096 7月 19 2014 tmp
drwxr-xr-x 2 root root 4096 7月 19 2014 usr
drwxr-xr-x 7 root root 4096 7月 19 2014 var
drwxr-xr-x 3 root root 4096 7月 19 2014 WEBSERVER
lrwxrwxrwx 1 root root 8 7月 19 2014 www -> /usr/www

所以刚才binwalk没跑动 也是因为不是root?还是不行 555

分析文件系统

从这里开始,我们开始遍历文件系统中不同的目录,并从安全视角查找其中可能存在的漏洞的文件

查找所有配置文件

我们需要做的第一件事是查找所有配置文件

1
find . -name '*.conf'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌──(root💀kali)-[/home/…/IOT/dlink-dwr932b/DWR-932_B1_FW v.02.02EU/yaffs2-root]
└─# find . -name '*.conf'
./etc/AR6004_AP1_hostapd.conf
./etc/AR6003_AP1_hostapd.conf
./etc/mdev.conf
./etc/igd/miniupnpd.conf
./etc/AR6003_hostapd.conf
./etc/host.conf
./etc/AR6004_hostapd.confl
./etc/dbus-1/system.conf
./etc/dbus-1/system.d/avahi-dbus.conf
./etc/dbus-1/session.conf
./etc/nsswitch.conf
./etc/inadyn-mt.conf
./etc/wpa_supplicant.conf
./etc/pimd.conf
./etc/avahi/avahi-daemon.conf
./etc/hostapd.conf
./etc/radvd.conf

查看配置文件的内容

因为配置文件中常常包含一些重要的信息 甚至是后门 ( 见 TCTF Final eeenginx)

当我们看到 ./etc/inadyn-mt.conf 文件时

1
2
3
4
5
6
--log_file /usr/inadyn_srv.log
--forced_update_period 6000
--username alex_hung
--password 641021
--dyndns_system default@no-ip.com
--alias test.no-ip.com

我TM直接好家伙 username password 整整齐齐

当然 我们可能会在 .conf 文件之外找到更多的敏感信息

自动化信息搜索-firmwalker

1
2
┌──(godrun㉿kali)-[~/CTFtools/firmwalker]
└─$ ./firmwalker.sh /home/godrun/IOT/dlink-dwr932b/DWR-932_B1_FWv.02.02EU/yaffs2-root

直接搞到很多敏感的信息 可以说是十分的爽了

漏洞挖掘

密码泄露

我们从 /etc/shadow下可以得到root 的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
┌──(root💀kali)-[/home/…/dlink-dwr932b/DWR-932_B1_FWv.02.02EU/yaffs2-root/etc]
└─# cat ./shadow
root:aRDiHrJ0OkehM:16270:0:99999:7:::
daemon:*:16270:0:99999:7:::
bin:*:16270:0:99999:7:::
sys:*:16270:0:99999:7:::
sync:*:16270:0:99999:7:::
games:*:16270:0:99999:7:::
man:*:16270:0:99999:7:::
lp:*:16270:0:99999:7:::
mail:*:16270:0:99999:7:::
news:*:16270:0:99999:7:::
uucp:*:16270:0:99999:7:::
proxy:*:16270:0:99999:7:::
www-data:*:16270:0:99999:7:::
backup:*:16270:0:99999:7:::
list:*:16270:0:99999:7:::
irc:*:16270:0:99999:7:::
gnats:*:16270:0:99999:7:::
diag:*:16270:0:99999:7:::
nobody:*:16270:0:99999:7:::
messagebus:!:16270:0:99999:7:::
avahi:!:16270:0:99999:7:::

然后 复制到 passwd.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root💀kali)-[/home/…/dlink-dwr932b/DWR-932_B1_FWv.02.02EU/yaffs2-root/etc]
└─# john passwd.txt
Created directory: /root/.john
Using default input encoding: UTF-8
Loaded 1 password hash (descrypt, traditional crypt(3) [DES 64/64 MMX])
Will run 4 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for stat
Almost done: Processing the remaining buffered candidate pa
Warning: Only 86 candidates buffered for the current salt,
Proceeding with wordlist:/usr/share/john/password.lst, rule
1234 (root)
1g 0:00:00:00 N/A 50.00g/s 507800p/s 507800c/s 507800C/s 12
Use the "--show" option to display all of the cracked passw
Session completed

一波直接带走

自启动脚本文件

  /etc/init.d 是 /etc/rc.d/init.d 的软链接(soft link)。可以通过 ll 命令查看。

 都是用来放服务脚本的,当Linux启动时,会寻找这些目录中的服务脚本,并根据脚本的run level确定不同的启动级别。

   在制作服务脚本的过程中,使用了Linux的两个版本,CentOS和Ubuntu,需要在两个版本中都可以开机启动服务。但Ubuntu没有 /etc/rc.d/init.d这个目录,所以,为了保持同一种服务在CentOS和Ubuntu使用的统一性,将服务脚本(注:服务脚本在两个不同版本中是不同的)都放在 /etc/init.d 目录下,最终达到的效果是相同的。

   需要说明的是:在CentOS和Ubuntu两个版本中,除了服务脚本放置的目录是相同的,服务脚本的编写及服务配置都是不同的。比如CentOS使用Chkconfig进行配置,而Ubuntu使用sysv-rc-conf进行配置。

https://blog.csdn.net/liudongdong19/article/details/79774171 (写linux启动过程的)

我们进去看一下 发现有许多脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
┌──(godrun㉿kali)-[~/…/DWR-932_B1_FWv.02.02EU/yaffs2-root/etc/init.d]
└─$ ls -la
总用量 260
drwxr-xr-x 2 root root 4096 7月 19 2014 .
drwxr-xr-x 31 root root 4096 10月 5 16:47 ..
-rwxr-xr-x 1 root root 2482 7月 19 2014 adbd
-rwxr-xr-x 1 root root 250 7月 19 2014 alignment.sh
-rwxr-xr-x 1 root root 4735 7月 19 2014 avahi-daemon
-rwxr-xr-x 1 root root 4490 7月 19 2014 avahi-dnsconfd
-rwxr-xr-x 1 root root 492 7月 19 2014 banner.sh
-rwxr-xr-x 1 root root 1529 7月 19 2014 bootlogd
-rwxr-xr-x 1 root root 1680 7月 19 2014 bootmisc.sh
-rwxr-xr-x 1 root root 681 7月 19 2014 busybox-cron
-rwxr-xr-x 1 root root 3229 7月 19 2014 checkroot.sh
-rwxr-xr-x 1 root root 151 7月 19 2014 chgrp-diag
-rwxr-xr-x 1 root root 1591 7月 19 2014 data-init
-rwxr-xr-x 1 root root 2781 7月 19 2014 dbus-1
-rwxr-xr-x 1 root root 526 7月 19 2014 devpts.sh
-rwxr-xr-x 1 root root 408 7月 19 2014 diagrebootapp
-rwxr-xr-x 1 root root 2674 7月 19 2014 dropbear
-rw-r--r-- 1 root root 1123 7月 19 2014 functions
-rwxr-xr-x 1 root root 510 7月 19 2014 halt
-rwxr-xr-x 1 root root 270 7月 19 2014 hostname.sh
-rwxr-xr-x 1 root root 2402 7月 19 2014 hwclock.sh
-rwxr-xr-x 1 root root 348 7月 19 2014 keymap.sh
-rwxr-xr-x 1 root root 169 7月 19 2014 mdev
-rwxr-xr-x 1 root root 168 7月 19 2014 modem-shutdown
-rwxr-xr-x 1 root root 878 7月 19 2014 modutils.sh
-rwxr-xr-x 1 root root 859 7月 19 2014 mountall.sh
-rwxr-xr-x 1 root root 1399 7月 19 2014 mountnfs.sh
-rwxr-xr-x 1 root root 783 7月 19 2014 netmgrd
-rwxr-xr-x 1 root root 1463 7月 19 2014 networking
-rwxr-xr-x 1 root root 5114 7月 19 2014 populate-volatile.sh
-rwxr-xr-x 1 root root 10835 7月 19 2014 power_config
-rwxr-xr-x 1 root root 1136 7月 19 2014 qmi_shutdown_modemd
-rwxr-xr-x 1 root root 610 7月 19 2014 qmuxd
-rwxr-xr-x 1 root root 368 7月 19 2014 qrngd
-rwxr-xr-x 1 root root 4346 7月 19 2014 rc
-rwxr-xr-x 1 root root 525 7月 19 2014 rcS
-rwxr-xr-x 1 root root 2015 7月 19 2014 reboot
-rwxr-xr-x 1 root root 159 7月 19 2014 reset_reboot_cookie
-rwxr-xr-x 1 root root 585 7月 19 2014 rmnologin.sh
-rwxr-xr-x 1 root root 609 7月 19 2014 run-postinsts
-rwxr-xr-x 1 root root 321 7月 19 2014 save-rtc.sh
-rwxr-xr-x 1 root root 438 7月 19 2014 sendsigs
-rwxr-xr-x 1 root root 978 7月 19 2014 set-hwver.sh
-rwxr-xr-x 1 root root 1836 7月 19 2014 shutdown
-rwxr-xr-x 1 root root 578 7月 19 2014 single
-rwxr-xr-x 1 root root 2178 7月 19 2014 start_appmgr
-rwxr-xr-x 1 root root 2138 7月 19 2014 start_ipacm_le
-rwxr-xr-x 1 root root 764 7月 19 2014 start_QCMAP_ConnectionManager_le
-rwxr-xr-x 1 root root 1001 7月 19 2014 start_qti_le
lrwxrwxrwx 1 root root 8 7月 19 2014 stop-bootlogd -> bootlogd
-rwxr-xr-x 1 root root 540 7月 19 2014 sysfs.sh
lrwxrwxrwx 1 root root 14 7月 19 2014 syslog -> syslog.busybox
-rwxr-xr-x 1 root root 1559 7月 19 2014 syslog.busybox
-rwxr-xr-x 1 root root 659 7月 19 2014 thermal-engine
-rwxr-xr-x 1 root root 516 7月 19 2014 umountfs
-rwxr-xr-x 1 root root 686 7月 19 2014 umountnfs.sh
-rwxr-xr-x 1 root root 1349 7月 19 2014 urandom
-rwxr-xr-x 1 root root 5005 7月 19 2014 usb
-rwxr-xr-x 1 root root 8116 7月 19 2014 wlan

看到 start_mgr mgr一般是主控程序的意思 拿来分析一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#! /bin/sh
#

# appmgr init.d script to start router daemon
export KERNEL=`uname -r`
export MODULE_BASE=/lib/modules/$KERNEL/updates
export RETRY_LIMIT=4
export SDCC_SLOT=4
export SDCC_SLOT3=2

#Vince {
BOOT_MODE=`cat /proc/cmdline | sed -n 's/.*boot_mode=\(........\) .*/\2/p'`

if [ "x${BOOT_MODE}" == "xcharging" ]; then
start-stop-daemon -S -b -a /bin/pfcharging
exit 1
fi
#Vince }

#Sandro { for telnetd debug...
start-stop-daemon -S -b -a /bin/logmaster
#if [ -e /config3/telnetd ]; then
start-stop-daemon -S -b -a /sbin/telnetd
#fi
#Sandro }

#Sandro set hw id start
if [ -e /etc/init.d/set-hwver.sh ]; then
/etc/init.d/set-hwver.sh
fi
#Sandro set hw id end

if [ ! -e /etc/versions ]; then
if [ -e /usr/etc/versions ]; then
ln -nsf /usr/etc/versions /etc/versions
fi
fi

if [ ! -e /etc/qrcfg ]; then
if [ -d /usr/etc/qrcfg ]; then
ln -nsf /usr/etc/qrcfg /etc/qrcfg
fi
fi

if [ ! -e /www ]; then
if [ -d /usr/www ]; then
ln -sf /usr/www /www
fi
fi

if [ -f /sbin/netcfg ]; then
echo -n "chmod 778 netcfg"
chmod 778 /sbin/netcfg
fi

if [ -f /bin/QNetCfg ]; then
echo -n "chmod 778 QNetCfg"
chmod 778 /bin/QNetCfg
fi

#if [ ! -e /data ]; then
# mkdir -p /data
# mount -t yaffs3 /dev/mtdblock12 /data
#fi

# Get the vendor_id, [Generic|Pure]
VENDOR_ID=$(grep vendor_id /etc/versions 3>/dev/null | awk -F"=" '{print $2}')

case "$2" in
start)
if [ "$VENDOR_ID" = "Pure" ]; then
echo -n "Starting btnd: "
start-stop-daemon -S -b -a /bin/btnd
echo "done"
else
echo -n "Starting appmgr: "
start-stop-daemon -S -b -a /bin/appmgr
echo "done"
fi
;;
stop)
if [ "$VENDOR_ID" = "Pure" ]; then
echo -n "Stopping btnd: "
start-stop-daemon -K -n btnd
echo "done"
else
echo -n "Stopping appmgr: "
start-stop-daemon -K -n appmgr
echo "done"
fi
;;
restart)
$1 stop
$1 start
;;
*)
echo "Usage appmgr { start | stop | restart}" >&3
exit 2
;;
esac


exit 1

然后 start-stop-daemon 是linux中守护进程 启停 工具

1
2
3
4
5
6
7
8
9
10
11
12
case "$2" in
start)
if [ "$VENDOR_ID" = "Pure" ]; then
echo -n "Starting btnd: "
start-stop-daemon -S -b -a /bin/btnd
echo "done"
else
echo -n "Starting appmgr: "
start-stop-daemon -S -b -a /bin/appmgr
echo "done"
fi
;;

看看 /bin/appmgr

1
2
3
4
┌──(godrun㉿kali)-[~/…/dlink-dwr932b/DWR-932_B1_FWv.02.02EU/yaffs2-root/bin]
└─$ ls -la | grep appmgr
-rwxr-xr-x 1 root root 505728 7月 19 2014 appmgr
-rwxr-xr-x 1 root root 7944 7月 19 2014 appmgr_cli

有俩文件 逆一下启动程序

默认admin账号

image-20211006172438209

开发人员留下的后门

意思是 你往39889端口 发一个 HELODBG 可以直接连上 telnet

image-20211006173503346

泄露WPS PIN码

image-20211006173956585

fotad 分析

FOTA服务器是一个抽象的功能实体,主要功能的升级包上传,存储,缓存和分配机制,以及字节差异文件的生成和管理,下载的并发访问控制。FOTA服务器的实现可以分为几个部分的下载服务器,升级软件包管理服务器,升级服务包存储。

FOTA解决方案的客户包括以下三大功能实体:

1设备管理客户端。负责终端内部资源管理,如终端对象树管理。设备管理客户端和客户端下载,通过之间的状态转换消息界面更新客户端。

2下载客户端。下载过程管理是负责根据下载协议的更新包,关键是要遵循基于OMA-DM V1.1.2┊“替换”命令下载或OMA DL 1.0下载机制。

3更新客户端。包括交换剂和更新负责存储管理中所涉及到的升级包安装和安装过程中的代理,安装故障恢复,容错。

系统的实现

在设备的厂家,有大量的FOTA解决方案的系统部署的运营环境,客户端和服务器端的接口的标准化是至关重要的。同时,应考虑的实际操作和管理,用户管理,任务管理的需要,和其他必要的函数。实现的过程如下。

1终端的发现。包括触发终端服务器会话和阅读终端的轮廓信息(包括制造商,终端,和固件版本信息,等等)来初始化一个客户机/服务器(C/S)。触发模式包括:服务器端发起终端管理系统操作员通过门户系统,客户服务人员通过客户服务专线门从服务器端启动;由客户端发起的,最终用户通过自助服务门户系统推出CDMA 1X终端,终端用户开始通过终端自动触发的GPRS终端的菜单

image-20211006181205612