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最大内存限制。
-