Hint:curl prints the raw HTML of a page to your terminal. The product name sits in the main heading near the top of that HTML. Note it: this is the application you will assess for the rest of the room.
Reference: Horizon3.ai: CVE-2023-27524 writeup
CVE severity: Critical (CVSS 8.9)
Affected: Apache Superset < 2.1.0
Hint: Run/usr/local/webtools/bin/httpx -h and look for the switches that print the status code, the page title, and the server software, plus one to keep the output quiet. Success looks like the application name followed by a version number appearing in your output.
Hint: /usr/local/webtools/bin/httpx has a flag for content length and one for writing results straight to a file (the file version strips the colour codes, which is what you want for a report). Keep the fingerprint stable: do not add fields that change on every run, such as response time, or the saved output will never be the same twice. A line showing the target URL with[200] means you are done.
Hint: TheDisallow: lines are your wordlist. httpx can read a file of URLs instead of a single target, and the same status-code flag from before makes each result show its[200] ,[404] and so on. One of the live paths is an admin area that should never be reachable without a login.
Hint:curl -I http://apache-serv:5000 sends a HEAD request and prints just the response headers. Scan the list forX-Frame-Options ,X-Content-Type-Options andContent-Security-Policy . None of them are set here. TheServer line at the top of the same output also re-confirms the software version you found earlier.
Hint: nuclei can be scoped by template directory, by tag, and by severity. Explore/opt/nuclei-templates/ to see how the templates are grouped, then decide how you want to narrow the run; there is more than one valid way.nuclei -h shows the relevant flags. Once it prints[INF] Templates loaded , the scan is under way and the findings follow.
Hint: During surface discovery you saw an/api/... path. Usingcurl -s http://apache-serv:5000/{the_interesting_path} | jq fetches and pretty-prints it. The field you want is the one Flask signs cookies with.
Hint:flask-unsign --decode --cookie '<cookie>' prints the payload with no secret at all, which is exactly why a signed-but-not-encrypted cookie is so dangerous once the key leaks. Re-signing is the step that needs the key:flask-unsign --sign --secret '<recovered key>' --cookie '<the same fields, id set to 1>' . Send the result withcurl -b "session=<forged>" . Logging in only ever gives you an analyst cookie; the leaked key is what turns it into an admin one without the admin's password.
Hint: A nuclei template is YAML in three parts: anid , aninfo block, and a protocol block (herehttp ). Undermatchers you can combine astatus matcher and aword matcher, andmatchers-condition: and requires both, which stops a 404 page from triggering a false positive. The examples under/opt/nuclei-templates/ are the fastest way to learn the exact syntax: find one that is close and adapt it. Run it withnuclei -u http://apache-serv:5000 -t celadon-default-secret-key.yaml .
The best resource if you need help writing the template : Nuclei's Template Structure Documentation.
If nuclei does not recognize your template, use-debug to see why!