Internal Network & Active Directory · beginner · ~11 min
**What you will learn** - Run the internal-test loop from a foothold: **discover → enumerate → validate → gather credentials → move → escalate**. - Explain what an **assumed-breach** engagement is and why it produces better results than a purely external test. - Recognise why most internal Windows engagements converge on **Active Directory (AD)** as the highest-impact target. - Build a **threat model** for an internal subnet: assets, trust boundaries, and entry points. - Test and demonstrate impact **safely** — scan gently, stay in scope, and record noisy actions so defenders can correlate them. - Keep a defensive mindset: for every technique you learn, know the **detection, logging, and remediation** that stops it.
Security objective. The asset you are protecting is an internal corporate network — its file shares, workstations, servers, and above all the Active Directory domain that authenticates every Windows user and computer. The threat is an attacker who already has a small foothold inside (a phished laptop, a rogue device in a meeting room, a compromised contractor VPN account) and wants to expand that into control of the whole domain. As a learner you will detect the misconfigurations and weak credentials that let this expansion happen, and — just as importantly — learn to prevent and detect each step.
This lesson builds directly on your two prerequisites. From The phases of an engagement you already know the overall arc — scoping, rules of engagement, recon, exploitation, reporting. Internal methodology is the engine that runs inside the middle of that arc. From Port, service, and OS scanning you know how to find live hosts and identify what is listening; here you learn where that scanning fits in a repeating loop and how to do it gently on fragile internal networks.
An internal engagement assumes the attacker is already past the perimeter. Instead of asking "can someone break in from the internet?", it asks the more realistic question: "once someone is in — which happens constantly via phishing — how far can they get, and would we notice?" The whole methodology is a disciplined loop that turns one small position into a map of the network's real risk, all while staying inside an authorized scope.
Internal and Active Directory work is the bread and butter of professional penetration testing. Most organisations of any size run Windows domains, and the majority of real engagements involve them.
A repeatable loop matters for three professional reasons:
Recognising that AD ties Windows networks together lets you focus effort on the highest-impact target instead of spreading thin. And the same loop, read backwards, tells a defender exactly where to add logging, tighten segmentation, and rotate credentials — which is the outcome that actually improves security.
Definition. An engagement that starts with the tester already inside the network — given a network drop, a low-privilege domain account, or a standard employee laptop image.
Plain explanation. Instead of spending days trying to break through the firewall, the client hands you a realistic starting position, because real attackers get in through phishing and stolen credentials all the time. The interesting question is what happens next.
How it works. The client provisions a foothold (a VM, a VPN account, or a physical drop) and defines exactly which subnets and systems are in scope. You then demonstrate the impact an attacker could achieve from that spot.
When / when not. Use assumed breach when the goal is to measure internal blast radius and detection. Do not use it when the client specifically wants to test perimeter defences — that is a different objective.
Pitfall. Treating "assumed breach" as permission to go anywhere. The foothold is scoped; the rest of the network may not be.
Definition. The repeating cycle: host discovery → service enumeration → validation → credential gathering → lateral movement → domain escalation, then back to discovery from the new vantage point.
Plain explanation. Every new host or credential you gain gives you a new place to look from, so you run the same steps again with better access. The network unfolds like a series of rooms, each one revealing doors to more rooms.
How it works. You discover live hosts, identify their services, confirm real (not scanner-guessed) misconfigurations, collect any credentials, reuse those credentials to reach new hosts, and try to convert local access into domain-level control — repeating until you have mapped the risk or run out of scope/time.
When / when not. The loop applies to almost any internal test. On very small or non-Windows networks the escalation step may not lead to AD, but the discover-enumerate-validate rhythm still holds.
Pitfall. Skipping validation and reporting raw scanner output as findings. A scanner saying "possible MS17-010" is a lead, not a confirmed vulnerability.
Definition. The observation that internal Windows engagements almost always turn into Active Directory engagements.
Plain explanation. In a Windows environment, AD is the single system that authenticates users, joins computers, and stores group memberships. Control AD and you effectively control every domain-joined machine. So the loop naturally flows toward it.
How it works. Credentials and misconfigurations you find on individual hosts are usually domain credentials or domain trust relationships. Following them leads inward to the domain controllers.
When / when not. Applies to Windows/AD networks. A pure-Linux or embedded/OT network has a different centre of gravity — do not force an AD narrative where there is no AD.
Pitfall. Tunnel vision. Chasing AD so hard you ignore a critical finding elsewhere (an unpatched internet-exposed database on the same subnet).
Definition. The professional constraints that keep internal testing from causing outages or leaving scope.
Plain explanation. Internal networks contain fragile things — printers, badge readers, medical or industrial (ICS/OT) devices — that can crash from aggressive scanning. Being careful is part of the job, not a nicety.
How it works. You throttle scans, avoid known-fragile ranges unless explicitly authorized, record timestamps of noisy actions, and continually check that the current target is in scope.
When / when not. Always. There is no phase where scope and safety stop applying.
Pitfall. A default "fast/aggressive" scan across a /16 that knocks printers or an ICS device offline — a real, contract-ending mistake.
AUTHORIZED INTERNAL LAB (scope: 10.10.0.0/24 only)
============================= TRUST BOUNDARY (perimeter) =============================
Internet | |
| [Foothold VM] <-- entry point (assumed breach, given by client) |
| 10.10.0.50 |
| | discover / enumerate (gentle) |
| v |
TRUST | [Workstations] --- [File Server] --- [App/DB Server] |
BOUNDARY | shares 445 creds in shares service accounts |
(user -> | | | | |
domain) | +--------- credentials / trust relationships ---------+ |
| | |
========================== TRUST BOUNDARY (domain tier) ==============================
| [Domain Controller] <-- highest-value asset |
| AD: users, groups, Kerberos, LDAP 389/636, KDC 88 |
=====================================================================================
Assets protected: user data, file shares, service accounts, and the AD domain itself.
Entry point: the single foothold. Escalation crosses each trust boundary inward.
Knowledge check.
Internal methodology is a process, but a few concrete, lab-safe commands anchor the loop. The key structure is: discover → enumerate one host → validate by hand, always throttled.
# 1) GENTLE host discovery on an authorized lab subnet (ARP/ping sweep, no port flood)
nmap -sn -T2 10.10.0.0/24
# -sn : host discovery only (no port scan) -> quiet, low-impact
# -T2 : slow timing template -> gentle on fragile devices
# 2) Targeted service enumeration of ONE live host (only common internal ports)
nmap -sV -T2 -p 88,389,445,636,3389 10.10.0.10
# 88=Kerberos 389/636=LDAP/LDAPS 445=SMB 3389=RDP -> AD service fingerprint
# 3) VALIDATE a finding by hand (list SMB shares as an authenticated user)
# Placeholder creds only; never real secrets in commands or notes.
smbclient -L //10.10.0.10 -U 'LAB\\student%<lab-placeholder-password>'
Key internal ports to recognise (an AD service fingerprint):
| Port | Service | Why it matters internally |
|---|---|---|
| 445 | SMB | File shares; where credentials leak in scripts/configs |
| 88 | Kerberos | Present on domain controllers; ticket-based auth |
| 389 / 636 | LDAP / LDAPS | AD directory queries (users, groups) |
| 3389 | RDP | Remote desktop; a common lateral-movement path |
Note the -T2 timing and single-host targeting: on internal networks, gentle and specific beats fast and broad.
An internal engagement assumes the attacker is already inside the perimeter. The starting point may be a foothold, a rogue device, or an "assumed breach" position.
The goal is to show how far that access can be pushed — ideally all the way to domain compromise.
Repeat the loop. Each new host or credential opens up more of the network.
Internally you will see far more than from the outside: file shares, printers, legacy protocols, and Active Directory, which ties every Windows host together.
Most internal engagements become AD engagements.
Internal scanning can disrupt fragile devices such as printers and industrial control systems (ICS). Scan gently and stay within scope.
Note the time of noisy actions so the client's blue team (defenders) can correlate them.
Segmentation testing — checking whether subnet A can reach subnet B — is often an explicit objective.
The "code" for a methodology lesson is a repeatable, auditable runbook. Below is the insecure habit, the secure practice, and a verification you actually ran the loop safely — all lab-only.
This is the insecure tester habit that causes outages and scope breaches — shown so you can recognise and avoid it:
# ANTI-PATTERN: aggressive, unbounded, unlogged. Never do this on a real network.
nmap -T5 -A -p- 10.0.0.0/8 # fast+aggressive across a HUGE range
# - -T5 : maximum speed -> can crash printers, badge readers, ICS/OT devices
# - -A : OS+script+traceroute -> noisy, sends probes fragile devices choke on
# - -p- : all 65535 ports -> massive traffic
# - 10.0.0.0/8 : millions of hosts -> almost certainly OUTSIDE authorized scope
# No timestamp, no scope check, no output file -> nothing the blue team can correlate.
#!/usr/bin/env bash
# Lab-only internal recon runbook. Runs ONLY against an authorized subnet.
set -euo pipefail
SCOPE="10.10.0.0/24" # <-- exactly what the client authorized
OUT="engagement_$(date +%Y%m%d)" # evidence folder
mkdir -p "$OUT"
# Refuse to run if the operator has not confirmed authorization for this scope.
read -r -p "Confirm you are AUTHORIZED to test ${SCOPE}? (yes/no) " ok
[ "$ok" = "yes" ] || { echo "Aborting: not authorized."; exit 1; }
log() { echo "$(date -u +%FT%TZ) | $*" | tee -a "$OUT/actions.log"; }
# STEP 1: gentle host discovery (no port flood)
log "host-discovery start scope=${SCOPE}"
nmap -sn -T2 "$SCOPE" -oG "$OUT/hosts.gnmap"
log "host-discovery done -> $OUT/hosts.gnmap"
# STEP 2: enumerate ONLY common internal ports on discovered live hosts, gently
grep "Status: Up" "$OUT/hosts.gnmap" | awk '{print $2}' > "$OUT/live.txt"
while read -r host; do
log "enumerate host=${host} ports=88,389,445,636,3389"
nmap -sV -T2 -p 88,389,445,636,3389 "$host" -oN "$OUT/host_${host}.txt"
done < "$OUT/live.txt"
log "loop complete. VALIDATE findings by hand before reporting."
# ACCEPT: authorized scope + "yes" -> the loop runs and writes an audit log.
$ ./recon.sh
Confirm you are AUTHORIZED to test 10.10.0.0/24? (yes/no) yes
2026-07-07T09:00:01Z | host-discovery start scope=10.10.0.0/24
...
# REJECT: operator cannot confirm authorization -> the script refuses to scan.
$ ./recon.sh
Confirm you are AUTHORIZED to test 10.10.0.0/24? (yes/no) no
Aborting: not authorized.
$ echo $?
1
# REJECT (scope drift): to test a different subnet you must EDIT $SCOPE deliberately
# and re-confirm. There is no way to "accidentally" scan 10.0.0.0/8.
What this shows. The secure runbook is scoped (one /24, not a /8), gentle (-sn/-T2, five ports), and auditable (UTC-timestamped actions.log the blue team can correlate). The verification proves the authorization gate blocks a run when the operator cannot confirm authorization (exit code 1) and permits it when they can. Nothing here is an exploit — it is disciplined enumeration plus an audit trail.
Walking the secure runbook from part (2):
| Line / block | What happens | Why it matters |
|---|---|---|
set -euo pipefail |
The script aborts on any error, unset variable, or failed pipe | Prevents a half-run leaving you unsure what was actually scanned |
SCOPE="10.10.0.0/24" |
Hard-codes the exact authorized range | Scope lives in one obvious place; no wildcard drift |
OUT=engagement_<date> + mkdir |
Creates a dated evidence folder | Every action lands in one auditable place for the report |
read ... Confirm you are AUTHORIZED ... |
Forces the operator to type yes |
An authorization gate — the human confirms scope before any packet is sent |
[ "$ok" = "yes" ] || exit 1 |
Any answer other than yes aborts with code 1 |
Fail closed: the default is to do nothing |
log() writes UTC timestamp |
Each step is time-stamped to actions.log |
Blue team can line up your noisy actions against their alerts (rules out a real attacker) |
nmap -sn -T2 "$SCOPE" |
Gentle host discovery, no port scan | Finds live hosts without hammering fragile devices |
grep "Status: Up" ... > live.txt |
Extracts only responsive hosts | You enumerate live hosts, not dead IPs — less noise |
while read host; do nmap -sV -T2 -p 88,389,445,636,3389 |
Per-host, five-port, slow service scan | Targeted AD fingerprint instead of a 65k-port flood |
final log "...VALIDATE findings by hand" |
Reminder that the loop's next step is manual validation | Scanner output is a lead; you must confirm before reporting |
How values change across the loop. hosts.gnmap (all responses) narrows to live.txt (only "Up" hosts), which drives one host_<ip>.txt per live host. Each of those files is a starting point for the validate → credentials → move steps you cover later in the track. After you gain a credential or a new host, SCOPE may legitimately expand — but only by a deliberate edit and a fresh authorization confirmation.
| WRONG approach | WHY it is wrong | CORRECTED approach | How to recognise / prevent |
|---|---|---|---|
Run nmap -T5 -A -p- across a huge range to "save time" |
Aggressive timing crashes printers, badge readers, and ICS/OT devices; a /8 is almost certainly out of scope | Use -sn -T2 for discovery, then targeted -p per host; confirm scope first |
If your command has -T4/-T5, -A, -p-, or a range wider than the contract, stop and re-check |
| Paste a scanner's "possible MS17-010" line straight into the report as a finding | Scanners guess from banners; unvalidated findings destroy credibility and can be false positives | Reproduce the issue by hand, capture evidence, then report | Ask: "did I actually confirm this, or did a tool merely suggest it?" |
| Treat the assumed-breach foothold as a licence to roam anywhere | The foothold is scoped; adjacent subnets may be off-limits or belong to a third party | Re-read the rules of engagement; test segmentation only where authorized | Before touching a new subnet, check it against the written scope |
| Decode a JWT or a token you find and assume you have "cracked" auth | Decoding is not verifying — a decoded token proves nothing about its validity or signature | Treat found tokens as leads; note them and validate against the actual system in scope | Remember: base64-decoding ≠ authentication bypass |
| Chase Domain Admin so hard you ignore everything else | Tunnel vision misses a critical unpatched database on the same subnet — real business risk | Run the full loop on each host; log side findings even while pursuing AD | If you have not enumerated a live host at all, you are not done |
| Do noisy work without recording the time | The blue team cannot tell your test from a real attack, and your report cannot prove what you did | Timestamp every noisy action (UTC) in an actions log | No actions.log entry = the action effectively didn't happen, for reporting |
Common ways the loop "fails" internally, and how to work through them:
nmap -sn -PR on the same L2), or a light TCP-SYN discovery on a common port (-PS445). Ask: am I even on the right VLAN/subnet?smbclient/enumeration returns ACCESS_DENIED. Expected without valid creds. That is a validation result, not a bug — note "share exists, requires auth" and move on. Ask: do I have a lab credential that legitimately applies here?-T1/-T2, restrict ports, and note the incident. Ask: is this device fragile (printer/ICS)? Should it be excluded?Questions to ask when the loop stalls: Am I in scope? Am I on the expected subnet? Is this a real block or a fragile device? Did I validate the finding or just read a tool's guess? Is every noisy action logged with a UTC timestamp?
Because this is a methodology lesson, the defensive payoff is huge: the same loop, read from the defender's chair, tells you exactly what to log, what to watch for, and what to fix.
What to log (so the loop is detectable):
Concretely on Windows/AD: enable and forward Security event logs — logon events (4624/4625), Kerberos service-ticket requests (4769, spikes hint at Kerberoasting), object-access on sensitive shares (4663 with SACLs), and network/firewall connection logs. Central collection (a SIEM) is what turns scattered events into a detected attack path.
What to NEVER log: passwords, password hashes, Kerberos tickets or session cookies, private keys, full API tokens, or unnecessary PII. If the tester found a credential in a share, the finding is logged — the credential itself is redacted to a placeholder like <redacted>.
Events that signal abuse (the loop, seen defensively):
How false positives arise: legitimate vulnerability scanners, backup agents, patch-management sweeps, and monitoring tools all generate host-to-host traffic that looks like discovery. This is precisely why an authorized test's timestamped actions.log matters — defenders can subtract the known test from the alerts and see what (if anything) remains. Tuning detections to the environment's normal baseline is what reduces these false positives.
Remediation the loop points to: network segmentation (limit which subnets can reach the DC), least privilege (no shared local-admin passwords — use LAPS), credential hygiene (no passwords in scripts/shares, rotate service accounts), patching the validated findings, and turning on the logging above. Verify each fix (see practice tasks): after segmentation, re-run discovery and confirm subnet A can no longer reach subnet B.
Authorized real-world use case. A mid-size company hires a firm for an assumed-breach internal assessment. The client provisions a standard employee laptop image on an isolated test VLAN and authorizes the 10.10.0.0/24 range. The tester runs the loop — gentle discovery, targeted enumeration, hand-validation of an open file share containing a deployment script with a service-account password, careful reuse of that credential, and a path toward the domain — all timestamped. The deliverable is not "here are open ports" but "a single phished laptop reaches Domain Admin via one exposed script; here is each step, the evidence, and the fix." The client uses it to add share ACLs, remove the embedded password, deploy LAPS, and turn on the missing logging.
Professional best-practice habits.
| Habit | Beginner focus | Advanced focus |
|---|---|---|
| Scope & authorization | Confirm the written scope; never touch out-of-range subnets | Negotiate segmentation-test objectives and exclusion lists (ICS/OT, medical) up front |
| Validation | Reproduce findings by hand before reporting | Chain validated findings into a single, evidence-backed attack path |
| Least privilege | Use the lowest-privilege lab account that works | Demonstrate how least privilege / LAPS would have broken the chain |
| Secure defaults | Default to -sn -T2, targeted ports |
Model per-device fragility; tailor timing and exclusions to the environment |
| Logging | Keep a UTC actions.log of noisy steps | Map each step to the exact defender log that should catch it, and note gaps |
| Error handling | Fail closed on missing authorization | Build safety gates and reset/cleanup into tooling by default |
The through-line: an internal test is only valuable if it is safe, in scope, validated, logged, and remediation-focused — that is what separates a professional from a scanner-runner.
All tasks are lab-only. Run them on a network you own or an intentionally-vulnerable lab (a local VM range you control, a container network, or a sanctioned CTF/AD lab). Authorization checklist: (1) you own or have written permission for the target, (2) it is isolated from production/the internet, (3) you have defined the exact scope, (4) you know how to reset it. Each security task ends by remediating and verifying.
Beginner 1 — Draw your lab threat model.
text threat-model diagram of your lab subnet.Beginner 2 — Gentle host discovery with an audit log.
actions.log line before and after./24 scope; output = a live.txt of responsive hosts + log entries.-p-, no -T4/-T5, stay in scope.nmap -sn -T2 <scope>; you can extract "Status: Up" lines.Intermediate 1 — Enumerate and validate one host.
host_<ip>.txt plus a one-line validated finding ("share X exists, requires auth").Intermediate 2 — Detect your own loop.
actions.log.Challenge — Segmentation test with remediation and verification.
Main concepts. Internal testing usually starts from an assumed-breach foothold and runs a repeating loop: discover → enumerate → validate → gather credentials → move → escalate. On Windows networks the loop converges on Active Directory, the highest-impact target, because controlling AD means controlling every domain-joined host.
Key commands/structure. Gentle discovery (nmap -sn -T2 <scope>), targeted AD-service enumeration (ports 88/389/445/636/3389 with -sV -T2), and hand-validation before anything is reported. A scoped, authorization-gated, UTC-logged runbook is the professional shape of the work.
Common mistakes. Aggressive/broad scanning that crashes fragile devices or leaves scope; reporting unvalidated scanner output; assuming decoding a token equals bypassing auth; tunnel-visioning on Domain Admin; and doing noisy work without a timestamped actions log.
What to remember. Every offensive step has a defensive twin: log the timestamp, source, resource, result, and correlation id; never log secrets; watch for host-to-host sweeps, credential reuse, and Kerberos bursts; and reduce false positives with a baseline and your own recorded actions. An internal test only earns its value when it is safe, in scope, validated, logged, and remediation-verified — including cleanup that resets the lab. Testing happens only on systems you own or are explicitly authorized to test, and nothing is ever "completely secure."