TrollDump
- Внедряет управляемую DLL x64 в управляемый/неуправляемый процесс x64 (процесс должен иметь GUI, так как мы получаем его дескриптор окна) с помощью setwindowshook
- Здесь, в качестве троллинга, мы внедряемся в скрытое окно taskmgr, чтобы сделать дамп lsass незаметно (см. раздел Test Case ниже)
- DLL инжектора и внедряемая DLL — это одна и та же DLL, поэтому дополнительная DLL не требуется
- Уровень целостности целевого процесса должен быть таким же или более низким, чем у процесса инжектора
Благодарности (обновление/переписывание проекта)
Оригинальный проект: https://github.com/enkomio/ManagedInjector
- портировал код для внедрения в 64-битные двоичные файлы ---> оригинальный проект позволяет внедрение DLL только в 32-битные двоичные файлы
- удалил логику IPC, так как она была излишней
- создал шаблонный код для запуска вашей полезной нагрузки напрямую в функции RunOnRemoteProcess() вместо прежнего запутанного способа
- проект по-прежнему использует DLLExport, чтобы получить .NET DLL, экспортирующую функции
- Обратите внимание: это не зависимость проекта, а скорее постобработка. DLLExport изменит вашу итоговую .NET DLL, чтобы экспортировать функцию.
- Можно вручную выполнить экспорт функции, если хотите: https://blog.xpnsec.com/rundll32-your-dotnet/
Компиляция
- Скачайте проект и скомпилируйте решение как X64, Release
- Внешние зависимости не требуются
Использование
> Requires High Integrity depending on use case
> [System.Reflection.Assembly]::LoadFrom("C:\Users\public\TrollDump.dll")
> [TrollDump.ForFun]::Main("C:\windows\system32\taskmgr.exe")
- В этой POC мы делаем дамп lsass; вы можете запускать любую "логику экспортируемой функции DLL", изменив функцию RunOnRemoteProcess() и перекомпилировав.
- Как уже упоминалось ранее, код служит шаблоном для внедрения DLL; то, что вы решите делать после, удобно писать на управляемом коде c#.
Тестовый пример
- Win 2019 build 17763.737 с последними заплатками windefender
- оба: внедрение DLL + дамп lsass
- Другие антивирусы (не названы)
- внедрение DLL работает нормально
- очевидно, работает ли дамп lsass, зависит от того, разрешает ли антивирус taskmgr выполнять дамп lsass
- Не тестировалось ни на каких EDR -> думаю, внедрение DLL всё равно должно работать на отдельных EDR
OPSEC
- DLL должна находиться на диске, поэтому должна быть обфусцирована
- DLL следует использовать только для внедрения; фактическая полезная нагрузка никогда не должна быть встроена в DLL и должна загружаться рефлексивно
- Очевидно, внедрение CLR в неуправляемый процесс подозрительно, но что поделать!
- setwindowshook, хотя и классическая техника, чаще всего ассоциируется с кейлогингом, а не с нашим случаем использования
- Можно проявить много творчества с любым GUI-процессом, в который вы хотите внедриться (если вы работаете как system, можно внедряться и в dwm.exe)
Пожелания - Проект был сделан за выходные, и у меня нет времени/желания заниматься следующим:
- Внедрение в процесс без GUI
- в настоящее время для setwindowshook используется WH_CALLWNDPROC; вы можете изменить его, чтобы использовать WH_GETMESSAGE, но целевой процесс должен выполнять цикл обработки сообщений (GetMessage())
- если вы сможете найти бинарник без GUI, реализующий цикл сообщений (я подозреваю, что вряд ли), то вы сможете внедряться и в бинарники без GUI
- для GUI-процессов обычно выполняется GetMessage()
- Полностью рефлексивное внедрение и отсутствие необходимости сбрасывать на диск
- Судя по setwindowshook, похоже, DLL должна быть на диске?
- я пытался использовать делегаты c#, чтобы передать указатель на функцию для выполнения вместо экспортированной функции DLL, и это не сработало (это классическая техника кейлоггера на c# для локального процесса, но мы делаем удалённый процесс)
- можете попробовать, включив другие техники; думаю, это осуществимо
- Taskmgr будет автоматически запускаться с High Integrity, даже если наш текущий процесс имеет Medium (так что технически, если внедрить в него DLL, это обход UAC)
- Внедрение, судя по возвращаемым результатам WIN API, работает нормально
- Однако taskmgr не вызывает экспортированную функцию
Отказ от ответственности
Следует использовать только в образовательных целях!