habrahabr

Обнаружение SSH-туннелей по размеру пакетов

  • вторник, 19 марта 2024 г. в 00:00:15
https://habr.com/ru/companies/ruvds/articles/799255/

Иллюстрация из книги «Справочник киберсантехника»

Протокол SSH — очень мощный инструмент, который используется для удалённой консоли или передачи файлов (scp, sftp). Есть менее известная функция перенаправления портов. Такие SSH-туннели используются для пробития файрволов и хорошо скрываются от обнаружения стандартными средствами мониторинга типа Trisul, Zeek (ранее был известен как Bro), Suricata и Snort. Поэтому для их обнаружения в корпоративной сети используются другие методы.

Например, разработчики инструмента для сетевого мониторинга Trisul Network Analytics несколько лет назад опубликовали небольшое руководство по методам обнаружения SSH-туннелей. Они напоминают, что ещё во второй версии SSH 2 появилась поддержка SOCKS5, а это позволяет любому желающему установить полноценный SOCKS5-прокси вне корпоративной сети и скрыть всю HTTP-активность от инструментов сетевого мониторинга.

После обмена ключами SSH эффективно скрывает от посторонних глаз весь трафик внутри туннеля.

В статье «Практические советы, примеры и туннели SSH» на Хабре рассказывалось про два типа туннелей SSH.


Прямой и обратный SSH-туннели

Самый простой прямой туннель открывает порт в вашей локальной системе, который подключается к другому порту на другом конце туннеля.

localhost:~$ ssh  -L 9999:127.0.0.1:80 user@remoteserver

С другой стороны, при организации обратного туннеля мы настраиваем прослушивающий порт на удалённом сервере, который будет подключаться обратно к локальному порту на нашем localhost (или другой системе):

localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver

Для управления такими туннелями часто используется популярная утилита autossh, которая постоянно отслеживает состояние туннеля через дополнительные healthcheck-порты и перезапускает основной туннель в случае сетевого сбоя.

AutoSSH принимает те же аргументы для переадресации портов, что и SSH:

autossh -R 2222:localhost:22 ssh-server

Такой туннель будет автоматически восстанавливаться после потери связи.

Тут нужно отметить два момента, которые затрудняют отслеживание туннелей внутри сети.

Во-первых, пользователь может поддерживать такое соединение в постоянном режиме, то есть 24/7, получив постоянную точку присутствия в нашей сети.

Во-вторых, динамическое перенаправление портов можно использовать в качестве прокси, то есть для перенаправления трафика через зашифрованный туннель.

Что же можно сделать для обнаружения SSH-туннелей?

▍ Обнаружение туннелей по размеру пакетов


В упомянутой программе Trisul для обнаружения туннелей используются трекеры потоков (flow trackers), которые в реальном времени снимаются снапшоты отдельных потоков, которые соответствуют параметрам, указанным при создании трекера.



Все SSH-потоки внутри сети можно отсортировать по объёму трафика и продолжительности соединения. Потенциально вредоносные обратные SSH-туннели от злоумышленников обычно не передают много данных, а находятся в «спящем» режиме, просто поддерживая соединение как точку присутствия в системе.



В системе анализа трафика можно создать «белый список» туннелей между легитимными точками. Остальные можно выявлять с помощью анализа трафика в инструментах вроде Zeek. В частности, по размеру пакетов можно выявить нажатия клавиш в терминале:

Когда SSH туннелирует другой SSH-канал, передающий TTY-трафик, то

длина пакета = SSH-заголовок + [предыдущий SSH-пакет] + HMAC

Это может быть 76, 84, 98 байт и т. д. Точная длина зависит от размера блока шифрования и алгоритма HMAC, реализации клиентов и серверов.

Каждое нажатие клавиши отражается эхом, поэтому можно настроить инструмент мониторинга для обнаружения последовательных пакетов типа Server:76, Client:76, S:76, C:76, S:76, C:76. Такая последовательность почти наверняка означает, что в данный момент человек набирает текст в интерактивном терминале в SSH-туннеле и получает ответное эхо. Всё просто.

Например, такой скрипт на Lua на базе другого скрипта-реассемблера TCP в случае обнаружения пакета размером 76 байт увеличивает счётчик.

-- WHEN CALLED: when a chunk of reassembled payload is available 
--  
-- see note for why we check the flowkey again , to co-operate with other reassembly scripts
onpayload = function(engine, timestamp, flowkey, direction, seekpos, buffer) 

    if flowkey:id():match("p-0016")  == nil then return; end

    local MAGIC_SEGMENT_LENGTH  =  76
    local CHARACTERS_TRIGGER = 3
    local MIN_ALERT_INTERVAL_SECS = 300 

    local sshF = T.SshFlowTable[ flowkey:id() ] 

    if sshF.seekpos[direction]==seekpos then
      return -- no new data 
    end

    if buffer:size() == MAGIC_SEGMENT_LENGTH then
      sshF.hits[direction] =  sshF.hits[direction] + 1
      sshF.seekpos[direction]=seekpos;
    else
      sshF.hits[0] =  0
      sshF.hits[1] =  0
      sshF.seekpos[direction]=seekpos;
    end

    -- print("Payload length for session "..flowkey:id().. "direction = ".. direction.." bufsz=".. buffer:size() .. " seekpos = "..seekpos )
    if sshF.hits[0] >= CHARACTERS_TRIGGER and sshF.hits[1] >= CHARACTERS_TRIGGER then

      sshF.hits[0] =  0
      sshF.hits[1] =  0

      if timestamp-sshF.lastalertts<MIN_ALERT_INTERVAL_SECS then
        T.log("Found Rev SSH "..flowkey:to_s().." but not alerting due to threshold interval")
      else
        T.log("Found Rev SSH "..flowkey:to_s().." ALERTING and TAGGING flow")
      
        -- tag flow 
        engine:tag_flow(flowkey:id(),"REVSSH");

        -- alert 
        engine:add_alert("{B5F1DECB-51D5-4395-B71B-6FA730B772D9}", flowkey:id(),"REVSSH",1,"rev ssh detected by keypress detect method");

        sshF.lastalertts=timestamp
      end
    end

end,

Для более эффективного решения нужно учитывать и пакеты большего размера. Дело в том, что размер пакетов SSH-туннелей варьируется в зависимости от алгоритма HMAC и типа шифрования.Можно обновить скрипт или использовать несколько размеров пакетов, чтобы поймать все алгоритмы HMAC и комбинации шифрования:

local MAGIC_SEGMENT_LENGTH  =  76
local CHARACTERS_TRIGGER = 3
local MIN_ALERT_INTERVAL_SECS = 300 

Подходящий под заданные условия можно пометить соответствующим тегом или генерировать оповещения.



▍ Защита SSH-сервера и клиента. Усиление конфигурации


Нужно заметить, что многие ОС по умолчанию настроены на удобство работы, а не на безопасность. Поэтому в большинстве случае настройки нуждаются в усилении.

ssh-audit — инструмент для аудита конфигурации ssh-сервера и клиента.

Основные функции:

  • поддержка серверов протоколов SSH1 и SSH2;
  • анализ конфигурации SSH-клиента;
  • распознавание устройства, программного обеспечения и операционной системы, определение компрессии;
  • сборка обмена ключами, ключей хостов, шифрования и кодов аутентификации сообщений;
  • вывод информации об алгоритме (с какого времени доступен, удалён/отключён, небезопасен/слаб/устарел и т. д.);
  • вывод рекомендаций по алгоритмам (добавлять или удалять в зависимости от версии распознанного ПО);
  • вывод информации о безопасности (связанные проблемы, список CVE и т. д.);
  • анализ совместимости версий SSH на основе информации об алгоритмах;
  • историческая информация из OpenSSH, Dropbear SSH и libssh;
  • сканирование политик для обеспечения усиленной/стандартной конфигурации;
  • работает под Linux и Windows;
  • поддерживает Python 3.8−3.12;
  • отсутствие зависимостей.

Стандартный аудит можно запустить для одного сервера…

ssh-audit localhost
ssh-audit 127.0.0.1
ssh-audit 127.0.0.1:222
ssh-audit ::1
ssh-audit [::1]:222

…или для многих серверов из списка:

ssh-audit -T servers.txt

Выдача стандартного серверного аудита выглядит следующим образом (подключение через OpenSSH 5.3, неусиленный):



Стандартный аудит клиента (OpenSSH 7.2, неусиленный):



Кроме утилиты командной строки, для удобства реализован веб-интерфейс, через который она запускается:



Этот сервис чем-то похож на SSL Server Test для быстрого аудита конфигурации SSL.

Вместе с программой распространяются советы по улучшению конфигурации с целью повышения безопасности SSH для разных дистрибутивов Linux. Советы актуальны для последних версий серверных дистрибутивов Amazon Linux 2023, Debian 11−12, RedHat Enterprise Linux 7−8, CentOS 7−8, Rocky Linux 9, Ubuntu 18−22, а также клиентских Ubuntu 18−22 и Mint 19−21. Советы для свежих ОС составлены на основе этого документа 2015 года, который сейчас уже устарел. Там же неофициальные руководства по SSH для MacOS13−14, FreeBSD нескольких версий, различных маршрутизаторов и других устройств типа Synology DSM.

Например, усиление конфигурации на сервере Ubuntu 22.04 LTS включает пять пунктов:

  1. Перегенерировать ключи RSA и ED25519

    rm /etc/ssh/ssh_host_*
    ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
    ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
  2. Удалить модуль для маленьких ключей по алгоритму Диффи — Хеллмана

    awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe<br>
    mv /etc/ssh/moduli.safe /etc/ssh/moduli
  3. Активировать ключи RSA и ED25519

    Активировать директиву HostKey для RSA и ED25519 в файле/etc/ssh/sshd_config:

    sed -i 's/^\#HostKey \/etc\/ssh\/ssh_host_\(rsa\|ed25519\)_key$/HostKey \/etc\/ssh\/ssh_host_\1_key/g' /etc/ssh/sshd_config
  4. Ограничить поддерживаемые алгоритмы обмена ключами, шифровальные алгоритмы и MAC

    echo -e "# Ограничение алгоритмов в соответствии с рекомендациями sshaudit.com\nKexAlgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org,gss-curve25519-sha256-,diffie-hellman-group16-sha512,gss-group16-sha512-,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha256\n\nCiphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr\n\nMACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.com\n\nHostKeyAlgorithms sk-ssh-ed25519-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,ssh-ed25519,rsa-sha2-512,rsa-sha2-256\n\nCASignatureAlgorithms sk-ssh-ed25519@openssh.com,ssh-ed25519,rsa-sha2-512,rsa-sha2-256\n\nGSSAPIKexAlgorithms gss-curve25519-sha256-,gss-group16-sha512-\n\nHostbasedAcceptedAlgorithms sk-ssh-ed25519-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,ssh-ed25519,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-256\n\nPubkeyAcceptedAlgorithms sk-ssh-ed25519-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,ssh-ed25519,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-256" > /etc/ssh/sshd_config.d/ssh-audit_hardening.conf
  5. Перезагрузить сервер OpenSSH

    service ssh restart

Кроме этого, для повышения безопасности SSH рекомендуется отключить вход по паролю.

См. также подсказки по командам SSH (cheat sheet).

На Хабре также публиковались неплохие материалы, как вышеупомянутая статья с практическими примерами использования туннелей SSH. Например, там приводятся примеры удалённого выполнения команд, удалённого перехвата пакетов, копирования файлов, туннелирования SSH-трафика через сеть Tor, передачи потокового видео по SSH с помощью VLC и SFTP и др.

▍ Скрытие SSH от обнаружения


Вероятно, чтобы скрыть свой SSH-туннель от обнаружения методом анализа сетевого трафика по размеру пакетов, нам нужно изменить стандартный размер пакетов.

В 2023 году в ssh(1) и OpenSSH внесено важное изменение с поддержкой обфускации тайминга нажатий клавиш, то есть интервалов между временем нажатия клавиш на клавиатуре.



Чтобы скрыть промежуток между нажатиями, ssh в случае малого количества трафика отправляет его по сети с фиксированными интервалами 20 мс, а также добавляет «фальшивые» нажатия. В документации появилась новая опция ObscureKeystrokeTiming.

Методы скрытия SSH от обнаружения особенно актуальны в Китае и других странах, где применяется технология DPI для фильтрации трафика и обнаружения/замедления трафика SSH. По некоторой информации, в качестве альтернативы VPN китайцы используют SOCKS-прокси через SSH на свой сервер за пределами подцензурной сети, и через него туннелируется весь TCP- и DNS-трафик (см. проект sshuttle), но это тоже обнаруживается средствами DPI.

Возможности Великого китайского файрвола подробно изучаются и тестируются специалистами из разных стран. В прошлом году группа исследователей опубликовала отчёт о методах обнаружения зашифрованного трафика в Китае, а также способах его обфускации.


Примеры заблокированных и незаблокированных пакетов, которые прошли через Великий китайский файрвол

Исследование показало, что китайская цензура динамически блокирует полностью зашифрованный трафик в режиме реального времени. Новая технология DPI частично или полностью затронула многие инструменты обхода блокировок, включая Shadowsocks, Outline, VMess, Obfs4, Lantern, Psiphon и Conjure.

Как выяснилось, DPI применяет грубую, но эффективную эвристику: сначала исключается трафик, который вряд ли является полностью зашифрованным; а потом блокируется оставшийся неисключённый трафик. Эвристики основаны на фингерпринтинге распространённых протоколов, частоте установленных бит, а также на количестве, доле и положении печатаемых символов ASCII. При широком применении система потенциально блокирует около 0,6% обычного интернет-трафика.

Учёные детально изучили алгоритмы динамической блокировки — и в своей работе представили эффективные стратегии обхода для разработчиков антицензурных инструментов.

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻