Управление сетями и мониторинг потока данных между системами кажется сложным. Но не в том случае, если вы знаете, как использовать Netcat.
Netcat – это инструмент командной строки, который можно использовать для различных целей, таких как сканирование портов, передача файлов и создание минимального веб-сервера для тестирования активности подключения. И в этом руководстве вы узнаете, как использовать Netcat, изучив некоторые из самых распространенных случаев его применения.
Готовы? Читайте далее и поднимайте свои навыки в сетевых технологиях на новый уровень!
Предварительные требования
Этот учебник будет практическим демонстрационным материалом. Если вы хотите следовать за мной, убедитесь, что у вас есть следующее.
- Два компьютера с Linux: один (ubuntu1) действует как хост-получатель, а другой (ubuntu2) служит в качестве хоста-отправителя. В этом учебнике используется Ubuntu 20.04 для обоих машин.
Сканирование открытых портов
Порты – это входные ворота, которые позволяют сетевому трафику входить и выходить из машины. Когда порт закрыт, на нем не работает никакая служба, и трафик не может проходить через него. Но если порт открыт, ваша сеть подвергается атакам.
Если вы хотите проверить, открыт ли определенный порт на машине для выявления уязвимостей безопасности, Netcat подходит для этой задачи. Как тестировщик на проникновение, вам нужно знать, какие порты открыты, чтобы провести вашу атаку. В любом случае, поиск открытых портов – это обычная потребность.
Базовый синтаксис для сканирования портов с использованием Netcat выглядит следующим образом, где:
host
– это IP-адрес или имя хоста машины, которую вы хотите проверить.startport
– начальный номер порта.endport
– конечный номер порта.
Команда netcat имеет псевдоним nc, который пригодится для сокращения команд. Но в этом руководстве используется netcat для правильной документации.
Подключитесь по SSH к вашему отправляющему хосту (ubuntu2) и выполните следующую команду для сканирования открытых портов между портами 1-100
.
На протяжении этого руководства замените 149.28.86.131 на IP-адрес вашего отправляющего хоста.
В большинстве случаев диапазон портов 1-100
достаточен. Большинство служб используют номера портов по умолчанию, которые, как правило, попадают в этот диапазон, например, 22
для SSH, 80
для HTTP и т. д.
Список ниже объясняет каждый из флагов, управляющих поведением сканирования портов:
-z
(нулевые режимы ввода/вывода) – Netcat не будет читать из сетевого подключения или записывать в него. Этот параметр делает процесс сканирования более быстрым.-n
– Говорит Netcat’у отключить DNS-запросы для избегания задержек.-v
– Заставляет Netcat показывать все процессы сканирования портов подробно.
Вы можете видеть ниже, что подключение к порту 22 (SSH) удалось, но все остальные порты не удалось открыть.

Поскольку команда netcat
перечисляет все отсканированные порты, вы получаете много информации, в том числе и ту, которая вам не нужна. В таком случае выполните следующую команду, передав ее через конвейер команде grep
. Эта команда фильтрует только открытые порты с сообщением "succeeded!"
в конце, как показано ниже.
Ниже вы можете видеть, что порт 22 открыт для подключения по SSH, как и ожидалось.

Отправка файлов безопасно между хостами
Помимо сканирования портов, Netcat позволяет безопасно передавать файлы между двумя машинами. Netcat использует протокол TCP для передачи файлов, который более надежен, чем UDP.
Базовый синтаксис для отправки файла с использованием Netcat следующий:
Чтобы отправить файлы с вашего хоста на другую машину:
1. Выполните следующую команду, чтобы начать прослушивание на порту 4444 на принимающем хосте (ubuntu1).
Эта команда не имеет вывода, но ниже приведены опции, влияющие на то, как команда устанавливает порт прослушивания:
-l
– говоритnetcat
прослушивать входящее соединение на указанном TCP-порту. Порт может быть любым числом, но убедитесь, что другие службы не используют ваш предпочтительный порт.
>
– говорит netcat перенаправить все входящие данные в файл по указанному пути (ata_file).
Только пользователь root может привязываться к портам с номерами меньше 1000, поэтому вам нужно выбрать порт больше 1000 как пользователь без прав root. Если вы попытаетесь использовать номер порта меньше 1000 как пользователь без прав root, вы получите следующую ошибку.

2. На отправляющем хосте (ubuntu2) выполните следующую команду echo, которая не имеет вывода, но создает файл с именем ata_file с содержимым “Hello from ATA”.
3. Теперь выполните следующую команду netcat, чтобы отправить ata_file на принимающий хост (ubuntu1). Убедитесь, что вы используете тот же номер порта на принимающем хосте (4444), что и на отправляющем хосте.
Эта команда не имеет вывода, но опция < говорит netcat взять ввод из указанного файла.
4. Наконец, переключитесь на принимающий хост (ubuntu1) и выполните команду cat ниже, чтобы проверить содержимое файла ata_file.
Вы увидите сообщение “Hello from ATA” ниже, указывающее на успешную передачу.

Отправка каталогов на другой хост
До сих пор вы успешно отправили один файл с одного хоста на другой. Но что если вы хотите отправить целый каталог со всеми его подкаталогами и файлами? Netcat тоже может отправлять каталоги!
Предположим, у вас есть каталог резервных копий под названием apache_backup на отправляющем хосте (ubuntu2). Сначала вам нужно сжать каталог, затем отправить и извлечь каталог на принимающем хосте (ubuntu1).
1. На принимающем хосте (ubuntu1) выполните следующую команду, чтобы создать новый каталог под названием apache_backup и перейти (cd) в этот каталог.

2. Затем выполните следующую команду, чтобы начать прослушивание порта 4444 и извлечь сжатые файлы, которые отправляющий хост (ubuntu2) отправляет на принимающий хост (ubuntu1).
Эта команда не выводит информацию, но флаги tar xf – берут ввод из Netcat (стандартный ввод) и извлекают все файлы в текущий каталог.
3. На отправляющем хосте (ubuntu2) выполните следующие команды, чтобы создать каталог (apache_backup), некоторые текстовые файлы и отправить их на принимающий хост (ubuntu1).
Эти команды не выводят информацию, но вы проверите, успешно ли прошла передача, на следующем шаге.
4. Наконец, переключитесь на принимающий хост (ubuntu1), нажмите Ctrl+C, чтобы остановить прослушивание порта 4444, и выполните команду ls, чтобы просмотреть файлы в каталоге apache_backup.
Как видите ниже, файлы каталога apache_backup успешно переданы в каталог apache_backup на принимающем хосте.

Передача всего диска или раздела на другой хост
Отправка всего вашего диска или раздела на другой хост может показаться амбициозной задачей, но это выполнимо, помимо отправки файлов и каталогов. Этот трюк приходится как нельзя кстати, особенно если вам нужно создать резервную копию всего вашего диска перед решительными действиями, такими как перемещение или удаление огромного количества файлов.
1. Запустите команду на принимающем хосте (ubuntu1), чтобы начать прослушивание порта 4444. Эта команда не выводит никаких данных, но разархивирует все входящие данные (bzip2 -d | dd) на /dev/sdb.
/dev/sdb – это ваш второй жесткий диск на машине. Но в этом случае /dev/sdb – это пустой жесткий диск, подключенный к этой машине для этого руководства.
2. На отправляющем хосте (ubuntu2) выполните следующую команду fdisk, чтобы найти все диски и разделы на вашей машине.
Как видно ниже, /dev/vda1/ – это корневой раздел для отправляющего хоста в этом руководстве. Ваш вывод может отличаться в зависимости от конфигурации вашей машины.

3. Запустите следующую команду на отправляющем хосте (ubuntu2), которая не выводит данных, но отправляет раздел /dev/vda1 на принимающий хост (ubuntu1) через порт 4444.
Сжатие и отправка раздела на принимающий хост занимает некоторое время, в зависимости от размера раздела.
4. После завершения процесса переключитесь на принимающий хост (ubuntu1), и вы увидите вывод ниже.
Ошибка “Нет свободного места на устройстве” ожидаема, так как /dev/vda1 вероятно больше чем /dev/sdb. Но вы поняли идею! Вы можете использовать Netcat для отправки всего вашего жесткого диска или раздела на другой компьютер.

Наконец, выполните команды на принимающем хосте (ubuntu1), чтобы смонтировать раздел /dev/vda1 и перечислить все файлы в разделе.
Как видно ниже, все файлы и каталоги из /dev/vda1 успешно переданы на /dev/sdb.

Создание минимального веб-сервера
Настройка полноценного веб-сервера, такого как Apache или NGINX, только для диагностики проблемы с веб-сервером, может быть болезненной. Вместо этого создайте минимальный веб-сервер с помощью Netcat, чтобы быстро выявить проблемы с веб-сервером.
Чтобы создать минимальный веб-сервер:
1. Переключитесь на ваш принимающий хост и выполните нижеуказанные команды, чтобы создать корневой каталог (nc-webserver-docroot) для веб-сервера и сценарий оболочки (httpresponse.sh), который генерирует HTTP-ответ.

2. Затем создайте файл index.html в каталоге /root/nc-webserver-docroot/ с помощью вашего предпочтительного редактора и заполните файл указанным ниже кодом. Этот HTML-файл содержит содержимое, которое будет обслуживать веб-сервер Netcat.
3. Создайте файл сценария оболочки с названием httpresponse.sh в каталоге /root/nc-webserver-docroot/ и заполните указанным ниже кодом.
Этот скрипт оболочки возвращает содержимое файла /root/nc-webserver-docroot/index.html в качестве HTTP-ответа любому клиенту, который отправляет запрос на ваш веб-сервер Netcat.
4. Теперь выполните команду chmod ниже, которая не имеет вывода, но делает файл httpresponse.sh исполняемым (+x).
5. Выполните команду ncat ниже, чтобы запустить веб-сервер Netcat на порту 7777.
Убедитесь, что замените порт 7777 на номер порта по вашему выбору, который не используется другим сервисом на вашей системе.
Следующие опции влияют на поведение веб-сервера Netcat:
-l
– указывает Ncat слушать входящее подключение.
-v
– включает режим подробного отображения всех входящих HTTP-запросов в вашем терминале.
-c - указывает путь к сценарию httpresponse.sh, который генерирует HTTP-ответы.
- -keep-open – сохраняет открытым слушатель Ncat даже после закрытия первого соединения. Эта опция полезна, если вы тестируете свой веб-сервер с несколькими клиентами.
Вы увидите следующий вывод, когда веб-сервер Netcat запустится и будет слушать порт 7777 на всех доступных сетевых интерфейсах.

6. Теперь откройте еще один терминал и выполните следующую команду, чтобы протестировать ваш веб-сервер Netcat (http://localhost:7777).
Результат ниже показывает, что веб-сервер Netcat работает как ожидается и может возвращать содержимое файла /root/nc-webserver-docroot/index.html в качестве HTTP-ответа.

7. Наконец, вернитесь к терминалу, где запущен веб-сервер Netcat. Вы увидите, что веб-сервер Netcat получил и обработал HTTP-запрос от клиента curl.
Поздравляем! Вы успешно создали минимальный веб-сервер Netcat для проверки вашей сетевой связи!

Заключение
В этом руководстве вы узнали, как использовать Netcat для повышения уровня ваших навыков сетевого взаимодействия и отладки. Вы сканировали открытые порты, передавали файлы и создали минимальный веб-сервер. И на данном этапе вы можете решать множество проблем сетевого взаимодействия в реальном мире с помощью этой мощной сетевой утилиты!
Имея эти новые знания, почему бы вам не усовершенствовать свои сетевые навыки еще больше и не стать опытным пользователем в области Кибербезопасности?