- PVSM.RU - https://www.pvsm.ru -

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

Обнаружение SSH-туннелей по размеру пакетов - 1 [1]
Иллюстрация из книги «Справочник киберсантехника» [2]

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

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

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

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

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

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

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

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

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

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

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

autossh -R 2222:localhost:22 ssh-server

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Например, такой скрипт на Lua [14] на базе другого скрипта-реассемблера TCP [15] в случае обнаружения пакета размером 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-туннелей по размеру пакетов - 5

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

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

ssh-audit [16] — инструмент для аудита конфигурации 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, неусиленный):

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

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

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

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

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

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

Вместе с программой распространяются советы по улучшению конфигурации с целью повышения безопасности SSH [19] для разных дистрибутивов 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 года [20], который сейчас уже устарел. Там же неофициальные руководства по 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.comnKexAlgorithms 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-sha256nnCiphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctrnnMACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.comnnHostKeyAlgorithms 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-256nnCASignatureAlgorithms sk-ssh-ed25519@openssh.com,ssh-ed25519,rsa-sha2-512,rsa-sha2-256nnGSSAPIKexAlgorithms gss-curve25519-sha256-,gss-group16-sha512-nnHostbasedAcceptedAlgorithms 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-256nnPubkeyAcceptedAlgorithms 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 [21] (cheat sheet).

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

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

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

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

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

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

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

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

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

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

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

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

Автор:
programmerguru

Источник [28]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/shpargalka/390577

Ссылки в тексте:

[1] Image: https://habr.com/ru/companies/ruvds/articles/799255/

[2] «Справочник киберсантехника»: https://github.com/opsdisk/the_cyber_plumbers_handbook/

[3] перенаправления портов: https://www.ssh.com/academy/ssh/tunneling-example

[4] Trisul: https://www.trisul.org/

[5] Zeek: https://zeek.org/

[6] Suricata: https://suricata.io/

[7] Snort: https://www.snort.org/

[8] небольшое руководство по методам обнаружения SSH-туннелей: https://www.trisul.org/blog/detecting-ssh-tunnels/

[9] «Практические советы, примеры и туннели SSH»: https://habr.com/ru/articles/435546/

[10] прямой туннель: https://habr.com/ru/articles/435546/#2

[11] обратного туннеля: https://habr.com/ru/articles/435546/#4

[12] autossh: https://linux.die.net/man/1/autossh

[13] трекеры потоков: https://trisul.org/docs/ug/flow/tracker.html

[14] скрипт на Lua: https://github.com/trisulnsm/trisul-scripts/tree/master/lua/frontend_scripts/reassembly/revssh

[15] скрипта-реассемблера TCP: https://www.trisul.org/docs/lua/reassembly.html

[16] ssh-audit: https://github.com/jtesta/ssh-audit

[17] веб-интерфейс: https://www.ssh-audit.com/

[18] SSL Server Test: https://www.ssllabs.com/ssltest/analyze.html?d=habr.com

[19] советы по улучшению конфигурации с целью повышения безопасности SSH: https://www.ssh-audit.com/hardening_guides.html

[20] этого документа 2015 года: https://stribika.github.io/2015/01/04/secure-secure-shell.html

[21] подсказки по командам SSH: https://www.stationx.net/ssh-commands-cheat-sheet/

[22] туннелирования SSH-трафика через сеть Tor: https://habr.com/ru/articles/435546/#13

[23] потокового видео по SSH с помощью VLC и SFTP: https://habr.com/ru/articles/435546/#18

[24] важное изменение: https://habr.com/ru/companies/ruvds/articles/770792/

[25] ObscureKeystrokeTiming: https://man.openbsd.org/ssh_config.5#ObscureKeystrokeTiming

[26] sshuttle: https://github.com/sshuttle/sshuttle

[27] отчёт о методах обнаружения зашифрованного трафика в Китае: https://gfw.report/publications/usenixsecurity23/data/paper/paper.pdf

[28] Источник: https://habr.com/ru/companies/ruvds/articles/799255/?utm_source=habrahabr&utm_medium=rss&utm_campaign=799255