03.11.2017

Детектирование скрытых сетей на базе USB-устройств

image

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

Авторы: Pablo Gonzalez Perez (pablo@11paths.com),  Francisco Jose Ramirez Vicente franciscojose.ramirezvicente@telefonica.com)

Введение

У многих компаний и государственных структур есть сети, изолированные от внешних коммуникаций или с потоками данных «для служебного пользования». Это компьютерные сети создаются в особых ситуациях, поскольку либо используются в специфических случаях, либо имеют критическую информацию. Примеры: система управления фабрикой, высокозащищенные среды для обработки определенной информации или сети, удовлетворяющие особым стандартам безопасности. Недавняя кибер-история, на примере вредоноса Stuxnet и атомной электростанции Ирана, подтверждает факты проникновения в изолированные сети, в связи с чем можно сделать вывод, что отключение Ethernet-кабеля и WiFi недостаточно для защиты. Любое внешнее соединение к компьютеру представляет собой угрозу. В этой статье рассматриваются методы обнаружения так называемых скрытых сетей и способы защиты от появления скрытых соединений.   

Риски, связанные с соединениями

В отношении безопасности сетей передачи данных существует тренд, связанный с созданием схем сетей на уровне связей, например, Ethernet- или WiFi-соединений. Корпоративные сети намного сложнее подобных схем и требуют анализа с различных точек зрения.

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

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


Рисунок 1: Симуляция карты сети с различными узлами и соединениями

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

Главная проблема – понять истинные границы сети. Во многих случаях сеть определяется как группа компьютеров, объединенных возможностью коммуникации при помощи различных технологий и протоколов. Зачастую администраторы рассматривают сеть как компьютеры, взаимодействующие через Ethernet или WiFi, что, строго говоря, является неверным. Если в организации не предприняты меры касаемо USB-устройств, могут появиться так называемые скрытые сети, которые создаются при помощи USB-устройств и позволяют осуществлять коммуникацию между компьютерами, изолированными физически и логически. 

Изоляция сети и USB-соединение

Для лучшего понимания рисков, касающихся скрытых сетей, которые создаются при помощи USB-устройств, рассмотрим простой пример. Предположим, в организации есть сеть, состоящая из трех VLAN’нов (виртуальных локальных сетей).

Первый VLAN содержит:

  • Компьютер А, имеющий связь с остальными компьютерами того же VLAN’a.
  • Компьютер B, имеющий связь с остальными компьютерами того же VLAN’a.

Второй VLAN содержит:

  • Компьютер C, имеющий связь с остальными компьютерами того же VLAN’a.
  • Компьютер D, имеющий связь с остальными компьютерами того же VLAN’a.
  • Компьютер E, имеющий связь с остальными компьютерами того же VLAN’a.

Третий VLAN содержит:

  • Компьютер F, имеющий связь с остальными компьютерами того же VLAN’a.

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

Рисунок 2: Топология сети, когда группы компьютеров подключены к разным VLAN


Рисунок 3: Скрытая сеть, наложенная на общую топологию

Соединения USB-устройств в системе компьютеров

Если USB-устройство мигрирует от одного компьютера к другому, возникает термин «опыление», схожий с концепцией, используемой в других областях, и связан с переносом угрозы / рисков при помощи USB-устройства между различными компьютерами, которые даже могут быть подключены к различным сетям.

Когда пользователь подключает USB-устройство, в реестре ОС Windows создается несколько записей, которые, например, могут быть полезны при криминалистической экспертизе с целью понимания, откуда возникла утечка или появилась угроза.  

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


Рисунок 4: Информация обо всех USB-устройствах, подключенных к компьютеру

По каждому подключенному USB-устройству доступна следующая информация:

  • Имя устрйства.
  • Class.
  • ClassGUID.
  • HardwareID.
  • Тип устройства (например, жесткий диск)
  • Driver.
  • И т. д.

Детектирование скрытых связей

Зная, где и как информация одного из USB-устройств хранится в операционной системе, вы можете выяснить компьютеры, «совместно использующие» подключенное устройство. В этом случае мы можем нанести на общую топологию два узла, связанные с двумя компьютерами и одну дугу, отражающую связь между этими компьютерами. Таким образом, после обнаружения скрытой связи, соответственно, будет обнаружена и скрытая сеть. Далее на основе времени возникновения событий вы можете определить направление скрытой связи.

Для выполнения автоматизации детектирования скрытых связей была предложена следующая схема:


Рисунок 5: Логика работы скрипта автоматизации в ActiveDirectory

На рисунке выше логика работы приложения в центральном узле с использованием нескольких технологий от Microsoft для запуска команд на каждом компьютере внутри домена. В нашем решении использовались следующие технологии:

  • WinRM.
  • SMB (Server Message Block; Блок сообщений сервера).
  • WMI.

Powershell представляет собой объектно-ориентированную командную оболочку от Microsoft, которая упрощает взаимодействие с любой структурой внутри операционной системы Windows.

Рисунок 6: Перечень USB-устройств, когда-либо подключаемых к компьютеру

Поиск скрытых USB-сетей с использованием WinRM

Для корректной работы WinRM-версии скрипта для PowerShell требуется активация службы Windows Remote Management (WinRM) на каждом компьютере, где нужно провести аудит:


Рисунок 7: Служба WinRM

С целью автоматизации сбора информации скрипт был протестирован в сети с одним доменом на базе Active Directory (AD). Для подтверждения запуска на удаленных компьютерах в локальной сети использовалась учетная запись администратора домена, которая понадобится во время запуска скрипта.


Рисунок 8: Для использования скрипта необходимы данные об учетной записи

Основная реализация скрипта находится в файле LaunchUSBHiddenNetworks.ps1, который подключается к удаленным компьютерам и использует скрипт RecollectUSB.ps1, передаваемый в качестве параметра, с последующим сбором информации об USB-устройствах. Таким образом, скрипт должен запускаться на каждой машине, участвующей в аудите.

Скрипт: LaunchUSBHiddenNetworks

Работа этого скрипта основана на команде “Invoke-Command”. Скрипт позволяет соединиться с компьютером в сети, если в качестве параметров передать FQDN, имя или IP-адрес и путь к еще одному скрипту для последующего запуска в PowerShell.

$salida=invoke-command -ComputerName (Get-Content servers.txt) –FilePath 'PathToScript\RecollectUSBData.ps1'-Credential testdomain\administrador

В параметре –ComputerName задается имя компьютера (или списка компьютеров) для аудита, которые находятся внутри Active Directory. Список имен можно перечислить через запятую или, как в примере выше, передать в виде текстового файла (servers.txt).

В параметре –FilePath передается имя скрипта, который будет собирать данные на компьютерах. В параметре –Credential передается учетная запись администратора домена для разрешения запуска на удаленном компьютере (в нашем случае домен – testdomain, пользователь – administrator).

Результаты работы скрипта записываются в объект $salida. Полученная информация будет храниться в файле CSV с именем “USBDATA.csv”:

$salida | Out-File USBDATA.csv

По результатам отработки скрипта полученный файл CSV будет иметь следующую структуру:

Имя компьютера, IP (в формате IPv4), Имя USB-устройства, ID (уникальный идентификатор)


Рисунок 9: Результаты, полученные в формате CSV

На базе полученной информации мы можем создать схему, схожую с той, что показана на рисунке ниже, при помощи приложения Gephi:

Рисунок 10: Схема, отражающая скрытые соединения на базе USB-устройств

Скрипт RecollectUSBData

Этот скрипт собирает всю информацию, касающуюся USB-устройств, подключаемых к компьютеру и запускается локально. Информация собирается из определенной ветки реестра ОС Windows.

$USBDevices = @()
$USBContainerID = @()
$USBComputerName = @()
$USBComputerIP = @()
$SubKeys2 = @()
$USBSTORSubKeys1 = @()

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

$Hive = "LocalMachine"
$Key = "SYSTEM\CurrentControlSet\Enum\USBSTOR"

Переменные $Hive и $Key хранят полный путь к ветке реестра, где находится информации относительно подключаемых USB-устройств. Значение “LocalMachine” эквивалентно разделу HKLM или HKEY_LOCAL_MACHINE.

$ComputerName = $Env:COMPUTERNAME
$ComputerIP = $localIpAddress=((ipconfig | findstr [0-9].\.)[0]).Split()[-1]

Имя и IP-адрес локального компьютера хранятся в переменных $ComputerName и $ComputerIP соответственно.

$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($Hive,$Computer)
$USBSTORKey = $Reg.OpenSubKey($Key)
$nop=$false

В объекте $Reg хранится запрос к реестру на базе команды OpenRemoteBaseKey, в которую передаются параметры $Hive и $Computer. В итоге получаем ветвь, где будет осуществляться поиск. Переменная $nop будет использоваться далее для управления потоком выполнения.

Try {
$USBSTORSubKeys1 = $USBSTORKey.GetSubKeyNames()
}
Catch
{
Write-Host "Computer: ",$ComputerName -foregroundcolor "white" -
backgroundcolor "red"
Write-Host "No USB data found"
$nop=$true
}

Блок Try – Catсh отвечает за обработку ошибок в случае, если информация относительно USB-устройств найдена не будет. Если никаких данных не найдено, в переменной $nop присваивается значение переменной $true для того, чтобы избежать выполнения процесса идентификации и получения информации об USB-устройствах.

if(-Not $nop)

В случае, если что-либо найдено, связанное с подключаемым USB-устройством, будут запущены следующие блоки:

Блок 1:
ForEach($SubKey1 in $USBSTORSubKeys1)
{
$Key2 = "SYSTEM\CurrentControlSet\Enum\USBSTOR\$SubKey1"
$RegSubKey2 = $Reg.OpenSubKey($Key2)
$SubkeyName2 = $RegSubKey2.GetSubKeyNames()
$Subkeys2 += "$Key2\$SubKeyName2"
$RegSubKey2.Close()
}

Каждая запись в ветке реестра, где происходит поиск, связана с отдельным USB-устройством. Каждый элемент хранится в матрице @Subkeys2.
Блок 2:
ForEach($Subkey2 in $Subkeys2)
{
$USBKey = $Reg.OpenSubKey($Subkey2)
$USBDevice = $USBKey.GetValue('FriendlyName')
$USBContainerID = $USBKey.GetValue('ContainerID')
If($USBDevice)
{
$USBDevices += New-Object -TypeName PSObject -Property @{
USBDevice = $USBDevice
USBContainerID = $USBContainerID
USBComputerName= $ComputerName
ComputerIP = $ComputerIP
}
}
$USBKey.Close()
}

Этот блок анализирует информацию по каждому USB-устройству, полученную в Блоке 1, которая хранится в матрице @Subkeys2. Для каждого элемента, имеющего значение в поле $USBDevice, извлекается идентификатор USB-устройства (переменная USBContainerID). Имя и IP-адрес компьютера также хранятся в соответствующих переменных, чтобы впоследствии эта информация была добавлена в CSV-файл.

Рисунок 11: Ветка реестра, где хранится информация об USB-устройствах

Блок 3:

for ($i=0; $i -lt $USBDevices.length; $i++) {
$IDUnico=$USBDevices[$i] | Select -ExpandProperty "USBContainerID"         
$USBNombre=$USBDevices[$i] | Select -ExpandProperty "USBDevice"
Write-Host "Computer: ",$ComputerName -foregroundcolor "black" - backgroundcolor "green"
Write-Host "IP: ",$ComputerIP
Write-Host "USB found: ",$USBNombre
Write-Host "USB ID: ",$IDUnico
Echo "$ComputerName,$ComputerIP,$USBNombre,$IDUnico"
}

Третий блок отображает информацию, собранную с удаленного компьютера. Команда Write-Host используется для вывода информации на экран. Команда Echo – для вывода данных, которые впоследствии будут записаны в файл CSV.


Рисунок 12: Информация, выводимая после запуска скрипта

Скрытые USB-сети на базе SMB

Для того чтобы запустить скрипт через протокол SMB, нужно предварительно установить PSTools для запуска команды PSExec на проверяемом компьютере. Схема работы будет примерно той же, как и в случае с WinRM. С сервера происходит соединение с удаленным компьютером и запускается скрипт с использованием учетной записи администратора домена. Затем запускается второй скрипт, который собирает информацию об USB-устройствах.
Главный скрипт LaunchUSBHiddenNetworks.ps1 будет иметь некоторые модификации для работы с новым типом соединения. Основное изменения связано с тем, что в этот раз для запуска удаленного скрипта команда Invoke-Command использоваться не будет. Скрипт будет запускаться из шелла, открытого через Powershell и будет загружаться из сетевого каталога, предположительно находящегося на веб-сервере, через протокол HTTP. В этом случае отсутствуют сопутствующие проблемы, связанные с политикой запуска и правами, которые существуют при работе локальными общедоступными ресурсами.

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

Скрипт LaunchUSBHiddenNetworks

$computers = gc
"C:\scripts\HiddenNetworks\PSExec\USBHiddenNetworks_for_SMB\servers.txt"
$url = "http://192.168.1.14/test/RecollectUSBData.ps1"
$sincro = 40

В коде выше используются несколько переменных. Матрица с IP-адресами или именами компьютеров из файла servers.txt будет храниться в переменной $computers. В переменной $url хранится адрес скрипта, используемого для сбора информации на удаленных компьютерах. В переменной $sincro хранится время ожидания до операции синхронизации. Следует учитывать, это время может варьировать в зависимости от среды, где вы запускаете этот скрипт. Ниже показан пример выполнения:


Рисунок 13: Запуск скрипта при помощи утилиты PSEXEC

В файле servers.txt находится либо список имен компьютеров, либо перечень IP-адресов, как показано на рисунке ниже:


Рисунок 14: Список IP-адресов для анализа

foreach ($computer in $computers) {
$Process = [Diagnostics.Process]::Start("cmd.exe","/c psexec.exe
\\$computer powershell.exe -C IEX (New-Object
Net.Webclient).Downloadstring('$url') >>
C:\scripts\HiddenNetworks\PSExec\USBHiddenNetworks_for_SMB\
usbdata.csv")
$id = $Process.Id
sleep $sincro
Write-Host "Process created. Process id is $id"
taskkill.exe /PID $id
}

В этом цикле будет проанализирован каждый компьютер из переменной $computers, в которую загружается информация из файла servers.txt. Во время выполнения главную роль играет объект $Process, внутри которого происходит открытие консоли удаленного компьютера, запуск Powershell, куда передается скрипт RecollectUSBData.ps1 в качестве параметра. Местонахождение скрипта находится в переменной $url. Перед запуском скрипта важно проверить корректность путей для каждого файла.

Перед переходом к следующему компьютеру в списке, нужно убедиться в том, что завершен текущий процесс по сбору информации. Существует несколько способов решить эту задачу, но в нашем случае используется команда sleep с задержкой после каждого акта сбора сведений. После того как аудит текущего компьютера закончился, задача удаляется при помощи команды taskkill. В информационных целях ID и результат операции выводится на экран, как показано на рисунке ниже:


Рисунок 15: Скрипт, запущенный в Powershell

Скрипт: RecollectUSBData

Этот скрипт претерпел изменения только в последнем блоке (Блоке 3) с целью адаптации выходных данных под новую среду. Как видно в коде ниже, команда Echo заменена на Write-Host с несколькими переменными без вывода информации на экран.

for ($i=0; $i -lt $USBDevices.length; $i++) {
$IDUnico=$USBDevices[$i] | Select -ExpandProperty "USBContainerID"
$USBNombre=$USBDevices[$i] | Select -ExpandProperty "USBDevice"
Write-Host "$ComputerName,$ComputerIP,$USBNombre,$IDUnico"
}

Файл CSV генерируется в точности так же, как и в предыдущем случае.

Историческая информация

Также возможно получение дат первого подсоединения к компьютеру в случае, если мы хотим больше подробностей относительно миграции USB-устройства внутри скрытой сети. Ветка с дополнительной информацией, показанная ниже, в журнале событий по умолчанию отключена во всех версиях Windows:

Windows Logs -> Applications and Services Logs -> Windows -> DriverFrameworks-
UserMode -> Operational

Дату первого подключения USB-устройства можно получить при помощи анализа следующего файла:

C:\Windows\inf\setuoapi.dev.log

Внутри этого файла помимо других сведений записано время первого подключения USB-устройства. Чтобы правильно определить USB-устройство, в скрипте “RecollectUSBData.ps1” необходимо ввести новую переменную, в которой будет храниться содержимое ключа DiskID:

Рисунок 16: Раздел реестра с ключом DiskID

Значение ключа DiskID уникально внутри Windows, но отличается при подключении к другому компьютеру, в отличие от поля ContainerId, которое не изменяет своего значения. USB‑устройство можно найти внутри файла setupoapi.dev.log, используя это значение. На рисунке ниже показан пример поиска информации по одному из устройств, где указана дата первого подключения к проверяемому компьютеру:


Рисунок 17: Пример поиска даты первого подключения USB-устройства

Скрытые связи в OS X

На компьютерах под управлением Mac OS X / macOS есть файл com.apple.finder.plist, где хранится информация о подключаемых USB-устройствах. На рисунке ниже показан пример содержимого такого файла:


Рисунок 18: Информация, касающаяся подключения USB-устройство, в системах с OS X

Защита от образования скрытых сетей

Самый очевидный способ избежать «опыления» (создания скрытых связей) между компьютерами в корпоративной сети – ограничить использование USB-устройств. Например, через обязательное следование политикам Active Directory, которые разрешают подключение к пользовательскому компьютеру только тех устройств, которые разрешил сам пользователь. Реализация такой политики наряду с белыми списками разрешенных устройств для каждого пользователя позволяет избежать появления скрытых связей, однако этот метод требует много ресурсов для поддержания в работоспособном состоянии.


Рисунок 19: Использование USB-устройств на этом компьютере запрещено из-за политики компании

Заключение

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

Заражение при помощи USB-устройств – реальная и насущная проблема, которая касается не только случая с вирусом Stuxnet, но и других ситуаций, имеющих высочайшую актуальность, как, например, вредонос Brutal Kangaroo, использовавшийся ЦРУ.

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

Ссылки

https://blogs.technet.microsoft.com/heyscriptingguy/2012/05/18/use-powershell-to-find-thehistory-of-usb-flash-drive-usage/

http://www.elladodelmal.com/2017/06/brutal-kangaroo-y-la-infeccion-por-usb.html

https://github.com/ElevenPaths/USBHiddenNetworks

comments powered by Disqus