Nmap Ncat
Слушать порт | |
Оправлять сообщения | |
Вывод в файл | |
Установка | |
Обмен файлами | |
Общий синтаксис | |
Сканирование портов | |
Сканирование портов на localhost | |
Python + nc: сканер портов | |
Похожие статьие |
Слушать порт
ncat -l -p 9150 -k
Оправлять сообщения
ncat 10.6.1.197 9150
В данном примере я слушаю и отправляю на одном и том же IP
Вывод Netсat в файл
Netcat разделяет стандартный вывод stdout (поток номер 1) и стандартный вывод ошибок stderr (поток номер 2) , поэтому, чтобы совместить весь вывод в одни файл в конец команды нужно добавить 2>&1
netcat -z -vv domain 4845-4855 > openports.txt 2>&1
Установка
sudo apt -y install ncat
sudo yum -y install ncat
Обмен файлами с помощью Netcat
Чтобы переслать файл с одного компьютера на другой.
На принимающем ПК введите
nc -l -p номер_порта > название_файла.расширение
Например:
nc -l -p 9150 > settings.txt
Затем на отправляющем ПК
nc -w 3 IP_адрес номер_порта < название_файла.расширение
Например:
nc -w 3 10.6.1.1 9150 settings.txt
Netcat
Данное руководство посвящено работе утилиты netcat. Этот своеобразный «швейцарский армейский нож» сетевых инструментов может быть полезен при мониторинге, тестировании и передаче данных через сетевые соединения.
В данном руководстве используется сервер Ubuntu 12.04, но в целом утилита netcat доступна практически на любом современном дистрибутиве. Ubuntu поставляется с BSD-вариантом утилиты, который и будет использован в этой статье. Другие версии могут работать по-другому или предоставлять другие опции.
Общий синтаксис
По умолчанию netcat работает путем инициации соединения TCP с удаленным хостом.
Базовый синтаксис:
netcat [опции] хост порт
Такая команда инициирует TCP-соединение с указанным хостом через заданный порт.
В основном, она функционирует аналогично старой команде Linux — telnet.
Имейте в виду, что ваше соединение будет установлено в незашифрованном виде.
Чтобы вместо установления TCP-соединения отправить UDP-пакет, используйте опцию -u:
netcat -u хост порт
Чтобы задать диапазон портов, укажите первый и последний порт диапазона через тире:
netcat хост первый_порт-последний_порт
Обычно данная команда используется с дополнительными флагами.
На большинстве систем можно использовать netcat или nc. Они взаимозаменяемы, поскольку являются псевдонимами для одной команды.
Использование Netcat для сканирования портов
Чаще всего netcat используют как сканер портов.
Хотя Netcat, вероятно, не самый умный инструмент для выполнения этой задачи (в большинстве случаев для этого больше подойдет nmap), он может выполнять простое сканирование портов, чтобы быстро определить открытые порты.
Для этого укажите диапазон портов для сканирования (как показано выше), а также используйте опцию -z, которая выполняет сканирование вместо установления соединений.
К примеру, чтобы просканировать все порты до порта 1000, выполните:
netcat -z -v domain.com 1-1000
Просканировать все порты от порта 4847 до порта 4899 и вывести результат в файл ports.txt
nc -z -v domain.com 4847-4899 > ports.txt 2>&1
Как видите, кроме опции -z в данной команде использована опция -v, благодаря которой netcat выводит более подробную информацию.
Результат имеет такой вид:
nc: connect to domain.com port 1 (tcp) failed: Connection refused
nc: connect to domain.com port 2 (tcp) failed: Connection refused
nc: connect to domain.com port 3 (tcp) failed: Connection refused
nc: connect to domain.com port 4 (tcp) failed: Connection refused
nc: connect to domain.com port 5 (tcp) failed: Connection refused
nc: connect to domain.com port 6 (tcp) failed: Connection refused
nc: connect to domain.com port 7 (tcp) failed: Connection refused
…
Connection to domain.com 22 port [tcp/ssh] succeeded!
…
Как видите, эта команда выводит достаточно подробный результат, а также сообщает, было ли сканирование каждого отдельного порта успешным или нет.
Это удобно при использовании доменного имени.
Тем не менее, указывая нужные IP-адреса, можно значительно ускорить сканирование. Затем можно использовать флаг -n, чтобы указать, что не нужно разрешать IP-адрес с помощью DNS:
netcat -z -n -v 111.111.111.111 1-1000
Возвращаемые сообщения отправляются в стандартный поток ошибок. Сообщения о стандартных ошибках можно отправлять в стандартный вывод, чтобы фильтровать результаты.
Для перенаправления стандартной ошибки в стандартный вывод используется bash-синтаксис 2>&1; полученные результаты фильтруются с помощью grep:
netcat -z -n -v 111.111.111.111 1-1000 2>&1 | grep succeeded
Connection to 111.111.111.111 22 port [tcp/*] succeeded!
Итак, теперь можно видеть, что единственный открытый порт на удаленной машине в диапазоне 1-1000 — это порт 22, стандартный порт SSH.
Просканируем порты 4847-4899 и сохраним только успешные результаты в файл openports.txt
nc -z -v askqa.ru 4847-4899 2>&1 | grep succeeded > openports.txt
Сканирование портов на localhost
Чтобы просканировать открытые порты на локальной машины
sudo nmap -sS localhost
Starting Nmap 6.40 ( http://nmap.org ) at 2024-12-13 00:01 EEST Nmap scan report for localhost (127.0.0.1) Host is up (0.000028s latency). Other addresses for localhost (not scanned): 127.0.0.1 Not shown: 991 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 53/tcp open domain 111/tcp open rpcbind 631/tcp open ipp 3389/tcp open ms-wbt-server 5907/tcp open unknown 6007/tcp open X11:7 10000/tcp open snet-sensor-mgmt Nmap done: 1 IP address (1 host up) scanned in 1.69 seconds
Перечисленные порты могу быть закрыты с помощью Firewall
Другие типы сканирования можно изучить выполнив
nmap --help
SCAN TECHNIQUES:
-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
Python + nc: сканер портов
Простейший сканер портов с использованием
Python
Чтобы выполнить команду nc
используется модуль
subprocess
Для перебора портов используется
цикл for
Запись в файл производится с помощью
менеджера контекста with
#!/usr/bin/python
import subprocess
HOST_IP = "192.168.56.138"
START_PORT = 18079
END_PORT = 18083
for ip in range(START_PORT, END_PORT):
ipstr = str(ip)
result = subprocess.run(["nc", "-z", HOST_IP, ipstr])
if result.returncode == 0:
with open("open_ports.txt", "a") as f:
f.write(f"{ipstr}\n")
Общение с помощью netcat
Команда netcat не ограничивается отправкой пакетов TCP и UDP. Она также может прослушивать порт
на соединения и пакеты, что дает возможность подключить два экземпляра netcat в отношении
«клиент-сервер».
Какой компьютер является сервером, а какой — клиентом,
существенно только во время
начальной настройки.
После того, как соединение установлено, связь одинакова в обоих направлениях.
На одной машине нужно сказать netcat прослушивать определенный порт на подключения. Это
делается с помощью параметра -l, после которого указывается номер порта:
netcat -l 4444
Выполнив эту команду, netcat прослушивает соединения TCP на порту 4444. Теперь обычный пользователь (не root) не сможет открывать какие-либо порты до 1000 (для безопасности сервера).
На втором сервере нужно подключиться к первой машине через указанный порт. Это делается так же, как было показано ранее:
netcat domain.com 4444
После установления соединения может показаться, что ничего не произошло. Но теперь можно отправлять сообщения по обе стороны соединения и они будут видны на обоих серверах.
Введите сообщение и нажмите ENTER. Сообщение появится как на локальном, так и на удаленном сервере. Это работает и в обратном направлении.
Завершив передачу сообщений, нажмите CTRL-D, чтобы прервать TCP-соединение.
Обмен файлами с помощью netcat
Ознакомившись с основными функциями утилиты и выполнив предыдущие примеры, можно перейти к более сложным задачам.
Как уже говорилось, утилита netcat создает TCP-соединения, с помощью которых можно передавать практически любой вид информации, не ограничиваясь набранными пользователем сообщениями. Эти знания можно использовать, чтобы превратить netcat в программу передачи файлов.
Опять же, нужно выбрать одну машину для прослушивания соединений. Однако, вместо того, чтобы печатать информацию на экран (как в предыдущем примере), netcat разместит всю информацию прямо в файл:
netcat -l 4444 > received_file
На втором компьютере нужно создать простой текстовый файл:
echo "Hello, this is a file" > original_file
Теперь можно использовать этот файл в качестве входных данных для создания соединения со слушающим компьютером. Файл будет передаваться так же, как если бы он был набран в интерактивном режиме:
netcat domain.com 4444 < original_file
Как можно видеть, на компьютере, который ожидал соединения, теперь есть новый файл с именем «received_file», содержащий введенные на другом компьютере данные:
cat received_file
Hello, this is a file
Как видите, подобные соединения можно легко использовать для передачи любого рода информации.
К примеру, можно передать содержимое целого каталога; для этого создайте безымянный тарбол, передайте его на удаленную систему и распакуйте его в удаленный каталог.
На принимающей стороне можно использовать следующую команду, чтобы предупредить о том, что нужно получить и распаковать файл:
netcat -l 4444 | tar xzvf -
Тире в конце команды означает, что тарбол будет работать на стандартный ввод, который в настоящее время передается по сети, если соединение установлено.
На стороне, содержащей каталог, который нужно передать, упакуйте данный каталог в архив, а затем отправьте его на удаленный компьютер с помощью netcat:
tar -czf - * | netcat domain.com 4444
На этот раз тире в команде tar значит, что содержимое текущего каталога (как указано символом *) нужно заархивировать и передать, а затем записать результат в стандартный вывод.
Затем это записывается в подключение ТСР, передается другой стороне соединения и распаковывается в текущий каталог удаленного компьютера.
Это лишь один пример передачи более сложных данных с одного компьютера на другой. Также часто используется команда dd, которая создает образ диска на одной стороне и передает его на удаленный компьютер. Тем не менее, такой подход не охвачен данным руководством.
Netcat как простой веб-сервер
Утилита netcat уже была использована для передачи сообщений и файлов.
Этот же подход
поможет использовать netcat как простой веб-сервер. Это может пригодиться для тестирования готовых страниц.
Для начала нужно создать HTML -файл на одном сервере:
touch index.html
vi index.html
В данном файле можно разместить следующий простой код:
<html>
<head>
<title>Test Page</title>
</head>
<body>
<h1>Level 1 header</h1>
<h2>Subheading</h2>
<p>Normal text here</p>
</body>
</html>
Сохраните и закройте файл.
Данный файл нельзя обслуживать на порту веб-сервера по умолчанию (80) без привилегий root. Потому как обычный пользователь установите порт 8888.
Чтобы протестировать одну страницу и проверить, как она отображается, наберите что-то вроде:
netcat -l 8888 < index.html
Теперь контент можно просмотреть в браузере, посетив:
http://IP_сервера:8888
Эта команда выведет страницу, после чего соединение netcat закроется. При попытке обновить страницу она исчезнет.
Netcat может обслуживать страницу на продолжении неопределенного срока; для этого нужно сделать последнюю команду цикличной при помощи строки:
while true; do nc -l 8888 < index.html; done
Тогда страница будет продолжать получать соединения после того, как первое соединение было прекращено.
Чтобы остановить цикл, наберите CTRL-C.
Этот сервер позволит увидеть, как страница отображается в браузере, но не предоставляет более широкой функциональности. Никогда не используйте такой веб-сервер для обслуживания реальных сайтов: он небезопасен, кроме того, такие простые вещи, как ссылки, не всегда работают правильно.
Итоги
Данное руководство знакомит с основными функциями и использованием netcat. Так как этот инструмент универсален, он может быть использован для диагностики проблем и тестирования базовой функциональности TCP/UDP-соединений.
Кроме того, netcat позволяет общаться и обмениваться информацией между различными компьютерами, что очень важно для быстрого взаимодействия пользователей. Упрощая создание соединения, утилита netcat пытается сделать сетевые взаимодействия компьютеров более удобными, быстрыми и понятными.
Тестирование ПО | |
Разработка ПО | |
DevOps | |
IT | |
Кибербезопасность | |
RFID | |
Web | |
Список открытых API |