06 agosto, 2017

Administrar los permisos de un servicio de Windows sobre un objeto

Definimos objeto a un fichero, carpeta, unidad, etc. Todo aquello en lo que se puedan administrar permisos NTFS en el caso de Windows.

Con los permisos NTFS de Windows podemos gestionar las DACL (Discretionary Access Control List) son lista de control de acceso discrecional en las que se pueden controlar quien es el propietario de un objeto y especifica quién tiene permiso y quién no para acceder a dicho objeto.

Sabemos que se pueden conceder DACL a usuarios locales del sistema, de un dominio, equipos o grupos de usuairos sobre uno o varios objetos (ficheros, carpetas o unidades).

¿Se pueden administrar estos permisos a objetos para un servicio de Windows o de terceros?.
Si. Se pueden asignar uno o varios servicios a uno o varios objetos de Windows y establecer permisos sobre ellos. Lo que pasa que no se puede hacer una forma gráfica amigable ni de manera trivial como pasa con los usuarios.

Para conceder permisos a un objeto es necesario conocer el SID (Security Identifier) del usuario, equipo, grupo, etc. Que se va asignar a ese objeto. Por ejemplo en el caso de Windows, buscando el nombre de un usuario y asignándolo a un objeto sería suficiente para administrar las DACL de ese usuario sobre un objeto. De forma subyacente el sistema está reconociendo un SID asociado a ese usuario.

Los SID de los usuarios locales de un equipo se registran en la siguiente rama del registro de Windows.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ProfileList
Hay otras formas de conocer los SID de usuarios locales así como también usuarios de dominio y equipos. Para conocer estos SID podemos usar WMIC (Windows Management Instrumentation Command-line).

Para listar todos los usuarios locales filtrando por nombre de usuario y SID.
wmic useraccount get name,sid
Igual que lo anterior pero filtrando un nombre de usuario en concreto.
wmic useraccount where (name='USUARIO') get name,sid
Lo mismo pero para usuarios que pertenezcan a un dominio.
wmic useraccount where (name='USUARIO' and domain='DOMINIO') get name,sid
Con PsGetSid (de Sysinternals) para listar los SID de usuarios locales de equipos remotos y el propio SID de la máquina locales y otras remotas. Para ejecutar cualquier herramienta PsTools de forma remota tendremos que conocer las credenciales de un administrador local o de dominio en la máquina remota.

Comentado todo lo anterior vamos a ver como podemos agregar un servicio a un objeto y gestionar sus permisos.

Lo primero que tenemos que averiguar es el nombre asignado a un servicio. Ya sea de Windows o de una aplicación de terceros la forma de conocerlo sería la misma.

En este caso de ejemplo usaré el servicio de Dropbox para Windows. Abrimos una consola de servicios (services.msc) y buscamos el servicio que queremos utilizar. Cuando abrimos el servicio vemos el apartado "Nombre del servicio" será ese el que usaremos.

Figura 1: Nombre del servicio Dropbox para Windows (DbxSvc).

Para conocer su SID asignado por Windows a un servicio usaremos la herramienta de comandos de Windows SC (Service Controller).
sc showsid DbxSvc
Figura 2: Conocer el SID asignado a un servicio de Windows con SC.

Ahora solo quedaría asociar ese SID a un objeto. De forma gráfica perosnalmente no encontré forma de hacerlo, pero si por la herramienta de comandos de Windows ICACLS. Con la que podemos mostrar y gestionar las listas de control de acceso discrecional (DACL) de un objeto.
En este caso agregaremos a la carpeta llamada "test" (que será el objeto) el servicio de Dropbox mediante el SID obtenido anteriormente.
icacls c:\test /grant *S-1-5-80-315955965-2752282644-3851734118-3415690430-1520210413:(f)
Figura 3: Agregando un servicio a un objeto con ICACLS

Ahora vemos como el servicio DbxSvc ya está integrado en el objeto y podremos manipular los permisos de forma gráfica. 

Figura 4: Administrando de forma gráfica los permisos de un servicio agregado a un objeto.

Saludos!

03 agosto, 2017

Como protegerse de ataques ARP Spoofing

Siguiendo el tema de las entradas en las que comentara los ataques MITM en la tabla ARP.
  1. Ataque MITM: ARP Poisoning y DNS Spoof con Ettercap [Parte 1 de 2]
  2. Ataque MITM: ARP Poisoning y DNS Spoof con ARPSpoof [Parte 2 de 2]
  3. Como detectar direcciones MAC duplicadas en el equipo local
El éxito de esta técnica de ataque radica en que dentro de una misma red local es posible la suplantación de la dirección MAC de la puerta de enlace, por la dirección MAC del atacante en la tabla ARP del equipo atacado. De modo que todo el tráfico que se genere desde en el equipo atacado será interceptado por el equipo atacante y este a su vez lo redireccionará a la dirección de la puerta de enlace legítima de la red local, de esta manera el equipo atacado no será consciente de que su tráfico de red se esté monitoreando, al menos que este consulta su tabla ARP (arp -a).

En la siguiente captura se puede ver una consulta a la tabla ARP de un equipo atacado, consultada antes y después de ser atacado. Vemos como la dirección MAC del Gateway es suplantada por la dirección MAC del atacante (en este caso correspondiente a la dirección IP 192.168.100.20).

Figura 1: Suplantación de MAC en la tabla ARP (ARP Spoofing)

Una opción que podemos aplicar para prevenir la suplantación de la dirección MAC de nuestro Gateway, es incluir dicha dirección MAC en la tabla ARP del sistema local de forma estática. Con esto conseguiremos que el equipo ya tenga definida una ruta estática de dirección IP correspondiente con su dirección MAC, por lo que será imposible el uso de técnicas ARP Spoofing para intentar suplantarla.

En sistemas Windows añadir una o varias rutas estáticas en la tabla ARP es posible con la utilidad de comandos ARP.
arp -s [IP_GATEWAY] [MAC_GATEWAY]
Figura 2: Añadir ruta estática en la tabla ARP en sistemas Windows.

Otra forma de hacerlo es mediante la utilidad de comandos Netsh en su modo interactivo.
netsh
netsh>interface
netsh>ipv4
netsh>add neighbors "[NOMBRE_INTERFACE]" "[IP_GATEWAY]" "[MAC_GATEWAY]"
Figura 3: Añadir una ruta estática en la tabla ARP en sistemas Windows con Netsh.

En el caso de sistemas Linux el argumento y la expresión del comando es la misma que en el caso de Windows.

Vemos como las rutas estáticas en la tabla ARP se marca como "PERM" (permanent).
arp -s [IP_GATEWAY] [MAC_GATEWAY]
Figura 4: Añadir una ruta estática en la tabla ARP en sistemas Linux.

Cualquiera de estas líneas de comandos de la tabla ARP se podría automatizar en un script de inicio del sistema. Ejecutar scripts o aplicaciones al inicio del sistema.

En el caso de Windows se puede crear un fichero por lotes .bat con la instrucción. Y añadir este script en el inicio de sesión o sistema.
@echo off
arp -s [IP_GATEWAY] [MAC_GATEWAY]
exit
En el caso de Linux crearíamos un script .sh en bash. Darle permisos de ejecución a este script y añadiendo el path de ubicación en una línea al final del fichero /etc/rc.local por ejemplo.
#!/bin/sh -e
# Añadir ruta estática gateway en la tabla ARP
arp -s [IP_GATEWAY] [MAC_GATEWAY]
exit 0
Saludos!

01 agosto, 2017

Ejecutar scripts o aplicaciones al inicio del sistema

Esta es una entrada muy básica, pero que decidí escribirla para hacer referencia a ella en futuras entradas con el fin de evitar repiticiones de estas acciones en las mismas.

Tanto en sistemas Windows como Linux se pueden automatizar scripts o aplicaciones para que se inicien en el arranque del sistema o en el inicio de sesión de usuario.

Comentaré varias opciones para realizar este proceso, tanto en sistemas MS Windows como en distribuciones Linux.

En Windows 

Se pueden añadir ficheros binarios o scripts en el inicio del sistema o inicio de sesión de usuario de diferentes maneras.
  1. Creando un valor de cadena y estableciendo la ruta del script batch en la clave de registro: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run.
  2. Ubicando el script o binario ejecutable del software en la carpeta para la ejecución de inicio del sistema: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp.
  3. Mediante una directiva local de Windows (GPO): https://technet.microsoft.com/es-es/library/cc770556(v=ws.11).aspx.
  4. Con una tarea programada de Windows (taskschd.msc), estableciendo como desencadenador el "Inicio del sistema" o "Inicio de sesión" y en acciones introducir el path de ubicación del script .bat. https://technet.microsoft.com/es-es/library/cc748841(v=ws.11).aspx

En Linux 

Al igual que Windows, hay varias formas de hacer que un script o aplicación se ejecute en el inicio del sistema. Una de ellas es haciendo uso del fichero /etc/rc.local. Este fichero se ejecuta en el inicio de sesión del usuario. Se ejecuta en el último nivel una vez iniciado el sistema.

Establecemos permisos de ejecución al fichero o programa
sudo chmod +x [script.sh_o_aplicacion]
Añadimos el path de ubicación del fichero como una línea al final del fichero /etc/rc.local. De este modo se ejecutará automáticamente en los próximos inicios de sesión. Esto lo haremos desde un superusuario (root) que tiene permisos de escritura sobre el fichero /etc/rc.local.

También se podría hacer de forma manual editando el propio fichero /etc/rc.local.
sudo su
echo [path_script.sh_o_aplicacion] >> /etc/rc.local
Otra opción sería establecer el script.sh o el programa como un servicio del sistema a través del directorio /etc/init.d/. De este modo se iniciará según el sistema se inicie, como si fuese un servicio más.
Movemos el script.sh o programa al directorio /etc/init.d/. Establecemos permisos de ejecución sobre el fichero y actualizamos el update-rc.d.
sudo mv [path_script.sh_o_aplicacion] /etc/init.d/
sudo chmod +x /etc/init.d/[script.sh_o_aplicacion]
sudo update-rc.d [script.sh_o_aplicacion] defaults
Si estamos trabajando con un script .sh y al ejecutar el último comando de actualización de update-rc.d nos diese algún/os error/es del tipo "insserv: missing ...".
Tendríamos que referenciar en modo de comentarios los siguientes parámetros en el propio fichero del script.
#!/bin/bash
### BEGIN INIT INFO
# Provides:           descripción
# Required-Start:     $syslog
# Required-Stop:      $syslog
# Default-Start:      2 3 4 5
# Default-Stop:       0 1 6
# Short-Description:  descripción
# Description:        descripción
### END INIT INFO
[SCRIPT AQUÍ]
Saludos!
Entradas Relacionadas