NSSRound 12 Misc 专场

Secrets in Shadow(linux提权 )

首先ssh远程连接上主机 直接看目录 发现flag文件 但是没有权限访问 需要进行提权

image-20230528085116572

我们现在需要寻找的是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=要爆破密码的用户名 哈希文件 保存结果的文件

image-20230603173158932

得到密码为:bullshit

image-20230603173457813

**:horse:NSSCTF{6011c959-50a4-4761-b08a-76c87a7c9e37}**s

ordinary forensics(内存取证 挂载ext系统磁盘)

打开之后有一个内存镜像一个unknown文件

首先进行内存取证 发现可以使用volatility2进行取证

volatility -f  forensics.raw imageinfo  #获得内存镜像的操作系统版本

image-20230602094324154

volatility -f  forensics.raw --profile==Win7SP1x64 cmdscan #提取镜像中cmd命令的使用情况

image-20230602094452525

找到一个password:U_find_1t

那面下面的目标就是要找压缩包了 但其实应该是png txt jpg 等可能的证据文件都提取一下

image-20230603084225877

image-20230603084358692

hint.txt里面提到vera

image-20230603084433823

useful.zip使用上面找到的password解压

image-20230603084519072

猜测是使用useful.txt挂载vc容器 得到一个secret

首先查看文件类型:是ext3系统磁盘文件

image-20230603162203998

进行挂载 查看磁盘内文件

image-20230603162308535

压缩包内提示 密码为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" # 查看计算机名

image-20230603163308057

得到解压密码:Mario_Princess-Peach

:horse:NSSCTF{f0rens1cs_1s_Interesting}

Bulbasaur(盲水印 阴阳怪气编码)

有题目描述可以猜测是盲水印 使用工具一把梭 得到:blind watermark 空格多试几次就看出来了 这就是压缩包的密码

image-20230603184810342

解压压缩包 得到一段文字 复制一段上网搜索 得知是阴阳怪气编码 阴阳怪气编码

image-20230603185021897

: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)

image-20230604095535749

最后将字符进行拼接得到flag :horse:NSSCTF{fine!it_1s_ez_f0rU_a_MISCmaster_todo}

strange python (jail 沙箱逃逸)

拿到一个python shell

首先dir()查看shell的内置变量 看到__flag__ random seed shuffle

image-20230604204936922

方法一

__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__的加载逻辑肯定在预先加载脚本内:

image-20230604210108219

但是在读取这个文件的时候 发现需要root权限

image-20230604210256502

但是python可以读取 因为发现该题目中python有特殊权限

ctf@61d8d57653564e1a:/$ getcap -r / 2>/dev/null  
/usr/bin/python3.10 cap_dac_override=ep

所以可以用python直接进行脚本读取

image-20230604210502189

: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)有关

image-20230604212459122

想查看flag 但发现没有权限 开始寻找该linux在什么文件中设置了特权

image-20230604212551027

于是使用dig程序 无视文件的权限设置 读取flag 在读取过程中 会将flag的内容一起读出来

image-20230604212924138

:horse:NSSCTF{d4ff2964-dd1b-453d-a2d3-d00a85ee68cd}

dig程序

在 Linux 系统中,dig 是一个常用的命令行工具,用于执行 DNS(Domain Name System)查询 从DNS服务器中获取域名等相关信息。

具体来说,dig 的作用如下:

  1. DNS 查询:dig 命令用于执行 DNS 查询,包括查找域名的 IP 地址、反向查找 IP 地址的域名、获取 DNS 记录等。
  2. 命令行界面:dig 提供了一个命令行界面,使用户可以直接在终端中输入命令并获取 DNS 查询结果。
  3. 支持多种查询类型:dig 支持多种 DNS 查询类型,如 A、AAAA、CNAME、MX、TXT、NS、PTR 等,可根据需求执行不同类型的查询。
  4. 详细信息输出:dig 在执行查询时,会输出详细的信息,包括查询结果、响应时间、查询状态等,便于用户进行分析和调试。

dig 命令中,**-f** 选项用于指定包含要查询的域名列表的文件。

具体来说,-f 选项的含义如下:

  • -f <filename>: 指定包含要查询的域名列表的文件名该文件应该是一个文本文件,每行包含一个域名,dig 命令将逐行读取该文件并对每个域名执行查询操作。使用 -f 选项可以方便地对多个域名进行批量查询,而不需要手动输入每个域名。这在一次性查询多个域名的情况下特别有用,例如从文件中读取要查询的域名列表。