--- # Common tasks for configuring C2 server with Havoc C2 and EDR evasion # Shared across all providers - name: Update apt cache apt: update_cache: yes - name: Set a custom MOTD template: src: "../templates/motd-linode.j2" dest: /etc/motd owner: root group: root mode: '0644' - name: Install base utilities and tools via apt apt: name: - git - wget - curl - unzip - python3-pip - python3-venv - tmux - pipx - nmap - tcpdump - hydra - john - hashcat - sqlmap - gobuster - dirb - enum4linux - dnsenum - seclists - responder - golang - proxychains - tor - crackmapexec - jq - build-essential - zip - unzip - postfix - certbot - opendkim - opendkim-tools - dovecot-core - dovecot-imapd - dovecot-pop3d - dovecot-sieve - dovecot-managesieved - yq - build-essential # Additional Havoc C2 dependencies - mingw-w64 - nasm - cmake - ninja-build - libfontconfig1 - libglu1-mesa-dev - libgtest-dev - libspdlog-dev - libboost-all-dev - libncurses5-dev - libgdbm-dev - libssl-dev - libreadline-dev - libffi-dev - libsqlite3-dev - libbz2-dev - mesa-common-dev - qtbase5-dev - qtchooser - qt5-qmake - qtbase5-dev-tools - libqt5websockets5 - libqt5websockets5-dev state: present - name: Create directories for operational scripts file: path: "{{ item }}" state: directory mode: '0700' owner: root group: root with_items: - /root/Tools - /root/Tools/beacons - /root/Tools/payloads - name: Copy operational scripts copy: src: "{{ item }}" dest: "/root/Tools/{{ item | basename }}" mode: '0700' owner: root group: root with_items: - "../files/clean-logs.sh" - "../files/secure-exit.sh" - "../files/havoc_installer.sh" - "../files/havoc_shell_handler.sh" - name: Copy post-install script copy: src: "../files/post_install_c2.sh" dest: "/root/Tools/post_install_c2.sh" mode: '0700' owner: root group: root - name: Copy port randomization script copy: src: "../files/randomize_ports.sh" dest: "/root/Tools/randomize_ports.sh" mode: '0700' owner: root group: root - name: Create Havoc C2 configuration from template template: src: "../templates/havoc-config.yaotl.j2" dest: "/root/Tools/havoc/data/profiles/default.yaotl" mode: '0600' owner: root group: root - name: Create post-install instructions copy: content: | ================================================================ C2ingRed Post-Installation Instructions ================================================================ To complete your setup with SSL certificates, run: /root/Tools/post_install_c2.sh This script will guide you through: - Setting up Let's Encrypt certificates - Starting required services - Setting up the redirector (if desired) - Displaying DNS configuration recommendations For enhanced OPSEC, you can also randomize ports: /root/Tools/randomize_ports.sh Run these after you've configured your DNS records to point to this server. dest: "/root/POST_INSTALL_INSTRUCTIONS.txt" mode: '0644' owner: root group: root - name: Remove any existing Sliver or Havoc file: path: "{{ item }}" state: absent with_items: - "/usr/local/bin/sliver" - "/usr/local/bin/sliver-server" ignore_errors: yes - name: Install Havoc C2 Framework shell: "/root/Tools/havoc_installer.sh" args: creates: "/root/Tools/havoc/Teamserver/teamserver" register: havoc_installation_result - name: Display Havoc installation output debug: var: havoc_installation_result.stdout_lines when: havoc_installation_result.stdout_lines is defined - name: Create Havoc payload generation script template: src: "../templates/generate_havoc_payloads.sh.j2" dest: "/root/Tools/generate_havoc_payloads.sh" mode: '0700' owner: root group: root - name: Create Linux loader script template template: src: "../templates/linux_loader.sh.j2" dest: "/root/Tools/linux_loader.template" mode: '0644' owner: root group: root - name: Create Windows PowerShell loader template template: src: "../templates/windows_loader.ps1.j2" dest: "/root/Tools/windows_loader.template" mode: '0644' owner: root group: root - name: Create beacon server script from template template: src: "../templates/serve-havoc-payloads.sh.j2" dest: "/root/Tools/serve-havoc-payloads.sh" mode: '0700' owner: root group: root vars: redirector_subdomain: "{{ redirector_subdomain | default('cdn') }}" domain: "{{ domain }}" redirector_port: "{{ redirector_port | default('443') }}" - name: Run port randomization if enabled include_tasks: port_randomization.yml when: randomize_ports | default(false) | bool - name: Generate Havoc payloads shell: "/root/Tools/generate_havoc_payloads.sh" args: creates: "/root/Tools/havoc/payloads/manifest.json" register: payload_generation_result environment: PATH: "{{ ansible_env.PATH }}:/usr/local/bin" ignore_errors: yes - name: Display payload generation output debug: var: payload_generation_result.stdout_lines when: payload_generation_result.stdout_lines is defined - name: Start payload server shell: | nohup /root/Tools/serve-havoc-payloads.sh > /dev/null 2>&1 & args: executable: /bin/bash register: beacon_server_result - name: Create NGINX configuration fragment for redirector template: src: "../templates/redirector-havoc-fragment.j2" dest: "/root/Tools/redirector-config.conf" mode: '0644' owner: root group: root vars: c2_ip: "{{ ansible_host }}" redirector_domain: "{{ redirector_subdomain }}.{{ domain }}" - name: Create Havoc usage guide template: src: "../templates/havoc-guide.j2" dest: "/root/havoc-guide.txt" mode: '0600' owner: root group: root vars: c2_ip: "{{ ansible_host }}" redirector_domain: "{{ redirector_subdomain }}.{{ domain }}" - name: Set up cron job for log cleaning if zero-logs enabled cron: name: "Clean logs" minute: "0" hour: "*/6" job: "/root/Tools/clean-logs.sh > /dev/null 2>&1" when: zero_logs | bool # Include integrated tracker tasks if requested - name: Include integrated tracker setup include_tasks: "configure_integrated_tracker.yml" when: setup_integrated_tracker | default(false) | bool