Posts on this blog are interactive. You can copy commands, run code, and inspect the output without leaving the page. This post describes each component.
Terminal sessions
Terminal blocks show a session exactly as it happened. Click copy next to a command to grab it, or hit copy commands to grab every command at once and paste them into your own shell.
kali@attackbox: ~
kali@attackbox:~$whoami
kali
kali@attackbox:~$uname -a
Linux attackbox 6.8.0-kali1-amd64 #1 SMP x86_64 GNU/Linux
kali@attackbox:~$echo "follow along!" | base64
Zm9sbG93IGFsb25nIQo=
Output lines are colored by convention: [+] success, [-] failure, [!] warning, [*] info.
kali@attackbox: ~
kali@attackbox:~$./exploit.py --target 10.10.10.5
[*] Connecting to 10.10.10.5:8080
[*] Sending payload (412 bytes)
[!] Target responded slowly, retrying
[-] Attempt 1 failed
[+] Got shell!
root@attackbox:~#id
uid=0(root) gid=0(root) groups=0(root)
Runnable code
Code cells are editable and run right in your browser. Change something and hit Run (or Ctrl + Enter). JavaScript runs in an isolated Web Worker, and any script that runs longer than a few seconds is terminated.
Python works too, powered by Pyodide (CPython compiled to WebAssembly). The first run downloads the runtime; later runs start immediately. Python cells on the same page share state, like a Jupyter notebook — define something in one cell, use it in the next.
# uses 'wordlist' and 'target' from the cell abovefor word in wordlist:
if hashlib.md5(word.encode()).hexdigest() == target:
print(f"[+] cracked: {word}")
breakelse:
print("[-] not in wordlist")
output
Regular code blocks
Plain snippets get syntax highlighting, a filename, and a copy button: