Vulnhub打靶记录:Gemini_Pentest_v2
相关信息
kali:1.0.0.201/24
靶机:1.0.0.203/24(这个靶机需要在vmware中运行)
由于我多次打靶和思路的补充导致靶机ip有些混乱,
203,206,212都是靶机的ip。
靶机下载:https://download.vulnhub.com/geminiinc/Gemini-Pentest-v2.zip
目标:1个 flag + root权限
难度:中
未提及的相关知识点,命令和代码等等可以查看我其他三个blog:
-
渗透相关知识补充 - CC-HL - 博客园 (cnblogs.com)
当然我也只是记录了我认为有必要的。
文字思路
全流程思路:
- 主机发现 端口扫描 信息搜集
- 隐藏路径爬取:爬取到的关键用户注册页面和激活页面非常的重要,
web路径的爬取一定要细致。迭代爬取是否进行,字典是否合适,验证绕过是否需要,爬取文件的后缀是否限制,bak备份文件是否需要爬墙,这些都是需要注意的。 - 开发注册
- 验证码爆破:这个步骤使用的
burpsuite功能非常重要,为实现验证码爆破而对burpsuite进行的每项操作都必不可少。但是了解每个步骤实现的具体目的是非常重要的,只有这样才能在其他情况下更加明白为什么。 - Anti CSRF Token:这个步骤同样是需要使用到
burpsuite里面的功能的,非常关键且极具实践意义。 - 密码破解
- WAF Bypass:一个学习使用
burpsuite插件非常好的机会 - 命令注入绕过
- SSH公钥登陆:这个通过传递
ssh公钥的方法是个非常非常常规。但是有多种实现方法,多种应用场景,需要不断的发现和利用。 - Redis漏洞利用 本地提权
下意识的操作
- 任何网页的源码都是需要查看的,一定一定。因为很多
web应用虽然在页面渲染上没有问题,但是在网页源码层面很有可能由于接口,bug等原因会让有过多的数据和敏感信息泄露出来。 - 突破边界后需要查看相关的进程和启用进程相关的用户。
- 任意能控制网页展示的都要尝试
xss,ssit漏洞测试。
主要的知识点
burpsuite递归爆破的使用,插件使用以及各种操作的精细设置。往往一个设置出问题,就达不到使用burpsuite的效果。burpsuite的wafbypass插件使用。%09(tab键),空格,+这些在空格过滤中都是可以尝试进行替换进行绕过的。- 在利用
redis来保存相关文件时,注意对文件进行格式化,即前后添加两行:\n\n。
具体流程
信息搜集
-
发现主机,扫描端口,确认服务版本。靶机是开放了
22,80端口,基本确定了打靶的思路就是以80端口为主,然后看是否能够利用ssh:22端口。
-
靶机的
80端口,是一个login.php的登陆页面。尝试简单的mysql注入和弱密码爆破没有效果,网页源码很常规并没有漏洞。唯一的问题就是页面一直显示在加载,通过抓包和源码发现靶机是请求了外网的相关资源(可以不用管)。
-
使用
dirb工具对目标url进行路径爬取,-r表示迭代爬取。发现如下目录:/admin, /css, /img, /inc。
由于
dirb工具的特点,是需要指定文件后缀的。否者即使加载的字典中是有存在的文件名,也会导致扫描不到特定后缀的同名文件。其中-X .php表示字典名后面拼接上.php后缀,扫描结果中的activate.php文件尤其关注。
-
依次访问
dirb爬取到的web路径:-
registration.php:一个注册用户的界面
使用相同的信息尝试重复注册,提示
email已经使用过。那么表明尝试注册的用户meiy已经成功被注册。
-
activate.php:顾名思义为一个激活页面,应该是用于激活用户账号的后台页面,应该是用来激活我们注册的用户的。
-
export.php:黑屏,无源码。
-
profile.php:白屏,无源码。
-
-
尝试在
login.php页面登陆,成功进入到用户后台profile.php。但系统提示meiy用户并未激活,而且网页相关功能也无法使用,所以联想到路径爬取到得到的activate.php页面,尝试用该页面激活meiy用户。
点击
My Profile这个功能键,虽然没有任何的实际作用,但是会在地址栏爆出当前用户meiy的uid为15。

账号激活
-
由于
activate页面的激活码非常的短只有6位,可以尝试使用burpsuite进行密码爆破。先对activate.php页面尝试手动激活,通过抓包发现激活时页面会向服务端发送一个带有token的包,并且该token会在每次尝试激活的时候发生变化。通过在请求历史中对同一个token进行过滤搜索,发现每次激活时附带的token都是会出现在两个报文中。其中第n次请求激活中携带的token是n-1次请求返回报文中的一个名为token变量的值。
-
重新利用浏览器进行一次
activate的请求,将数据包截获发送给Intruder功能(一定要将这个包截获,不让这个请求的数据包发送给靶机,从而确保当前获得的token值是有效的)。分别对activation_code, token设为两个变量,然后选择pitchfork攻击模式(对每个变量给予不同的payload集,然后取各自变量的payload一一对应的进行爆破)。
-
activation_code变量就是000000~999999范围的数字,注意位数,范围,步长即可。
-
token变量为上一个返回包中的值,需要使用递归查询的方式来获取。在设置中的检索-提取中进行设置。
点击添加后的页面按照如下设置即可,其中开始和结束的字符串都可以在报文中截取。点击重新获取响应即可看到成功定位到返回的
token值。
然后在
token变量在Intrude中的payload选择递归即可,注意初次请求的payload值的设置(就是这个没有放行包的token值)。
-
如果这个时候直接开始攻击,系统会提示由于
token的获取模式是递归,所以只能有一个线程(非常好理解)。因此还需要在资源池进行设置,只使用一个线程。
同时为了加快爆破的速度,所以不需要进行错误处理,即便激活码错误返回
403也不需要进行重试。
-
在爆破开始后,选择状态过滤,便可以发现
meiy账户以及成功激活。

-
再次登录
meiy用户验证猜想,可以发现已经成功激活账号。
确认漏洞
-
在个人编辑档案的编辑中插入
xss恶意代码:<script>alert(1234)</script>,并未有弹出,表明靶机的目标网站并不存在该漏洞。-
原显示名:meiy(meiy)

-
修改页面
-
修改后显示名:
<script>alert(1234)</script>(meiy)
-
-
在查看
user list表单时,重点关注9emin1用户。访问Gemini用户的profile界面不难发现他的rank是administer。
-
查看
Gemini's profile网页源码,可以发现爆出了一个Password:edbd1887e772e13c251f688a5f10c1ffbb67960d的字段。
很明显该字段符合
sha的加密密文特征,如下:
-
通过在线解密,可以密文为
secretpassword。
-
利用破解的密码登陆
Gemini管理员用户的账号,可以发现管理员账号具有命令执行的功能。

-
但是当访问命令执行功能页面的时候是无法访问成功的。
使用
burpsuite抓获访问命令执行页面的包,可以发现这个是403 IP NOT ALLOWED。很可能是由于靶机存在某些防护措施如防火墙来WAF。
WAF绕过
-
在
burpsuite拓展中的BApp商店中搜索Bypass WAF,并下载这个插件。
然后将其进行加载,加载成功后菜单栏上方会多出一个标签页。

-
接着在设置里面搜索
sessions,选中project里面的session。选择会话处理规则的添加(这个里面的更改会作用在整个工程里面),再在其中选择Rule actions的添加。然后选着添加拓展,选择下好的bypass waf即可。
-
添加后再范围的选项中在将工具范围全部勾选上,外加URL范围的勾选为自定义。
-
由于刚刚勾选的URL范围是自定义,所以回到代理界面的 HTTP历史记录右击访问靶机的记录,将其添加到URL范围中。
过滤绕过
-
经过上述的
WAF BYPASS操作后,便可成功的访问命令执行页面。如下不难发现该命令执行功能是对 空格进行了过滤。
-
通过抓包也发现会将输入的空格转换为
+进行发包,所以准确的讲靶机对+进行了过滤。
-
尝试通过将
+转换为%09(tab)来尝试提交ls -a命令,能够成功的执行,表明%09可以完成 空格的绕过。
-
可以在
proxy选项中添加一个 替换规则来自动的让burpsuite帮我们替换空格为%09(Tab)键。
突破边界
-
但在靶机执行
nc反连接并未成功,可能是由于靶机上没有nc造成的。
-
可以在
kali使用python开启一个web服务,然后利用命令执行让靶机将kali上的nc下载到靶机上的/tmp/nc上。-
kali复制nc,利用Python打开web服务。
-
靶机下载
nc
-
-
给靶机中的
nc赋予执行权限,进常规的在kali打开回连端口,靶机利用nc再会连完成边界突破。
-
靶机成功回连
kali,利用Python进行简单的shell升级。
-
可以发现在靶机本地是有一个黑名单的文件
blacklist.txt,cat该文件后基本可以确定就是用于来过滤命令执行页面特殊字符的。
提权
-
通过
ss查看靶机的相关的端口信息,其中3306:mysql, 6379:redis两个端口尤其注意。再用ps命令查看两个服务的具体进程,发现Redis是由root用户运行的,基本确定就是通过redis完成提权了。
ss -pantu # -p:显示每个进程的socket # -n:用ip的形式显示域名或主机 ps -ef # -e:显示所有的进程 # -f:显示全部信息 -
进入到
Redis的配置文件夹,浏览6379.conf文件。使用grep命令检索该文件中的敏感字段:requirepass:8a7b86a2Cd89d96dfCC125ebCC0535e6,然后便可以登录靶机的redis。但在成功进入redis后,由于nc反弹的shell功能不完善导致交互命令难以阅读。在其中输入info命令的返还内容无法阅读,交互感非常差。
-
为解决上述问题,可以使用
ssh的shell来解决,即通非法在靶机写入文件来实现ssh的公钥登录:在靶机的
gemini1家目录创建一个.ssh文件,同时靶机的nc侦听3333端口来接收公钥,写入到~/.ssh/authorized_keys(ssh公钥)文件中。最后便可以在kali直接ssh登录靶机,完成shell升级。-
靶机上创建文件夹,开启侦听。

-
kali生成一个ssh连接的秘钥对id_rsa, id_rsa.pub。其中密钥对保存路径设置为默认/root/.ssh/id_rsa,密码设置为空。然后利用nc完成公钥的传输,注意:-w参数设置,确保传输完公钥后的1秒后就断开与靶机的nc连接。然后就可以直接以无密码的状态直接ssh连接gemini1用户,使用完整功能的shell。
-
靶机成功接收公钥。

-
便可以无密码的登录靶机。

-
-
在
ssh完整功能的shell中登录Redis,便可以正常的交互使用info命令。
-
便可以利用
root启用的Redis将公钥写入到root用户的.ssh文件中,这样靶机就可以以root身份登录靶机。
(echo -e "\n\n"; cat authorized_keys; echo -e "\n\n") > pub.txt # 这样的操作可能是为了确保 SSH 公钥在 Redis 数据库中保存时,与其他数据隔离开,也可能是为了确保在 SSH 连接时读取这个文件时有一些额外的空白行,以增加可读性或确保正确性。 cat pub.txt | redis-cli -a 8a7b86a2Cd89d96dfCC125ebCC0535e6 -x set ssh_key # -x:将输入视为二进制数据。 # set ssh_key:将传入的数据与redis-cli的ssh_key键与输入对应起来 config set dir /root/.ssh # 用于指定redis的数据库目录 config set dbfilename "authorized_keys" # 用于指定数据库名字 -
最后就可以无密码的连接靶机的
root用户,查看flag完成打靶。
相关工具/命令
工具
sha1sum
-
what?
是一个 Linux/Unix 系统中用于计算文件 SHA-1 散列值的命令。
-
how to use?
-b或--binary: 以二进制模式处理文件。-c或--check: 从文件中读取 SHA-1 散列值并验证文件。-t或--text: 以文本模式处理文件。-v或--verbose: 详细模式,显示文件名和散列值。
国外加解密网站
复盘/相关知识
复盘
ssh公钥登录实现
可以在靶机进行文件写入的时候,可以通过传递公钥的形式来登录目标靶机。其中公钥写入时关键,可以通过多种方式来实现,完全需要依据靶机的情况而定。
漏洞查找
在目标靶机上查看敏感文件,特殊程序也是非常重要的一步不要忘记。
重要
Redis的相关文件
-
位置 返回原地方
- 配置文件目录 (
/etc/redis): Redis的配置文件通常存储在此目录中。默认情况下,主配置文件名为redis.conf。你可以在这个文件中配置Redis的各种参数,如端口号、日志文件位置、持久化选项等。 - 数据目录 (
/var/lib/redis): Redis存储其持久化数据(如RDB快照文件和AOF日志文件)的默认位置。此目录还包含有关Redis实例的其他数据,例如在RDB持久化模式下生成的快照文件。
- 配置文件目录 (
-
具体内容
-
redis.conf:bind: 指定Redis监听的IP地址。默认情况下,它会监听所有可用的网络接口。 port: 指定Redis服务器监听的端口号。默认端口是6379。 logfile: 指定Redis的日志文件路径。记录有关Redis操作的日志信息。 dir: 指定Redis服务器存放持久化文件的目录。这包括RDB快照文件和AOF日志文件。 save: 指定触发持久化操作的条件。格式为save <seconds> <changes>,表示在指定的秒数内,如果至少有指定数量的变更操作发生,就执行一次持久化。 dbfilename: 指定RDB快照文件的名称。 appendonly: 如果设置为yes,则启用AOF(Append-Only File)持久化方式。 appendfilename: 指定AOF日志文件的名称。 requirepass: 设置Redis连接的密码。# 解释了为什么要直接搜索这个字段 maxclients: 限制连接到Redis服务器的最大客户端数量。 timeout: 客户端闲置多长时间后关闭连接,以秒为单位。 maxmemory: 设置Redis最大内存限制。
-

浙公网安备 33010602011771号