Vulnhub打靶记录:Gemini_Pentest_v2

相关信息


kali:1.0.0.201/24

靶机:1.0.0.203/24(这个靶机需要在vmware中运行)

由于我多次打靶和思路的补充导致靶机ip有些混乱,203,206,212都是靶机的ip

靶机介绍:Gemini Inc: 2 ~ VulnHub

靶机下载:https://download.vulnhub.com/geminiinc/Gemini-Pentest-v2.zip

目标:1flag + root权限

难度:中

未提及的相关知识点,命令和代码等等可以查看我其他三个blog:

文字思路


全流程思路:

  • 主机发现 端口扫描 信息搜集
  • 隐藏路径爬取:爬取到的关键用户注册页面和激活页面非常的重要,web路径的爬取一定要细致。迭代爬取是否进行,字典是否合适,验证绕过是否需要,爬取文件的后缀是否限制,bak备份文件是否需要爬墙,这些都是需要注意的。
  • 开发注册
  • 验证码爆破:这个步骤使用的burpsuite功能非常重要,为实现验证码爆破而对burpsuite进行的每项操作都必不可少。但是了解每个步骤实现的具体目的是非常重要的,只有这样才能在其他情况下更加明白为什么。
  • Anti CSRF Token:这个步骤同样是需要使用到burpsuite里面的功能的,非常关键且极具实践意义。
  • 密码破解
  • WAF Bypass:一个学习使用burpsuite插件非常好的机会
  • 命令注入绕过
  • SSH公钥登陆:这个通过传递ssh公钥的方法是个非常非常常规。但是有多种实现方法,多种应用场景,需要不断的发现和利用。
  • Redis漏洞利用 本地提权

下意识的操作

  • 任何网页的源码都是需要查看的,一定一定。因为很多web应用虽然在页面渲染上没有问题,但是在网页源码层面很有可能由于接口,bug等原因会让有过多的数据和敏感信息泄露出来。
  • 突破边界后需要查看相关的进程和启用进程相关的用户。
  • 任意能控制网页展示的都要尝试xss,ssit漏洞测试。

主要的知识点

  • burpsuite递归爆破的使用,插件使用以及各种操作的精细设置。往往一个设置出问题,就达不到使用burpsuite的效果。
  • burpsuitewafbypass插件使用。
  • %09(tab键)空格+这些在空格过滤中都是可以尝试进行替换进行绕过的。
  • 在利用redis来保存相关文件时,注意对文件进行格式化,即前后添加两行:\n\n

具体流程


信息搜集

  1. 发现主机,扫描端口,确认服务版本。靶机是开放了22,80端口,基本确定了打靶的思路就是以80端口为主,然后看是否能够利用 ssh:22端口。

    Snipaste_2023-07-31_14-18-46
  2. 靶机的80端口,是一个login.php的登陆页面。尝试简单的mysql注入和弱密码爆破没有效果,网页源码很常规并没有漏洞。唯一的问题就是页面一直显示在加载,通过抓包和源码发现靶机是请求了外网的相关资源(可以不用管)。

    Snipaste_2023-07-31_14-18-16
  3. 使用dirb工具对目标url进行路径爬取,-r表示迭代爬取。发现如下目录:/admin, /css, /img, /inc

    Snipaste_2023-07-31_14-19-58

    由于dirb工具的特点,是需要指定文件后缀的。否者即使加载的字典中是有存在的文件名,也会导致扫描不到特定后缀的同名文件。其中-X .php表示字典名后面拼接上 .php后缀,扫描结果中的activate.php文件尤其关注。

    Snipaste_2023-07-31_14-22-12
  4. 依次访问dirb爬取到的web路径:

    • registration.php:一个注册用户的界面

      Snipaste_2023-07-31_14-25-03

      使用相同的信息尝试重复注册,提示email已经使用过。那么表明尝试注册的用户meiy已经成功被注册。

      image-20231017092339857

    • activate.php:顾名思义为一个激活页面,应该是用于激活用户账号的后台页面,应该是用来激活我们注册的用户的。

      Snipaste_2023-07-31_14-22-42

    • export.php:黑屏,无源码。

      Snipaste_2023-07-31_14-23-18

    • profile.php:白屏,无源码。

      Snipaste_2023-07-31_14-24-40

  5. 尝试在login.php页面登陆,成功进入到用户后台profile.php。但系统提示meiy用户并未激活,而且网页相关功能也无法使用,所以联想到路径爬取到得到的activate.php页面,尝试用该页面激活meiy用户。

    Snipaste_2023-07-31_14-45-28

    点击 My Profile这个功能键,虽然没有任何的实际作用,但是会在地址栏爆出当前用户meiyuid15

    image-20231017095211248

    image-20231017095233922

账号激活

  1. 由于activate页面的激活码非常的短只有6位,可以尝试使用burpsuite进行密码爆破。先对activate.php页面尝试手动激活,通过抓包发现激活时页面会向服务端发送一个带有token的包,并且该token会在每次尝试激活的时候发生变化。通过在请求历史中对同一个token进行过滤搜索,发现每次激活时附带的token都是会出现在两个报文中。其中第n次请求激活中携带的tokenn-1请求返回报文中的一个名为token变量的值。

    asdfasadfasfadsf
  2. 重新利用浏览器进行一次activate的请求,将数据包截获发送给Intruder功能(一定要将这个包截获,不让这个请求的数据包发送给靶机,从而确保当前获得的token值是有效的)。分别对 activation_code, token设为两个变量,然后选择pitchfork攻击模式(对每个变量给予不同的payload集,然后取各自变量的payload一一对应的进行爆破)。

    image-20231017103738870

  3. activation_code变量就是000000~999999范围的数字,注意位数,范围,步长即可。

    image-20231017103850918
  4. token变量为上一个返回包中的值,需要使用递归查询的方式来获取。在设置中的检索-提取中进行设置。

    image-20231017104120930

    点击添加后的页面按照如下设置即可,其中开始和结束的字符串都可以在报文中截取。点击重新获取响应即可看到成功定位到返回的token值。

    image-20231017104239273

    然后在token变量在Intrude中的payload选择递归即可,注意初次请求的payload值的设置(就是这个没有放行包的token值)。

    image-20231017104315113
  5. 如果这个时候直接开始攻击,系统会提示由于token的获取模式是递归,所以只能有一个线程(非常好理解)。因此还需要在资源池进行设置,只使用一个线程。

    Snipaste_2023-07-31_15-00-54

    同时为了加快爆破的速度,所以不需要进行错误处理,即便激活码错误返回403也不需要进行重试。

    Snipaste_2023-07-31_15-02-08

  6. 在爆破开始后,选择状态过滤,便可以发现meiy账户以及成功激活。image-20231017110547900

    image-20231017110608473

  7. 再次登录meiy用户验证猜想,可以发现已经成功激活账号。

    image-20231017111609067

确认漏洞

  1. 在个人编辑档案的编辑中插入xss恶意代码:<script>alert(1234)</script>,并未有弹出,表明靶机的目标网站并不存在该漏洞。

    • 原显示名:meiy(meiy)

      Snipaste_2023-07-31_20-34-49

    • 修改页面

      Snipaste_2023-07-31_20-35-36
    • 修改后显示名:<script>alert(1234)</script>(meiy)

    Snipaste_2023-07-31_20-35-52
  2. 在查看user list表单时,重点关注9emin1用户。访问Gemini用户的profile界面不难发现他的rankadminister

    Snipaste_2023-07-31_20-36-29 Snipaste_2023-07-31_20-36-43
  3. 查看Gemini's profile网页源码,可以发现爆出了一个Password:edbd1887e772e13c251f688a5f10c1ffbb67960d的字段。

    Snipaste_2023-07-31_20-38-26

    很明显该字段符合sha的加密密文特征,如下:

    Snipaste_2023-07-31_20-40-40

  4. 通过在线解密,可以密文为secretpassword

    Snipaste_2023-07-31_20-41-29
  5. 利用破解的密码登陆 Gemini管理员用户的账号,可以发现管理员账号具有命令执行的功能。

    image-20231108155811546

    Snipaste_2023-07-31_20-44-54

  6. 但是当访问命令执行功能页面的时候是无法访问成功的。

    Snipaste_2023-11-08_16-50-55

    使用burpsuite抓获访问命令执行页面的包,可以发现这个是403 IP NOT ALLOWED。很可能是由于靶机存在某些防护措施如防火墙来WAF

    Snipaste_2023-07-31_20-47-12

WAF绕过

  1. burpsuite拓展中的BApp商店中搜索 Bypass WAF,并下载这个插件。

    Snipaste_2023-11-08_17-12-06

    然后将其进行加载,加载成功后菜单栏上方会多出一个标签页。

    Snipaste_2023-11-08_17-12-32

  2. 接着在设置里面搜索sessions,选中project里面的session。选择会话处理规则添加(这个里面的更改会作用在整个工程里面),再在其中选择Rule actions添加。然后选着添加拓展,选择下好的bypass waf即可。

    image-20231108172047058

  3. 添加后再范围的选项中在将工具范围全部勾选上,外加URL范围的勾选为自定义。

    Snipaste_2023-07-31_21-02-58
  4. 由于刚刚勾选的URL范围是自定义,所以回到代理界面的 HTTP历史记录右击访问靶机的记录,将其添加到URL范围中。

    image-20231108221457092 image-20231108221521884

过滤绕过

  1. 经过上述的WAF BYPASS操作后,便可成功的访问命令执行页面。如下不难发现该命令执行功能是对 空格进行了过滤。

    Snipaste_2023-07-31_21-08-15 Snipaste_2023-07-31_21-09-32 Snipaste_2023-07-31_21-08-46
  2. 通过抓包也发现会将输入的空格转换为 +进行发包,所以准确的讲靶机对 +进行了过滤。

    image-20231108221946149

  3. 尝试通过将+转换为%09(tab)来尝试提交ls -a命令,能够成功的执行,表明%09可以完成 空格的绕过。

    image-20231108222054374

  4. 可以在 proxy选项中添加一个 替换规则来自动的让burpsuite帮我们替换空格为 %09(Tab)键。

    image-20231108222732570

突破边界

  1. 但在靶机执行nc反连接并未成功,可能是由于靶机上没有nc造成的。

    Snipaste_2023-07-31_21-13-58
  2. 可以在kali使用python开启一个web服务,然后利用命令执行让靶机将kali上的nc下载到靶机上的 /tmp/nc上。

    • kali复制nc,利用Python打开web服务。

      image-20231108222459163
    • 靶机下载nc

      image-20231108222835858
  3. 给靶机中的nc赋予执行权限,进常规的在kali打开回连端口,靶机利用nc再会连完成边界突破。

    image-20231108222909400 Snipaste_2023-07-31_21-22-27 image-20231108222953186
  4. 靶机成功回连kali,利用Python进行简单的shell升级。

    Snipaste_2023-07-31_21-24-23

  5. 可以发现在靶机本地是有一个黑名单的文件blacklist.txtcat该文件后基本可以确定就是用于来过滤命令执行页面特殊字符的。

    Snipaste_2023-07-31_21-28-20

提权

  1. 通过ss查看靶机的相关的端口信息,其中3306:mysql, 6379:redis两个端口尤其注意。再用ps命令查看两个服务的具体进程,发现Redis是由root用户运行的,基本确定就是通过redis完成提权了。

    Snipaste_2023-07-31_21-31-26

    ss -pantu
    # -p:显示每个进程的socket
    # -n:用ip的形式显示域名或主机
    
    ps -ef
    # -e:显示所有的进程
    # -f:显示全部信息
    
  2. 进入到Redis的配置文件夹,浏览6379.conf文件。使用grep命令检索该文件中的敏感字段:requirepass:8a7b86a2Cd89d96dfCC125ebCC0535e6,然后便可以登录靶机的redis。但在成功进入redis后,由于nc反弹的shell功能不完善导致交互命令难以阅读。在其中输入info命令的返还内容无法阅读,交互感非常差。

    为什么这里直接检索了requirepass字段?

    Snipaste_2023-07-31_21-33-23
  3. 为解决上述问题,可以使用sshshell来解决,即通非法在靶机写入文件来实现ssh的公钥登录:

    在靶机的gemini1家目录创建一个.ssh文件,同时靶机的nc侦听3333端口来接收公钥,写入到~/.ssh/authorized_keysssh公钥)文件中。最后便可以在kali直接ssh登录靶机,完成shell升级。

    • 靶机上创建文件夹,开启侦听。

      image-20231115112910594

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

      image-20231115113256012
    • 靶机成功接收公钥。

      image-20231115113329452

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

      image-20231115113414179

  4. ssh完整功能的shell中登录Redis,便可以正常的交互使用info命令。

    Snipaste_2023-11-09_10-14-17

  5. 便可以利用root启用的Redis将公钥写入到root用户的.ssh文件中,这样靶机就可以以root身份登录靶机。

    Snipaste_2023-11-09_10-31-52

    (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"
    # 用于指定数据库名字
    
  6. 最后就可以无密码的连接靶机的root用户,查看flag完成打靶。

    Snipaste_2023-11-09_10-31-08

相关工具/命令


工具

sha1sum

  1. what?

    是一个 Linux/Unix 系统中用于计算文件 SHA-1 散列值的命令。

  2. how to use?

    • -b--binary: 以二进制模式处理文件。
    • -c--check: 从文件中读取 SHA-1 散列值并验证文件。
    • -t--text: 以文本模式处理文件。
    • -v--verbose: 详细模式,显示文件名和散列值。

国外加解密网站

Hash, hashing, and encryption toolkit (md5hashing.net)

复盘/相关知识


复盘

ssh公钥登录实现

​ 可以在靶机进行文件写入的时候,可以通过传递公钥的形式来登录目标靶机。其中公钥写入时关键,可以通过多种方式来实现,完全需要依据靶机的情况而定。

漏洞查找

​ 在目标靶机上查看敏感文件,特殊程序也是非常重要的一步不要忘记。

重要

Redis的相关文件

  1. 位置 返回原地方

    • 配置文件目录 (/etc/redis): Redis的配置文件通常存储在此目录中。默认情况下,主配置文件名为redis.conf。你可以在这个文件中配置Redis的各种参数,如端口号、日志文件位置、持久化选项等。
    • 数据目录 (/var/lib/redis): Redis存储其持久化数据(如RDB快照文件和AOF日志文件)的默认位置。此目录还包含有关Redis实例的其他数据,例如在RDB持久化模式下生成的快照文件。
  2. 具体内容

    • 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最大内存限制。
      
posted @ 2023-11-15 17:14  C_CHL  阅读(150)  评论(0编辑  收藏  举报