Код IT
← Каталог

Обеспечение безопасности — 11.1. Определение сканеров

Фрагмент из «Обеспечение безопасности»: 11.1. Определение сканеров.

bash infra-securityencyclopedia8-07-informatsionnaya-bezopasnost-2 embed URL статья в энциклопедии
Bash main.sh
# 1. Извлекаем уникальные user-agent’ы и их частоту
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -nr > uas.txt

# 2. Ищем известные сигнатуры
grep -Ei "nmap|sqlmap|acunetix|burpsuite|ZmEu" uas.txt

# 3. Определяем "сканерские" IP по поведению —
# >50 запросов за 1 мин, >80% запросов — 404
awk '{
  ip = $1;
  gsub(/\[|\]/, "", $4);
  split($4, dt, ":");
  time = mktime("2025 11 " dt[1] " " dt[2] " " dt[3] " " dt[4]);
  status = $9;
  window = int(time / 60);
  count[ip, window]++;
  if (status == 404) notfound[ip, window]++
}
END {
  for (key in count) {
    split(key, a, SUBSEP);
    ip = a[1]; win = a[2];
    if (count[key] > 50 && (notfound[key] / count[key]) > 0.8)
      print "Scanner candidate:", ip, "window", win
  }
}' access.log
# 1. Извлекаем уникальные user-agent’ы и их частоту
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -nr > uas.txt

# 2. Ищем известные сигнатуры
grep -Ei "nmap|sqlmap|acunetix|burpsuite|ZmEu" uas.txt

# 3. Определяем "сканерские" IP по поведению —
# >50 запросов за 1 мин, >80% запросов — 404
awk '{
  ip = $1;
  gsub(/\[|\]/, "", $4);
  split($4, dt, ":");
  time = mktime("2025 11 " dt[1] " " dt[2] " " dt[3] " " dt[4]);
  status = $9;
  window = int(time / 60);
  count[ip, window]++;
  if (status == 404) notfound[ip, window]++
}
END {
  for (key in count) {
    split(key, a, SUBSEP);
    ip = a[1]; win = a[2];
    if (count[key] > 50 && (notfound[key] / count[key]) > 0.8)
      print "Scanner candidate:", ip, "window", win
  }
}' access.log