<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Guides on xodbox</title><link>https://defektive.github.io/xodbox/docs/guides/</link><description>Recent content in Guides on xodbox</description><generator>Hugo</generator><language>en</language><atom:link href="https://defektive.github.io/xodbox/docs/guides/index.xml" rel="self" type="application/rss+xml"/><item><title>OIDC / SSO</title><link>https://defektive.github.io/xodbox/docs/guides/oidc-sso/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://defektive.github.io/xodbox/docs/guides/oidc-sso/</guid><description>&lt;p&gt;The admin console supports single sign-on via any OpenID Connect provider
(Google, Okta, Keycloak, Azure AD, Authentik, Dex, etc.). SSO runs
&lt;strong&gt;alongside&lt;/strong&gt; built-in username/password login — a local admin can always
sign in even when the IdP is down or misconfigured.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A working xodbox instance with the admin console enabled
(&lt;code&gt;admin_listener&lt;/code&gt; or &lt;code&gt;ui_path&lt;/code&gt; configured).&lt;/li&gt;
&lt;li&gt;An OIDC provider with a client application registered for xodbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="register-xodbox-with-your-identity-provider"&gt;Register xodbox with your identity provider&lt;/h2&gt;
&lt;p&gt;Create an application / client in your IdP with these settings:&lt;/p&gt;</description></item><item><title>Admin Console Setup</title><link>https://defektive.github.io/xodbox/docs/guides/admin-console/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://defektive.github.io/xodbox/docs/guides/admin-console/</guid><description>&lt;p&gt;The admin console is an embedded React web UI and JSON API for managing
payloads, browsing captured interactions, creating sinks, and managing
users and API keys. It ships inside the xodbox binary — no separate
install needed.&lt;/p&gt;
&lt;h2 id="bootstrap-the-first-user"&gt;Bootstrap the first user&lt;/h2&gt;
&lt;p&gt;There is no default account. Create an admin user before starting the
server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xodbox user add alice --admin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This prints a generated 24-character password once — store it
immediately. To choose your own password:&lt;/p&gt;</description></item><item><title>TLS / ACME Setup</title><link>https://defektive.github.io/xodbox/docs/guides/tls-acme/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://defektive.github.io/xodbox/docs/guides/tls-acme/</guid><description>&lt;p&gt;The HTTPX handler can automatically provision and renew TLS certificates
via &lt;a href="https://letsencrypt.org/"&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; using
&lt;a href="https://github.com/caddyserver/certmagic"&gt;certmagic&lt;/a&gt;. Two challenge
methods are supported: &lt;strong&gt;DNS-01&lt;/strong&gt; (recommended — works behind firewalls
and supports wildcards) and &lt;strong&gt;HTTP-01 / TLS-ALPN-01&lt;/strong&gt; (requires ports 80
and 443 to be reachable from the internet).&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A domain (or subdomain) whose DNS you control.&lt;/li&gt;
&lt;li&gt;For DNS-01: API credentials for a supported DNS provider (Namecheap or
Route53).&lt;/li&gt;
&lt;li&gt;For HTTP-01: ports 80 and 443 open and reachable from the public
internet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="quick-start-dns-01-with-namecheap"&gt;Quick start (DNS-01 with Namecheap)&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;handlers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;HTTPX&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tls_names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*.oob.example.com,oob.example.com&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;acme_email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;you@example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;acme_accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;acme_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://acme-staging-v02.api.letsencrypt.org/directory&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dns_provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;namecheap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dns_provider_api_user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;your-namecheap-user&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dns_provider_api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;your-namecheap-api-key&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Start with the &lt;strong&gt;staging&lt;/strong&gt; ACME URL to avoid rate limits while testing.
Once certificates provision correctly, switch to production (see below).&lt;/p&gt;</description></item><item><title>HTTP Payloads</title><link>https://defektive.github.io/xodbox/docs/guides/payloads/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://defektive.github.io/xodbox/docs/guides/payloads/</guid><description>&lt;p&gt;The HTTPX handler serves user-defined &lt;strong&gt;payloads&lt;/strong&gt; — configurable HTTP
responses keyed by URL pattern. Payloads use Go templates for dynamic
headers, bodies, and status codes, letting you craft responses that test
how an application consumes remote data.&lt;/p&gt;
&lt;h2 id="how-payloads-work"&gt;How payloads work&lt;/h2&gt;
&lt;p&gt;Payloads form a &lt;strong&gt;processing chain&lt;/strong&gt;, not a simple route table. On each
request:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;All payloads are evaluated in order of &lt;code&gt;weight&lt;/code&gt; (ascending), then by
pattern.&lt;/li&gt;
&lt;li&gt;Every payload whose &lt;code&gt;pattern&lt;/code&gt; regex matches &lt;code&gt;r.URL.Path&lt;/code&gt; runs — it can
set headers, write a body, or set the status code.&lt;/li&gt;
&lt;li&gt;If a payload has &lt;code&gt;is_final: true&lt;/code&gt;, processing stops. Otherwise, the
next matching payload runs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This means multiple non-final payloads can contribute to a single
response. For example, the built-in &lt;code&gt;Default Header&lt;/code&gt; payload (weight
-1000) adds a &lt;code&gt;Server&lt;/code&gt; header to every response, then processing
continues to the content payload.&lt;/p&gt;</description></item><item><title>Notifier Integration</title><link>https://defektive.github.io/xodbox/docs/guides/notifiers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://defektive.github.io/xodbox/docs/guides/notifiers/</guid><description>&lt;p&gt;Notifiers deliver alerts when xodbox captures an interaction. Every
handler (HTTP, DNS, SMB, SSH, FTP, SMTP, TCP) emits events; notifiers
filter them and forward matches to external services.&lt;/p&gt;
&lt;p&gt;Four notifiers ship built-in: &lt;strong&gt;app_log&lt;/strong&gt; (structured log, enabled by
default), &lt;strong&gt;slack&lt;/strong&gt;, &lt;strong&gt;discord&lt;/strong&gt;, and &lt;strong&gt;webhook&lt;/strong&gt; (generic HTTP POST).&lt;/p&gt;
&lt;h2 id="how-filtering-works"&gt;How filtering works&lt;/h2&gt;
&lt;p&gt;Each notifier has an optional &lt;code&gt;filter&lt;/code&gt; key — a Go regular expression
matched against the event&amp;rsquo;s canonical &lt;strong&gt;filter string&lt;/strong&gt;. The filter
string has the form:&lt;/p&gt;</description></item><item><title>DNS Delegation</title><link>https://defektive.github.io/xodbox/docs/guides/dns-delegation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://defektive.github.io/xodbox/docs/guides/dns-delegation/</guid><description>&lt;p&gt;The DNS handler listens for UDP queries and responds to every request with
a configurable A record. Every query is logged as an interaction event and
delivered to notifiers. This makes it ideal for detecting out-of-band DNS
lookups triggered by SSRF, XXE, log4shell, and similar vulnerabilities.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;The handler responds to &lt;strong&gt;all queries for all domains&lt;/strong&gt; — there is no
zone configuration. Every query (regardless of type — A, AAAA, MX, etc.)
receives the same A record response with a TTL of 0 (not cacheable).&lt;/p&gt;</description></item><item><title>Docker Deployment</title><link>https://defektive.github.io/xodbox/docs/guides/docker-deployment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://defektive.github.io/xodbox/docs/guides/docker-deployment/</guid><description>&lt;p&gt;Pre-built Docker images are published to the GitHub Container Registry
(GHCR) and signed with cosign (keyless OIDC via GitHub Actions). The
images are Alpine-based, run as a non-root &lt;code&gt;xodbox&lt;/code&gt; user, and contain a
single statically-linked binary.&lt;/p&gt;
&lt;h2 id="quick-start"&gt;Quick start&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Generate a starter config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm ghcr.io/defektive/xodbox:latest config -e &amp;gt; xodbox.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Edit xodbox.yaml to taste, then run&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name xodbox &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/workspace&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --user &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;id -u&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;id -g&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 80:80 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ghcr.io/defektive/xodbox:latest serve
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="image-details"&gt;Image details&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Property&lt;/th&gt;
					&lt;th&gt;Value&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Image&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ghcr.io/defektive/xodbox&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Tags&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;:latest&lt;/code&gt;, &lt;code&gt;:v1.2.3&lt;/code&gt; (per release)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Architecture&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;linux/amd64&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Base&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;alpine:3.21&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Entrypoint&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/bin/xodbox&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Working directory&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/workspace&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Runs as&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;xodbox&lt;/code&gt; (non-root)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="volumes-and-persistence"&gt;Volumes and persistence&lt;/h2&gt;
&lt;p&gt;The container&amp;rsquo;s working directory is &lt;code&gt;/workspace&lt;/code&gt;. Mount a host directory
there to persist:&lt;/p&gt;</description></item></channel></rss>