#!/bin/bash
# deep-capture.sh [сек] — разовый пакетный разбор атаки. По умолчанию 20с. Пишет в Logs/.
SELF="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"; source "$SELF/../defender.conf"
DUR=${1:-20}
mkdir -p "$LOGDIR"
PCAP="$LOGDIR/capture-$(date +%H%M%S).pcap"
REP="$LOGDIR/analysis-$(date +%H%M%S).txt"

echo "[*] захват ${DUR}с на $IFACE порт $PORT -> $PCAP"
timeout $DUR tcpdump -i $IFACE -nn -s 96 "tcp port $PORT" -w "$PCAP" 2>/dev/null
echo "[*] анализ..."
{
echo "###### ATTACK PACKET ANALYSIS  $(date) ######"
TOTAL=$(tcpdump -r "$PCAP" 2>/dev/null | wc -l)
echo "пакетов захвачено: $TOTAL за ${DUR}с (~$((TOTAL/DUR)) pkt/s)"
echo; echo "== распределение TCP-флагов =="
tcpdump -r "$PCAP" -nn 2>/dev/null | grep -oP 'flags \[\K[^\]]+' | sort | uniq -c | sort -rn
echo "  (S=SYN-флуд, S.=synack, P=push/L7-данные, F/R=teardown)"
echo; echo "== входящие SYN-only (попытки коннекта) =="
SYN=$(tcpdump -r "$PCAP" -nn "tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0" 2>/dev/null | wc -l)
echo "SYN: $SYN (~$((SYN/DUR))/с)"
echo; echo "== пакеты с payload (L7-флуд?) =="
PSH=$(tcpdump -r "$PCAP" -nn "tcp[tcpflags] & tcp-push != 0" 2>/dev/null | wc -l)
echo "PSH/data: $PSH (~$((PSH/DUR))/с) -- много => L7-флуд, не только SYN"
echo; echo "== топ-20 IP по пакетам =="
tcpdump -r "$PCAP" -nn 2>/dev/null | grep -oP 'IP \K[0-9.]+(?=\.[0-9]+ >)' | sort | uniq -c | sort -rn | head -20
echo; echo "== топ /16 подсетей (ботнет-диапазоны) =="
tcpdump -r "$PCAP" -nn 2>/dev/null | grep -oP 'IP \K[0-9]+\.[0-9]+' | sort | uniq -c | sort -rn | head -10
echo; echo "== распределение размеров пакетов =="
tcpdump -r "$PCAP" -nn -v 2>/dev/null | grep -oP 'length \K[0-9]+' | sort -n | awk '
  {c[$1]++} END{for(s in c) printf "  len=%-6s : %d\n", s, c[s]}' | sort -k3 -rn | head -12
} | tee "$REP"
echo; echo "[*] отчёт: $REP   pcap: $PCAP"
