Home » Блокирование встроенной обратной оболочки Visual Studio Code, пока не стало слишком поздно

Блокирование встроенной обратной оболочки Visual Studio Code, пока не стало слишком поздно

Введение

С июля 2023 года Microsoft предлагает идеальную обратную оболочку, встроенную в Visual Studio Code — широко используемый инструмент разработки. Всего несколькими щелчками мыши любой пользователь с учетной записью GitHub может поделиться своим рабочим столом Visual Studio в Интернете. Туннель кода VS почти считается лолбин (Двоичный файл Living Of The Land).

Я так рад, что мои пользователи теперь имеют возможность предоставлять доступ к своим компьютерам с очень конфиденциальными данными прямо в Интернете посредством аутентификации, которую я не контролирую и не контролирую. Моя внутренняя сеть теперь доступна откуда угодно!

Хуже всего то, что этот туннель может сработать из командной строки с портативная версия code.exe. Злоумышленнику просто нужно загрузить двоичный файл, который не будет обнаружен ни одним антивирусом, поскольку это законный и подписанный двоичный файл Windows.

Поэтому есть на что обратить внимание.

Выполните его, откройте указанную ссылку, войдите в свою учетную запись GitHub и получите обратную оболочку.

 1.code.exe tunnel
 2*
 3* Visual Studio Code Server
 4*
 5* By using the software, you agree to
 6* the Visual Studio Code Server License Terms (https://aka.ms/vscode-server-license) and 
 7* the Microsoft Privacy Statement (https://privacy.microsoft.com/en-US/privacystatement).
 8*
 9
10Open this link in your browser https://vscode.dev/tunnel/sauceTomate/C:/Users/ipfyx/Downloads/vscode_cli_win32_x64_cli

Бинарный файл определенно подписан:

1Get-AppLockerFileInformation 'C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebincode-tunnel.exe'|Select-Object -ExpandProperty Publisher
2PublisherName    : O=MICROSOFT CORPORATION, L=REDMOND, S=WASHINGTON, C=US
3ProductName      :
4BinaryName       :
5BinaryVersion    : 0.0.0.0
6HasPublisherName : True
7HasProductName   : False
8HasBinaryName    : False

Обратите внимание, что здесь нет значений ProductName и BinaryName, мы воспользуемся ими позже.

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

смягчение последствий

Но как нам, защитникам, заблокировать или обнаружить его использование?

Черный список доменов

В документации Microsoft указано:

1If you're part of an organization who wants to control access to Remote Tunnels, you can do so by allowing or denying access to the domain global.rel.tunnels.api.visualstudio.com.

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

Насколько я понимаю, контакты VScode global.rel.tunnels.api.visualstudio.com чтобы получить его “кластеры”: https://global.rel.tunnels.api.visualstudio.com/api/v1/clusters

Вот образец полученного json:

 1[
 2  {
 3    "clusterId": "auc1",
 4    "uri": "https://auc1.rel.tunnels.api.visualstudio.com",
 5    "azureLocation": "AustraliaCentral"
 6  },
 7  {
 8    "clusterId": "aue",
 9    "uri": "https://aue.rel.tunnels.api.visualstudio.com",
10    "azureLocation": "AustraliaEast"
11  },
12  etc.
13]

Эти домены также упоминаются в другом Документация Майкрософт :

1- Dev Tunnels
2  - global.rel.tunnels.api.visualstudio.com
3  - [clusterId].rel.tunnels.api.visualstudio.com
4  - [clusterId]-data.rel.tunnels.api.visualstudio.com
5  - *.[clusterId].devtunnels.ms
6  - *.devtunnels.ms

Блокировка этих доменов заблокирует и отключит любой туннель кода VS:

1*.tunnels.api.visualstudio.com
2*.devtunnels.ms

блокировщик приложений

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

Для их создания в Редактор управления групповыми политикамиидти к Конфигурация компьютера -> Настройки Windows -> Параметры безопасности -> Политики контроля приложений -> AppLocker.. Щелкните правой кнопкой мыши по Создать правила по умолчанию.

Затем щелкните правой кнопкой мыши AppLocker и Экспортная политика.

Генерация правил по умолчанию MS Applocker

Вот полученный XML:

 1 Version="1">
 2   Type="Appx" EnforcementMode="Enabled" />
 3   Type="Dll" EnforcementMode="NotConfigured" />
 4   Type="Exe" EnforcementMode="Enabled">
 5     Id="921cc481-6e17-4653-8f75-050b80acca20" Name="(Default Rule) All files located in the Program Files folder" Description="Allows members of the Everyone group to run applications that are located in the Program Files folder." UserOrGroupSid="S-1-1-0" Action="Allow">
 6      
 7         Path="%PROGRAMFILES%*" />
 8      
 9    
10     Id="a61c8b2c-a319-4cd0-9690-d2177cad7b51" Name="(Default Rule) All files located in the Windows folder" Description="Allows members of the Everyone group to run applications that are located in the Windows folder." UserOrGroupSid="S-1-1-0" Action="Allow">
11      
12         Path="%WINDIR%*" />
13      
14    
15     Id="fd686d83-a829-4351-8ff4-27c7de5755d2" Name="(Default Rule) All files" Description="Allows members of the local Administrators group to run all applications." UserOrGroupSid="S-1-5-32-544" Action="Allow">
16      
17         Path="*" />
18      
19    
20  
21   Type="Msi" EnforcementMode="NotConfigured" />
22   Type="Script" EnforcementMode="Enabled" />
23

При использовании этих правил разрешается все, что находится в Program Files и Windows, все остальное блокируется. Администраторам разрешено выполнять что угодно, например VSCode. Но если бы вам нужно было определить правило, блокирующее VSCode, это правило применялось бы первым, поскольку «Запретить правила» применяется перед «Разрешенными правилами».

Давайте создадим правило, которое полностью заблокирует VScode. Правило применяется ко всем (SID S-1-1-0), следовательно, к администраторам (SID S-1-5-32-544).

1Get-AppLockerFileInformation 'C:UsersipfyxAppDataLocalProgramsMicrosoft VS CodeCode.exe'| New-AppLockerPolicy -RuleType Publisher -User S-1-1-0 -Optimize -Xml

В полученном XML-коде я заменил Action=”Allow” на Action=”Deny”. Я также удалил свою текущую версию VSCode из Двоичная версияДиапазон для соответствия любой версии VScode.

Предупреждение. Не импортируйте следующий XML-файл в Applocker. Импортированное отдельно это правило полностью заблокирует вашу систему. Добавьте правило Разрешить * заранее.

 1 Version="1">
 2	 Type="Exe" EnforcementMode="NotConfigured">
 3		 Id="1dd70b30-eb06-4220-b808-bd8d368624c0" Name="VScode" Description="" UserOrGroupSid="S-1-5-21-1935059010-3323107334-3352698520-500" Action="Deny">
 4			
 5				 PublisherName="O=MICROSOFT CORPORATION, L=REDMOND, S=WASHINGTON, C=US" ProductName="VISUAL STUDIO CODE" BinaryName="*">
 6					 LowSection="*" HighSection="*" />
 7				
 8			
 9		
10	
11

Включенный в правила MS по умолчанию, вот результирующий XML (с этого момента называемый vscode.xml):

 1 Version="1">
 2   Type="Appx" EnforcementMode="Enabled" />
 3   Type="Dll" EnforcementMode="NotConfigured" />
 4   Type="Exe" EnforcementMode="Enabled">
 5     Id="921cc481-6e17-4653-8f75-050b80acca20" Name="(Default Rule) All files located in the Program Files folder" Description="Allows members of the Everyone group to run applications that are located in the Program Files folder." UserOrGroupSid="S-1-1-0" Action="Allow">
 6      
 7         Path="%PROGRAMFILES%*" />
 8      
 9    
10     Id="a61c8b2c-a319-4cd0-9690-d2177cad7b51" Name="(Default Rule) All files located in the Windows folder" Description="Allows members of the Everyone group to run applications that are located in the Windows folder." UserOrGroupSid="S-1-1-0" Action="Allow">
11      
12         Path="%WINDIR%*" />
13      
14    
15     Id="fd686d83-a829-4351-8ff4-27c7de5755d2" Name="(Default Rule) All files" Description="Allows members of the local Administrators group to run all applications." UserOrGroupSid="S-1-5-32-544" Action="Allow">
16      
17         Path="*" />
18      
19    
20		 Id="1dd70b30-eb06-4220-b808-bd8d368624c0" Name="VScode" Description="" UserOrGroupSid="S-1-5-21-1935059010-3323107334-3352698520-500" Action="Deny">
21			
22				 PublisherName="O=MICROSOFT CORPORATION, L=REDMOND, S=WASHINGTON, C=US" ProductName="VISUAL STUDIO CODE" BinaryName="*">
23					 LowSection="*" HighSection="*" />
24				
25			
26		
27  
28   Type="Msi" EnforcementMode="NotConfigured" />
29   Type="Script" EnforcementMode="Enabled" />
30

К сожалению, это правило не применимо к туннелю кода, поскольку у этого двоичного файла нет названия продукта (спасибо Microsoft!):

1Get-AppLockerFileInformation 'C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebincode-tunnel.exe' | New-AppLockerPolicy -RuleType Publisher -User S-1-1-0 -Optimize -Xml                           
2New-AppLockerPolicy : Les règles ne peuvent pas être créées. Les informations de fichier requises sont absentes dans le fichier suivant:
3%OSDRIVE%USERSipfyxDOWNLOADSVSCODE_CLI_WIN32_X64_CLICODE.EXE

Для уверенности давайте проверим ранее созданное правило vscode.

 1# Portable code tunnel is blocked but not by the rule
 2Test-AppLockerPolicy -XmlPolicy .vscode.xml -Path .code.exe -User S-1-1-0|fl
 3FilePath       : C:UsersipfyxDownloadsvscode_cli_win32_x64_clicode.exe
 4PolicyDecision : DeniedByDefault
 5MatchingRule   :
 6
 7# Code tunnel is blocked but not by the rule
 8Test-AppLockerPolicy -XmlPolicy .vscode.xml -Path 'C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebincode-tunnel.exe' -User S-1-1-0|fl
 9FilePath       : C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebincode-tunnel.exe
10PolicyDecision : DeniedByDefault
11MatchingRule   :
12
13# VScode is blocked by the rule
14Test-AppLockerPolicy -XmlPolicy .vscode.xml -Path 'C:UsersipfyxAppDataLocalProgramsMicrosoft VS CodeCode.exe' -User S-1-1-0|fl
15FilePath       : C:UsersipfyxAppDataLocalProgramsMicrosoft VS CodeCode.exe
16PolicyDecision : Denied
17MatchingRule   : VScode

ПолитикаРешение является Запрещено по умолчанию, что означает, что правило, которое мы только что создали из двоичного файла vscode, не применимо к туннелю кода. Если ни одно правило не соответствует, по умолчанию для applocker запрещается любое выполнение. Код-туннель там запрещен, но его бы не было, если бы его поместили в разрешенные каталоги. Его может разместить злоумышленник или законный vscode, установленный администратором.

Решением может быть использование условия хеширования.

1# Export
2Get-AppLockerFileInformation .code.exe | New-AppLockerPolicy -RuleType Hash -User S-1-1-0 -Optimize -Xml > .vscode-tunnel-hash.xml
3
4# Code tunnel is blocked
5Test-AppLockerPolicy -XmlPolicy .vscode-tunnel-hash.xml -Path 'C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebincode-tunnel.exe' -User S-1-1-0|fl
6FilePath       : C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebincode-tunnel.exe
7PolicyDecision : Denied
8MatchingRule   : code.exe

Предупреждение. Не импортируйте следующий XML-файл в Applocker. Импортированное отдельно это правило полностью заблокирует вашу систему. Добавьте правило Разрешить * заранее

 1 Version="1">
 2	 Type="Exe" EnforcementMode="NotConfigured">
 3		 Id="15b4ef38-5f18-484b-bc83-e03d24076a0d" Name="code.exe" Description="" UserOrGroupSid="S-1-1-0" Action="Deny">
 4			
 5				
 6					 Type="SHA256" Data="0xAC60D7CA817ED4BEF562D07DEB4BE730413BD23B3ABFE0DFC78B1DDC866F85BA" SourceFileName="code.exe" SourceFileLength="16738736" />
 7				
 8			
 9		
10	
11

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

объект групповой политики

Визуальная Студия имеет столь необходимые функции:

1- Dev Tunnels - controls test functionality

Но на сегодняшний день (1.8.82) VScode этого не делает. Однако вы можете принудительно установить автоматические обновления! UpdateMode_default был бы моим выбором.

1gc 'C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codepoliciesen-usVSCode.adml'
 1
 2 revision="1.0" schemaVersion="1.0">
 3         />
 4         />
 5        
 6                
 7                         id="Application">Visual Studio Code
 8                         id="Supported_1_67">Visual Studio Code >= 1.67
 9                         id="Category_updateConfigurationTitle">Update
10                         id="UpdateMode">UpdateMode
11                         id="UpdateMode_updateMode">Configure whether you receive automatic updates. Requires a restart after change. The updates are fetched from a Microsoft online service.
12                         id="UpdateMode_none">Disable updates.
13                         id="UpdateMode_manual">Disable automatic background update checks. Updates will be available if you manually check for updates.
14                         id="UpdateMode_start">Check for updates only on startup. Disable automatic background update checks.
15                         id="UpdateMode_default">Enable automatic update checks. Code will check for updates automatically and periodically.
16                
17                
18                         id="UpdateMode"> refId="UpdateMode" />
19                
20        
21

Обнаружение

Процесс

Ищем выполнение туннеля кода

Простое обнаружение может быть:

1index=win sourcetype="XmlWinEventLog" EventCode=4688 code tunnel cmdline="*code*.exe*tunnel*"
2| stats min(_time) as time_min max(_time) as time_max count as occurence values(NewProcess) as NewProcess values(ParentProcess) as ParentProcess values(CommandLine) as CommandLine by host, SubjectUser file_name
хозяин СубъектПользователь cmdline имя файла время_мин time_max возникновение НовыйПроцесс Родительскийпроцесс
обжаритьПомидоры ipfyx Туннель «c:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebincode-tunnel» –accept-server-license-terms –name TotalNotSuspicious код-туннель.exe 2023-09-18 11:31:54 2023-09-18 11:31:54 1 C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codecode-tunnel.exe C:WindowsSystem32cmd.exe

Но двоичный файл код.exe можно было бы переименовать. Однако злоумышленник не может изменить туннель и –accept-server-license-terms параметры :

1index=win sourcetype="XmlWinEventLog" EventCode=4688 tunnel accept server license terms cmdline="*.exe*tunnel*--accept-server-license-terms*"
2| stats min(_time) as time_min max(_time) as time_max count as occurence values(NewProcess) as NewProcess values(ParentProcess) as ParentProcess values(CommandLine) as CommandLine by host, SubjectUser file_name
хозяин СубъектПользователь cmdline имя файла время_мин time_max возникновение НовыйПроцесс Родительскийпроцесс
обжаритьПомидоры ipfyx Туннель «c:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebinc0de.exe» –accept-server-license-terms –name TotalNotSuspicious c0de.exe 2023-09-18 11:35:54 2023-09-18 11:35:54 1 C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codec0de.exe C:WindowsSystem32cmd.exe
обжаритьПомидоры ipfyx Туннель «c:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebincode-tunnel» –accept-server-license-terms –name TotalNotSuspicious код-туннель.exe 2023-09-18 11:31:54 2023-09-18 11:31:54 1 C:UsersipfyxAppDataLocalProgramsMicrosoft VS Codecode-tunnel.exe C:WindowsSystem32cmd.exe

Если вы используете sysmon, вы можете переключиться на EventCode=1 и тип источника Sysmon вместо EventCode 4688.

Ищем подозрительный дочерний процесс

Отличная идея от волки :

1IOC: Process tree: code.exe -> cmd.exe -> node.exe -> winpty-agent.exe

Прямой поиск будет таким:

1index=win sourcetype="XmlWinEventLog" EventCode=4688 code (cmd OR powershell) ParentProcess="*code-tunnel.exe" NewProcess IN ("*cmd*", "*powershell*")
2| table _time, host, NewProcess, ParentProcess

Но еще раз, код.exe можно было бы переименовать

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

1index=win sourcetype="XmlWinEventLog" EventCode=4688 (cmd OR powershell) ParentProcess="*code*.exe" NewProcess IN ("*cmd*", "*powershell*")
2    [search index=win sourcetype="XmlWinEventLog" EventCode=4688 tunnel accept server license terms CommandLine="*.exe*tunnel*--accept-server-license-terms*"
3    | table host NewProcessId
4    | rename NewProcessId as ParentProcessId
5    | format]
6| table _time, host, NewProcess, ParentProcess
_время хозяин НовыйПроцесс Родительскийпроцесс
2023-09-18 11:36:21 обжаритьПомидоры C:WindowsSystem32WindowsPowerShellv1.0powershell.exe c:UsersipfyxAppDataLocalProgramsMicrosoft VS Codebinc0de.exe

Создание файла

Еще одна замечательная идея от волки :

IOC: File write of code_tunnel.json which is parametizable, but defaults to: %UserProfile%.vscode-clicode_tunnel.json

License_consent.json файл также можно было просмотреть.

1PS > gc C:Usersipfyx.vscodeclicode_tunnel.json
2{"name":"sauceTomate","id":"9s43zAc9","cluster":"uks1"}
3PS > gc C:Usersipfyx.vscodeclilicense_consent.json
4{"consented":true}

У меня пока нет sysmon EventCode 11, поэтому поиск SPL оставлю в качестве упражнения для пользователя. Наблюдения за созданием этих файлов внутри каталога UserProfile недостаточно, поскольку его можно изменить с помощью –cli-data-dir вариант.

1.code.exe tunnel help
2...
3GLOBAL OPTIONS:
4      --cli-data-dir <CLI_DATA_DIR>  Directory where CLI metadata should be stored [env: VSCODE_CLI_DATA_DIR=]

Мониторинг веб-трафика

Если вы не заблокировали домены, о которых я упоминал ранее, следите за любым HTTP-трафиком, ведущим к этим доменам.

Заключение

Параметр GPO был бы замечательным, но его еще предстоит увидеть. Хэш-правило Applocker не является устойчивым. Более того, ваши компьютеры, не присоединенные к домену, не будут затронуты ни одним из них. Поэтому на данный момент нам осталось только заблокировать этих двух плохих парней:

1*.tunnels.api.visualstudio.com
2*.devtunnels.ms

2023-09-23 14:29:55


1695492965
#Блокирование #встроенной #обратной #оболочки #Visual #Studio #Code #пока #не #стало #слишком #поздно

Read more:  Тео Джонсон из Виндзора не жаловался на ожидание.

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.