NSSRound 12 Misc 专场
NSSRound 12 Misc 专场
Secrets in Shadow(linux提权 )
首先ssh远程连接上主机 直接看目录 发现flag文件 但是没有权限访问 需要进行提权
我们现在需要寻找的是root权限的密码 登陆root 获得读取flag的权限
通过查看/etc/shadow文件 可以得到root密码的哈希值
$6$Vh57Xwpz34U8wthL$Xd0QAbWlZgB4nOhgDPCR/Q50rhAUsVVkIs3MUiglBlMychQjULqAADyTSzTXNuuF0TO.2TzUi574DHY6e8Fma1
hashcat -m 1800 -a 0 -o value.txt hash rockyou.txt # value.txt是存放爆破结果的文件 hash存放想要爆破的哈希值 rockyou.txt是字典文件
再补充一下john爆破的命令:
john --wordlist=字典地址 --user=要爆破密码的用户名 哈希文件 保存结果的文件
得到密码为:bullshit
**:horse:NSSCTF{6011c959-50a4-4761-b08a-76c87a7c9e37}**s
ordinary forensics(内存取证 挂载ext系统磁盘)
打开之后有一个内存镜像一个unknown文件
首先进行内存取证 发现可以使用volatility2进行取证
volatility -f forensics.raw imageinfo #获得内存镜像的操作系统版本
volatility -f forensics.raw --profile==Win7SP1x64 cmdscan #提取镜像中cmd命令的使用情况
找到一个password:U_find_1t
那面下面的目标就是要找压缩包了 但其实应该是png txt jpg 等可能的证据文件都提取一下
hint.txt里面提到vera
useful.zip使用上面找到的password解压
猜测是使用useful.txt挂载vc容器 得到一个secret
首先查看文件类型:是ext3系统磁盘文件
进行挂载 查看磁盘内文件
压缩包内提示 密码为username_hostname 显然问的是内存镜像中的信息 再回去对信息进行提取
volatility -f forensics.raw --profile=Win7SP1x64 printkey -K "SAM\Domains\Account\Users\Names" # 查看系统用户名
volatility -f forensics.raw --profile=Win7SP1x64 printkey -K "ControlSet001\Control\ComputerName\ComputerName" # 查看计算机名
得到解压密码:Mario_Princess-Peach
:horse:NSSCTF{f0rens1cs_1s_Interesting}
Bulbasaur(盲水印 阴阳怪气编码)
有题目描述可以猜测是盲水印 使用工具一把梭 得到:blind watermark 空格多试几次就看出来了 这就是压缩包的密码
解压压缩包 得到一段文字 复制一段上网搜索 得知是阴阳怪气编码 阴阳怪气编码
:hot_pepper:NSSCTF{W@t3rMaRk_1s_s0000000_35s9}
坏东西(嵌套压缩包)
拿到一个压缩包99020.zip 验证后发现不是伪加密 爆破得到密码就是99020
里面有一个压缩包 压缩包里面还有压缩包 猜测压缩包名前的数字就是每个压缩包的解压密码 写脚本 解压
import zipfile
name = '99020'
while True:
fz = zipfile.ZipFile(name + '.zip', 'r')
fz.extractall(pwd=bytes(name, 'utf-8'))
name = fz.filelist[0].filename.rstrip('.zip')
print(fz.filelist[0].filename)
fz.close()
得到一个损坏的flag.pdf 放在010editor里面发现flag被拆分藏在 /Filter/FlateDecode里面 一点点手撸吧。。。
NSSCTF{25da50b7993c0db55867a5a51f32f35c}
奇怪的tex文件(提取包含文件)
首先 了解一下tex文件
TeX 文件是使用自己的标记语言编写的采用 ASCII 编码的纯文本文件。 它们可能需要包含其他数据,例如图像或其他LaTeX文件。 此类文件通常需要特定的软件才能使用它们。(比如cm3d2/com3d2)
注意:里面提到了可能需要包含其他文件 这是本题的关键
放在010editor里面查看 从第65个十六进制字符开始到每个文件尾 都是一个png图片 将其提取出来
import os
def extract_png_from_folder(folder_path):
file_paths = [os.path.join(folder_path, file) for file in os.listdir(folder_path) if
os.path.isfile(os.path.join(folder_path, file))]
for file_path in file_paths:
with open(file_path, 'rb') as file:
file_data = file.read()
# 找到PNG图片的起始位置
png_start = file_data.find(b'\x89\x50\x4E\x47\x0D\x0A\x1A\x0A')
while png_start != -1:
# 找到PNG图片的结束位置
png_end = file_data.find(b'\x49\x45\x4E\x44\xAE\x42\x60\x82', png_start)
if png_end != -1:
# 提取PNG图片的数据
png_data = file_data[png_start:png_end + 8]
# 保存PNG图片
output_file_path = os.path.splitext(file_path)[0] + '.png'
with open(output_file_path, 'wb') as output_file:
output_file.write(png_data)
print(f'Saved PNG image from {file_path} to {output_file_path}')
# 继续查找下一个PNG图片的起始位置
png_start = file_data.find(b'\x89\x50\x4E\x47\x0D\x0A\x1A\x0A', png_end)
else:
break
# 存放这44个文件的文件夹路径
folder_path = 'E:/Desktop/nss misc专项/奇怪的tex文件/Tex'
extract_png_from_folder(folder_path)
最后将字符进行拼接得到flag :horse:NSSCTF{fine!it_1s_ez_f0rU_a_MISCmaster_todo}
strange python (jail 沙箱逃逸)
拿到一个python shell
首先dir()查看shell的内置变量 看到__flag__
random seed shuffle
方法一
__flag__
应该是flag按照seed确定的顺序 使用shuffle函数进行了乱序 那么可以 伪随机预测+列表伪随机打乱后还原
import random
import re
__flag__ = ['a6', '5f', '70', 'SC', '-4', '7-', '3d', '7e', 'a2', 'NS', 'b4', 'f6', '6}', 'TF', '-7', '1a', '22', '06', 'c0', 'c5', '{4', '0-']
seed = 114514
b = []
for i in range(22):
b.append(i)
print(b)
random.seed(seed)
random.shuffle(b)
print(b)
for i in range(22):
print(__flag__[b.index(i)], end="")
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
# [18, 19, 20, 1, 10, 12, 14, 17, 4, 0, 13, 11, 21, 2, 15, 8, 9, 16, 5, 6, 3, 7]
# NSSCTF{4a2c0c50-1a22-4f67-b43d-7067ea65f706}
方法二
利用python的特殊权限态进行文件读取
先通过python得到一个交互式的shell
>>> import pty;pty.spawn("/bin/bash")
import pty;pty.spawn("/bin/bash")
ctf@61d8d57653564e1a:/$
通过资料,可以得知在python启动交互式终端的时候,会读取PYTHONSTARTUP
这一环境变量作为shell启动时的预先加载脚本,那么说明__flag__
的加载逻辑肯定在预先加载脚本内:
但是在读取这个文件的时候 发现需要root权限
但是python可以读取 因为发现该题目中python有特殊权限
ctf@61d8d57653564e1a:/$ getcap -r / 2>/dev/null
/usr/bin/python3.10 cap_dac_override=ep
所以可以用python直接进行脚本读取
:horse:NSSCTF{4a2c0c50-1a22-4f67-b43d-7067ea65f706}
知识点:
了解一下import pty;pty.spawn(“/bin/bash”)
pty.spawn用于创建一个伪终端环境 或者说交互式的终端环境 用于执行命令行程序或模拟终端用户与其他程序进行交互的场景。
该函数运行了/bin/bash 命令 可以进入一个新的bash shell环境 可以在其中执行命令 与其交互
env:在linux系统中用来显示当前用户的变量 即环境变量
getcap -r / 2>/dev/null该命令可以查看linux系统中所有存在特殊权限(capabilities)的文件
ability(jail 沙箱逃逸)
题目提示和linux中的特权(capabilities)有关
想查看flag 但发现没有权限 开始寻找该linux在什么文件中设置了特权
于是使用dig程序 无视文件的权限设置 读取flag 在读取过程中 会将flag的内容一起读出来
:horse:NSSCTF{d4ff2964-dd1b-453d-a2d3-d00a85ee68cd}
dig程序
在 Linux 系统中,dig
是一个常用的命令行工具,用于执行 DNS(Domain Name System)查询 从DNS服务器中获取域名等相关信息。
具体来说,dig
的作用如下:
- DNS 查询:
dig
命令用于执行 DNS 查询,包括查找域名的 IP 地址、反向查找 IP 地址的域名、获取 DNS 记录等。 - 命令行界面:
dig
提供了一个命令行界面,使用户可以直接在终端中输入命令并获取 DNS 查询结果。 - 支持多种查询类型:
dig
支持多种 DNS 查询类型,如 A、AAAA、CNAME、MX、TXT、NS、PTR 等,可根据需求执行不同类型的查询。 - 详细信息输出:
dig
在执行查询时,会输出详细的信息,包括查询结果、响应时间、查询状态等,便于用户进行分析和调试。
在 dig
命令中,**-f
** 选项用于指定包含要查询的域名列表的文件。
具体来说,-f
选项的含义如下:
-f <filename>
: 指定包含要查询的域名列表的文件名。该文件应该是一个文本文件,每行包含一个域名,dig
命令将逐行读取该文件并对每个域名执行查询操作。使用-f
选项可以方便地对多个域名进行批量查询,而不需要手动输入每个域名。这在一次性查询多个域名的情况下特别有用,例如从文件中读取要查询的域名列表。