
靶场搭建
靶场下载地址:https://download.vulnhub.com/vikings/Vikings.ova
下载下来是虚拟机.ova压缩文件,直接用Vmvare导出就行
打开后把网络模式设置为NAT模式(桥接模式也可以,和kali攻击机保持一致就可以)
开启虚拟机
开启后发现没有自动获取ip,解决办法看我这篇文章:https://www.freebuf.com/articles/network/343723.html,解决后重启
靶机搭建完毕
渗透测试
由于不知道靶机ip,所以需要扫描NAT的网段
128是kali攻击机的ip,所以140是靶机的ip
扫描靶机端口服务开放情况
开放了22端口,存在ssh服务
开放了80端口,存在http服务,且中间件为Apache 2.4.29
访问以下WEB
首页是一个静态网页,讲述了一个故事,没有什么线索
搜索一下铭感目录,没有发现其它铭感目录
发现一个war.txt文件,里面似乎是另一个目录/war-is-over
尝试访问,成功访问,发现很大一段编码,似乎是base64编码
将其复制到cyberchef里,解码后变得更乱了,但是我们发现开头的PK,可能为某种类型文件的文件头,这应该是经过了加密或者压缩后的
所以我们看看他是什么文件类型,使用cyberchef里的Detect File Type,发现为ZIP压缩文件
确定为ZIP文件后,我们利用cyberchef自带的功能将它保存为zip文件
保存后对其解压,发现需要密码
进行密码爆破,利用john爆破,先将文件转换为john可以识别的文件,然后爆破,成功爆破,密码为ragnarok123
解压后为一个名字为king的jpeg图片
图片是隐写信息很好的载体,探测一下这个图片是否隐写了信息,使用steghide工具,在kali上敲命令可以直接下载
发现需要密码,看来真的有隐写了信息
使用binwalk分析并提取二进制文件
分析发现这个图片里还存在一个名字为user的zip文件
提取user zip文件
提示我们加上--run-as=root
提取成功
提取成功后目录下会多出一个_king.extracted的目录
user文件里的内容看起来像ssh的用户名密码,应为有个@vikings
所以我们猜测FamousBoatbuilder_floki是账号
下面那段是密码
尝试登录,登录失败
再看看用户名,前面的FamousBoatbuilder(著名的造船者)似乎是修饰,用户名可能为floki,尝试登录,登录成功
在目录下发现一个boat文件和一个readme.txt文件
cat /etc/passwd发现三个可以登录的用户


readme.txt似乎是提示我们需要‘boat’来找到(提权)到ragnar,因为我们在/etc/passwd下也找到了一个叫做ragnar的可登录用户
boat文件里提示:可打印的字符是我的盟友,num等于第29个质数
collatz-conjecture经过搜索为考拉兹猜想(英语:Collatz conjecture),又称为奇偶归一猜想、3n+1猜想、冰雹猜想、角谷猜想、哈塞猜想、乌拉姆猜想或叙拉古猜想,是指对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1。
所以boat的意思是让我们对第二十九个质数做考拉兹猜想,所得到的数的数列,其中可打印的字符(ascall可以代表的字符,256以内),就是我们要得到的
首先我们编写一段简单的python代码来计算出第二十九个质数
n = 0 for i in range(1000): flag = 0 if i < 2: continue j = int(i/2) + 1 for k in range(2,j): if i % k == 0: flag = 1 break if flag == 0: n += 1 print("第",n,"个质数为",i)
运行程序计算出第二十九个质数为109
再编写一个简单python做考拉兹猜想,并且输出所有ascall为256以内的字符
n = 109 num = [] num.append(n) while n != 1: if n % 2 == 0: n =int(n / 2) else: n= int(3 * n + 1) if(n < 256): num.append(n) print(num) for i in num: j = chr(i) print(j,end='')
执行结果
这段字符串中还不是所有的字符都可打印
使用cyberchef的Strings模块分出所有可打印的字符,因为输出是每个字符占一行所以再用replace模块替换掉换行符方便复制密码,也要掉所有空格
尝试ssh登录,登录成功,且登录的时候似乎还自动执行了sudo命令
获得到一个flag
linux登录自动执行命令,可以通过
对于当前用户生效的 1、编辑当前主目录下的.bashrc文件添加一个指令 2、编辑当前主目录下的.profile文件 3、.bash_profile文件 对于全局用户生效的 /etc/profile
发现目录下存在两个这种文件
cat .bashrc
没有找到和sudo相关的命令
cat .profile
发现sudo运行了一个python文件
进入到这个文件的目录下
现在我们这个shell不是完整deshell,不是很方便,我们升级为/bin/bash
通过搜索我们发现这个程序也是一个客户端服务端的程序,并且这个服务端文件的运行用户为root,我们可以通过编写代码向服务端发送特殊请求来获得root用户的shell
通过官网的提示编写代码,让root用户将当前用户ragnar添加到sudo组里,使ragnar具有sudo权限
import rpyc def shell(): import os os.system("sudo usermod -a -G sudo ragnar") conn = rpyc.classic.connect("localhost") fn = conn.teleport(shell) fn()
通过官网文档知道,服务端默认运行再18812端口,我们检查以下这个端口是否开放,发现正常开放
创建程序,运行程序
执行成功后,重新ssh登录ragnar用户,发现可以sudo执行刚才哪个python程序了,只不过报错了报错原因使端口被占用,此程序已经在运行
继续把我们的shell变成更方便的/bin/bash
然后运行sudo -l查看sudo权限,发现对所有程序具有sudo权限
直接通过sudo -s提权到root用户
获得最后一个flag
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)