|
775 | 775 | <a class="slink" href="#vpc" onclick="closeMobile()">VPC</a> |
776 | 776 | <a class="slink" href="#campaign" onclick="closeMobile()">Campaign</a> |
777 | 777 | <a class="slink" href="#fw-presets" onclick="closeMobile()">FW Presets</a> |
| 778 | + <a class="slink" href="#templates" onclick="closeMobile()">Templates</a> |
778 | 779 | <a class="slink" href="#audit" onclick="closeMobile()">Audit</a> |
779 | 780 | <a class="slink" href="#output-json" onclick="closeMobile()">JSON Output</a> |
780 | 781 | <a class="slink" href="#completion" onclick="closeMobile()">Completion</a> |
@@ -875,6 +876,7 @@ <h1 class="hero-title"> |
875 | 876 | <div class="sidebar-heading">Red Team</div> |
876 | 877 | <a class="slink" href="#campaign">Campaign</a> |
877 | 878 | <a class="slink sub" href="#fw-presets">Firewall Presets</a> |
| 879 | + <a class="slink" href="#templates">Templates</a> |
878 | 880 | <a class="slink" href="#audit">Audit</a> |
879 | 881 | </div> |
880 | 882 | <div class="sidebar-section"> |
@@ -1958,6 +1960,147 @@ <h3>Rebuild a burned node</h3> |
1958 | 1960 |
|
1959 | 1961 | <hr /> |
1960 | 1962 |
|
| 1963 | + <!-- TEMPLATES --> |
| 1964 | + <section id="templates" class="reveal"> |
| 1965 | + <h2>Templates</h2> |
| 1966 | + <p> |
| 1967 | + Built-in cloud-init bash scripts embedded directly in the binary. |
| 1968 | + Each script installs and configures a specific tool (C2, redirector, VPN, phishing) |
| 1969 | + and is ready to run at Droplet first boot via DigitalOcean's cloud-init mechanism. |
| 1970 | + </p> |
| 1971 | + <p style="margin-top:.75rem"> |
| 1972 | + Variable substitution uses Go's <code>text/template</code> (<code>{{.VarName}}</code> syntax). |
| 1973 | + Every variable has a declared default in the script header — unset variables silently |
| 1974 | + fall back to their defaults. Use <code>--template-var KEY=VALUE</code> to override. |
| 1975 | + </p> |
| 1976 | + |
| 1977 | + <h3>Available templates</h3> |
| 1978 | + <div class="table-scroll"> |
| 1979 | + <table class="flags-table"> |
| 1980 | + <thead><tr><th>Name</th><th>Description</th><th>Key variables</th></tr></thead> |
| 1981 | + <tbody> |
| 1982 | + <tr> |
| 1983 | + <td><code>c2-havoc</code></td> |
| 1984 | + <td>Havoc C2 framework - build from source, teamserver as systemd service</td> |
| 1985 | + <td><code>C2Port</code> <code>C2Host</code> <code>TeamserverPassword</code></td> |
| 1986 | + </tr> |
| 1987 | + <tr> |
| 1988 | + <td><code>c2-sliver</code></td> |
| 1989 | + <td>Sliver C2 - download latest release, generate operator config, systemd</td> |
| 1990 | + <td><code>C2Port</code> <code>OperatorName</code></td> |
| 1991 | + </tr> |
| 1992 | + <tr> |
| 1993 | + <td><code>redirector-nginx</code></td> |
| 1994 | + <td>nginx HTTPS reverse proxy with URI path filtering. certbot or self-signed TLS.</td> |
| 1995 | + <td><code>C2BackendHost</code> <code>Domain</code> <code>C2URIPath</code></td> |
| 1996 | + </tr> |
| 1997 | + <tr> |
| 1998 | + <td><code>redirector-apache</code></td> |
| 1999 | + <td>Apache2 mod_rewrite with User-Agent + URI filtering for C2 profile matching</td> |
| 2000 | + <td><code>C2BackendHost</code> <code>C2UserAgent</code> <code>C2URIPath</code></td> |
| 2001 | + </tr> |
| 2002 | + <tr> |
| 2003 | + <td><code>wireguard-server</code></td> |
| 2004 | + <td>WireGuard VPN server — generates server keypair, configures wg0, enables IP forwarding</td> |
| 2005 | + <td><code>WGListenPort</code> <code>WGServerNet</code></td> |
| 2006 | + </tr> |
| 2007 | + <tr> |
| 2008 | + <td><code>wireguard-client</code></td> |
| 2009 | + <td>WireGuard peer — connects to a WireGuard server, prints client pubkey for server registration</td> |
| 2010 | + <td><code>WGServerEndpoint</code> <code>WGServerPublicKey</code> <code>WGClientNet</code></td> |
| 2011 | + </tr> |
| 2012 | + <tr> |
| 2013 | + <td><code>gophish</code></td> |
| 2014 | + <td>GoPhish phishing framework — latest release, admin panel bound to 127.0.0.1 only</td> |
| 2015 | + <td><code>AdminListenPort</code> <code>PhishListenPort</code></td> |
| 2016 | + </tr> |
| 2017 | + <tr> |
| 2018 | + <td><code>evilginx2</code></td> |
| 2019 | + <td>evilginx2 reverse proxy phishing — latest release, auto-detects public IP if not set</td> |
| 2020 | + <td><code>Domain</code> <code>ExternalIP</code> <code>RedirectURL</code></td> |
| 2021 | + </tr> |
| 2022 | + <tr> |
| 2023 | + <td><code>hardening</code></td> |
| 2024 | + <td>SSH hardening, fail2ban, non-root operator user creation with SSH key injection</td> |
| 2025 | + <td><code>SSHPort</code> <code>OperatorUser</code> <code>OperatorPubKey</code></td> |
| 2026 | + </tr> |
| 2027 | + </tbody> |
| 2028 | + </table> |
| 2029 | + </div> |
| 2030 | + |
| 2031 | + <h3>Commands</h3> |
| 2032 | + <div class="terminal"> |
| 2033 | + <div class="terminal-bar"><span class="tl tl-r"></span><span class="tl tl-y"></span><span class="tl tl-g"></span><span class="terminal-title">template list / show / dump</span><button class="copy-btn" onclick="copyTerminal(this)"><svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"/></svg>copy</button></div> |
| 2034 | + <div class="terminal-body"> |
| 2035 | +<span class="dm"># List all templates with variables and defaults</span> |
| 2036 | +<span class="p">$ </span><span class="c">do-manager template list</span> |
| 2037 | +<span class="hd">>> 9 template(s)</span> |
| 2038 | +<span class="o"> NAME | DESCRIPTION | VARIABLES (DEFAULT)</span> |
| 2039 | +<span class="o"> c2-havoc | Havoc C2 framework ... | C2Port=443 C2Host TeamserverPassword=...</span> |
| 2040 | +<span class="o"> redirector-nginx | nginx HTTPS reverse proxy ... | C2BackendHost=10.20.0.2 Domain ...</span> |
| 2041 | +<span class="o"> wireguard-server | WireGuard VPN server ... | WGListenPort=51820 WGServerNet=...</span> |
| 2042 | +<span class="o"> ...</span> |
| 2043 | +<span class="dm"># Inspect raw script before deploying</span> |
| 2044 | +<span class="p">$ </span><span class="c">do-manager template show redirector-nginx</span> |
| 2045 | +<span class="dm"># Preview rendered output with your variable values</span> |
| 2046 | +<span class="p">$ </span><span class="c">do-manager template dump c2-havoc \</span> |
| 2047 | +<span class="o"> --template-var C2Host=1.2.3.4 \</span> |
| 2048 | +<span class="o"> --template-var TeamserverPassword=s3cr3t</span> |
| 2049 | + </div> |
| 2050 | + </div> |
| 2051 | + |
| 2052 | + <h3>Deploy a single node with a template</h3> |
| 2053 | + <div class="terminal"> |
| 2054 | + <div class="terminal-bar"><span class="tl tl-r"></span><span class="tl tl-y"></span><span class="tl tl-g"></span><span class="terminal-title">droplet create --template</span><button class="copy-btn" onclick="copyTerminal(this)"><svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"/></svg>copy</button></div> |
| 2055 | + <div class="terminal-body"> |
| 2056 | +<span class="dm"># Spin up a GoPhish node in one command</span> |
| 2057 | +<span class="p">$ </span><span class="c">do-manager droplet create \</span> |
| 2058 | +<span class="o"> --name phish-01 --region fra1 --image ubuntu-22-04-x64 \</span> |
| 2059 | +<span class="o"> --template gophish \</span> |
| 2060 | +<span class="o"> --template-var AdminListenPort=3333 \</span> |
| 2061 | +<span class="o"> --wait</span> |
| 2062 | +<span class="ok">✓ phish-01 active 167.99.10.1</span> |
| 2063 | +<span class="dm"># Access the admin panel via SSH tunnel (admin is bound to 127.0.0.1 only)</span> |
| 2064 | +<span class="p">$ </span><span class="c">ssh -L 3333:127.0.0.1:3333 root@167.99.10.1</span> |
| 2065 | +<span class="dm"># Then open https://127.0.0.1:3333 in your browser</span> |
| 2066 | + </div> |
| 2067 | + </div> |
| 2068 | + |
| 2069 | + <h3>Full campaign with templates per role</h3> |
| 2070 | + <div class="terminal"> |
| 2071 | + <div class="terminal-bar"><span class="tl tl-r"></span><span class="tl tl-y"></span><span class="tl tl-g"></span><span class="terminal-title">campaign deploy with template= in role spec</span><button class="copy-btn" onclick="copyTerminal(this)"><svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25v-7.5z"/><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25v-7.5zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25h-7.5z"/></svg>copy</button></div> |
| 2072 | + <div class="terminal-body"> |
| 2073 | +<span class="dm"># 1 Havoc C2 + 3 nginx redirectors, VPC isolated, fresh ubuntu images</span> |
| 2074 | +<span class="p">$ </span><span class="c">do-manager campaign deploy \</span> |
| 2075 | +<span class="o"> --name op-phantom \</span> |
| 2076 | +<span class="o"> --region fra1 \</span> |
| 2077 | +<span class="o"> --operator-ip 203.0.113.5 \</span> |
| 2078 | +<span class="o"> --vpc-auto \</span> |
| 2079 | +<span class="o"> --role "c2:count=1:image=ubuntu-22-04-x64:preset=c2:template=c2-havoc" \</span> |
| 2080 | +<span class="o"> --role "redirector:count=3:image=ubuntu-22-04-x64:preset=redirector:reserve-ips:template=redirector-nginx" \</span> |
| 2081 | +<span class="o"> --template-var C2BackendHost=10.10.0.2 \</span> |
| 2082 | +<span class="o"> --template-var Domain=cdn.example.com \</span> |
| 2083 | +<span class="o"> --template-var TeamserverPassword=s3cr3t</span> |
| 2084 | +<span class="ok">✓ VPC created: op-phantom-vpc 10.10.0.0/20</span> |
| 2085 | +<span class="ok">✓ Role c2: 1 Droplet(s) created Havoc installing at first boot</span> |
| 2086 | +<span class="ok">✓ Role redirector: 3 Droplet(s) created nginx installing at first boot ips=3</span> |
| 2087 | +<span class="dm"># --template-var values are shared across all roles</span> |
| 2088 | +<span class="dm"># C2BackendHost is used by redirector-nginx, TeamserverPassword by c2-havoc</span> |
| 2089 | + </div> |
| 2090 | + </div> |
| 2091 | + |
| 2092 | + <div class="callout"> |
| 2093 | + <strong>WireGuard workflow</strong><br><br> |
| 2094 | + WireGuard requires a two-step key exchange. Deploy the C2 with |
| 2095 | + <code>template=wireguard-server</code> first. The cloud-init script prints the server public key |
| 2096 | + in the boot logs (<code>journalctl -u cloud-init</code>). Then deploy the redirector with |
| 2097 | + <code>template=wireguard-client</code> and pass the server public key via |
| 2098 | + <code>--template-var WGServerPublicKey=<key></code>. |
| 2099 | + </div> |
| 2100 | + </section> |
| 2101 | + |
| 2102 | + <hr /> |
| 2103 | + |
1961 | 2104 | <!-- AUDIT --> |
1962 | 2105 | <section id="audit" class="reveal"> |
1963 | 2106 | <h2>Audit</h2> |
@@ -2025,6 +2168,7 @@ <h2>Library Usage</h2> |
2025 | 2168 | <span class="o"> </span><span class="ok">"github.com/franckferman/do-manager/pkg/snapshot"</span> |
2026 | 2169 | <span class="o"> </span><span class="ok">"github.com/franckferman/do-manager/pkg/sshkey"</span> |
2027 | 2170 | <span class="o"> </span><span class="ok">"github.com/franckferman/do-manager/pkg/region"</span> |
| 2171 | +<span class="o"> </span><span class="ok">"github.com/franckferman/do-manager/pkg/tmpl"</span> |
2028 | 2172 | <span class="o">)</span> |
2029 | 2173 | <span class="dm"></span> |
2030 | 2174 | <span class="fl">func</span><span class="o"> main() {</span> |
@@ -2052,7 +2196,13 @@ <h2>Library Usage</h2> |
2052 | 2196 | <span class="o"> sizes, _ := reg.ListSizes(ctx)</span> |
2053 | 2197 | <span class="o"> images, _ := reg.ListImages(ctx, </span><span class="ok">"distribution"</span><span class="o">)</span> |
2054 | 2198 | <span class="dm"></span> |
2055 | | -<span class="o"> _ = list; _ = d; _ = results; _ = keys; _ = regions; _ = sizes; _ = images</span> |
| 2199 | +<span class="dm"> // Templates</span> |
| 2200 | +<span class="o"> metas, _ := tmpl.List()</span> |
| 2201 | +<span class="o"> script, _ := tmpl.Render(</span><span class="vl">"redirector-nginx"</span><span class="o">, map[string]string{</span> |
| 2202 | +<span class="vl"> "C2BackendHost"</span><span class="o">: </span><span class="vl">"10.20.0.2"</span><span class="o">, </span><span class="vl">"Domain"</span><span class="o">: </span><span class="vl">"cdn.example.com"</span><span class="o">,</span> |
| 2203 | +<span class="o"> })</span> |
| 2204 | +<span class="dm"></span> |
| 2205 | +<span class="o"> _ = list; _ = d; _ = results; _ = keys; _ = regions; _ = sizes; _ = images; _ = metas; _ = script</span> |
2056 | 2206 | <span class="o">}</span> |
2057 | 2207 | </div> |
2058 | 2208 | </div> |
|
0 commit comments