README.md
Rendering markdown...
#!/usr/bin/env bash
#
# Velociraptor server installation + client config generator.
#
# What it does:
# 1. Skips install if velociraptor is already on PATH.
# 2. Downloads the defined release, generates a fresh server config,
# builds the .deb, installs it via dpkg.
# 3. Pulls the CA cert + nonce out of the generated server config and
# emits a matching client config pointing at this host's IP.
set -euo pipefail
readonly VR_VERSION="0.75.6"
readonly VR_MINOR="0.75"
readonly VR_URL="https://github.com/Velocidex/velociraptor/releases/download/v${VR_MINOR}/velociraptor-v${VR_VERSION}-linux-amd64"
readonly WORK_DIR="${HOME}/velociraptor_setup"
readonly BIN="${WORK_DIR}/velociraptor"
readonly SERVER_CFG="${WORK_DIR}/server.config.yaml"
readonly CLIENT_CFG="${WORK_DIR}/client.config.yaml"
log() { printf '[+] %s\n' "$*"; }
warn() { printf '[!] %s\n' "$*" >&2; }
info() { printf '[=] %s\n' "$*"; }
die() { printf '[-] %s\n' "$*" >&2; exit 1; }
already_installed() {
command -v velociraptor >/dev/null 2>&1
}
prep_workdir() {
log "Preparing ${WORK_DIR}"
mkdir -p "${WORK_DIR}"
cd "${WORK_DIR}"
}
fetch_binary() {
log "Downloading Velociraptor v${VR_VERSION}"
wget -q --show-progress -O "${BIN}" "${VR_URL}"
chmod +x "${BIN}"
}
generate_server_config() {
log "Generating server configuration"
"${BIN}" config generate > "${SERVER_CFG}"
# Bind frontend to 0.0.0.0 so exploited endpoints can connect remotely
sed -i 's/bind_address: 127\.0\.0\.1/bind_address: 0.0.0.0/' "${SERVER_CFG}"
}
install_server() {
log "Building and installing server .deb (requires sudo)"
"${BIN}" debian server --config "${SERVER_CFG}"
local deb
deb="$(ls -t velociraptor-server-*.deb 2>/dev/null | head -n1)"
[[ -n "${deb}" ]] || die "Could not find generated .deb file"
sudo dpkg -i "${deb}"
}
show_status() {
printf "\n\n"
systemctl status velociraptor_server.service --no-pager || true
}
create_admin_user() {
log "Adding admin user with password 'admin'. This requires sudo."
sudo -u velociraptor /usr/local/bin/velociraptor --config /etc/velociraptor/server.config.yaml user add admin admin --role administrator
systemctl restart velociraptor_server.service
}
# Extract the Client: block verbatim from the server config.
# (server_urls, ca_certificate, nonce, writeback paths, etc.)
build_client_config() {
log "Building client configuration"
local local_ip
local_ip="$(hostname -I | awk '{print $1}')" # Just first IP
[[ -n "${local_ip}" ]] || die "Could not determine local IP"
# Extract the Client: block from server config
# Everything from "Client:" until the next top-level key (non-indented line)
awk '
/^Client:/ { in_block=1; print; next }
in_block && /^[A-Za-z]/ { in_block=0 }
in_block { print }
' "${SERVER_CFG}" > "${CLIENT_CFG}"
# Replace localhost with actual IP
sed -i "s|https://localhost:8000/|https://${local_ip}:8000/|" "${CLIENT_CFG}"
}
show_client_config() {
printf '\n\n'
echo "========== START OF CLIENT CONFIG =========="
cat "${CLIENT_CFG}"
echo "=========== END OF CLIENT CONFIG ==========="
info "On Windows targets, install at: C:\\Program Files\\Velociraptor\\client.config.yaml"
}
main() {
if [[ "${1:-}" == "--client-only" ]]; then
prep_workdir
build_client_config
show_client_config
return
fi
if already_installed; then
warn "Velociraptor is already installed. Skipping install steps."
warn "Run with --client-only to output a configuration."
exit 0
fi
prep_workdir
fetch_binary
generate_server_config
install_server
create_admin_user
show_status
build_client_config
show_client_config
}
main "$@"