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

Lazarus and the FudModule Rootkit: Beyond BYOVD with an Admin-to-Kernel Zero-Day

varwar

El Diff
Забанен
Регистрация
12.11.2020
Сообщения
1 383
Решения
5
Реакции
1 537
Пожалуйста, обратите внимание, что пользователь заблокирован
C:
NTSTATUS __fastcall AppHashComputeImageHashInternal(
        __int64 user_controlled_buffer,
        __int64 (__fastcall **user_controlled_ptr)(__int64, __int128 *),
        unsigned int a3,
        __int64 a4)
{
...
  status = (*user_controlled_ptr)(user_controlled_buffer, &v42);
  if ( status < 0 )
    return status;
...
}

Кому нужны переполнения, когда есть такая красота?

Статья: https://decoded.avast.io/janvojtese...eyond-byovd-with-an-admin-to-kernel-zero-day/
 
Докатились, теперь в драйверах напрямую вызывается пользовательский указатель... А вы и дальше свои мемори-коррапшены ищите=)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Докатились, теперь в драйверах напрямую вызывается пользовательский указатель... А вы и дальше свои мемори-коррапшены ищите=)
Ага. Тоже новый код драйвера, как в afd.sys где была некорректная обработка юзер указателей и "arbitrary write what where".
 
Ага. Тоже новый код драйвера, как в afd.sys где была некорректная обработка юзер указателей и "arbitrary write what where".
У меня есть все основание полагать, что в ближайшем будущем мы увидим где-нибудь в ntoskrnl экспортируемую функцию "CallUsermodeCode", которая будет принимать шеллкод и его размер =) С обходами всяких митигаций
 
Пожалуйста, обратите внимание, что пользователь заблокирован
в ближайшем будущем мы увидим где-нибудь в ntoskrnl экспортируемую функцию "CallUsermodeCode", которая будет принимать шеллкод и его размер =) С обходами всяких митигаций
Было бы забавно, но за такое точно кто-то с работы улетит, мягко говоря.
Нам же остается фильтрацию всех указателей в SystemBuffer проверять чуточку тщательнее, чем в мелкософте.
 
Было бы забавно, но за такое точно кто-то с работы улетит, мягко говоря.
Нам же остается фильтрацию всех указателей в SystemBuffer проверять чуточку тщательнее, чем в мелкософте.
А что за такое не надо увольнять с волчьим билетом? Понять и простить? Ну человек же наверное не специально, наверное не выспался, с кем не бывает... Я так думаю надо выкинуть следом и непосредственного начальника, поскольку последний отвечает за свои кадры.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А что за такое не надо увольнять с волчьим билетом? Понять и простить?
Конечно. У мелкософта admin->kernel это не security boundary xD
 
Конечно. У мелкософта admin->kernel это не security boundary xD
На самом деле тут не удивлюсь если судебное дело заведут, похоже на умысел.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Докатились, теперь в драйверах напрямую вызывается пользовательский указатель...
Большинства техник эксплуатации ядра основаны на технике эксплуатации Ret2User.

Ret2Usr (return-to-user) – это техника эксплуатации ядра, суть которой заключается в том, что процессы пространства пользователя не могут получить доступ к пространству ядра, в то время как пространство ядра может получить доступ к пространству пользователя. Поэтому мы можем перенаправить поврежденный код или указатели данных в ядре на код или данные в пользовательском пространстве, которые затем будут выполнены с привилегиями ядра (ring-0). ... ....

Эта техника достигается путем, что когда у нас есть уязвимость в kernel-mode мы можем перезаписать адрес возврата, таблицу диспетчерезации, указатель функции, указатель данных. Тем самым перенаправив поток выполнения на свой код, чтобы повысить свои привилегии в системе.

...
Доработанная техника позволяет обходить SMEP. Есть еще такая штука как Ret2Dir.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
What’s more, the attacker also partially controlled the data referenced by the first argument passed to the invoked callback function. This presented an ideal exploitation scenario, allowing the attacker to call an arbitrary kernel function with a high degree of control over the first argument.
...
The exploit crafts the IOCTL input buffer in such a way that the vulnerable callback is essentially a gadget that performs a 64-bit copy from the IOCTL input buffer to an arbitrary target address. This address was chosen to corrupt the PreviousMode of the current thread. By ensuring the corresponding source byte in the IOCTL input buffer is zero, the copy will clear the PreviousMode field, effectively resulting in its value being interpreted as KernelMode.

Вот это интересная часть, которую в твиттерах обсуждали, но не видел ответа.
Нашел интересного кандидата в ntoskrnl.exe.

C:
void __stdcall RtlClearAllBits(PRTL_BITMAP BitMapHeader)
{
    memset(
        BitMapHeader->Buffer,
        0,
        4 * ((BitMapHeader->SizeOfBitMap >> 5) + ((BitMapHeader->SizeOfBitMap & 0x1F) != 0)));
}

Как там было в оригинале хз, пацаны с аваста, поделитесь семплом. Если все поля SystemBuffer контролятся, то можно собрать фейковый BitMapHeader и обнулить KTHREAD->PreviousMode для дальнейшего оперирования всей памятью.
 
This is an interesting part that was discussed on Twitter, but I did not see a response.
I found an interesting candidate in ntoskrnl.exe.

C:
void __stdcall RtlClearAllBits(PRTL_BITMAP BitMapHeader)
{
    memset(
        BitMapHeader->Buffer,
        0,
        4 * ((BitMapHeader->SizeOfBitMap >> 5) + ((BitMapHeader->SizeOfBitMap & 0x1F) != 0)));
}

How it was in the original xs, guys from Avasta, share the sample. If all SystemBuffer fields are controlled, then you can assemble a fake BitMapHeader and reset KTHREAD->PreviousMode for further operation of all memory.

There is even better function for this:

C:
void __stdcall ExInitializePushLock(PKSPIN_LOCK SpinLock)
{
  *SpinLock = 0i64;
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я может чего то не понимаю, но как это
There is even better function for this:

C:
void __stdcall ExInitializePushLock(PKSPIN_LOCK SpinLock)
{
  *SpinLock = 0i64;
}
может помочь в эксплуатации чего-либо? Обнуление previousmode должно же быть инициировано из юзермода.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я может чего то не понимаю, но как это

может помочь в эксплуатации чего-либо? Обнуление previousmode должно же быть инициировано из юзермода.

Ничего из юзермода не нужно вызывать, SMEP обходить не нужно. Ищется в пространстве ядра функция-гаджет (две выше), она исполняется драйвером. В параметре передается адрес PreviousMode, который ликается через NtQuerySystemInformation (объект исполняемого потока KTHREAD).
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Так мне узнать хочется, в чем смысл из ядра обнулять PreviousMode?
Чтобы у пользовательского потока, для которого обнуляется PreviosMode был доступ ко всей памяти. Т.е. NtReadVirtualMemory, NtWriteVirtualMemory может вызываться без ограничений. Это используется для повышения привилегий и DKOM в целом.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Просто зачем в качестве коллбека выбирать фукнцию в юзер-моде? Для этого нужно SMEP обходить, а так ты сначала используешь Arbitrary Write Where через легитимную функцию-гаджет, повышаешь привилегии и делаешь что хочешь. В статье же все написано (почти все).
 
Guys, please listen. The whole point of setting PreviousMode of our user mode thread is to gain read/write access to kernel without having to load vulnerable drivers or use complex chains for CFG gadgets. There is little to no gain when it comes to privilege escalation as we already need to run in higher integrity.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
The whole point of setting PreviousMode of our user mode thread is to gain read/write access to kernel without having to load vulnerable drivers
This is exactly what I said before. The article contain all of the information.
 


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