Пожалуйста, обратите внимание, что пользователь заблокирован
Недавно тестил одну штуку и натолкнулся на интересный момент, который до этого не знал. Судя по всему, современный AMSI помимо всяческих eval'ов и Assembly.Load'ов еще и палит последовательности вызовов методов на COM-интерфейсах. Не знаю, как давно это происходит, но все же. Чуть ниже будет пример того, что отправляется на сканирование через AMSI, при запуска классического Dotnet2JScript. Как видно из текста, выводится наименование COM-интерфейса, имя метода (или DISPID-метода, если имя не удалось получить), а также аргументы (не все типы аргументов таким образом отображаются, бывает "Unsupported parameter type <тип>"). Base64 от нагрузки я вырезал, тк он слишком большой вышел, но могу сказать, что сериализованный делегат Assembly.Load был запихан в скан полностью. Я предполагаю, что когда скрипт вызывает GetObject или new ActiveXObject, движок создает небольшой прокси поверх IDispatch, который логирует вызовы. Про PowerShell и дотнеты понятно, но печально, что из VBScript/JScript мы с этим ничего толком поделать не можем, кроме разве что установки значения AmsiEnable в реестре, или чего то более всратого и палевного типа: https://www.tiraniddo.dev/2018/06/disabling-amsi-in-jscript-with-one.html - если знаете варианты получше, то напишите, может я чего не знаю.
PS: Если кому интересно, как я достаю то, что отправляется на сканирование через AMSI, то я просто зарегал свой AMSI-провайдер. Примеров этого можно в интернетах найти, или просто собрать что-то типа: https://github.com/manyfacedllama/amsi-tracer - он будет всё, что через AMSI полетит антивирусу в папку высерать, не то чтобы прям удобно, но вполне приемлимо для тестирования.
Код:
IWshShell3.Environment("Process");
IWshEnvironment.Item("COMPLUS_Version", "v2.0.50727");
_ASCIIEncoding._6002000f("<base64_payload>");
_ASCIIEncoding._60020014("<base64_payload>");
_FromBase64Transform._60020009("Unsupported parameter type 00002011", "0", "1956");
_MemoryStream._60020017("Unsupported parameter type 00002011", "0", "1465");
_MemoryStream._6002000b("0");
_BinaryFormatter._60020006("Unsupported parameter type 00000009");
_ArrayList._60020020("Unsupported parameter type 00000000");
_ArrayList._6002001b();
_HeaderHandler._60020007("Unsupported parameter type 0000200c");
PS: Если кому интересно, как я достаю то, что отправляется на сканирование через AMSI, то я просто зарегал свой AMSI-провайдер. Примеров этого можно в интернетах найти, или просто собрать что-то типа: https://github.com/manyfacedllama/amsi-tracer - он будет всё, что через AMSI полетит антивирусу в папку высерать, не то чтобы прям удобно, но вполне приемлимо для тестирования.
