EnglishРусский Map
SSH port forwarding

Шпаргалка по пробросу портов в SSH (Грэм Хелтон)

title
Шпаргалка по пробросу портов в SSH (Грэм Хелтон)
type
summary
summary
Разбор флагов SSH -L/-R/-D/-J/-A/-g/-t с упором на red team, консоли ~? и ключевого слова Match в конфиге
tags
ssh, networking, security, red-team
created
2026-05-21
updated
2026-05-21
lang
ru
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.

См. также