声明:该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作。本公众号的技术文章可以转载,能被更多人认可本文的创作内容属实荣幸之至,请在转载时标明转载来源即可.也欢迎对文章中出现的不足和错误进行批评指正!
实战打靶系列第 09 篇文章
kali:1.0.0.3/24
靶机:1.0.0.4/24
靶机下载:
https://download.vulnhub.com/vikings/Vikings.ova
难度:低(中)
主机发现 端口扫描
WEB信息搜集:在里面我们发现了个 base64的编码文本
编码转换/文件还原:为加密的 zip文件
离线密码破解 隐写技术
二进制文件提取:为一个压缩包 zip,给予登陆密码提示
素数查找/克拉茨猜想:登陆密码提示
RPC漏洞提权
确认编码:是否加密,是否压缩(通过计算熵值来判断)
确认数据流的格式(文件头或者使用相关工具)
进行相关的查看和解密
直接上工具查看
查看二进制
当数据流以字母 "PK" 开头时,很可能是 ZIP 文件格式。ZIP 文件的文件头部分包含标识符 "PK",这是 ZIP 文件格式的标志之一。
查看 /etc/passwd
文件,寻找 /bin/
RPC漏洞
主机发现,端口扫描,版本确认。我们直接 nmap
出了一个 web
目录 /site
访问靶机的 ip
和发现的相关文本路径。然后查看网页的源码,查找相关的路径,api,注释等。依然没有什么收获。
这个网页的其他链接也是假链接,都是指向本页面的。
接下来就是常规的操作,目录爬取(迭代的进行爬取)当迭代的爬取 /site
的时候我们发现了一个 war.txt
的文件。至于其他的没有什么价值。
然后访问该文件,通过回显的内容/war-is-over
。我们很自然的判断这也是 web
路径。我们进一步访问发现回显了大量的数据。
通过访问 /war-is-over
,我们可以很简单判断出这是个 base64
编码的文件,具有明显的 base64
特征。所以我采用
https://cyberchef.org 这个网站的 From Base64
模块来进行解码。但是我们发现解码出来的数据我们依然看不懂。
不过我们通过数据流的 PK
这个打头的信息,我们应该敏感的察觉这很有可能为一个 zip
压缩包。我们通过 Entropy
模块也可以判断出这个解密出来的数据流很可能经过认为的加密或混淆。因为计算出的 熵值
大于 7.5
进一步的通过 Detect File Type
模块判断文件类型果然为 zip
。但是当我们将其保存为 a.zip
打开的时候发现是需要密码的。
zip2john
工具先将 a.zip
的密码==提出==来转化为 john
可以处理的格式。然后是使用 john
进行密码破解,发现密码为:ragnarok123
打开后发现为一张图片,结合 CTF
自然而然的想到是存在数据的隐写可能的。
我们使用 steghide
工具来帮助我们判断。但是当我们发现的时候它提示我们是需要密码的,这反而更加的让我们确信图片里面存在隐写的数据
进行密码的破解:
0:为jpeg格式的图片
12:为图片的具体内容
1429567:为一个 zip
压缩文件,压缩的大小为:53,解压后为:92。里面的文件名为 user
1429740:zip
压缩文件的结束位置
方法一:自己写个 bash
脚本,但是效率太低,无法实现多线程。而且由于字典太大破解速度非常缓慢,而且密码爆破不出来。
steghide extract king -p $i
for i in $(cat "rockyou.txt");do steghide extract king -p $i;done
方法二:我们是否可以直接对 king
图片进行二进制的数据分析,暂时的忽略密码验证。看能不能直接从二进制中提取出隐写的数据。我们使用 binwalk
工具进行查看,每个行的大致解释:
进行隐写文件的提取,然后进行查看发现为一段文本我们发现该文本具有非常明显的 ssh
的特征。
我们进行 ssh
登陆的不断尝试,直到 user:floki passwd:[email protected]
我们才成功的登陆。
进行一系列的数据收集,而且无法直接 sudo -s
。我们发现了一个非常有趣的用户 ragnar
也是能使用 shell
我们发现在用户目录下有个非常明显的提示文件 readme.txt, boat
,当我阅读文件内容全部的时候可以发现它提示我们两个非常有用的信息:1,ragnar
2,create this boat
然后我们阅读 boat
这个为一个伪代码。意思:可打印的字符是你的帮手,num
=第 29
个素数,将 num
放入到 collatz-conjecture(num)
函数中,我们可以猜测当经过函数处理后会生成一系列数据,然后将可打印的提取出来。估计就是 ragnar
的密码。
第 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)
collatz-conjecture(num)
的实现:翻译过来就是 ==考拉兹猜想==,
这个脚本是结合 可打印的字符是你的帮手
这个提示消息,将在考拉兹猜想过程中产生的中间值==进行筛选后==进行输出
==不要问为什么这个提示就是这个意思呢?==我感觉还是要你打靶经验,做题经验来帮助你推断的
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)
然后再使用 CyberChef
来进行编码,我们可以大胆的尝试将其认为是 ragnar
的密码
Delimiter
:分隔符 Comma
:逗号,顿号
进行登陆,登陆成功但是系统还要我们输入一次密码(有没有可能是我们一登陆这个用户,系统就自动的跑了一些需要高权限的程序?==---->==查看自启==动的配置文件==),我们还是用 mR)|>^/Gky[gz=\.F#j5P(
这个密码。输入的时候发现错误,提示 ragnar
不在 sudoer
组内。
但是如果我们抛开视频的思路不谈,如果就用登陆成功的 floki
的 shell
进行 su ragnar
是不会发现我们还需要输入第二次密码来运行一个程序的。那么这个提示我们要查看==自启动配置文件==的提示就很容易忽略。
同时我们为了交互的方便将原本的 sh
shell换位 bash
来方便交互。
拿下第一个 flag
我通过查看和用户 ragnar
登陆自启动的相关配置文件来查看到底是哪个程序需要高权限才能运行,当我们浏览到 .profile
文件的时候我们发现了目标为一个 python
的脚本。
查看该脚本和它的相关权限,发现该脚本只有 root
用户有读写的权限,其他的所有用户只有读和执行的权限。
该脚本已经大致的注释了该脚本的使用方法,同时我们应该敏锐的发现 rpyc
是python中一个用来 RPC
的一个模块。
同时我们发现服务端也是打开了 rpyc
服务服务短的端口的,
接下来的大致思路就是利用 RPC
来让靶机替我们执行程序:
我们选择3来进行尝试,通过阅读 rpyc
模块的官方文档,我们可以大致的进行编程出一个脚本。请参考官网的教程,非常简单。就是将 shell
函数从客户端传递给服务端。在服务端本地执行 shell
函数。只是这里的客户端和服务端都为靶机。
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。 ==这些都要建立在是可以让高权限用户执行命令的前提下==
让靶机执行提权脚本
让靶机提升我们已经获得的用户权限。
再次 ragnar
登陆查看是否提权成功。我们进行 id
的查看发现我们是在 sudo
组中的,然后直接 sudo -s
切换为 root
。拿下 flag
参考资料:
https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0