bashRecon & Automation#nmap
152 linhas•02_ports.sh
02_ports.sh — Port Scanning & Service Fingerprint
Mapeamento completo de portas e detecção de serviços via nmap com adaptação dinâmica de privilégios de execução.
Destaques Operacionais
- Detecção inteligente: TCP connect (-sT) sem sudo / SYN stealth (-sS) com root
- Escaneamento inicial rápido seguido de varredura completa das 65.535 portas
- Execução de scripts NSE padrão para identificação rápida de serviços obsoletos e vulneráveis
Como Executar
./02_ports.sh 10.10.10.1 ./output/10.10.10.1
* Ajuste as permissões de execução com chmod +x 02_ports.sh se necessário.
Código Fonte — 02_ports.sh
bash#!/bin/bash
# ═══════════════════════════════════════════════════════
# MÓDULO 02 — Port Scan & Serviços
# Uso standalone: ./02_ports.sh <alvo> <output_dir>
# ═══════════════════════════════════════════════════════
set -uo pipefail
RED='\033[0;31m'; GRN='\033[0;32m'; YLW='\033[1;33m'
BLU='\033[0;34m'; CYN='\033[0;36m'; RST='\033[0m'; BOLD='\033[1m'
info() { echo -e "${BLU}[*]${RST} $1"; }
ok() { echo -e "${GRN}[+]${RST} $1"; }
warn() { echo -e "${YLW}[!]${RST} $1"; }
fail() { echo -e "${RED}[-]${RST} $1"; }
has() { command -v "$1" &>/dev/null; }
TARGET="${1:?Uso: $0 <alvo> <output_dir>}"
OUTDIR="${2:?Uso: $0 <alvo> <output_dir>}/ports"
mkdir -p "$OUTDIR"
CLEAN=$(echo "$TARGET" | sed 's|https\?://||;s|/.*||;s|:.*||')
echo -e "\n${CYN}━━━ 🔌 MÓDULO 02 — Port Scan & Serviços ━━━${RST}\n"
if ! has nmap; then fail "nmap não instalado!"; exit 1; fi
# Detectar se é root para escolher tipo de scan
if [[ $EUID -eq 0 ]]; then
SCAN_TYPE="" # root: nmap usa SYN scan por padrão
info "Rodando como root — SYN scan."
else
SCAN_TYPE="-sT" # sem root: TCP connect scan (não pede sudo)
info "Sem root — usando TCP connect scan (-sT)."
fi
# Quick scan — top 1000
info "Quick scan — top 1000 portas..."
nmap $SCAN_TYPE -T4 --open -Pn -oN "${OUTDIR}/quick_scan.txt" -oG "${OUTDIR}/quick_scan.gnmap" "$CLEAN" 2>/dev/null
open_ports=$(grep -oP '\d+/open' "${OUTDIR}/quick_scan.gnmap" 2>/dev/null | cut -d/ -f1 | tr '\n' ',' | sed 's/,$//')
# Se nada, scan completo
if [[ -z "$open_ports" ]]; then
warn "Nada no top 1000. Scan completo (-p-)..."
nmap $SCAN_TYPE -T4 -p- --open -Pn -oN "${OUTDIR}/full_scan.txt" -oG "${OUTDIR}/full_scan.gnmap" "$CLEAN" 2>/dev/null
open_ports=$(grep -oP '\d+/open' "${OUTDIR}/full_scan.gnmap" 2>/dev/null | cut -d/ -f1 | tr '\n' ',' | sed 's/,$//')
fi
if [[ -z "$open_ports" ]]; then fail "Nenhuma porta aberta."; exit 0; fi
ok "Portas abertas: ${open_ports}"
echo "$open_ports" > "${OUTDIR}/open_ports.txt"
# Service & Version
info "Detectando serviços (-sV -sC)..."
nmap $SCAN_TYPE -sV -sC -T4 -Pn -p "$open_ports" -oN "${OUTDIR}/services.txt" -oX "${OUTDIR}/services.xml" "$CLEAN" 2>/dev/null
ok "→ services.txt"
echo -e "\n${BOLD} Serviços:${RST}"
grep -E '^[0-9]+/' "${OUTDIR}/services.txt" 2>/dev/null | while read -r line; do
echo -e " ${GRN}→${RST} $line"
done
# OS Detection (root only)
if [[ $EUID -eq 0 ]]; then
info "OS Detection..."
nmap -O -p "$open_ports" -oN "${OUTDIR}/os_detect.txt" "$CLEAN" 2>/dev/null
ok "→ os_detect.txt"
info "UDP top 20..."
nmap -sU --top-ports 20 -T4 --open -oN "${OUTDIR}/udp_scan.txt" "$CLEAN" 2>/dev/null
ok "→ udp_scan.txt"
else
warn "Rode como root para OS detection e UDP scan."
fi
# Nmap vuln scripts
info "Nmap vuln scripts..."
nmap $SCAN_TYPE --script vuln -Pn -p "$open_ports" -oN "${OUTDIR}/nmap_vulns.txt" "$CLEAN" 2>/dev/null || true
ok "→ nmap_vulns.txt"
# ── HTML Report ──
HELPERS="$(dirname "$0")/_html_helpers.sh"
if [[ -f "$HELPERS" ]]; then
source "$HELPERS"
HTML="${OUTDIR}/report.html"
html_head "🔌 Port Scan — ${CLEAN}" > "$HTML"
# Contar portas
port_count=$(echo "$open_ports" | tr ',' '\n' | wc -l)
cat >> "$HTML" <<EOF
<h1>🔌 Port Scan & Serviços</h1>
<p class="meta">Alvo: <strong>${CLEAN}</strong> — $(date '+%Y-%m-%d %H:%M:%S')</p>
<div class="stats">
$(html_stat "$port_count" "Portas abertas" "green")
$(html_stat "$(echo "$open_ports" | tr ',' '\n' | head -1)" "Primeira porta" "blue")
EOF
[[ $EUID -eq 0 ]] && echo "$(html_stat "SYN" "Tipo de scan" "purple")" >> "$HTML" || echo "$(html_stat "TCP" "Tipo de scan" "yellow")" >> "$HTML"
echo '</div>' >> "$HTML"
# Tabela de portas/serviços
html_section_start "🔓 Portas & Serviços" >> "$HTML"
echo '<table><tr><th>Porta</th><th>Estado</th><th>Serviço</th><th>Versão</th></tr>' >> "$HTML"
if [[ -f "${OUTDIR}/services.txt" ]]; then
grep -E '^[0-9]+/' "${OUTDIR}/services.txt" 2>/dev/null | while IFS= read -r line; do
local port state svc version
port=$(echo "$line" | awk -F/ '{print $1}')
state=$(echo "$line" | awk '{print $2}')
svc=$(echo "$line" | awk '{print $3}')
version=$(echo "$line" | awk '{for(i=4;i<=NF;i++) printf "%s ",$i; print ""}' | sed 's/ *$//')
echo "<tr><td><strong>${port}</strong></td><td>$(html_badge "$state" "green")</td><td>${svc}</td><td>$(echo "$version" | _esc)</td></tr>" >> "$HTML"
done
fi
echo '</table>' >> "$HTML"
html_section_end >> "$HTML"
# Service details
html_section_start "📋 Scan Detalhado (nmap -sV -sC)" >> "$HTML"
html_file_pre "${OUTDIR}/services.txt" 150 >> "$HTML"
html_section_end >> "$HTML"
# OS Detection
if [[ -f "${OUTDIR}/os_detect.txt" ]]; then
html_section_start "🖥️ OS Detection" >> "$HTML"
html_file_pre "${OUTDIR}/os_detect.txt" 40 >> "$HTML"
html_section_end >> "$HTML"
fi
# UDP
if [[ -f "${OUTDIR}/udp_scan.txt" ]]; then
html_section_start "📡 UDP Scan" >> "$HTML"
html_file_pre "${OUTDIR}/udp_scan.txt" 40 >> "$HTML"
html_section_end >> "$HTML"
fi
# Vuln scripts
if [[ -s "${OUTDIR}/nmap_vulns.txt" ]]; then
html_section_start "⚠️ Nmap Vuln Scripts" >> "$HTML"
html_file_pre "${OUTDIR}/nmap_vulns.txt" 100 >> "$HTML"
html_section_end >> "$HTML"
fi
html_foot >> "$HTML"
ok "→ report.html"
fi
echo -e "\n${GRN}━━━ Módulo 02 concluído ━━━${RST}"