бортжурнал про обход детекта SOCами smbexec.py
smbexec из пакета impacket позволяет выполнять команды на удаленной windows машине. Данный скрипт генерирует в системе события:
1)удаленный сетевой вход по протоколу smb - eventid 4624 logontype 3; доступ на сетевую шару - eventid 5145
2)запрос к RPC интерфейсу svcctl через который будет создан сервис - eventid 5712
3)создание сервиса с командой и ее запуск - eventid 7045, 4688
события 5145 и 5712, как и событие запуска сервиса очень сильно шумят и зачастую их фильтруют или вовсе не включают их логирование.
Множество найденных способов обнаружения выполнения команд через smbexec.py завязаны на поля ServiceName и ImagePath создаваемого сервиса.
некоторые примеры обнаружения использования утилиты smbexec.py:
https://community.netwitness.com/t5/netwitness-community-blog/detecting-lateral-movement-in-rsa-netwitness-smbexec/ba-p/520798
https://research.splunk.com/endpoint/bb3c1bac-6bdf-4aa0-8dc9-068b8b712a76/
правила одного siem решения: lower(object.name) == "btobto" or regex(lower(object.process.cmdline), "%comspec%\s\/q\s\/c|__output|%temp%\\\\execute\.bat", 0) != null
red canary rules: https://github.com/mbabinski/Sigma-Rules/blob/main/2023_RedCanary_ThreatDetectionReport/threat_impacket_smbexec_execution.yml
sigma rules:https://github.com/mdecrevoisier/SIGMA-detection-rules/blob/main/windows-services/win-os-service%20creation%20SMBexec%20(native).yaml
https://u0041.co/blog/post/2
https://ivannikov-ws.org/2020/docs/Khrykov.pdf
https://www.ptsecurity.com/upload/corporate/ru-ru/webinars/ics/webinar_295012.pdf
В предыдущих релизах smbexec.py был хард имени устанавливаемой сервиса:BTOBTO, в текущей версии имя сервиса задается рандомно:
https://github.com/fortra/impacket/blob/master/examples/smbexec.py#L122
self.__serviceName = ''.join([random.choice(string.ascii_letters) for i in range(8)])
Старый детект на базе названия сервиса BTOBTO, описанный в правилах sigma и используемый в некоторых Siem систем уже не актуален. Так же ранее использовался путь к сетевой шаре с указанием 127.0.0.1, сейчас путь состоит из hostname устройства, множество старых детектов стало неактуальным (емнип детект Kaspersky endpoint security был связан с наличием строки 127.0.0.1 в imagepath сервиса). Старая версия скрипта с описанными хардами - тык
Нам меньше работы, для начала можно поменять путь хранения и запуска batника с %SYSTEMROOT% на %ALLUSERSPROFILE% (стр 286), так же в той же строке генерируется имя бантика. Имя равняется 8 символьной абракадабре, такое сразу бросается в глаза, лучше поменять на что то более неприметное.
стр 57: OUTPUT_FILENAME = '__output' поменять на OUTPUT_FILENAME = '__history' - любое адекватное слово) но не output, на него агрятся правила корреляции siem систем.
на строке 185: self.__shell = '%COMSPEC% /Q /c ' мы можем поменять на self.__shell = 'cmd /Q /c ' , строка %COMSPEC% тоже является "красной тряпкой" для корреляций Siem систем.
smbexec.py поддерживает ключи -service-name где мы можем указать неприметное имя сервиса и -share где можно указать имя существующей сетевой шары отличное от C$ (при наличии) и тогда детект по созданию службы с C$ в ImagePath обойдет нас стороной.
На строке 253 записана команда cd выполняемая при создании задачи по умолчанию: self.execute_remote('cd ' ), иногда детект возможен по конструкции "/Q /c echo cd ^>". cd можно поменять на что угодно, хоть set. cd возвращает в promt путь к system32, нам оно не нужно потому что cd не работает через smbexec.py. приведем строку 256 self.prompt = self.__outputBuffer.decode().replace('\r\n','') + '>' к виду self.prompt = '>'.
теперь при первом старте выполняется конструкция: cmd /Q /c echo set ^> \\%COMPUTERNAME%\D$\__backup
Таким простым способом можно обойти большинство найденных в сети способов обнаружения SOCами активности smbexec.py.
Так же, есть детекты по активности: удаленный доступ на админскую шару (С$/D$/Admin$) -> установка сервиса -> запуск команды в течении 5 минут. Мы можем ставить какие угодно паузы после каждого шага и такой детект будет обойден. Либо же просто использовать не админскую шару (при наличии такой).
Детект по созданию сервиса с определенным типом (Win32 Own Process или Interactive Own Process) и обращение к rpc svcctl с одним logonid так же возможен, но сложен в предварительной настройке и встречается редко.
Обнаружение по трафику проверить не на чем, но судя по публикациям вендоров с их детектами, это не составит особого труда.
Код с описанными мной изменениями - https://github.com/feedb/impacket_test/blob/main/smbexec.py