This Kioptrix Level 2 guide helps you test web behavior, interpret the result and choose your next step. It covers Level 1.1 (#2), using the updated archive as the reference image.

Scope: a lab companion with illustrative comparisons and a record tool. The example outcomes are hypothetical, not a transcript of a new end-to-end exploit run. For a separately authored full solution, open the VulnHub community walkthrough list — spoilers.
Where are you now?
| Your state | Start here | Finish with |
|---|---|---|
| Image version uncertain | Compare your archive | An identified release and checksum result. |
| VM or IP uncertain | Review VM import and boot; then confirm the VM identity and current address. | A running target matched to its IP on your contained lab network. |
| No saved service list | Save an initial inventory | The command, coverage and actual output. |
| Login behavior changed | Compare requests and sessions | A controlled access comparison. |
| Output looks like command execution | Compare baseline and changed input | An attributed result, or an unresolved question. |
| A command channel works | Record identity and prerequisites | A supported next investigation step. |
1. Confirm the image and lab
VulnHub identifies this release as Kioptrix: Level 1.1 (#2) and records a re-release after a web-application bug. Match the exact filename in its File Information listing. Identify your existing file before deciding whether another download is needed.
| Archive | Listed size | Use in this guide |
|---|---|---|
Kioptrix_Level_2-original.rar | 404 MB | Original image; record this difference when comparing a write-up. |
Kioptrix_Level_2-update.rar | 406 MB | Reference image for the comparisons below. |
Do: calculate the digest of the archive you actually have. For the updated file, run:
sha1sum Kioptrix_Level_2-update.rarCompare: the updated archive’s published SHA1 is 7A0EA0F414DFA0E05B7DF504F21B325C6D3CC53B. Save your result and source. SHA1 here is a legacy file comparison, not a signature or a safety certification.
Before continuing: use a dedicated lab segment, inspect all adapters and any forwarding or sharing, and keep the vulnerable VM off your physical LAN and unintended outbound paths. Host-only also includes the host. Record the target VM identifier and its matched current IP. Keep original files and notes outside the rollback boundary; establish a recovery method before state-changing tests.
2. Save the service inventory before testing the web application
Start when: the VM is running, its identity and current IP are matched, and you have reviewed the lab boundary and route.
Do: use the Kali tool guide to save an initial service inventory. Record the tool version, exact command, target, tested ports and completion or error status. Preserve original output rather than copying only interesting lines.
Read: select an observed HTTP service and record its actual scheme, address and port. A service label is a lead; inspect the response before assuming an application or version.
Next: if the web service responds, record the form’s action, method and field names, then continue below. If it does not, use the troubleshooting table. Do not copy a target address or assumed port list from another run.
3. Compare login requests and session state
Start when: you can reach the actual login form on your own training VM.
- Save a deliberately invalid login request and response as E01. Record URL, method, form action, field names, response status, redirect destination and whether a session already existed.
- Make one controlled input variation as E02. Keep the other request conditions equivalent. Use a separate fresh session with the same starting state for each comparison; do not reuse an already authenticated session as a control.
- Check the destination and a protected function independently as E03. Repeat the comparison from equivalent initial conditions.
| Illustrative outcome — not captured output | What it supports | Your actual result |
|---|---|---|
| A redirect appears after the changed input. | A response changed; authentication and SQL injection remain unproven. | Record status and destination, including any return to the login form. |
| A previously unavailable function becomes accessible. | Access changed under the tested conditions; investigate the cause. | Record the function, session conditions and access comparison. |
| The fresh invalid-login control can also reach the function. | The comparison has not isolated an input-driven login bypass. | Check pre-existing access, endpoint protection and session handling. |
Next: investigate SQL-specific behavior using the OWASP SQL injection testing guide. A changed page alone does not identify the cause. Keep complete evidence privately and redact live cookies from shared copies. Continue to a post-login function only when its access is actually established.
4. Compare reflected input with command execution
Start when: your authorized VM exposes a ping-style function you can access. Record its URL, parameter and session state; the endpoint and syntax may differ in your copy.
- Submit
127.0.0.1as a normal loopback input and save the request and response as E04. - In this isolated lab only, compare the bounded teaching input
127.0.0.1; idas E05. Keep other request conditions equivalent. - Repeat the comparison as E06 and retain the full responses. Separate the submitted text from output produced by the server.
| Illustrative outcome | Interpretation | Next action |
|---|---|---|
| Only the submitted string is visible. | Reflection alone does not demonstrate execution. | Compare response context and server-generated output. |
| Additional process-identity output appears only in the changed case and repeats. | Stronger evidence of input-driven execution, provided the output is attributable to this target. | Record the endpoint, comparisons and process identity. |
| The request fails or output is ambiguous. | Execution remains unresolved. | Preserve the error and compare parsing, access and request conditions. |
Example conclusion: “The changed request produced repeatable process-identity output in this illustrative case. An interactive shell and elevated privileges were not tested.” Replace this with your own results. See OWASP’s command injection explanation and the Level 2 command-injection comparison guide.
5. Review channel and privilege evidence separately
Start when: command execution has been established. Decide whether a further command channel is needed for your next question. A network connection, a working command interpreter and a privileged session are separate outcomes.
Do: if investigating an authorized channel, record the initiating endpoint, destination address and port, listener binding, route and errors. Check transport and command input/output separately. Keep the target isolated while troubleshooting.
Once a guest command channel actually works, record each command and result:
id
hostname
uname -r
uname -mInterpret: these identify the current context and provide investigation leads. A kernel string alone does not prove that an escalation applies; distribution packages may contain backported fixes.
| Record | Compare before choosing a candidate |
|---|---|
| Current account and effective permissions | The before/after identity and target session. |
| Distribution, kernel and package build | The specific affected and fixed builds in the advisory. |
| Architecture and configuration | The candidate’s supported environment and required settings. |
| Required tools, permissions and side effects | Which prerequisites are met, unknown or contradicted; recovery before changes. |
Next: write why a candidate fits or does not fit before testing it. If no escalation was attempted, record “not attempted.” If a test failed, retain the error and unchanged identity. If effective UID 0 is observed, preserve the before/after evidence and state the guest or namespace boundary; it does not establish host access. This guide supplies no newly reproduced root result.
6. Find the next check from the symptom
| Symptom | Distinguish first | Next action |
|---|---|---|
| Web page does not load. | Target identity and route versus web-service availability. | Compare the saved inventory and actual URL. |
| Login returns to the login page. | Session handling versus access failure. | Compare cookies, redirects and protected-function access. |
| Only my input appears. | Reflection versus server-side execution. | Compare normal and changed responses. |
| Connection opens, but commands do not work. | Transport event versus a usable interpreter. | Record channel errors and input/output behavior. |
| Privileges do not change. | Prerequisites versus execution failure. | Review build, architecture and actual test result. |
When seeking help, share the exact release, sanitized environment, one question, the action and literal result, and what you already checked. Say whether you want a hint or a worked step.
7. Save your lab record and next question
Fill in what you observed. Use not attempted / failed / unresolved / observed to distinguish outcomes. Entries remain in this tab and clear on reload; download before leaving. Do not enter secrets or live session tokens.
Complete the fields, then download your current record.
Continue: compare Level 2 command-injection results, or consult the external community solutions — spoilers. Compare image version and environment before adopting a route.
Editorial update: October 26, 2026. Added state-based navigation, comparison steps, transition criteria, troubleshooting and structured notes. Outcomes remain illustrative; no new VM boot, end-to-end exploitation or restore test was performed.