Полезные трюки при работе с netcat / Блог компании Pentestit / Хабр

Перевод: A Unix Utility You Should Know About: Netcat
Автор: Peteris Krumins

Это второй пост из серии статей о Unix утилитах, которые Вам следовало бы знать. В этой статье я представляю Вам утилиту netcat или просто nc.

Утилиту Netcat часто называют эдаким «Швейцарским армейским ножом», в хорошем смысле этого слова. Функционал netcat полезен в той-же степени, в какой полезна многофункциональность и сподручность зарекомендовавшего себя карманного Швейцарского армейского ножа. Некоторые из ее возможностей включают сканирование портов, передачу файлов, прослушивание портов и она может быть использована как бэкдор.

В 2006 году netcat получила 4-ое место в опросе «100 утилит сетевой безопасности», поэтому она — это определенно тот инструмент, который необходимо знать.

Содержание

Как пользоваться nc?

Начнем с нескольких простых примеров и далее будем их использовать как базовые.

Если Вы помните, я говорил, что netcat это Швейцарский армейский нож. Чем-бы этот нож был, если бы его нельзя было использовать как обычный нож? Вот почему netcat может использоваться вместо обычного telnet:

$ nc www.google.com 80

В действительности он более удобный чем обычный telnet, потому что Вы можете завершить соединение в любое время, нажав Ctrl+C и он обрабатывает двоичные данные как обычные (никаких escape последовательностей, ничего).

Вы можете добавить параметр “-v” для более подробного вывода результатов действий, и параметр (-vv) для получения статистики о том, сколько байт было передано во время текущего сеанса соединения.

Netcat может быть использован в качестве сервера. Если Вы запустите его, как указано ниже, он будет слушать на порту 12345 (на всех интерфейсах):

$ nc -l -p 12345

Теперь если Вы подключитесь к порту 12345 этого хоста, все, что Вы набираете будет передано удаленной стороне, что говорит нам о том, что netcat можно использовать как чат сервер. Запустите на одном из компьютеров:

# На компьютере A с IP 10.10.10.10
$ nc -l -p 12345

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

# На компьютере B
$ nc 10.10.10.10 12345

Теперь обе стороны могут переговариваться!

Такой способ разговора, когда обе стороны могут разговаривать друг с другом делает возможным использование nc для операций ввода/вывода через сеть! К примеру, Вы можете послать целую директорию с одного компьютера на другой организовав tar конвейер через nc на первом компьютере, и перенаправив вывод в другой tar процесс на втором.

Предположим, Вы хотите переслать файлы из директории /data компьютера A с IP 192.168.1.10 на компьютер B (с любым IP). Это просто:

# На компьютере A с IP 192.168.1.10
$ tar -cf — /data | nc -l -p 6666

# На компьютере B
$ nc 192.168.1.10 6666 | tar -xf —

Не забудьте скомбинировать конвейер с Рipe Viewer, который был описан в предыдущей статье, что-бы посмотреть статистику того, как быстро происходит передача!

Одиночный файл может быть послан проще:

# На компьютере A с IP 192.168.1.10
$ cat file | nc -l -p 6666

# На компьютере B
$ nc 192.168.1.10 6666 > file

Вы даже можете скопировать и восстановить целый диск, с помощью nc:

# На компьютере A с IP 192.168.1.10
$ cat /dev/hdb | nc -l -p 6666

# На компьютере B
$ nc 192.168.1.10 6666 > /dev/hdb

Заметим: Опция “-l” не может быть использована совместно с “-p” на Mac компьютерах! Решение, — просто заменить “-l -p 6666? на “-l 6666?. Как здесь:

# теперь nc слушает на порту 6666 для Mac компьютеров
$ nc -l 6666

Незаурядное использование netcat — сканирование портов. Netcat не лучший инструмент для такой работы, но он с этим справляется (лучший, конечно-же nmap):

$ nc -v -n -z -w 1 192.168.1.2 1-1000
(UNKNOWN) [192.168.1.2] 445 (microsoft-ds) open
(UNKNOWN) [192.168.1.2] 139 (netbios-ssn) open
(UNKNOWN) [192.168.1.2] 111 (sunrpc) open
(UNKNOWN) [192.168.1.2] 80 (www) open
(UNKNOWN) [192.168.1.2] 25 (smtp) : Connection timed out
(UNKNOWN) [192.168.1.2] 22 (ssh) open

Параметр “-n” предотвращает от просмотра DNS, “-z” не ждет ответа от сервера, и “-w 1? задает таймаут для соединения в 1 секунду.

Другое нетривиальное использование netcat в роли прокси. И порт и хост могут быть перенаправлены. Посмотрите на этот пример:

$ nc -l -p 12345 | nc www.google.com 80

Эта команда запускает nc на порту 1234 и перенаправляет все соединения на google.com:80. Если теперь Вы подключитесь к этому компьютеру на порту 12345 и сделаете запрос, Вы обнаружите, что в ответ не получаете никаких данных. Это правильно, потому-что мы не установили двунаправленный канал. Если Вы добавите второй канал, Вы получите Ваши данные на другом порту:

$ nc -l -p 12345 | nc www.google.com 80 | nc -l -p 12346

После посылки запроса на порт 12345, получите Ваши данные ответа на порту 12346.

Вероятно самая мощная возможность netcat — запустить любой процесс как сервер:

$ nc -l -p 12345 -e /bin/bash

Параметр “-e” пораждает выполнение ввода и вывода перенаправляемого через сетевой сокет. Теперь, если Вы подключитесь к хосту на порту 12345, Вы можете использовать bash:

$ nc localhost 12345
ls -las
total 4288
4 drwxr-xr-x 15 pkrumins users 4096 2009-02-17 07:47 .
4 drwxr-xr-x 4 pkrumins users 4096 2009-01-18 21:22 ..
8 -rw——- 1 pkrumins users 8192 2009-02-16 19:30 .bash_history
4 -rw-r—r— 1 pkrumins users 220 2009-01-18 21:04 .bash_logout

Последствия таковы, что nc это популярный инструмент хакера и с его помощью можно очень легко сделать бэкдор. На Linux сервере вы можете запустить /bin/bash а на Windows cmd.exe и иметь в своих руках полный контроль.

Это все, что я хотел сказать. Вам знакомы какие-либо другие полезные приемы работы с netcat, которые здесь не описаны?

Как установить nc?

Если у Вас Debian или система базирующаяся на Debian, такая как Ubuntu, сделайте следующее:

$ sudo aptitude install netcat

Если у Вас Fedora или система базирующаяся на Fedora, такая как CentOS, сделайте:

$ sudo yum install netcat

Если у Вас Slackware, FreeBSD, NetBSD, Solaris или Mac, скачайте исходники nc и сделайте:

$ tar -zxf nc-version.tar.gz
$ cd nc-version
$ ./configure && sudo make install

Еще способ сделать это на Mac, если у Вас есть MacPorts:

$ sudo port install netcat

На Slackware Вы можете установить ее как пакет из пакетной директории:

$ sudo installpkg nc-1.10-i386-1.tgz

Если у Вас Windows, скачайте порт Windoze с securityfocus.

Руководство по утилите может быть найдено в man nc.

Приятного времяпровождения вместе с nc, до следующего раза!

Почитать еще по данной теме :

Обязательные поля помечены *

Полезные примеры использования утилиты netcat в Linux

Оригинал: Useful netcat examples on Linux
Автор: Dan Nanni
Дата публикации: 27 января 2014 г.
Перевод: А.Панин
Дата перевода: 7 сентября 2016 г.

Обычно называемая «швейцарским ножом» для TCP/IP-сетей, утилита является чрезвычайно гибким инструментом, позволяющим выполнять практически все возможные действия с TCP/UDP-сокетами в Linux. Это один из наиболее популярных инструментов для диагностики и экспериментов с сетями в среде системных администраторов.

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

Учтите, что при использовании nc для приема соединений на портах известных сетевых служб (0-1023) вам понадобятся привилегии пользователя root. Во всех остальных случаях для корректной работы nc достаточно прав обычного пользователя.

1. Проверка наличия определенного открытого TCP-порта на удаленном узле

$ nc -vn 192.168.233.208 5000 nc: connect to 192.168.233.208 5000 (tcp) failed: Connection refused $ nc -v 192.168.233.208 22 Connection to 192.168.233.208 22 port [tcp/ssh] succeeded! SSH-2.0-OpenSSH_6.0p1 Debian-4

2. Отправка тестового UDP-пакета на удаленный узел

Приведенная ниже команда предназначена для отправки тестового UDP-пакета с задержкой в 1 секунду на порт 5000 удаленного узла с заданным адресом.

$ echo -n "foo" | nc -u -w1 192.168.1.8 5000

3. Сканирование TCP-портов на удаленном узле

Приведенная ниже команда предназначена для сканирования портов из диапазонов [1-1000] и [2000-3000] и вывода списка открытых портов.

$ nc -vnz -w 1 192.168.233.208 1-1000 2000-3000

4. Копирование файла (например, my.jpg) с узла с именем hostA.com на узел с именем hostB.com

На узле с именем hostB.com (принимающая сторона):

$ nc -lp 5000 > my.jpg

На узле с именем hostA.com (передающая сторона):

$ nc hostB.com 5000 < my.jpg

5. Передача директории (со всем содержимым) с узла hostA.com на узел hostB.com

На узле с именем hostB.com (принимающая сторона):

$ nc -l 5000 | tar xvf —

На узле с именем hostA.com (передающая сторона):

$ tar cvf — /path/to/dir | nc hostB.com 5000

6.

все про NETCAT

Сканирование UDP-портов на удаленном узле

$ nc -vnzu 192.168.1.8 1-65535 Connection to 192.168.1.8 68 port [udp/*] succeeded! Connection to 192.168.1.8 5353 port [udp/*] succeeded! Connection to 192.168.1.8 16389 port [udp/*] succeeded! Connection to 192.168.1.8 38515 port [udp/*] succeeded! Connection to 192.168.1.8 45103 port [udp/*] succeeded!

Приведенная выше команда позволяет вывести список открытых, принимающих данные UDP-портов на удаленном сервере.

7. Ожидание данных на UDP-порту и вывод принятых данных в текстовом формате

Приведенная ниже команда позволяет принимать сообщения (строки текста) на заданном UDP-порту.

$ nc -u localhost 5000

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

$ while true; do nc -u localhost 5000; done

8. Сохранение (сжатого) файла образа жесткого диска (например, /dev/sdb) на удаленном сервере

На удаленном сервере:

$ nc -lp 5000 | sudo dd of=/backup/sdb.img.gz

На локальном узле, на котором установлен жесткий диск:

$ dd if=/dev/sdb | gzip -c | nc remote_server.com 5000

9. Восстановление содержимого жесткого диска из сжатого файла образа, сохраненного на удаленном сервере

На локальном узле:

$ nc -lp 5000 | gunzip -c | sudo dd of=/dev/sdb

На удаленном сервере, на котором сохранен файл образа жесткого диска (например, /backup/sdb.img.gz):

$ cat /backup/sdb.img.gz | nc my_local_host.com 5000

10. Передача статической веб-страницы по аналогии с веб-сервером

Выполните приведенную ниже команду для запуска веб-сервера, который будет передавать веб-страницу с именем test.html клиентам, соединяющимся с портом 8000.

$ while true; do nc -lp 8000 < test.html; done

Теперь проверьте доступность веб-страницы, перейдя с помощью веб-браузера по адресу: . Обратите внимание на то, что для использования стандартного порта веб-сервера под номером 80 вам придется запустить nc с привилегиями пользователя root следующим образом:

$ while true; do sudo nc -lp 80 < test.html; done

11. Организация незащищенного чата между двумя узлами

На первом узле (192.168.233.203):

$ nc -lp 5000

На втором узле:

$ nc 192.168.233.203 5000

После выполнения двух приведенных выше команд все символы, введенные в окно терминала на любом из узлов появятся в окне терминала другого узла.

12. Запуск «удаленной командной оболочки», позволяющей выполнять произвольные команды на удаленном узле в процессе работы с локальным узлом

На удаленном узле (192.168.233.208):

$ nc -lp 5000 -e /bin/bash

На локальном узле:

$ nc 192.168.233.208 5000

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

13. Создание веб-прокси для определенного веб-сайта (например, google.com)

$ mkfifo proxypipe $ while true; do nc -l 5000 0<proxypipe | nc www.google.com 80 1> proxypipe; done

Приведенные выше команды позволяют создать именованный канал и использовать утилиту nc для перенаправления всех соединений по протоколу TCP с портом 5000 локального узла на веб-сайт http://www.google.com посредством двунаправленного канала. После выполнения этих команд вы сможете попасть на главную страницу поисковой системы Google, введя в адресную строку веб-браузера адрес http://127.0.0.1:5000.

14. Создание SSL-прокси для определенного веб-сайта (например, google.com)

$ mkfifo proxypipe $ mkfifo proxypipe2 $ nc -l 5000 -k > proxypipe < proxypipe2 & $ while true do; openssl s_client -connect www.google.com:443 -quiet < proxypipe > proxypipe2; done

Приведенные выше команды позволяют использовать утилиту nc для создания прокси-сервера с поддержкой протокола SSL, позволяющего устанавливать соединения с веб-сайтом google.com.

15. Потоковая передача видеофайла с сервера и его просмотр с помощью проигрывателя mplayer на клиентской машине

На сервере потоковой передачи видео (192.168.233.208):

$ cat video.avi | nc -l 5000

На клиентской системе:

$ nc 192.168.233.208 5000 | mplayer -vo x11 -cache 3000 —

16. Прием соединений по протоколу TCP на определенном порту с использованием адреса IPv6

Приведенные ниже команды позволяют утилите nc использовать адрес IPv6 при приеме соединений на TCP-порту. Это может понадобиться в процессе тестирования корректности настройки адресации IPv6 в сети.

$ nc -6 -l 5000 $ sudo netstat -nap | grep 5000 tcp6 0 0 :::5000 :::* LISTEN 4099/nc

Если вам понравилась статья, поделитесь ею с друзьями:


Средняя оценка 5 при 1 голосовавших

<<< Назад

Сервис socat

Сервис socat: установка и настройка шлюза Serial-to-TCP порт для передачи данных на сервер MQTT

Вводные

МиниПК: BananaPiPro
Операционная система: ARMBIAN 5.38 stable Debian GNU/Linux 9 (stretch) 4.14.18-sunxi
Установка ОС по ссылке
Описание socat на оф.сайте

Описание

Socat — это утилита которая устанавливает два двунаправленных потока (сокета) и передает данные между ними. Поскольку потоки могут быть построены из большого набора различных типов источников и приемников данных, а также потому, что для потоков могут применяться множество параметров адресов, socat может использоваться для различных целей. На странице с описанием socat можно ознакомиться с полной документацией по этой программе.
В двух словах: программа создает подключение к двум портам и передает данные между ними. Источниками и приемниками, в частности, могут быть файлы, TCP и последовательные (USB и UART) порты. Особенностью программы является то, что она сама инициирует подключение к портам, что позволяет передавать и принимать данные с какого-либо сервиса (например MQTT) по последовательному (USB или UART) порту, который сам не может осуществить подключение к серверу.

Установка socat

В ARMBIAN 5.38 програма уже есть (путь /usr/bin/socat). Но чтобы установить socat достаточно выполнить команду:

На странице оф.сайта можно найти последние версии сервиса.

Запуск socat

Будем подключать /dev/ttyUSB0 (в данном примере это USB to UART конвертер) к брокеру MQTTmosquitto на локальном порту localhost:1883.
Команда имеет формат:

<options> — из описания к программе: Socat предоставляет некоторые параметры командной строки, которые изменяют поведение программы.

Установка NetCat на Windows

Они не имеют ничего общего с так называемыми параметрами адресов, которые используются как части спецификаций адресов.
<Addr1> <Addr2> — адреса для подключения. Из описания к программе: С аргументами командной строки адреса пользователь дает инструкции socat и необходимую информацию для установления потоков байтов.Спецификация адреса обычно состоит из ключевого слова типа адреса, нулевых или более обязательных параметров адреса, разделенных символом «:» от ключевого слова и друг от друга, и нулевого или большего количества параметров адреса, разделенных символом «,».
И так, для своего соединения, получилась вот такая команда:

Где:
-T60 — таймаут 60 сек.
-T <timeout> — опция, общий тайм-аут бездействия: когда socat уже находится в цикле передачи (то есть осуществленно подключение к портам), и ничего не произошло в течение <timeout> секунд (данные не поступали, прерывания не возникало …), тогда он заканчивается.

file:/dev/ttyUSB0 — первый адрес для подключения. Из описания к программе: Для адресов, которые работают с tty (например, stdio, file:/dev/tty, exec: …, pty), параметры терминала, определенные в механизме term UNX, становятся доступными в качестве параметров для параметра адреса. Обратите внимание, что изменения параметров вашего интерактивного терминала остаются в силе после прекращения участия socat , поэтому вам может потребоваться ввести «reset» или «stty sane» в вашу оболочку.

rawer — параметр адреса. Передает данные в "сыром", не обработанном виде. Эта опция неявно отключает эхо.

echo=0 — отключает эхо.
echo=<bool> — Включает или отключает локальное эхо.

b19200 — устанавливает скорость передачи 19200 бод.
b<speed> — Устанавливает скорость передачи. Примечание из описания к программе: В некоторых операционных системах эти параметры могут быть недоступны. Вместо этого используйте ispeed=<unsigned-int> для входных данных или ospeed=<unsigned-int> для выходных данных.

cstopb=1 — устанавливает два стоповых бита.
cstopb=<bool> — Устанавливает два стоповых бита, а не один.

cs8 — устанавливает 8 бит данных.
cs5 | cs6 | cs7 | cs8 | csize=<0|1|2|3> — Устанавливает размер символа 5, 6, 7 или 8 бит соответственно.

parenb=0 — выключить проверку четности.
parenb=<bool> — Включить формирование четности на выходе и проверку четности для ввода.

TCP4:localhost:1883 — подключение к TCP порту.
TCP4:<host>:<port> — Подключается к <порт> [служба TCP] на <host> [IP-адрес] с использованием TCP/IP.

reuseaddr — Позволяет другим сокетам связываться с адресом, даже если его части (например, локальный порт) уже используются socat.

После запуска команды, программа будет ждать данные на обоих портах в течении 60 секунд, и завершится когда окончится время таймаута или когда один из сокетов закроет соединение (это сделает mosquitto, т.к. для брокера mosquitto таймаут, как правило, тоже 60 секунд, поэтому он и закроет сокет). Если на последовательный порт предавать данные для сервера в формате MQTT (CONNECT, PUBLISH, SUBSCRIBE, UNSUBSCRIBE и PINGREQ), то связь будет поддерживаться до подачи команды DISCONNECT, после которой сервер также закроет соединение.

Скрипт для запуска socat

Для удобного использования был написан скрипт для управления сервисом socat. Его разместил в /etc/init.d/socat_sh для старта при загрузке системы:

Скрипт проверяет наличее DEV=/dev/ttyUSB0 и запускает socat в режиме ожидания на 60 секунд. При завершении соединения востанавливает его.
Наличее аргументов start, stop, restart, status для скрипта требует Debian.
Даем права на запуск:

Заносим в автозагрузку:

Описание данных для протокола MQTT здесь.

Обсуждение (0) (0)

Linux nc command

Updated: 06/16/2017 by Computer Hope

About nc

nc is the command which runs netcat, a simple Unix utility that reads and writesdata across network connections, using the TCP or UDPprotocol. It is designed to be a reliable "back-end" tool that can be used directly or 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. Common uses include:

nc syntax

nc [-46bCDdhklnrStUuvZz] [-I length] [-i interval] [-O length] [-P proxy_username] [-p source_port] [-q seconds] [-s source] [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port]

Options

-4 Forces nc to use IPv4 addresses only.
-6 Forces nc to use IPv6 addresses only.
-b Allow broadcast.
-C Send CRLF as line-ending.
-D Enable debugging on the socket.
-d Do not attempt to read from stdin.
-h Prints out nc help.
-Ilength Specifies the size of the TCP receive buffer.
-iinterval Specifies a delay time interval between lines of text sent and received. Also, causes a delay time between connections to multiple ports.
-k Forces nc to stay listening for another connection after its current connection is completed. It is an error to use this option without the -l option.
-l Used to specify that nc should listen for an incoming connection rather than initiate a connection to a remote host. It is an error to use this option in conjunction with the -p, -s, or -z options. Additionally, any timeouts specified with the -w option are ignored.
-n Do not do any DNS or service lookups on any specified addresses, hostnames or ports.
-Olength Specifies the size of the TCP send buffer.
-Pproxy_username Specifies a username to present to a proxy server that requires authentication. If no username is specified then authentication will not be attempted. Proxy authentication is only supported for HTTP CONNECT proxies at present.
-psource_port Specifies the source port nc should use, subject to privilege restrictions and availability.
-qseconds after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
-r Specifies that source or destination ports should be chosen randomly instead of sequentially within a range or in the order that the system assigns them.
-S Enables the RFC 2385 TCP MD5 signature option.
-ssource Specifies the IP of the interface that is used to send the packets. For UNIX-domain datagram sockets, specifies the local temporary socket file to create and use so that datagrams can be received. It is an error to use this option in conjunction with the -l option.
-Ttoskeyword Change IPv4 TOS value. toskeyword may be one of critical, inetcontrol, lowcost, lowdelay, netcontrol, throughput, reliability, or one of the DiffServ Code Points: ef, af11af43, cs0cs7; or a number in either hex or decimal.
-t Causes nc to send RFC 854 DON’T and WON’T responses to RFC 854 DO and WILL requests.

This makes it possible to use nc to script telnet sessions.

-U Specifies to use UNIX-domain sockets.
-u Use UDP instead of the default option of TCP. For UNIX-domain sockets, use a datagram socket instead of a stream socket. If a UNIX-domain socket is used, a temporary receiving socket is created in /tmp unless the -s flag is given.
-Vrtable Set the routing table to be used. The default is 0.
-v Have nc give more verbose output.
-wtimeout Connections which cannot be established or are idle timeout after timeout seconds. The -w flag has no effect on the -l option, i.e. nc will listen forever for a connection, with or without the -w flag. The default is no timeout.
-Xproxy_protocol Requests that nc should use the specified protocol when talking to the proxy server. Supported protocols are "4" (SOCKS v.4), "5" (SOCKS v.5) and "connect" (HTTPS proxy). If the protocol is not specified, SOCKS version 5 is used.
-xproxy_address[:port] Requests that nc should connect to destination using a proxy at proxy_address and port. If port is not specified, the well-known port for the proxy protocol is used (1080 for SOCKS, 3128 for HTTPS).
-Z DCCP mode.
-z Specifies that nc should just scan for listening daemons, without sending any data to them. It is an error to use this option in conjunction with the -l option.

destination can be a numerical IP address or a symbolic hostname (unless the -n option is given). In general, a destination must be specified, unless the -l option is given (in which case the local host is used). For UNIX-domain sockets, a destination is required and is the socket path to connect to (or listen on if the -l option is given).

port can be a single integer or a range of ports. Ranges are in the form nn-mm. In general, a destination port must be specified, unless the -U option is given.

Client/Server Model

It is quite simple to build a very basic client/server model using nc. On one console, start nc listening on a specific port for a connection. For example:

nc -l 1234

nc is now listening on port 1234 for a connection.

Установка NetCat на Windows

On a second console (or a second machine), connect to the machine and port being listened on:

nc 127.0.0.1 1234

There should now be a connection between the ports. Anything typed at the second console will be concatenated to the first, and vice-versa. After the connection has been set up, nc does not really care which side is being used as a ‘server’ and which side is being used as a ‘client’. The connection may be terminated using an EOF (‘^D’).

There is no -c or -e option in modern netcat, but you still can execute a command after connection being established by redirecting file descriptors. Be cautious here because opening a port and let anyone connected execute arbitrary command on your site is DANGEROUS. If you really need to do this, here is an example:

On ‘server’ side:

rm -f /tmp/f; mkfifo /tmp/fcat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

On ‘client’ side:

nc host.example.com 1234

(shell prompt from host.example.com)

By doing this, you create a fifo at /tmp/f and make nc listen at port 1234 of address 127.0.0.1 on ‘server’ side, when a ‘client’ establishes a connection successfully to that port, /bin/sh gets executed on ‘server’ side and the shell prompt is given to ‘client’ side.

When connection is terminated, nc quits as well. Use -k if you want it keep listening, but if the command quits this option won’t restart it or keep nc running. Also don’t forget to remove the file descriptor once you don’t need it anymore:

rm -f /tmp/f

Data Transfer

The example in the previous section can be expanded to build a basic data transfer model. Any information input into one end of the connection will be output to the other end, and input and output can be easily captured to emulate file transfer.

Start by using nc to listen on a specific port, with output captured into a file:

nc -l 1234 > filename.out

Using a second machine, connect to the listening nc process, feeding it the file which is to be transferred:

nc host.example.com 1234 < filename.in

After the file has been transferred, the connection will close automatically.

Talking To Servers

It is sometimes useful to talk to servers "by hand" rather than through a user interface.

It can aid in troubleshooting, when it might be necessary to verify what data a server is sending in response to commands issued by the client. For example, to retrieve the homepage of a website:

printf «GET / HTTP/1.0\r\n\r\n» | nc host.example.com 80

Note that this also displays the headers sent by the web server. They can be filtered, using a tool such as sed, if necessary.

More complicated examples can be built up when the user knows the format of requests required by the server. As another example, an email may be submitted to an SMTP server using:

nc [-C] localhost 25 << EOF HELO host.example.com MAIL FROM:<[email protected]> RCPT TO:<[email protected]> DATA Body of email. . QUIT EOF

Port Scanning

It may be useful to know which ports are open and running services on a target machine. The -z flag can be used to tell nc to report open ports, rather than initiate a connection. Usually it’s useful to turn on verbose output to stderr by use this option in conjunction with -v option.

For example:

nc -zv host.example.com 20-30Connection to host.example.com 22 port [tcp/ssh] succeeded! Connection to host.example.com 25 port [tcp/smtp] succeeded!

The port range was specified to limit the search to ports 20 — 30, and is scanned by increasing order.

You can also specify a list of ports to scan, for example:

nc -zv host.example.com 80 20 22nc: connect to host.example.com 80 (tcp) failed: Connection refused nc: connect to host.example.com 20 (tcp) failed: Connection refused Connection to host.example.com port [tcp/ssh] succeeded!

The ports are scanned by the order you given.

Alternatively, it might be useful to know which server software is running, and which versions. This information is often contained within the greeting banners. To retrieve these, it is necessary to first make a connection, and then break the connection when the banner has been retrieved. This can be accomplished by specifying a small timeout with the -w flag, or perhaps by issuing a «QUIT» command to the server:

echo «QUIT» | nc host.example.com 20-30SSH-1.99-OpenSSH_3.6.1p2 Protocol mismatch. 220 host.example.com IMS SMTP Receiver Version 0.84 Ready

nc examples

nc -p 31337 -w 5 host.example.com 42

Opens a TCP connection to port 42 of host.example.com, using port 31337 as the source port, with a timeout of 5 seconds.

nc -u host.example.com 53

Opens a UDP connection to port 53 of host.example.com.

nc -s 10.1.2.3 host.example.com 42

Opens a TCP connection to port 42 of host.example.com using 10.1.2.3 as the IP for the local end of the connection.

nc -lU /var/tmp/dsocket

Creates and listens on a UNIX-domain stream socket.

nc -x10.2.3.4:8080 -Xconnect host.example.com 42

Connects to port 42 of host.example.com via an HTTP proxy at 10.2.3.4, port 8080. This example could also be used by ssh.

nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42

The same as the above example, but this time enabling proxy authentication with username "ruser" if the proxy requires it.

Related commands

ifconfig — View or modify the configuration of network interfaces.

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

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