Сканирование TCP-портов
Основной метод сканирования TCP-портов - это установление TCP-соединения connect() (-sT) с портом, чтобы посмотреть, будет ли получен ответ. То же самое делает TCP-клиент, желая установить соединение (законченное трехходовое соединение), за исключением того, что nmap может разорвать соединение, послав пакет RST, как только соединение будет установлено. Можно использовать сканирование RPC (-sR) для сканирования любого открытого для RPC-сервиса порта (такого, как portmapper). Ниже приведены несколько примеров этих способов сканирования.
[bjohnson@originix ~]$ nmap -sT 192.168.1.109
Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ ) Interesting ports on cauliflower (192.168.1.109): (The 1518 ports scanned but not shown below are in state: closed) Port State Service 22/tcp open ssh 111/tcp open sunrpc 884/tcp open unknown 889/tcp open unknown 6000/tcp open X11
Nmap run completed - 1 IP address (1 host up) scanned in 0 seconds [bjohnson@originix ~]$ nmap -sR 192.168.1.109
Starting nmap V. 2.53 by fyodor@insecure.org ( www.insecure.org/nmap/ ) Interesting ports on cauliflower (192.168.1.109): (The 1518 ports scanned but not shown below are in state: closed) Port State Service (RPC) 22/tcp open ssh 111/tcp open sunrpc (rpcbind V2) 884/tcp open (mountd V1-2) 889/tcp open (mountd V1-2) 6000/tcp open X11 Nmap run completed - 1 IP address (1 host up) scanned in 3 seconds
Обратите внимание, как при сканировании -sR используются RPC-команды для определения, есть ли в наличии работающий RPC-сервис. Nmap исследует тип и версию работающих сервисов rpcbind и mountd. Следующая таблица показывает, как выполняется сканирование -sT, -sR и -sP типов.
SYN | SYN/ACK | ACK следом за RST | Порт открыт; хост работает. |
SYN | RST | - | Порт закрыт; хост работает. |
SYN | Nothing | - | Порт блокирован брандмауэром или хост не работает. |
Это великолепно, но поскольку вы всего лишь создали TCP-соединение, оно, скорее всего, будет зарегистрировано службой, предоставившей его.
Nmap позволяет сделать много интересного с TCP-пакетами, которые вы используете для сканирования портов. Во-первых, есть SYN-сканирование (-sS), которое создает первую половину TCP-соединения (посылая TCP-пакет с установленным флагом SYN) но затем ведет себя несколько иначе. Если приходит TCP-пакет с установленным флагом RST, nmap решает, что порт закрыт и ничего больше не предпринимает. Однако если приходит ответ (о чем свидетельствует пакет с установленным флагом SYN/ACK), вместо того чтобы подтвердить получение этого пакета, как это было бы при установлении нормального соединения, посылается RST-пакет, как это показано в следующей таблице. Поскольку трехходовое TCP-соединение не завершено, многие сервисы не регистрируют соединение. Поскольку вы осуществляете манипуляции с некоторыми из этих TCP-флагов на низком уровне, вы не можете реализовать эти типы сканирования, не имея полномочий пользователя root в системе.
SYN | SYN/ACK | RST | Порт открыт; хост работает. |
SYN | RST | - | Порт закрыт; хост работает. |
SYN | Nothing | - | Порт блокирован брандмауэром или хост не работает. |
Вы должны были уже понять, что в любой момент, как только вы посылаете TCP-пакет на закрытый порт, стек TCP/IP на другой стороне готов послать в ответ RST-пакет. Что же в этом случае происходит с разрешенными TCP пакетами? Если закрытый порт всегда отвечает пакетами RST, почему бы просто не посылать не имеющие смысла пакеты и не смотреть, что придет в ответ?
FIN-сканирование (-sF) посылает пакеты FIN, которые обычно используются для закрытия соединения.
Однако, поскольку мы посылаем его прежде, чем соединение было установлено, открытый порт должен игнорировать такой мусор. Закрытый порт по-прежнему будет отвечать пакетом RST, как это показано в следующей таблице. Nmap предлагает два способа мусорного сканирования: Xmas tree (-sX) (рождественское) сканирование (которое устанавливает FIN, URG, и PUSH флаги TCP-пакета, расцвечивая его подобно новогодней елке) и null-сканирование (-sN) (которое выключает все флаги, подобно тому, как это делает hping по умолчанию). Поскольку мы совершаем некоторые манипуляции с пакетами на низком уровне, то такое сканирование также требует полномочий пользователя root. Имейте в виду, что не все стеки TCP/IP реализованы корректно. Даже притом, что открытые порты не посылают RST-пакеты в ответ на такие виды проверок, некоторые стеки TCP/IP не следуют этим правилам и посылают ответ в любом случае. Это означает, что вы можете ошибочно сделать положительное предположение при использовании такого сканирования для некоторых типов хостов. Также любой хост, защищенный брандмауэром, может вернуть ложный ответ. Nmap предполагает, что порт открыт, если не получает ничего в ответ. Что если брандмауэр блокирует этот ответ? Такое сканирование более скрытое, но оно и менее аккуратное.
FIN | Nothing | Порт открыт, если хост работает и не защищен брандмауэром. |
FIN | RST | Порт закрыт; хост работает. |
Сканирование ACK (-sA) может использовать этот факт для определения, осуществляется ли блокирование или фильтрация порта. Если получен пакет RST, порт не фильтруется; в противном случае, осуществляется фильтрация, как это показано в следующей таблице. Именно сканирование ACK может показать вам, что конкретный хост защищен брандмауэром.
ACK | RST | Порт не защищен брандмауэром; порт может быть открыт или закрыт; хост работает. |
ACK | Nothing or ICMP unreachable | Порт блокирован брандмауэром и хост работает. |
# nmap -sS 192.168.1.40
Starting nmap V. 2.54BETA30 ( www.insecure.org/nmap/ ) Interesting ports on (192.168.1.40): (The 1546 ports scanned but not shown below are in state: closed) Port State Service 21/tcp filtered ftp 22/tcp filtered ssh 80/tcp open http Nmap run completed - 1 IP address (1 host up) scanned in 8 seconds # nmap -sA 192.168.1.40
Starting nmap V. 2.54BETA30 ( www.insecure.org/nmap/ ) All 1549 scanned ports on (192.168.1.40) are: Unfiltered
Nmap run completed - 1 IP address (1 host up) scanned in 7 seconds
Помните, как мы использовали hping в лекции "Системные средства с открытым программным кодом: основы" для подмены исходящего IP-адреса, сканирующего порты и, тем не менее, получали результат? Nmap позволяет вам сделать нечто подобное, применяя Idle-сканирование (-sI). Для этого необходимо найти хост, который не пропускает никакого трафика и имеет TCP/IP-стек с известным IP ID-инкрементом (например, Windows всегда использует 256). За подробной информацией о таком сканировании обращайтесь к примеру использования hping в лекции "Системные средства с открытым программным кодом: основы".