Skenario 02 / 26FAIL
Active Debug Code - Application Server - Werkzeug Debugger
Lingkungan lab — bukan sistem produksi
Tangkapan layar dan trafik mentah tidak diterjemahkan; teks di dalamnya mungkin menggunakan bahasa lain.
vuln-bank/Evidence/[FAIL] Active Debug Code - Application Server - Werkzeug Debugger
01 — Catatan
Catatan pengujian
Kerentanan
[FAIL] Active Debug Code - Application Server - Werkzeug Debugger
Deskripsi
Aplikasi dijalankan dengan server pengembangan Flask dalam mode debug (app.run(debug=True)), sehingga konsol interaktif Werkzeug tersaji tanpa autentikasi pada /console. Halaman tersebut juga memuat nilai SECRET milik debugger. Header respons membocorkan versi Werkzeug dan Python secara persis.
Dampak
Medium: konsol debugger Werkzeug dirancang untuk mengeksekusi kode Python arbitrer pada server. Endpoint-nya terjangkau tanpa autentikasi dan nilai SECRET-nya terbaca, sehingga hanya PIN debugger yang menghalangi eksekusi perintah. PIN tersebut diturunkan dari atribut host dan dapat dihitung bila penyerang memperoleh primitif baca berkas, menjadikan temuan ini jalur menuju remote code execution. Selain itu, server pengembangan tidak dirancang untuk produksi dan banner versi yang presisi mempermudah pencocokan eksploit publik.
Catatan pengujian yang jujur: eksekusi kode TIDAK berhasil dicapai. PIN debugger aktif dan pada pengujian ini hanya terbaca melalui log kontainer, yang bukan merupakan jalur yang dapat dijangkau penyerang eksternal. Upaya menurunkan PIN melalui SSRF juga gagal karena pustaka requests tidak mendukung skema file://. Temuan ini karena itu dilaporkan sebagai eksposur debugger, bukan sebagai RCE yang terbukti.
CWE
CWE-489: Active Debug Code
OWASP
A05:2021 - Security Misconfiguration
Skenario
Eksploitasi: permintaan GET tanpa autentikasi ke /console -> HTTP 200 menyajikan konsol interaktif Werkzeug beserta nilai SECRET debugger. Pendukung: header respons pada rute mana pun membocorkan Werkzeug/2.0.1 dan Python/3.9.25 secara persis.
Endpoint
GET http://127.0.0.1:5001/console
Fitur terdampak
Konfigurasi server aplikasi (Flask development server, mode debug)
Rekomendasi perbaikan
- Matikan mode debug pada seluruh lingkungan selain workstation pengembang; pastikan debug=False di produksi.
- Jalankan aplikasi di belakang WSGI server produksi (gunicorn/uWSGI) dan jangan gunakan server pengembangan Flask.
- Blokir /console pada reverse proxy sebagai pertahanan berlapis.
- Sembunyikan atau samarkan header Server agar tidak membocorkan versi persis.
Bukti konsep
1) (Screenshot 1) EKSPLOITASI: GET /console tanpa autentikasi -> HTTP 200 menyajikan konsol interaktif Werkzeug beserta nilai SECRET debugger.
2) (Screenshot 2) PENDUKUNG: header respons membocorkan Server: Werkzeug/2.0.1 Python/3.9.25, mengonfirmasi server pengembangan berjalan di mode debug.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[FAIL] Active Debug Code - Application Server - Werkzeug Debugger
Description:
Aplikasi dijalankan dengan server pengembangan Flask dalam mode debug (app.run(debug=True)), sehingga konsol interaktif Werkzeug tersaji tanpa autentikasi pada /console. Halaman tersebut juga memuat nilai SECRET milik debugger. Header respons membocorkan versi Werkzeug dan Python secara persis.
Impact:
Medium: konsol debugger Werkzeug dirancang untuk mengeksekusi kode Python arbitrer pada server. Endpoint-nya terjangkau tanpa autentikasi dan nilai SECRET-nya terbaca, sehingga hanya PIN debugger yang menghalangi eksekusi perintah. PIN tersebut diturunkan dari atribut host dan dapat dihitung bila penyerang memperoleh primitif baca berkas, menjadikan temuan ini jalur menuju remote code execution. Selain itu, server pengembangan tidak dirancang untuk produksi dan banner versi yang presisi mempermudah pencocokan eksploit publik.
Catatan pengujian yang jujur: eksekusi kode TIDAK berhasil dicapai. PIN debugger aktif dan pada pengujian ini hanya terbaca melalui log kontainer, yang bukan merupakan jalur yang dapat dijangkau penyerang eksternal. Upaya menurunkan PIN melalui SSRF juga gagal karena pustaka requests tidak mendukung skema file://. Temuan ini karena itu dilaporkan sebagai eksposur debugger, bukan sebagai RCE yang terbukti.
CWE:
CWE-489: Active Debug Code
OWASP:
A05:2021 - Security Misconfiguration
Scenario:
Eksploitasi: permintaan GET tanpa autentikasi ke /console -> HTTP 200 menyajikan konsol interaktif Werkzeug beserta nilai SECRET debugger. Pendukung: header respons pada rute mana pun membocorkan Werkzeug/2.0.1 dan Python/3.9.25 secara persis.
Endpoint:
GET http://127.0.0.1:5001/console
Affected Feature:
Konfigurasi server aplikasi (Flask development server, mode debug)
Remediation:
- Matikan mode debug pada seluruh lingkungan selain workstation pengembang; pastikan debug=False di produksi.
- Jalankan aplikasi di belakang WSGI server produksi (gunicorn/uWSGI) dan jangan gunakan server pengembangan Flask.
- Blokir /console pada reverse proxy sebagai pertahanan berlapis.
- Sembunyikan atau samarkan header Server agar tidak membocorkan versi persis.
POC:
1) (Screenshot 1) EKSPLOITASI: GET /console tanpa autentikasi -> HTTP 200 menyajikan konsol interaktif Werkzeug beserta nilai SECRET debugger.
2) (Screenshot 2) PENDUKUNG: header respons membocorkan Server: Werkzeug/2.0.1 Python/3.9.25, mengonfirmasi server pengembangan berjalan di mode debug.
02 — Tangkapan layar
Tangkapan layar (2)
03 — Request dan response
Rekaman HTTP
Sebagian nilai kredensial disamarkan pada tampilan HTML publik ini. Penyamaran ini tidak menjamin bahwa seluruh data sensitif atau berkas tertaut sudah disamarkan.
REKAMAN 01 / 1
GET /console HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1909
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:12:57 GMT
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Console // Werkzeug Debugger</title>
<link rel="stylesheet" href="?__debugger__=yes&cmd=resource&f=style.css"
type="text/css">
<!-- We need to make sure this has a favicon so that the debugger does
not accidentally trigger a request to /favicon.ico which might
change the application's state. -->
<link rel="shortcut icon"
href="?__debugger__=yes&cmd=resource&f=console.png">
<script src="?__debugger__=yes&cmd=resource&f=debugger.js"></script>
<script type="text/javascript">
var TRACEBACK = -1,
CONSOLE_MODE = true,
EVALEX = true,
EVALEX_TRUSTED = false,
SECRET = "wQNdhu5XU86XonfW6ITo";
</script>
</head>
<body style="background-color: #fff">
<div class="debugger">
<h1>Interactive Console</h1>
<div class="explanation">
In this console you can execute Python expressions in the context of the
application. The initial namespace was created by the debugger automatically.
</div>
<div class="console"><div class="inner">The Console requires JavaScript.</div></div>
<div class="footer">
Brought to you by <strong class="arthur">DON'T PANIC</strong>, your
friendly Werkzeug powered traceback interpreter.
</div>
</div>
<div class="pin-prompt">
<div class="inner">
<h3>Console Locked</h3>
<p>
The console is locked and needs to be unlocked by entering the PIN.
You can find the PIN printed out on the standard output of your
shell that runs the server.
<form>
<p>PIN:
<input type=text name=pin size=14>
<input type=submit name=btn value="Confirm Pin">
</form>
</div>
</div>
</body>
</html>
REKAMAN 02 / 2
GET /nonexistent-path-for-server-banner HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
HTTP/1.1 404 NOT FOUND
Content-Type: text/html; charset=utf-8
Content-Length: 232
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:12:58 GMT
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>