Когда мы сканируем с помощью nmap, есть 3 базовых типа сканирования: 1. **TCP connect scans** `-sT` 2. **SYN Полуоткрытое сканирование** `-sS` 3. **UDP scans** `-sU` Дополнительно есть несколько не так часто используемых, некоторые из них мы также рассмотрим (хотя и менее подробно). Это: 1. **TCP null scans** `-sN` 2. **TCP FIN scans** `-sF 3. **TCP Xmas Scans** `-sX` Многие из них (за исключением UDP) мы используем в очень похожих целях, однако, способ их работы отличаются друг от друга. Это означет то, что один из базовой тройки вероятнее всего будет вашим выбором в большинстве ситуаций, но не стоит забывать о существовании других возможных типов сканирования. ## TCP connect scans `-sT` Что бы понимать как работает этот вид сканирования, нужно понимать концепцию ***Трехстороннего TCP рукопожатия***. Давайте вспомним что это обозначает. ***RFC 9293*** ***Трехстороннее TCP рукопожатие*** состоит из трёх (ну не четырех же =) ) стадий. 1. Клиент (в нашем случае атакующий) отсылает TCP запрос к целевой системе с флагом `SYN`. 2. Сервер признает этот TCP запрос, включающий в себя `SYN` флаг, отсылается ответ с флагами `SYN` и `ASK`. 3. Клиент получает ответ и отправляет подтверждение с флагом `ASK` ![[Pasted image 20250416202446.png]]![[Pasted image 20250416202511.png]] Каким образом это связано с работой nmap? Очень просто. Чтобы понять, работает ли порт или нет, nmap пытается установить **TCP** соединение и отправить `SYN` флаг. Если nmap проучает `SYN\ASK` ответ, это значит что порт открыт. Nmap помечает его открытым и завершает рукопожатие отправкой `ASK` флага. Если же nmap получает ответ с флагом `RST` (Reset), то это означает что порт закрыт. ![[Pasted image 20250416203106.png]] Если же открыт фаервол, обычно он просто роняет подключение. Тоесть, **nmap** отправляет `ASK` флаг, но в ответ ничего не получает. В данном случае порт помечается как **filtered**. ## SYN scans `-sS` Так же как и TCP сканирование, SYN использует подключение к TCP портам, но работает немного иначе. Этот вид сканирования часто называют скрытым. Если TCP сканирование полностью следует ***Трехстороннему рукопожатию***, то **SYN** сканирование после ответа от сервера с флагами `SYN\ASK` отпрвляет флаг `RST` обрывая соединение. ![[Pasted image 20250417102631.png]]![[Pasted image 20250417102751.png]] Данный вид сканирование имеет множество приемуществ для нас как для хакеров: 1. Он может использоваться для обхода старых систем обнаружения, которым необходимо ***полное трехстороннее рукопожатие***. 2. **SYN** сканирование не логируется приложениями, открытыми на портах (это является стандартной практикой логгировать соединение когда оно будет установленно) 3. **SYN** сканирование банально быстрее. Конечно есть некоторое количество минусов: 1. Необходимо запускать с правами админа (sudo) что бы оно работало нормально на линуксе, так как SYN сканирование создает сырые пакеты, что является привелегией админа. 2. Нестабильные сервисы иногда падают в процессе сканирования, это может быть проблемой если тестируется прод. Не считая способа поиска открытых портов, в основном работа **TCP** сканирования и **SYN** сканирования идентичны. ## UDP сканирование В отличие от TCP, у UDP нет никакого подтверждения о получении пакета. Буквально отсылается пакет, с надеждой на то, что он был получен. Это делает его широкоиспользуемым там, где нужна скорость (например - видеотрансляции). Но отсутствие подтверждения получения пакета сильно услажняет возможность сканирования. Когда пакет отсылается на открытый UDP порт, ответа не должно последовать. Если это так и есть, то **nmap** помечает порт как открытый или отфильтрованный. Если же пакет был отправлен на закрытый UDP порт, то назад возвращается **ICMP (ping)** пакет, содержащий сообщение что порт не доступен. В этом случае nmap помечает порт как закрытый. UDP сканирование достаточно медленное, поэтому рекомендуется ипользовать `--top-ports ` флаг при сканировании. ```bash nmap -sU --top-ports 20 ``` Данная команда будет сканировать топ 20 самых используемых UDP портов. ## NULL FIN Xmas TCP port scan Данные типы сканирования используются гораздо реже чем те, которые мы рассмотрели ранее, и поэтому не будем сильно останавливаться на них. ***NULL Scans*** **NULL** сканирование, флаг `-sN`, отправляет TCP запрос без заданных флагов. Если порт закрыт, то вернется `RST`. ![[Pasted image 20250417111734.png]] ***FIN Scans*** **FIN** сканирование, флаг `-sF` отправляет TCP запрос с флагом завершения `FIN`. Если порт закрыт, то вернется `RST`. ![[Pasted image 20250417112443.png]] ***XMAS*** **Xmass** сканирование, флаг `-sX`, отсылает TCP пакет с флагами `PSH, URG, FIN` Если порт закрыт, то вернется `RST`. ![[Pasted image 20250417122554.png]] Эти типы сканирования использются для обхода фаерволов, так как многие блокируют входящий TCP трафик, котрый содержит `SYN` флаг. Но не нужно думать что они 100% эффективны в современных системах защиты. ## ICMP Network scaning Во время первого соединения с целью, наша первая цель - составление карты сети. Единственная возможность сделать это используя nmap - подготовить "проверку пингом". Nmap отправляет **ICMP** пакет на каждый доступный IP address. Когда получен ответ - ip маркируется как живой. Флаг для вызова `-sn` ## NSE (Nmap Scripting Engine) Мощное рассширение, сильно расширяющее возможности nmap. NSE написаны на ***LUA***, и могут быть использованны для множества вещей, начиная с таких как сканирование на уязвимости, заканчивая эксплуатацией этих уязвимостей. Доступно множество категорий, вот некоторые из них: 1. `safe` - не имеют эффекта на цели 2. `intrusive` - не безопасны, влияют на цель 3. `vuln` - поиск уязвимостей 4. `exploit` - эксплуатация уязвимостей 5. `auth` - Обход аутентификации (например: получение доступа к анонимному ftp серверу) 6. `brute` - Подбор паролей и логинов 7. `discovery` - попытка запроса запущенных сервисов Более подробно можно узнать тут: https://nmap.org/book/nse-usage.html Команда что бы запустить скрипт: ```bash --script= ``` Что бы передать какой-то аргумент: ```bash --script-args ``` Что бы прочитать помощь: ```bash nmap --srcipt-help ```