#!/usr/bin/env bash # ============================================================================== # TheCr3w-dev — Stage 0 Infrastructure Discovery Script (READ-ONLY) # ============================================================================== # Cel: Zebranie podstawowych, bezpiecznych (read-only) informacji o stanie VPS, # kontenerach Docker, sieciach, Caddy oraz usługach. # # ZASADA BEZPIECZEŃSTWA: # Skrypt NIE modyfikuje żadnych plików, NIE zatrzymuje kontenerów, NIE zbiera # haseł, tokenów, kluczy prywatnych ani plików .env. # ============================================================================== set -o pipefail OUT_FILE="thecr3w_discovery_report_$(date +%Y%m%d_%H%M%S).txt" exec > >(tee -a "${OUT_FILE}") 2>&1 echo "==============================================================================" echo " THECR3W-DEV — AUDYT INFRASTRUKTURY (STAGE 0: READ-ONLY)" echo " Data wykonania: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" echo "==============================================================================" echo "" echo "--- 1. SYSTEM OPERACYJNY I ZASOBY HOSTA ---" echo "[OS Release]" if command -v lsb_release &>/dev/null; then lsb_release -a elif [ -f /etc/os-release ]; then cat /etc/os-release else uname -a fi echo "" echo "[Kernel]" uname -r echo "" echo "[Pamięć RAM i Swap]" free -h echo "" echo "[Dysk / Przestrzeń magazynowa]" df -hT -x tmpfs -x devtmpfs -x overlay echo "" echo "[Uptime i obciążenie]" uptime echo "" echo "--- 2. DOCKER & DOCKER COMPOSE ---" if command -v docker &>/dev/null; then echo "[Docker Version]" docker --version echo "" echo "[Docker Info - Storage & Security]" docker info --format 'ServerVersion: {{.ServerVersion}}, StorageDriver: {{.Driver}}, CgroupDriver: {{.CgroupDriver}}, RootDir: {{.DockerRootDir}}' echo "" echo "[Aktywne i zatrzymane kontenery]" docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}" echo "" echo "[Sieci Docker]" docker network ls echo "" echo "[Wolumeny Docker]" docker volume ls else echo "UWAGA: Polecenie 'docker' nie jest dostępne w PATH." fi echo "" echo "[Docker Compose]" if docker compose version &>/dev/null; then docker compose version elif command -v docker-compose &>/dev/null; then docker-compose --version else echo "Docker Compose nie został wykryty." fi echo "" echo "--- 3. REVERSE PROXY — CADDY ---" if docker ps --format '{{.Names}}' | grep -q "^caddy$"; then echo "Kontener 'caddy': ZNALEZIONY i URUCHOMIONY." echo "[Caddy Image]: $(docker inspect caddy --format '{{.Config.Image}}')" echo "[Caddy Networks]: $(docker inspect caddy --format '{{range $net, $conf := .NetworkSettings.Networks}}{{$net}} {{end}}')" echo "[Caddy Mounts / Volumes]:" docker inspect caddy --format '{{range .Mounts}}{{.Type}} -> Source: {{.Source}} | Dest: {{.Destination}} | RW: {{.RW}}{{"\n"}}{{end}}' else echo "Kontener o nazwie 'caddy' NIE jest aktualnie uruchomiony." docker ps -a --filter "name=caddy" --format "table {{.Names}}\t{{.Status}}" fi echo "" echo "[Weryfikacja /opt/proxy/Caddyfile]" if [ -f "/opt/proxy/Caddyfile" ]; then echo "Plik /opt/proxy/Caddyfile istnieje." echo "--- Fragment reguł (zanonimizowany, pierwsze 60 linii bez sekretów) ---" # Wyświetlamy strukturę bloków domenowych bez ewentualnych wrażliwych nagłówków/haseł grep -E '^[a-zA-Z0-9\.\_\:\-]+[[:space:]]*\{|reverse_proxy|import|tls' /opt/proxy/Caddyfile || head -n 40 /opt/proxy/Caddyfile else echo "Plik /opt/proxy/Caddyfile NIE istnieje w tej ścieżce." echo "Wyszukiwanie Caddyfile w standardowych lokalizacjach:" find /opt /etc -maxdepth 3 -name "Caddyfile" 2>/dev/null || true fi echo "" echo "--- 4. HISTORYCZNY KONTENER 'app-app-1' ---" if docker ps -a --format '{{.Names}}' | grep -q "^app-app-1$"; then echo "Kontener 'app-app-1' znaleziony:" docker inspect app-app-1 --format 'Image: {{.Config.Image}}, Status: {{.State.Status}}, Created: {{.Created}}' else echo "Kontener 'app-app-1' nie istnieje." fi echo "" echo "--- 5. PORTY NASŁUCHUJĄCE NA HOŚCIE (LSOF / SS) ---" if command -v ss &>/dev/null; then ss -tulpn | grep -E ':(80|443|22|5432|8080|3000|9000)' || ss -tulpn elif command -v netstat &>/dev/null; then netstat -tulpn fi echo "" echo "--- 6. WERYFIKACJA SIECIOWA DOMEN Z POZIOMU VPS (DNS & HTTP) ---" DOMAINS=("thecr3wnet.com" "login.thecr3wnet.com" "git.thecr3wnet.com" "app.thecr3wnet.com" "download.thecr3wnet.com") for d in "${DOMAINS[@]}"; do echo "[$d]" if command -v dig &>/dev/null; then echo " DNS A: $(dig +short "$d" | tr '\n' ' ')" elif command -v host &>/dev/null; then host "$d" | head -n 2 fi # Sprawdzenie odpowiedzi HTTP z nagłówkami HTTP_STATUS=$(curl -k -s -o /dev/null -w "%{http_code}" --connect-timeout 3 "https://$d" 2>/dev/null || echo "CONNECT_FAIL") echo " HTTPS Status: $HTTP_STATUS" done echo "" echo "==============================================================================" echo " AUDYT ZAKOŃCZONY." echo " Wynik zapisano w pliku: ${OUT_FILE}" echo " Przejrzyj plik, upewnij się, że nie ma w nim sekretów, i przekaż wyniki." echo "=============================================================================="