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

Вы выполняете все свои методы повышения привилегий — незащищенный объект, сброс Windows Credential Manager, незащищенные службы, использование PATH — и получаете большое старое гусиное яйцо.

Что теперь?

Почему бы нам просто не спросить пользователя, какой у него пароль?

Все о кредитах

Повышение привилегий Windows — одна из важнейших тем для пентестинга, red teaming и защиты собственного компьютера от различных атак. Когда вы атакуете сеть, наличие обычных учетных данных домена для пользователя необходимо для запуска таких приложений, как BloodHound, и таких эксплойтов, как NoPac или PrinterBug.

Итак, у нас есть маяк, как мы можем запросить у пользователя его пароль? Ответ на самом деле довольно прост. Закончив курс Sektor 7 Windows Privilege Escalation, я изучил несколько классных методов повышения привилегий для оболочек с более высоким уровнем целостности.

Один из методов, которым обучали в курсе, назывался «Вор», в котором использовалась однострочная оболочка PowerShell для создания окна сообщения безопасности Windows.

Отлично! Он автоматически перечисляет имя пользователя и домен пользователя и вводит их в командную строку. Что происходит, когда я ввожу пароль?

Прохладный! Он показывает пароль в открытом виде в командной строке. Тогда мы должны быть готовы, верно? Не совсем.

Какие проблемы?

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

Скриншот немного сложно увидеть, но вот суть вывода. Поскольку однострочник требует ввода данных пользователем, команда завершится ошибкой. Нам не разрешено удаленно запускать скрипт, требующий ввода данных пользователем (по крайней мере, я не нашел способа!).

Есть способы обойти это. Один из способов сделать это — из публикации 2015 года под названием Всплывающие окна PowerShell + Capture. Этот метод включает в себя настройку Metasploit и захват команды. Это работает, но нельзя ли упростить? Конечно.

Вторая проблема с однострочником заключается в том, что он показывает только учетные данные в открытом виде на консоли пользователя-жертвы. Таким образом, чтобы получить пароль в открытом виде, нам нужно быть в контексте сеанса пользователя.

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

Способ 1: InsideMan.exe

Не говоря уже о бесстыдном плагине моего собственного инструмента, InsideMan.exe — это простой способ легко предложить пользователю ввести свой пароль. Затем программа запишет пароль в виде открытого текста в текстовый файл в папке «Документы» пользователя.

Программа написана на C++ и использует системный вызов для запуска сеанса PowerShell и запуска модифицированной версии команды из курса Sektor 7 Windows PrivEsc. Вы можете найти предварительно скомпилированную версию InsideMan на моем GitHub или можете скомпилировать ее самостоятельно через gcc.

Предположим, что у нас есть маяк на нашей цели. Я собираюсь использовать Covenant C2 для демонстрации. Я использовал функцию загрузки, чтобы сбросить InsideMan.exe на диск. Как видите, Защитник Windows включен. Я использовал встроенную функцию обхода AMSI от Covenant, но только для запуска команд PowerShell, поскольку InsideMan.exe не считается вредоносным (пока).

Итак, вот первая проблема с этим методом. Вы должны скинуть EXE на диск. Да, знаю. ОПСЕК! Мне тоже не нравятся артефакты в системе, но это то, что есть. Кроме того, мы все равно сбрасываем файлы на диск с нашими фишинговыми полезными нагрузками!

Теперь мы можем запустить InsideMan из маяка.

Пользователю предлагается окно сообщения учетных данных Windows.

Венди вводит свой пароль по запросу.

Файл windows32.txt создается в каталоге Wendy’s Documents.

И мы можем напечатать файл, чтобы получить ее пароль открытым текстом!

Это очень простой способ легко предложить пользователю ввести свой пароль. Нет внедрения процесса, никаких причудливых вызовов Windows API или отключения. Просто наведи и стреляй. Вы можете запускать EXE столько раз, сколько потребуется, пока не получите пароль.

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

Метод 2. Инъекция процессов с помощью Donut и Pickl3

Этот метод использует инструмент под названием Pickl3. Pickl3 — это программа на C++, написанная с помощью вызовов Windows API, которые вызывают окно учетных данных Windows, аналогичное InsideMan. Аналогично предыдущей проблеме, с которой мы столкнулись, Pickl3 отображает только пароль в открытом виде в сеансе пользователя. Итак, как мы обойдем это?

Один из способов достижения нашей фишинговой цели — использование инъекций процессов. Мы можем преобразовать Pickl3 в шелл-код с помощью Donut, а затем внедрить его в процесс через наш маяк. Затем мы можем использовать функцию кейлоггера из Covenant/Cobalt Strike, чтобы перехватить пароль, когда он вводится в приглашение.

Компиляция

Вы можете скомпилировать C++-файл Pickl3 с помощью Visual Studio. Откройте новое консольное приложение C++ и вставьте код из файла cpp в VS. Скомпилируйте через вкладку Build, чтобы получить ваш EXE-файл.

Преобразование Pickl3 в шеллкод

Если у вас нет Donut, вы можете клонировать его на свой компьютер с Windows с GitHub. Мы будем использовать флаг -b для дополнительных возможностей обхода AMSI.

Внедрение процесса, часть 1:

Вернувшись к нашему маяку, мы можем запустить «ps», чтобы получить активные процессы в системе.

Когда мы смотрим на наши процессы, мы видим, что svchost работает. Это хороший процесс для инъекции.

Номер pid — 1680, поэтому мы запомним его и запустим наш кейлоггер.

Кейлоггинг

Covenant, Metasploit и Cobalt Strike предлагают функциональность кейлоггинга. для Covenant мы просто набираем Keylogger в приглашении, и нам предоставляется несколько вариантов времени.

Мы можем выбрать 30-секундный интервал.

Внедрение процесса, часть 2:

Нам нужно обойти AMSI еще раз, прежде чем внедрять процесс.

Мы вводим наш номер pid в поле ProcessID, а затем нажимаем «Обзор», чтобы выбрать наш шеллкод.

Мы нажимаем «Выполнить», и на нашей машине-жертве мы видим запрос пароля.

Вводим пароль в подсказку и возвращаемся на наш маяк, получаем пароль открытым текстом.

Когда мы убираем клавишу Shift и вывод клавиши Enter, мы получаем зима20!

Выводы

Это оба довольно хороших метода получения паролей в открытом виде с удаленного маяка. Хотя сброс EXE-файла на диск — не самый безопасный метод OPSEC, он работает быстро, не требуя никаких обходов AV или обхода EDR. Мы также можем быстро удалить артефакты после получения пароля.

Запуск процессов в памяти посредством внедрения процессов — лучший способ достичь нашей цели, но он не обходится без проблем. Нам придется запустить наш кейлоггер, и я обнаружил некоторые проблемы совместимости с машинами, на которых не установлена ​​Visual Studio C++.

Система, в которой эти файлы не установлены, возвращается с ошибкой исключения.

Я также обнаружил, что для того, чтобы заставить Pickl3 работать, вы должны обойти AMSI прямо перед попыткой внедрения. Поскольку InsideMan использует только вызовы PowerShell, нам не нужно выполнять какие-либо из этих процессов.

ПРИМЕЧАНИЕ. Я связался с автором Pickl3, чтобы узнать, как он скомпилировал инструмент, чтобы узнать, смогу ли я добиться большей совместимости с ним. Я обновлю эту статью, как только получу от него известие.

Чтобы узнать больше о методах Red Team и интересных вещах, следите за мной здесь, на Medium или в Twitter @assume_breach.