PowerShell_> Contruyendo nuestro usb Write Blocker

Hola a todos, hoy vamos a realizar un script que nos bloquee la escritura en dispositivos usb. Como algunos ya imagináis, este script tiene multiples usos, incluyendo para análisis forense en la parte de adquisición pruebas, cuando clonamos o queremos crear una imagen de un pendrive o de un hd, debemos asegurarnos de que el dispositivo del que queremos obtener la imagen no sea modificada por nuestro sistema, por ejemplo por el antivirus, etc. ya que provocaría cambios en el dispositivo origen, mac times de archivos, etc, inaceptable.

A parte de poder utilizar write blockers profesionales por hardware tipo Tableau, etc. tenemos la opción de utilizar write blocker por software, por ejemplo, distribuciones como; Caine, Kali (modo forense), etc. tienen por defecto (a dios gracias) el montaje de dispositivos en modo solo lectura y la opción de montarlos en lectura y escritura, en windows hay software gratuito y de pago que facilita la opción de utilizar dispositivos en solo lectura, en el caso de hoy, vamos a aprovecharnos de una entrada del registro para crear nuestro propio Write Blocker, espero que os guste y ahora a trabajar.

Desde Windows XP SP2, podemos modificar la storage device policy en el registro, bien pero, ¿dónde esta eso en el registro de windows?… tranquilidad ahora vamos a ello:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

 

Debería existir la clave StorageDevicePolicies, con el valor con nombre WriteBlocker ,tipo dword 32bits y con un valor hexadecimal tal y como aparece en la siguiente imagen:

Por cierto, un momento de pausa, estoy utilizando regedit porque es la herramienta que viene por defecto en windows, pero si queréis utilizar una herramienta para visualizar el registro más avanzada os recomiendo que leáis el post que se marcó Marcos aka @_N4rr34n6_ en un post en la web de los conejos, fin pausa… seguimos.

Por defecto, dicha clave no existe en nuestro registro, así que vamos a explicar que es lo que hará nuestro script:

1.- Comprobará si existe la rama: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies

2.- Si no existe, la crearemos y crearemos la clave WriteProtect con el valor “00000000”.

3.- En caso de que exista la rama, comprobaremos el valor de WriteProtect.

4.- Nos pedirá en qué estado queremos dejar la clave, bloqueando la escritura o permiténdola.

5.- Realiza el cambio, y nos muestra el estado.

Si, puede parecer enfarragoso, pero es un tema un poco delicado, y me gusta tener claro que es lo que estoy haciendo, otra cosa, este script se debe ejecutar ANTES de pinchar nada a los usb, y ahora el caso práctico:

IMPORTANTE: No es necesario reiniciar para que se apliquen los cambios, si ejecutamos el script y activamos el bloqueo, el usb que conectemos al equipo queda como solo lectura, si queremos pinchar otro dispositivo usb en modo lectura y escritura, tenemos que volver a ejecutar el script y desbloquear, de esta manera, el primer usb queda en solo lectura y el segundo en lectura y escritura.

Ahora os pongo el script:

# Constantes y variables
$RegRutaCompleta = 'hklm:\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies'
$RegRuta = 'hklm:\SYSTEM\CurrentControlSet\Control'
$ExisteRegistro = Test-Path -path $RegRutaCompleta
$UsbBloqueado = '0' # 0=Desploqueado, 1=Bloqueado
$EstadoBloqueo = '0'

# FUNCIONES
Function CambioValor{
#Dependiendo de lo que le indiques activa o desactiva el bloqueo del usb.
write-host ('---------------------------------------------')
$Pregunta = Read-Host -Prompt '¿Que desea hacer, 0 desactiva bloqueo y 1 activa bloqueo'
If(($Pregunta)-eq0) {
Set-ItemProperty-path $RegRutaCompleta-Name WriteProtect -Value "00000000"
CompruebaValor
} else {
Set-ItemProperty-path $RegRutaCompleta-Name WriteProtect -Value "00000001"
CompruebaValor
}
}

function CompruebaValor{
#Comprueba el valor de la entrada del registro.
$EstadoBloqueo=Get-ItemProperty-path $RegRutaCompleta|Select-Object-Property WriteProtect
If(($EstadoBloqueo.WriteProtect)-eq'1') {
Write-Host-BackgroundColor DarkGreen -ForegroundColor Black ('- USB BLOQUEADO, NO SE PUEDE ESCRIBIR')
} else {
Write-Host-BackgroundColor DarkRed -ForegroundColor White ('- USB DESBLOQUEADO - AHORA SE PUEDE ESCRIBIR')
}
}

Clear-Host
If (($ExisteRegistro) -eq $False) {
Write-Host('- No existe la ruta {0}'-f$RegRutaCompleta)
Write-Host('- Creando la ruta {0}'-f$RegRutaCompleta)
New-Item-path $RegRuta-Name StorageDevicePolicies |Out-Null
Write-Host('- Creando entrada WriteProtect con valor {0}'-f$EstadoBloqueo)
New-ItemProperty-path $RegRutaCompleta-Name WriteProtect -Value "00000000"-PropertyType DWORD |Out-Null
} Else {
Write-Host('- Ya existe la ruta {0}'-f$RegRutaCompleta)
Write-Host('- Comprobamos el valor')
}

CompruebaValor
CambioValor

Uroooooooo, bueno empecemos por partes:

Al principio podéis ver que defino las variables y constantes que utilizo en el script, creo que son auto explicativas., excepto la variable $ExisteRegistro, donde usamos el cmdlet Test-Path para comprobar si existe la ruta completa definida en la variable $RegRutaCompleta, Seguimos:

Al final del script está el código principal, en PowerShell, se lee de arriba hacia abajo, por lo que el código principal debe estar al final del script,  aquí evaluamos el valor de $ExisteRegistro y en caso de que sea Falso significa que la ruta hklm:\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies
NO existe, por lo tanto la creamos con el cmdlet New-Item y posteriormente creamos la clave WriteProtect con los valores por defecto a “00000000” lo que significa que está permitido la lectura y escritura. En caso de que exista, el Else nos lo dirá.

Después ejecutara las funciones CompruebaValor y posteriormente CambioValor, veamos CompruebaValor:

Esta función es muy sencilla, en $EstadoBloqueo, guardamos el valor de WriteProtect con el cmdlet Get-ItemProperty y según su valor nos informará si el usb esta bloqueado o desbloqueado, veamos Cambio valor:

Aquí, realizaremos una pregunta por consola y según su respuesta modificará el valor de WriteProtect con el cmdlet Set-ItemProperty, y posteriormente volverá a ejecutar la función CompruebaValor la cual nos indicará el mensaje correspondiente.

Como veis el script no es demasiado complicado, en esta ocasión hemos utilizado los cmdlets Test-Path, New-Item, Get-Item, Set-ItemProperty, New-ItemProperty, además, hemos aprendido a leer un valor desde consola con el cmdlet Read-Host. Parece que no, pero con este pequeño script hemos aprendido a trabajar un poco con el registro de windows y a entender un poco más a nuestro amigo Powershell, espero que os haya gustado y en otra ocasión veremos más cosas.

PD: Os dejo este script llamado Write_Blocker.ps1 dentro de una carpeta temporal en onedrive.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *