
Недавно коллеги из Censys выкатили разбор семейства AsyncRAT, описав целое генеалогическое древо: AsyncRAT → DCRAT (DarkCrystal RAT) → VenomRAT → еще десятки форков вплоть до LMTeamRAT, Alfa Red Fox, EchoRAT, Gh0stRAT (не путать с оригинальным Gh0st RAT 2008 года) и т. д. Всего насчитали около 40 именованных вариантов, 13 из них — с живой C2-инфраструктурой на момент исследования.
Ключевая мысль их исследования: форки почти никогда не переписывают TLS-сертификат сервера, доставшийся от родителя. DCRAT принес в семью структуру O=<Name> By <author>, L=SH, C=CN, и это наследуется вплоть до самых мелких потомков — даже если сам билд больше никак не забрендирован. Именно этот паттерн Censys называет самым надежным сигналом для всей линейки, независимо от конкретного варианта.
У нас, отдела сетевой экспертизы антивирусной лаборатории, уже был опыт детектирования VenomRAT по его дефолтовому сертификату, и мы даже отдали в сообщество сигнатуру для Suricata в рамках проекта PT Rules.
Именно поэтому нас это исследование, само собой, зацепило — и мы решили прогнать похожую логику не по интернет-скану, а по трафику из собственных песочниц: а вдруг мы что-то упустили?
Взяли любимый NTA и сделали в нем следующий запрос (аналогичный хант можно сделать где угодно, хоть в базе данных):
tls.server_cert.subject.value ~ "*RAT*" && !tls.server_cert.subject.value ~ "*CORPORAT*" && !tls.server_cert.subject.value ~ "*INTEGRAT*"
(исключения нужны, потому что corporated, corporation или integrator тоже с радостью матчатся на RAT — привет, ложные срабатывания)
Результат — реально интересный: помимо вышеупомянутого VenomRAT куча других C2-серверов буквально сами себя подписывают.
Вот например прародитель AsyncRAT не стесняется подписываться как AsyncRAT Server:

PureRAT притворяется PureRAT Agent:

LiberiumRAT подписал сам себе сертификат под именем Liberium RAT Authority:

Еще ряд менее известных семплов — все радостно светят своим назначением прямо в сертификате.
Как детектить в Suricata?
Аналогично нашему правилу на VenomRAT можно зацепиться за байты |3082| — встречаются в начале сертификата, далее |550403| — это закодированный ASN.1 Object ID 2.5.4.3 (id-at-commonName), и в завершение — искомая строка, например:
alert tls any any -> any any (msg: "REMOTE [PTsecurity] LiberiumRAT SSL certificate"; flow: established, from_server; content: "|3082|"; depth: 300; content: "|550403|"; depth: 600; content: "Liberium RAT"; distance: 2; within: 12; classtype: trojan-activity; sid: 1; rev: 1;)

А как хантить, на что смотреть
Issuer/Subject вида
CN=.*RAT.*— как видно выше, срабатывает идеально.Комбинация
L=SH,C=CN + O=* By *на нестандартном порту.Самоподписанные сертификаты в целом — malware-C2, в отличие от фишинговых сайтов, не боится браузерных ошибок, поэтому самоподпись используется массово.
Признаки дефолтной генерации — пустые
O/L/ST,CNпродублирован вSANилиIssuer—CN=example.com,O=Acme.Из истории вопроса — похожий трюк еще в 2023 году проворачивали с Quasar RAT: там дефолтный сертификатCN=Quasar Server CAчерез Shodan/Censys вывел исследователей сразу на 60+ живых серверов. Nuff said.
Мораль: TLS-сертификат, при наличии, конечно, — это метаданные, которые остаются в открытом виде, даже когда весь остальной трафик зашифрован. Авторы билдеров RAT'ов почему-то регулярно об этом забывают 🙂
Happy hunting!
(Источник: https://t.me/ptescalator)
