Vantage - HTB Sherlock Writeup (DFIR / Network Forensics)

Challenge Description
A small company moved some of its resources to a private cloud installation. The developers left the redirect to the dashboard on their web server. The security team got an email from the alleged attacker stating that the user data was leaked. It is up to you to investigate the situation.Difficulty: Very Easy
Category: DFIR / Network Forensics
Evidence Files:
web-server_2025-07-01.pcap (15 MB), controller_2025-07-01.pcap (6.9 MB)
Initial Analysis Methodology
Before diving into the challenge questions, the goal is to understand what happened using only the evidence. This section walks through a repeatable approach you can apply to any unknown PCAP - the same steps, in the same order, every time. We have two PCAP files from two different machines. We donāt know yet what those machines are, how they relate to each other, or what happened. The methodology below will answer all three.Step 1 - Protocol Hierarchy: What kind of machines are these?
The very first thing to do with any unknown PCAP is find out what protocols it contains. This tells you what kind of machine was captured and what kind of activity to expect - before you read a single packet. Wireshark:Statistics > Protocol Hierarchy
š web-server_2025-07-01.pcap
Open the web-server PCAP first and go toStatistics > Protocol Hierarchy. Hereās what stands out:
| Protocol | Frames | What it tells you |
|---|---|---|
| TCP | 21,586 | Nearly all traffic is TCP-based |
| HTTP | 7,482 | A web server - this is almost entirely HTTP |
| HTML Form URL Encoded | 8 | Only 8 form submissions out of 7,482 HTTP requests |
application/x-www-form-urlencoded is what
browsers send when you submit a login form via POST. Out of 7,482 HTTP requests, only 8 were form
POSTs - meaning the vast majority of traffic was automated GETs (scanning/fuzzing), and only a
handful were deliberate human interactions (login attempts). That ratio is the first red flag, and
youāve spotted it without reading a single packet.
Why 8 and not 4? You might expect 4 login attempts = 4 POSTs. The count is doubled because this
machine acts as a reverse proxy: it captures both the external POST from the attacker
(117.200.21.26 to 157.230.81.229) and the internally forwarded POST from proxy to backend app
(10.116.0.3 to 10.116.0.4). Each login attempt is seen twice in the one capture file. This matters
in Step 5 when we filter for login packets.
š controller_2025-07-01.pcap
Now open the controller PCAP and check the same view:| Protocol | Frames | What it tells you |
|---|---|---|
| HTTP + JSON | 626 | REST API traffic |
| MySQL | 8,978 | Database backend |
| AMQP | 849 | Message queue (RabbitMQ) |
| Data on port 2379 | 1,418 | etcd - distributed key-value store |
| Data on port 11211 | - | memcached - in-memory cache |
Step 2 - Endpoints & Conversations: Whoās talking, and how much?
Now we have a rough picture of each machine. Next question: who is communicating with them, and is any of that traffic abnormal? There are two related views in Wireshark that answer this differently:Statistics > Endpoints > IPv4- One row per IP, total packets aggregated across all connections. Best for quickly identifying dominant talkers.Statistics > Conversations > TCP- One row per TCP stream (unique source port to destination port pair). Best for understanding how the traffic is structured.
š web-server_2025-07-01.pcap - Endpoints view
OpenStatistics > Endpoints > IPv4 tab and sort by the Packets column (descending):
| Address | Packets | % of total | Role |
|---|---|---|---|
| 157.230.81.229 | 21,348 | - | Web server (this machine) |
| 117.200.21.26 | 20,897 | 97.9% | ??? (suspicious) |
| 10.116.0.3 | 256 | 1.2% | Internal IP |
| 10.116.0.4 | 256 | 1.2% | Internal IP |
| 60+ other IPs | 2ā243 each | under 1% | Internet background noise |
117.200.21.26 - accounts for 97.9% of all
traffic. Every other external IP has negligible volume. That ratio alone identifies the attacker
before youāve looked at a single HTTP request.
š web-server_2025-07-01.pcap - Conversations view
Now switch toStatistics > Conversations > TCP tab to understand how that traffic is structured.
Youāll see approximately 187 rows from 117.200.21.26, all connecting to 157.230.81.229:80,
each from a different source port:
| Address A | Direction | Address B | Packets | Duration |
|---|---|---|---|---|
| 117.200.21.26:64728 | to | 157.230.81.229:80 | 497 | 22.6s |
| 117.200.21.26:64727 | to | 157.230.81.229:80 | 489 | 22.7s |
| 117.200.21.26:64756 | to | 157.230.81.229:80 | 487 | 22.6s |
| ⦠184 more rows ⦠|
10.116.0.3 and 10.116.0.4:80. These two internal IPs
have nearly identical packet counts in the Endpoints view, and their timing aligns with the external
wave - this is the hallmark of a reverse proxy chain (e.g., Nginx or Apache fronting a backend app
server).
š controller_2025-07-01.pcap - What about this one?
Weāll come back to the controller PCAP after we understand the web-server traffic. The methodology is: follow the attackerās footsteps in order. The web server is where the attack started, the controller is where it escalated. Analysing them chronologically tells a coherent story.Step 3 - Filter HTTP Requests: What was the attacker doing?
Weāve identified117.200.21.26 as suspicious. Now letās see exactly what they requested.
Wireshark display filter (in web-server_2025-07-01.pcap):
Column Preferences > add:
http.host(titled āHostā)http.request.uri(titled āURIā)http.user_agent(titled āUser-Agentā)
| # | Host | Method | URI |
|---|---|---|---|
| 1024 | 1.vantage.tech | GET | / |
| 1031 | 2.vantage.tech | GET | / |
| 1038 | a.vantage.tech | GET | / |
| 1052 | abc.vantage.tech | GET | / |
| ⦠| 3,579 unique subdomains | GET | / |
| 1072 | cloud.vantage.tech | GET | / |
| - | (User-Agent changes here) | ||
| 18201 | cloud.vantage.tech | GET | /dashboard/ |
| 18215 | cloud.vantage.tech | GET | /dashboard/auth/login/ |
| 18240 | cloud.vantage.tech | POST | /dashboard/auth/login/ |
- Fuzzing phase: Thousands of GETs, each to a different
*.vantage.techsubdomain, all requesting/. The Host header cycles through a wordlist alphabetically. This is subdomain enumeration. - Exploitation phase: The Host locks onto
cloud.vantage.techand the attacker starts browsing the dashboard manually - navigating to the login page, submitting POST requests.
/dashboard/i18n/js/horizon+openstack_dashboard/. That path
literally contains the words horizon (OpenStackās web dashboard) and openstack_dashboard.
Remember the controller PCAP from Step 1 that we couldnāt identify beyond āapplication controller
nodeā? Now we know - this is an OpenStack deployment. The web server is fronting an OpenStack
Horizon dashboard, and the controller is the OpenStack control plane behind it.
The transition between phases is also visible in the User-Agent column (which weāll examine next).
Step 4 - Check User-Agents: What tools were used?
User-Agent strings are one of the quickest wins in web traffic analysis. Legitimate browsers all sendMozilla/5.0... headers. Attack tools often identify themselves - either by name or by sending
unusual/missing User-Agents.
Wireshark (in web-server_2025-07-01.pcap): Click any packet from the fuzzing phase, expand
Hypertext Transfer Protocol > User-Agent in the packet detail pane.
Two User-Agents appear from the attackerās IP:
| Phase | User-Agent | Meaning |
|---|---|---|
| Fuzzing (3,695 reqs) | Fuzz Faster U Fool v2.1.0-dev | ffuf - a Go-based web fuzzing tool |
| Manual browsing | Mozilla/5.0 (Macintosh Intel Mac OS X 10_15_7) AppleWebKit/537.36 ... Chrome/137.0.0.0 Safari/537.36 | Real Chrome browser on macOS |
cloud.vantage.tech returned something interesting (the Horizon dashboard) and decided to explore it
manually.
To filter for just the non-browser traffic:
Step 5 - Follow TCP Streams: Read the full conversations
So far weāve been looking at metadata - source IPs, URIs, User-Agents. Now we need to see the actual content of the most interesting requests: what credentials were submitted, what files were downloaded, what the server responded with.Reading the login attempts
Wireshark filter (inweb-server_2025-07-01.pcap):
Why theThis gives you exactly 4 POST packets - one per login attempt. Click the first one, then right-click > Follow > TCP Stream. What you see in the stream window: Wireshark colours the two sides of the conversation differently. By default, the clientās data (the attackerās request) is shown in red and the serverās response in blue. The stream shows everything in one continuous scroll: the HTTP request headers, then a blank line, then the POST body, then the serverās response headers, then the response body. The POST body you will see (line-wrapped here for readability):ip.srcclause is essential: Without it, this filter returns 8 packets, not 4. Because this machine is a reverse proxy, every inbound request from the attacker (117.200.21.26 ā 157.230.81.229) is immediately forwarded internally to the backend app server (10.116.0.3 ā 10.116.0.4). Both hops are captured in this one PCAP file, so each login attempt appears twice. Addingip.src == 117.200.21.26limits results to the original attacker-side packets only, giving you the complete request bodies.
csrfmiddlewaretoken- Djangoās Cross-Site Request Forgery protection token. It rotates with every new session and is not useful for our investigation. Ignore it.fake_email/fake_password- Honeypot fields that OpenStack Horizon adds to its login form to catch naive credential-stuffing bots. A real browser always leaves them empty. Ignore them.username/password- The credentials youāre looking for.region- The OpenStack region name, alwaysdefaulthere.
HTTP/1.1 200 OK: the server re-rendered the login page. Login failed.HTTP/1.1 302 FoundwithLocation: /dashboard/: the server redirected to the dashboard. Login succeeded.
| Attempt | Credentials | Response | Result |
|---|---|---|---|
| 09:39:16 | admin / admin | 200 OK | Failed |
| 09:39:27 | demo / demo | 200 OK | Failed |
| 09:39:33 | root / root | 200 OK | Failed |
| 09:40:07 | admin / StrongAdminSecret | 302 Found | Success |
Reading the OpenRC file download
Filter (inweb-server_2025-07-01.pcap):
/dashboard/project/api_access/openrc/. Scrolling down to the blue response, the headers confirm:
- Go to File > Export Objects > HTTPā¦
- Find the row with
admin-openrc.shin the Filename column. - Click Save, then open the file in a text editor.
134.209.71.220) and everything needed to authenticate to the OpenStack API without going
through the web dashboard. Everything that happens in the controller PCAP after this moment is a
consequence of this one download.
Step 6 - Cross-Reference PCAPs: Connect the timeline
This is where the two PCAP files merge into a single story. The question is: does the activity in the web-server PCAP lead to activity in the controller PCAP, and can we prove it? Method: Compare timestamps. Look at when the last meaningful action occurs in the web-server file, then look at when new activity begins in the controller file.š web-server_2025-07-01.pcap: Last meaningful action
The attackerās last request in this file is the OpenRC file download at 09:40:29 UTC. After that there is no more attacker-initiated traffic in the web-server PCAP.š controller_2025-07-01.pcap: Whatās in this file before the attacker arrives?
Open the controller PCAP and apply:09:41:44 there are zero results. The attacker has no presence in this file yet.
Without the filter, the controller PCAP contains only internal background traffic, just the OpenStack
services talking to each other. Youāll see periodic POST /v3/lease/keepalive requests from
134.209.71.220 to itself on port 2379 (etcd, a key-value store used internally by OpenStack).
These are automated heartbeats with no relation to the attacker. Everything else is MySQL and AMQP
traffic between backend services. There is no Horizon dashboard traffic in this file.
The pivot moment
The first packet in the controller PCAP with the attackerās IP is at 09:41:44 UTC:openstack command. The attacker is no longer using a browser. They are now running
command-line tools directly against the controller using the credentials from the OpenRC file.
The 75-second gap between 09:40:29 (OpenRC download) and 09:41:44 (first CLI call) is exactly
the time it takes to: open a terminal, run source admin-openrc.sh, enter the password when
prompted, and type the first openstack command. The causal chain is unambiguous.
What the attacker sequence looks like in the controller PCAP
Apply this filter to isolate only the attackerās CLI activity:| Time (UTC) | Request | What the attacker ran |
|---|---|---|
| 09:41:44 | GET /identity | First CLI command, discovery |
| 09:41:45 | POST /identity/v3/auth/tokens | Authentication |
| 09:41:45 | GET /identity/v3/services | List all services |
| 09:42:11 | GET /identity/v3/users | List all users |
| 09:42:27 | GET /compute/v2.1/servers/detail | List VMs |
| 09:43:27 | GET /v1/AUTH_9fb84977...?format=json | List Swift containers |
| 09:43:47 | GET /v1/AUTH_.../user-data?format=json | List user-data contents |
| 09:44:05 | GET /v1/AUTH_.../employee-data?format=json | List employee-data contents |
| 09:45:23 | GET /v1/AUTH_.../user-data/user-details.csv | Download user data |
| 09:45:47 | GET /v1/AUTH_.../employee-data/employee-details.csv | Download employee data |
| 09:48:02 | POST /identity/v3/users | Create backdoor user |
| 09:49:15 | PUT /identity/v3/projects/.../users/.../roles/... | Grant admin role |
openstack CLI command. The fact that every request carries the same
openstacksdk User-Agent and the same auth token confirms they all belong to the same session.
Methodology Summary
Every time you open an unknown PCAP, follow this sequence:- Protocol Hierarchy tells you what kind of machine this is
- Endpoints tell you whoās suspicious (disproportionate traffic volume)
- Conversations tell you how the traffic is structured (parallelism, ports)
- Build protocol-specific filters tell you what they did (HTTP paths, DNS queries, SMB shares, RDP sessions, etc.)
- Inspect client/application metadata tells you what tool or app generated the traffic (User-Agent strings, protocol banners, client names, request patterns)
- Reconstruct key sessions and relevant artifacts tell you the full content and sequence of
interesting exchanges (
Follow TCP Stream,File > Export Objects > HTTPfor compressed responses, key request/response bodies) - Cross-reference timestamps across hosts/files connects activity into one timeline and separates cause from effect
Attack Timeline
| Time (UTC) | Source PCAP | Event |
|---|---|---|
| 09:38ā09:40 | web-server | Subdomain fuzzing with ffuf (3,579 subdomains tested, 3,695 total requests) |
| 09:39:07 | web-server | Attacker discovers cloud.vantage.tech, switches to Chrome |
| 09:39:16 | web-server | Login attempt: admin / admin failed (HTTP 200) |
| 09:39:27 | web-server | Login attempt: demo / demo failed (HTTP 200) |
| 09:39:33 | web-server | Login attempt: root / root failed (HTTP 200) |
| 09:40:07 | web-server | Login attempt: admin / StrongAdminSecret succeeded (HTTP 302) |
| 09:40:29 | web-server | Downloads admin-openrc.sh from API Access page |
| - 75-second gap: attacker reads file, sources it, enters password - | ||
| 09:41:44 | controller | First direct API call - OpenStack CLI service discovery (GET /identity) |
| 09:41:45 | controller | Enumerates services and endpoints via Keystone |
| 09:42:11 | controller | Lists all users via Keystone (GET /identity/v3/users) |
| 09:42:27 | controller | Lists compute servers (GET /compute/v2.1/servers/detail) |
| 09:43:27 | controller | Lists Swift containers - finds 3: dev-files, employee-data, user-data |
| 09:43:47 | controller | Lists contents of user-data container |
| 09:44:05 | controller | Lists contents of employee-data container |
| 09:45:23 | controller | Downloads user-details.csv (28 PII records) |
| 09:45:47 | controller | Downloads employee-details.csv |
| 09:48:02 | controller | Creates backdoor user ājellibeanā with password āP@$$wordā |
| 09:49:15 | controller | Grants jellibean admin role on the project |
Questions & Answers
Task 1: What tool did the attacker use to fuzz the web server?
PCAP:web-server_2025-07-01.pcapFilter:
http.request && ip.src == 117.200.21.26Where to look: Click any packet from the early GETs to expand
Hypertext Transfer Protocol > User-Agent in the packet detail pane.
The User-Agent field reads Fuzz Faster U Fool v2.1.0-dev - this is ffuf, a popular web fuzzing
tool written in Go.
Answer: ffuf@2.1.0-dev
Task 2: Which subdomain did the attacker discover?
PCAP:web-server_2025-07-01.pcapFilter:
http.request && ip.src == 117.200.21.26 && http.user_agent contains "Chrome"
After the ffuf scan, the attacker switched to Chrome and manually browsed to the discovered
subdomain. Every Chrome request targets the same Host header value.
Answer: cloud.vantage.tech
Task 3: How many login attempts did the attacker make before successfully logging in?
PCAP:web-server_2025-07-01.pcapFilter:
http.request.method == POST && http.request.uri contains "/dashboard/auth/login" && ip.src == 117.200.21.26
Four POST packets appear. The response codes distinguish success from failure: HTTP 200 means the
login page was re-rendered (failed), while HTTP 302 means authentication succeeded and the server is
redirecting to the dashboard. The first three returned 200, and the fourth returned 302.
| Attempt | Credentials | Response | Result |
|---|---|---|---|
| 1 (09:39:16) | admin : admin | 200 OK | Failed |
| 2 (09:39:27) | demo : demo | 200 OK | Failed |
| 3 (09:39:33) | root : root | 200 OK | Failed |
| 4 (09:40:07) | admin : StrongAdminSecret | 302 Found | Success |
Answer: 3
Task 4: When did the attacker download the OpenStack API remote access config file?
PCAP:web-server_2025-07-01.pcapFilter:
http.request.uri contains "openrc" && ip.src == 117.200.21.26
The OpenRC file is a shell script that sets environment variables for OpenStack CLI authentication.
The attacker downloaded it from Project > API Access > Download OpenStack RC File in the Horizon
dashboard. The response header confirms the filename in Content-Disposition as admin-openrc.sh.
To read the file content itself, use File > Export Objects > HTTP (the response is
gzip-compressed and unreadable in the Follow TCP Stream window). The decompressed file contains the
auth URL (http://134.209.71.220/identity), the project ID, and the username - everything needed to
pivot from the web server to direct API access on the controller.
Answer: 2025-07-01 09:40:29
Task 5: When did the attacker first interact with the API on the controller node?
PCAP:controller_2025-07-01.pcapFilter:
http.request && http.user_agent contains "openstacksdk"
Before 09:40:29, controller API traffic is mostly dashboard-generated background activity. After a
75-second gap (the attacker reading and sourcing the OpenRC file), the first request with the
OpenStack SDK User-Agent appears - GET /identity at 09:41:44 UTC - which is the SDKās service
discovery call, always the first thing the CLI does when you run any openstack command.
Answer: 2025-07-01 09:41:44
Task 6: What is the project ID of the default project accessed by the attacker?
PCAP: Both - appears inweb-server (OpenRC file) and throughout controller (API URLs)Easiest source: Export the OpenRC file via File > Export Objects > HTTP (Task 4)
/v1/AUTH_9fb84977...), and networking quota requests.
Answer: 9fb84977ff7c4a0baf0d5dbb57e235c7
Task 7: Which OpenStack service provides authentication and authorization?
PCAP:controller_2025-07-01.pcapFilter:
http.request.uri == "/identity/v3/services" && http.user_agent contains "openstacksdk"
Click the matching packet and follow the TCP stream (Follow > TCP Stream). The response body is a
JSON service catalog. The entry with "type": "identity" is Keystone - OpenStackās
authentication and authorization service. Every API call hitting the /identity/ path in the
controller PCAP is talking to Keystone.
The relevant JSON entry:
Answer: Keystone
Task 8: What is the endpoint URL of the Swift service?
PCAP:controller_2025-07-01.pcapFilter:
http.request.uri == "/identity/v3/endpoints" && http.user_agent contains "openstacksdk"
Follow the TCP stream on the matching packet. The response body is a JSON endpoint catalog listing
all service endpoints. Find the entries with service_id matching the Swift service
(f9194820052d4788b09157bf0a0dfdd0). The public-interface endpoint URL is a template:
$(project_id)s template variable is resolved using the admin project ID from the OpenRC
file, the full URL becomes:
Answer: http://134.209.71.220:8080/v1/AUTH_9fb84977ff7c4a0baf0d5dbb57e235c7
Task 9: How many containers were discovered by the attacker?
PCAP:controller_2025-07-01.pcapFilter:
http.request.uri contains "AUTH_9fb84977ff7c4a0baf0d5dbb57e235c7?format=json" && ip.src == 117.200.21.26
One packet matches: the attackerās GET to the Swift proxy at port 8080 listing all containers.
Follow the TCP stream. The response includes:
X-Account-Container-Count: 3in the headers (confirms the count)- A JSON body listing all three containers:
Answer: 3
Task 10: When did the attacker download the sensitive user data file?
PCAP:controller_2025-07-01.pcapFilter:
http.request.uri contains "user-details.csv" && ip.src == 117.200.21.26
One packet matches: the attackerās GET to the Swift proxy at port 8080. (You may also see an
internal forwarding request from the Swift proxy to the object storage server on a path beginning
with /sdb1/ - filter by ip.src == 117.200.21.26 to see only the original request.)
Answer: 2025-07-01 09:45:23
Task 11: How many user records are in the sensitive user data file?
PCAP:controller_2025-07-01.pcapMethod: Follow the TCP stream on the
user-details.csv GET packet from Task 10.
The response headers confirm:
- A header row:
Full Name,Email,Phone Number - 28 data records (John Doe through Zoe Lee), each containing full name, email address, and phone number - personally identifiable information.
Answer: 28
Task 12: What is the username of the new user created for persistence?
PCAP:controller_2025-07-01.pcapFilter:
http.request.method == POST && http.request.uri == "/identity/v3/users"
Follow the TCP stream. The request body is a JSON payload sent to Keystone:
HTTP 201 CREATED, confirming the account was successfully created. A
subsequent PUT request at 09:49:15 then granted this user the admin role on the project.
Answer: jellibean
Task 13: What is the password of the new user?
PCAP:controller_2025-07-01.pcapMethod: Same TCP stream as Task 12 - the password is in the JSON request body in cleartext.
Answer: P@$$word
Task 14: What is the MITRE ATT&CK technique ID for the persistence method?
The attacker created a new user account in a cloud platform (OpenStack Keystone) and granted it administrative privileges. This maps to:- Tactic: Persistence
- Technique: T1136 - Create Account
- Sub-technique: .003 - Cloud Account
Answer: T1136.003
Key Wireshark Filters Reference
| Purpose | PCAP | Display Filter |
|---|---|---|
| All attacker HTTP requests | web-server | http.request && ip.src == 117.200.21.26 |
| Attacker fuzzing traffic only | web-server | http.request && ip.src == 117.200.21.26 && http.user_agent contains "Fuzz" |
| Attacker browser traffic only | web-server | http.request && ip.src == 117.200.21.26 && http.user_agent contains "Chrome" |
| Login attempts (attacker only) | web-server | http.request.method == POST && http.request.uri contains "login" && ip.src == 117.200.21.26 |
| OpenRC download (attacker only) | web-server | http.request.uri contains "openrc" && ip.src == 117.200.21.26 |
| Direct OpenStack CLI calls | controller | http.request && http.user_agent contains "openstacksdk" |
| Keystone API calls | controller | http.request.uri contains "/identity/v3" |
| Swift account listing | controller | http.request.uri contains "AUTH_" && http.request.uri contains "format=json" |
| CSV downloads (attacker) | controller | http.request.uri contains ".csv" && ip.src == 117.200.21.26 |
| User creation | controller | http.request.method == POST && http.request.uri == "/identity/v3/users" |
| Role assignment | controller | http.request.method == PUT && http.request.uri contains "roles" |
Tools Identified
| Tool | Version | User-Agent String | Purpose |
|---|---|---|---|
| ffuf | 2.1.0-dev | Fuzz Faster U Fool v2.1.0-dev | Subdomain enumeration |
| Chrome | 137.0.0.0 | Mozilla/5.0 (Macintosh Intel Mac OS X 10_15_7) AppleWebKit/537.36 ... Chrome/137.0.0.0 Safari/537.36 | Manual dashboard exploitation |
| OpenStack SDK | 4.6.0 | openstacksdk/4.6.0 keystoneauth1/5.11.1 python-requests/2.32.4 CPython/3.13.5 | API enumeration and data exfiltration |
Network Topology
MITRE ATT&CK Mapping
| Phase | Technique | Evidence |
|---|---|---|
| Reconnaissance | T1595.003 - Active Scanning: Wordlist Scanning | ffuf subdomain enumeration (3,579 subdomains) |
| Initial Access | T1078.004 - Valid Accounts: Cloud Accounts | Brute-forced admin:StrongAdminSecret on Horizon |
| Discovery | T1580 - Cloud Infrastructure Discovery | Enumerated services, endpoints, users, VMs, containers |
| Collection | T1530 - Data from Cloud Storage | Downloaded user-details.csv and employee-details.csv from Swift |
| Persistence | T1136.003 - Create Account: Cloud Account | Created ājellibeanā with admin role |
Corrections from Previous Version
The following errors were identified by verifying each claim against the raw PCAP data and have been corrected in this version:| Section | Previous (incorrect) | Corrected |
|---|---|---|
| Step 1 | No explanation for why ā8 form submissionsā when there are only 4 login attempts | Added explanation: the reverse proxy doubles every POST - both the external and internal hops are captured |
| Step 5 login filter | http.request.method == POST && http.request.uri contains "/dashboard/auth/login" then āFour POST requests appearā | Added && ip.src == 117.200.21.26, without it the filter returns 8 packets and selecting the wrong one gives the wrong stream |
| Step 5 POST body | Showed simplified username=admin&password=admin®ion=default | Shows the real body: includes csrfmiddlewaretoken, fake_email, and fake_password fields |
| Step 5 OpenRC | Implied the file is readable in the Follow TCP Stream window | Corrected: response is gzip-compressed (binary in stream), use File > Export Objects > HTTP instead |
| Step 4 User-Agent | Showed partial UA string Chrome/137.0.0.0 | Shows full UA string including macOS platform: Mozilla/5.0 (Macintosh Intel Mac OS X 10_15_7) ... |
| Attack Timeline | 09:44:27 - āLists contents of user-data and employee-data containersā (single entry) | Split into two correct entries: 09:43:47 (user-data) and 09:44:05 (employee-data) |
| Attack Timeline | 09:48:28 - āGrants jellibean admin role on the projectā | Corrected to 09:49:15 - actual timestamp verified in the PCAP |