Шпаргалка по пробросу портов в SSH (Грэм Хелтон)
- title
- Шпаргалка по пробросу портов в SSH (Грэм Хелтон)
- type
- summary
- summary
- Разбор флагов SSH -L/-R/-D/-J/-A/-g/-t с упором на red team, консоли ~? и ключевого слова Match в конфиге
- parent
- ssh-port-forwarding
- tags
- ssh, networking, security, red-team
- sources
- ssh-cheatsheet-grahamhelton
- created
- 2026-05-21
- updated
- 2026-05-21
- lang
- ru
- translation_of
- ssh-port-forwarding-cheatsheet
- source_updated
- 2026-05-21
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Справочный материал Грэма Хелтона по опциям SSH, разобранным на собственном опыте во время red team проектов. Повсюду фигурируют три хоста: campfire.int (машина оператора), vuln-server.int (точка закрепления) и internal-web.int (целевой хост, слушающий только loopback). Все примеры показаны на HTTP-сервисе, но применимы к любому TCP-сервису.
Мнемоника, проходящая через всю страницу: -L оставляет локальный порт слева (Left) в паре адресов, -R - справа (Right). Как только это улеглось в голове, остальное - просто рутина.
Пять схем проброса
Local (-L): ssh -N -f -L 1337:127.0.0.1:80 root@internal-web.int. Оператор привязывает локальный порт 1337; трафик выходит на 80-м порту на SSH-сервере. Применяется, когда цель слушает только на loopback, а у оператора есть туда доступ по SSH.
Remote (-R): ssh -N -f -R 3000:127.0.0.1:80 root@vuln-server.int. SSH-сервер (vuln-server.int) привязывает порт 3000; трафик выходит на 80-й порт на хосте оператора. Используется для проброса сервиса из сети, внутри которой находится оператор, но до которой сеть SSH-сервера напрямую дотянуться не может.
Dynamic (-D): ssh -N -f -D 8080 root@vuln-server.int. Оператор поднимает локальный SOCKS5-слушатель; SSH-сервер выступает точкой выхода. Используется вместе со строкой socks5 127.0.0.1 8080 в /etc/proxychains.conf или настройкой Firefox "Ручная настройка прокси -> SOCKS v5". DNS-over-SOCKS работает достаточно ненадёжно, поэтому в примерах с curl Хелтон использует прямые IP-адреса.
Jumphost (-J): ssh -J a@hop1,b@hop2 c@target. Цепочка хостов через запятую; аутентификация происходит на каждом хопе. Путь в статье: campfire.int -> vuln-server.int -> internal-web.int -> dns.int.
Agent forwarding (-A): ssh -A -J root@vuln-server.int root@internal-web.int. Пробрасывает сокет локального ssh-agent вдоль цепочки хопов, чтобы целевой хост мог использовать загруженные ключи оператора без их копирования. Несёт реальные риски - см. ssh-agent-forwarding-risk.
Связка флагов -N -f встречается почти в каждом примере. -N отключает выполнение команды, -f отправляет сессию в фоновый режим; вместе они создают проброс без открытия интерактивной оболочки, занимающей терминал.
Другие флаги
-g (gateway mode): ssh -N -f -g -L 2222:localhost:22 root@internal-web.int. По умолчанию слушатель -L привязывается к 127.0.0.1; -g заставляет его привязаться к 0.0.0.0, чтобы к нему могли обращаться другие хосты. Превращает SSH-сервер в pivot-узел для любого участника его локальной сети.
-t (force TTY): ssh user@host -t top. Запускает интерактивную команду на удалённом хосте с выделением настоящего TTY. Без этого программы на базе curses завершаются с ошибкой.
Интерактивная консоль ~?
Уже находясь внутри SSH-сессии, ~? (тильда и вопросительный знак в начале новой строки) открывает escape-меню. Два практических сценария:
~.- немедленно завершить сессию. Полезно, когда оболочка зависла.~C- открыть командную строку SSH внутри работающей сессии. Оттуда с помощью-D 8080можно задним числом добавить динамический проброс, превратив обычную сессию оболочки в SOCKS pivot прямо на лету без переподключения.
Это работает, потому что последовательности с префиксом-тильдой перехватываются локальным SSH-клиентом до того, как уйдут на удалённую сторону.
Конфигурационный файл SSH
~/.ssh/config позволяет оператору заранее зарегистрировать хосты с нестандартными параметрами. Пример Хелтона:
host internal-web.int
User root
IdentityFile /home/smores/ssh_agent/internal-web-no-pw
Port 2222
Порядок приоритета: флаги командной строки переопределяют конфиг, конфиг переопределяет значения по умолчанию. Запуск ssh graham@internal-web.int переопределит User root из конфига.
Неочевидные ключевые слова:
ProxyJump- то же самое, что и-J.ForwardAgent- то же самое, что и-A.IdentityFile- то же самое, что и-i.Match- условные блоки конфигурации. В примере Хелтона проверяетсяexport | grep PROXYME=TRUE, и блок применяется только тогда, когда grep завершается с кодом 0. Позволяет одной и той же записи хоста вести себя по-разному в зависимости от переменных окружения, сети, имени хоста или любого теста через exec.
scp и большинство производных от SSH утилит читают этот файл по умолчанию; если нет, -F ~/.ssh/config форсирует его чтение.
Полезные однострочники для управления ключами
ssh-copy-id -i internal-web user@hostзагружает соответствующий.pubв~/.ssh/authorized_keysна удалённом хосте.ssh-keygen -t ecdsa -b 521генерирует пару ключей ECDSA-P521 (по умолчанию используется RSA; обычно рекомендуются более длинные или не-RSA ключи).ssh-keygen -lf <keyfile>выводит отпечаток (fingerprint) и битовую длину.
Почему это ориентировано на red team
Подача материала ориентирована на атаку, но сами техники представляют собой стандартное поведение OpenSSH. SSH - канонический инструмент концепции living-off-the-land: клиент есть на любой Unix-подобной системе, sshd запущен на большинстве серверов, а каждый пакет выглядит как обычный трафик администратора. Режимы проброса превращают его в pivot-узел 4-го уровня, SOCKS-прокси и поверхность для повторного использования учётных данных без установки какого-либо стороннего ПО.
Разбор рисков безопасности при пробросе ssh-agent, упомянутый Хелтоном, см. в ssh-agent-forwarding-risk.
См. также
- ssh-port-forwarding - таксономия четырёх флагов в одном месте
- ssh-agent-forwarding-risk - почему
-AиForwardAgentтребуют осторожности - living-off-the-land - паттерны атак с использованием предустановленных инструментов
- graham-helton-blog - сайт автора