Projects Blog Tools About
Blog
8 min read

Hardening a Small Server Without Making It Unusable

A single box running a couple of sites does not need a security programme. It needs about a dozen specific things done, and two of them are traps that look done when they are not.

Blog
6 min read

A Git Server Is Two Packages and a Location Block

Self-hosting git needs no forge. git ships the server, nginx already speaks CGI, and the whole thing is about twenty lines of config. The one hard part is file ownership, and it will not tell you clearly that it is the problem.

Blog
3 min read

Recon Is a Loop, Not a Pass

Enumeration is not something you finish and move on from. Every credential and hostname you find sends you back to enumerate something new, so the surface grows as you work.

Blog
3 min read

Turning a Dumb Shell Into a Real TTY

A raw reverse shell has no tab completion, no arrow keys, no job control, and dies the moment you press Ctrl-C. The upgrade takes three steps, and it is worth doing before anything else.

Blog
2 min read

Tests Cannot See the State the Machine Already Has

Code that creates a precondition stops being exercised the moment it succeeds. On the machine where setup already ran, the setup path can break completely and stay green.

Blog
5 min read

Counting Your Shell History Can Execute It

In zsh, an array subscript inside arithmetic context is evaluated as an arithmetic expression, so it performs command substitution. Tallying strings into an associative array runs them.

Blog
1 min read

Vulnerabilities Cluster at Trust Boundaries

Name the point where data crosses into more trust and you have usually named the missing defence. Where that lens covers almost everything, and where it stops working.