Skip to main content
Cybersecurity

Ethical Hacking Tutorial with Examples.

Ethical hacking tutorial, lab-only: pentest scope, evidence, CVSS findings, reports, retests and disclosure. Hands-on offense lives on TryHackMe and HTB.

Beginner

Start here — no prior experience needed

3 lessons

Intermediate

For developers with core concepts down

3 lessons

Also part of Ethical Hacking (methodology, lab-only)

Taught in other topics. Each link opens the lesson in its home topic.

12 lessons
networking intermediate
5 min read

Scan a container you own with nmap on a private Docker network: what open, closed and filtered mean, the packets behind each, and -sV version banners.

networking intermediate
5 min read

Firewall a container's own port with nftables: a drop rule makes clients time out, reject makes them refused, and a source allow-list lets one host in.

linux intermediate
5 min read

A real permission-denied error from a locked-down file, then stripping the setuid bit from /usr/bin/passwd to see exactly why an ordinary user can't change their own password without it.

web-security beginner
5 min read

A Flask API leaks another user's invoice. Add the ownership check that fixes it, and a pytest sweep that catches the next route to forget the check.

web-security beginner
5 min read

A logged-in user's cookie lets a forged POST move money. Add a per-session CSRF token, set SameSite=Lax, and pin both with a failing-then-passing pytest.

web-security intermediate
5 min read

A link-preview endpoint fetches an internal admin page for anyone. Fix it with a host allowlist, resolved-IP checks and no redirects, under pytest.

web-security beginner
5 min read

A Flask error page leaks a stack trace and a database password. Replace it with a generic handler, add security headers, and pin both with pytest.

web-security intermediate
5 min read

A Flask avatar upload writes outside its folder and accepts any file. Fix it with secure_filename, an extension allowlist and MAX_CONTENT_LENGTH.

web-security intermediate
5 min read

A Flask login reveals which usernames exist and allows unlimited guesses. Fix it with one generic error, equal timing and a per-account attempt limit.

api-testing intermediate
5 min read

Extend the local test API with two auth schemes and catch the assumption that 'wrong token' and 'no token' return the same status code — they don't, and mixing them up hides real bugs.

cryptography intermediate
5 min read

Time SHA-256, PBKDF2, bcrypt, scrypt and argon2id on your own machine to see the guesses per second each allows, then store and upgrade argon2id hashes.

devsecops intermediate
5 min read

Run a passive OWASP ZAP baseline scan against a tiny Python app in its own container, read each warning, add the missing headers, and get to exit 0.