11 diciembre, 2018

Comandos Docker [Guía de referencia]

Llevo una temporada trabajando con el sistema de contenedores de Docker, poco a poco fuí recopilando los comandos de Docker que iba utilizando a través de su web oficial.

Cree un repositorio para irlo actualizando paulatinamente con la referencia de estos comandos de Docker.

En la medida de lo posible iré actualizando esta entrada con el nuevo contenido que vaya incorporando al repositorio de Github.

Instalación Docker en Ubuntu 18.04

Instalación Docker

Actualizar los repositorios existentes.
sudo apt update
Instalar paquetes previos que permitan a apt usar paquetes a través de HTTPS.
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Agregar la clave GPG del repositorio oficial de Docker.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Agregar el repositorio de Docker en las fuentes de APT.
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
Finalmente, se instala Docker.
sudo apt install docker-ce
Se comprueba que el daemon de Docker está iniciado y el proceso está habilita para iniciarse en el arranque.
sudo systemctl status docker
Si no estuviese iniciado y/o habilitado para el arranque del sistema.
sudo systemctl start docker
sudo systemctl enable docker


Ejecutar el comando Docker sin sudo o desde otro usuario

De forma predeterminada el comando Docker solo puede ser ejecutado por el usuario root o por un usuario del grupo docker. Donde “username” sería el nombre del usuario.
sudo usermod -aG docker username
Para comprobar que el usuario forma parte del grupo docker se pude ejecutar.
id -nG


Referencia de comandos Docker

https://docs.docker.com/engine/reference/commandline/docker

Comandos gestión Docker

Listar contenedores en ejecución. Listar todos los contenedores en ejecución y parados (-a indica todos).
docker ps –a
Listar imágenes descargadas en local (-a muestra todas las imágenes incluidas las intermedias).
docker images
Descargar imagen a caché local desde un repositorio público.
docker pull ubuntu:18.04
Loguearse en Docker Hub, será necesario estar autenticado para subir (push) una imagen.
docker login
docker login -u <usuario> -p <password>
Subir una imagen a un repositorio (Docker Hub).
docker push <imagen_local>
Crear una imagen de un contenedor personalizado en ejecución.
docker commit <ID o nombre_contenedor> <nombre_imagen_nueva>
Para subir una imagen creada a un repositorio como puede ser Docker Hub, es neecsario "tagearla" antes.
docker tag <imagen_local> <nombre_tag_imagen>
docker push <nombre_tag_imagen_creada>
Construir una imagen a partir de un Dockerfile (--file será necesario si el nombre del fichero no es "Dockerfile" y no está situado el mismo directorio).
docker build --tag <nombre_imagen> --file <fichero_dockerfile>
Eliminar una imagen local (-f o --force fuerza la eliminación).
docker rmi <id o nombre_imagen>
Eliminar un contenedor, si el contenedor está en ejecución será necesario detenerlo (docker stop ) antes de eliminarlo se puede indicar el parámetro -f o --force (esto fuerza la detención y eliminación del contenedor).
docker rm <id o nombre_imagen>
Eliminar todos contenedores, redes, imágenes o volúmenes "colgantes" sin referencia o no utilizados
docker system prune

#Parámetros
--all       #Eliminar todas las imágenes no utilizadas, no solo las que cuelgan.
--force     #Forzar el eliminado, no pedir confirmación.
--volumes   #Eliminar volúmenes no utilizados o colgantes.
--filter    #Proporcionar valores de filtro.

Crear e iniciar un contenedor basado en una imagen Ubuntu 18.04, que ejecuta una Shell en modo interactivo (-it) como entrypoint.
docker run –name <nombre_contenedor> -h <nombre_hostname> -it ubuntu:18.04 /bin/bash
Crear y ejecutar un contenedor con un comando/servicio en segundo plano un comando como entrypoint (-d modo detached, no interactivo) (-c comando dentro del modo interactivo bash).
docker run -d --name <nombre_contenedor> -h <hostname> <nombre_imagen> bash -c "<comando>"
docker run -d --name mi_web -h web ubuntu_web bash -c "apache2ctl -D FOREGROUND"
Crear e iniciar un contenedor en modo interactivo con una Shell (-i interactivo -t asociar una tty).
docker run -it --name test debian bash
Crear contenedores. El contenedor se crea pero no se inicia (sería necesario usar después docker start). “docker créate” dispone de multitud parámetros.
docker create -it --storage-opt size=120G fedora /bin/bash
Iniciar, detener y reiniciar contenedores.
docker start <id o nombre_imagen>
docker stop <id o nombre_imagen>
docker restart <id o nombre_imagen>
Publicar puertos en contenedores (aunque se ejecute una imagen que ya predefina exposición de puertos, igualmente habría que establecerlos en la ejecución del contenedor).
#Publicar el puerto 80 del contenedor en un puerto aleatorio del host.
docker run -it --name test -p 80 debian bash

#Publicar el puerto 80 del contenedor al 8080 del host.
docker run -it --name test -p 8080:80 debian test

#Publicar todos los puertos expuestos a puertos aleatorios del host.
docker run -it --name test -P debian bash
Listar los puertos de contenedores.
docker port <id o nombre_imagen>
Finalizar (matar) contenedores.
docker kill <id o nombre_imagen>
Buscar registros de logs de contenedores (-f muestra logs a tiempo real).
docker logs -f <id o nombre_imagen>
Mostrar los procesos en ejecución de contenedores.
docker top <id o nombre_imagen>
Buscar imágenes en repositorios (Docker Hub).
docker search <término>
Importar, exportar y guardar imágenes en un archivo tar.
docker save --outpout <nombre_contenedor> <nombre_empaquetado_contenido.tar>
docker export --output <nombre_contenedor> <nombre_empaquetado_contenido.tar>
docker import <nombre_empaquetado_contenido.tar> <nombre_contenedor>
Cargar una imagen desde un archivo tar o STDIN (Standard Input).
docker load --input <test.tar>
Gestionar Docker.
docker df                              #Mostrar el uso del disco docker.
docker system events o docker events   #Mostrar eventos en tiempo real.
docker system info o docker info       #Mostrar información de todo el sistema.
Desactivar procesos de contenedores.
docker unpause <id o nombre_imagen>
Actualizar la configuración de contenedores.
docker update <id o nombre_imagen>
Mostrar la versión de Docker.
docker version
Inspeccionar cambios de archivos o directorios de contenedores.
docker diff <id o nombre_imagen>
Inspeccionar contenedores (devuelve información de bajo nivel).
docker inspect <id o nombre_imagen>
Mostrar estadísticas de uso de los recursos de contenedores (CPU, Memoria, I/O, PIDs).
docker stats   #Muestra todos los contenedores actuales en ejecución.
docker stats <id o nombre_imagen>
Gestionar volúmenes Docker.
docker volume create    #Crear un volumen.
docker volume inspect   #Mostrar información detallada de volúmenes.
docker volume ls        #Listar volúmenes.
docker volume rm        #Eliminar volúmenes.
docker volume prune     #Eliminar volúmenes locales no utilizados.
Gestión de redes Docker.
docker network create       #Crear una red.
docker network connect      #Conectar un contenedor a una red.
docker network disconnect   #Desconectar un contenedor de una red.
docker network inspect      #Mostrar información detallada de redes.
docker network ls           #Listar redes.
docker network rm           #Eliminar redes.
docker network prune        #Eliminar todas las redes no utilizadas.
Montar un volumen de un directorio local en un contenedor (útil para trabajar con volúmenes de datos que se están editando habitualmente).
docker run -it -v /home/user/codigoWeb:/var/www/html debian bash
Crear un contenedor que usará un volumen asociado a otro contenedor existente.
#Crear el contenedor sin bash, simplemente para tenerlo como referencia para crear posteriormente otros contenedores basados en este usando su volumen de datos como referencia.
docker run -it -v /tmp:/var/www/html --name container_code debian /bin/false

#Asociar el volumen creado en el contenedor anterior con un nuevo contenedor usando el ID del contenedor.
docker run -it --name code -h code --volumenes-from ec3456a3d16cb debian bash
Copiar datos desde el contenedor al host local (opcional -a --archive copia toda la información uid/gid).
docker cp -a <id_contenedor>:<path_contenedor> <path_host_local>
Copiar desde el host local al contenedor.
docker cp -a <path_host_local> <id_contenedor>:<path_contenedor>
Ejecutar un comando en un contenedor en ejecución. Por ejemplo una Shell bash en modo interactivo (útil para acceder a un contenedor en ejecución).

https://docs.docker.com/engine/reference/commandline/exec
docker exec -it nombre_contenedor /bin/bash
○ Live restore Docker

Permite que los contenedores permanezcan en ejecución aunque el daemon no esté disponible (por ejemplo en un reinicio del daemon dockerd). Ayuda a reducir la inactividad del contenedor debido a fallas del daemon, interrupciones planificadas o actualizaciones.

https://docs.docker.com/config/containers/live-restore

Para habilitar es necesario crear el fichero “/etc/docker/daemon.json”, con el contenido.
{
  "live-restore": true
}
○ Iniciar contenedores automáticamente

Iniciar automáticamente un contenedor con “--restart always” se trata de una política de reinicio que siempre reinicia el contenedor si este se detiene (útil para auto iniciar el contenedor después de reiniciar la máquina host).
docker run -d --restart always --name test -h test debian

#Políticas de reinicio automático de contenedores
no               #No reinicia automáticamente el contenedor. (valor por defecto)
on-failure       #Reinicia el contenedor si sale debido a un error.
unless-stopped   #Reinicia el contenedor a menos que se detenga explícitamente o el propio Docker se detenga o reinicie.
always           #Siempre reinicia el contenedor si se detiene.


Comandos Docker Swarm

Referencia de comandos Docker Swarm.

https://docs.docker.com/engine/reference/commandline/swarm
https://docs.docker.com/engine/reference/commandline/swarm_update

Iniciar, unirse, dejar y actualizar un cluster Swarm.
docker swarm init     #Inicializar un Swarm.
docker swarm join     #Unirse a un Swarm como nodo worker y/o manager (dependiendo si se trata de un –token manager o worker).
docker swarm leave    #Dejar un Swarm.
docker swarm update   #Actualizar un Swarm, dispone de varias opciones.


Comandos Docker Machine

Referencia de comandos Docker Machine.

https://docs.docker.com/machine/reference
docker-machine create   #Crear un nodo.
docker-machine kill     #Detener una nodo.
docker-machine ls       #Listar nodos.
docker-machine ssh      #Iniciar sesión en un nodo activo.
docker-machine rm       #Eliminar un nodo.
docker-machine env      #Establecer variables de entorno para definir que docker debe ejecutar un comando en una máquina en particular.
Crear dos nodos usando driver de Amazon Web Services, estableciendo región y zona de disponibilidad, red VPC y tamaño de disco.
docker-machine create --driver amazonec2 --amazonec2-region "us-east-2" --amazonec2-zone "b" --amazonec2-vpc-id vpc-0d1dd38... --amazonec2-root-size 8 test


Comandos Docker Node

Referencia de comandos Docker Node.

https://docs.docker.com/engine/reference/commandline/node
docker node inspect   #Mostrar información detallada en uno o más nodos.
docker node ls        #Listar nodos del Swarm.
docker node ps        #Enumerar las tareas que se ejecutan en uno o más nodos.
docker node rm        #Eliminar uno o más nodos del Swarm.
docker node update    #Actualizar un nodo.
Promover un nodo worker a manager.
docker node promote <nodo>
Degradar un nodo manager a worker.
docker node demote <nodo>
Cambiar nodo a solo Manager y no Manager+Worker (que sería la función por defecto).
docker node update --availability drain <nodo>
○ Docker node update

Referencia de comandos Docker node update.

https://docs.docker.com/engine/reference/commandline/node_update
--availability   #Disponibilidad del nodo ("active"|"pause"|"drain").
--label-add      #Agregar o actualizar una etiqueta de nodo (key=value).
--label-rm       #Eliminar una etiqueta de nodo si existe.
--role           #Rol del nodo ("worker"|"manager").


Comandos Docker Service

Referencia de comandos Docker Service.

https://docs.docker.com/engine/reference/commandline/service
docker service create     #Crear un nuevo servicio.
docker service inspect    #Mostrar información detallada sobre uno o más servicios.
docker service logs       #Obtener los registros de un servicio o tarea.
docker service ls         #Listar servicios.
docker service ps         #Listar las tareas de uno o más servicios.
docker service rm         #Eliminar uno o más servicios.
docker service rollback   #Revertir cambios a la configuración de un servicio.
docker service scale      #Escalar uno o múltiples servicios replicados.
docker service update     #Actualizar un servicio.
Crear un servicio. Se debe crear desde un nodo manager.
--publish: Publicar puertos
--replicas: Número de réplicas totales a repartir entre los nodos existentes.
--update-parallelism: Ejecución del número de contenedores/tareas por nodo.
--update-delay: Retraso entre las actualizaciones (ms|s|m|h)
--restart-condition on-failure: Reiniciar la tarea en caso de fallo.
--constraint node.role manager: Los nodos solo admitirán tareas de un nodo manager
test: Imagen a ejecutar.
docker service create --name test -p 80:80 --replicas 3 --update-parallelism 1 --update-delay 5s --restart-condition on-failure --constraint 'node.role == manager' test
Otra forma de crear un servicio es añadiendo \ para un salto de línea y seguir definiendo los parámetros del servicio.
docker service create \
--name test \
--publish 80:80 \
--replicas 3 \
--update-parallelism 1 \
--update-delay 5s \
--restart-condition on-failure \
--constraint 'node.role == manager' \
test


Docker service update

Referencia de comandos Docker service update.

https://docs.docker.com/engine/reference/commandline/service_update

Actualizar réplicas de un Swarm de modo que se pueda controlar un escalado elástico.
docker service update --replicas=50 test
docker service scale test=50
Forzar actualización de un servicio, incluso si ningún cambio lo requiere. Útil para actualizar un cluster de nodos Swarm en los que se actualizaron réplicas en un servicio con un paralelismo concreto y Docker Swarm ignoró el balanceo de tareas (réplicas del servicio) a nuevos nodos worker unidos al Swarm.
docker service update --force test


Comandos Docker Stack

Referencia de comandos Docker Stack.

https://docs.docker.com/engine/reference/commandline/stack
docker stack deploy     #Implementar o actualizar un stack.
docker stack ls         #Lista de pilas.
docker stack ps         #Listar las tareas en la pila.
docker stack rm         #Eliminar una o más pilas.
docker stack services   #Listar los servicios en la pila.
Implementar o actualizar un stack a partir de un fichero “Docker-Compose”. Debe ejecutarse desde un nodo manager.
docker stack deploy --compose-file docker-compose.yml test
Saludos!

06 diciembre, 2018

Implementación de Docker Swarm en Amazon Web Services usando Auto Scaling Groups y Elastic Load Balancing

Implementación de Docker Swarm en Amazon Web Services usando Auto Scaling Groups y Elastic Load Balancing

En esta entrada quiero hacer referencia al proyecto de fin de curso del ciclo superior de "Administración de Sistemas Informáticos y Redes" que presenté en Noviembre de 2018 en el centro "CIFP A Carballeira - Marcos Valcárcel" de Ourense.

Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups y Elastic Load Balancing

▶ Repositorio Github

https://github.com/adrianlois/Docker-Swarm-AWS-ASG-ELB


▶ Documentación del trabajo final

(Descarga directa PDF 106 pag.)
https://github.com/adrianlois/Docker-Swarm-AWS-ASG-ELB/raw/master/documentacion/Implementaci%C3%B3n%20Docker%20Swarm%20AWS%20ASG%20y%20ELB%20-%20%5BDocumentaci%C3%B3n%5D%20-%20adrianlois.pdf

▶ Presentación Slides

https://www.slideshare.net/adrianlois/implementacin-docker-swarm-en-amazon-web-services-usando-auto-scaling-groups-y-elastic-load-balancing-124979842


▶ Video demo de la prueba de concepto (PoC) 

https://www.youtube.com/watch?v=HzsBiJjgrOo


Saludos!

16 noviembre, 2018

Montar carpeta remota FTP o FTPS en Linux con CurlFtpsFS y SSHFS

Para montar una carpeta de un directorio FTP o FTPS remoto en un sistema Linux y acceder a ella de forma local como un volumen más del sistema. Se puede usar CurlFtpFS o SSHFS.

CurlFtpFS

CurlFtpFS lo usaremos sino disponomes de conexión SSH hacia el servidor FTP remoto (la transferencia de datos es más lenta).

[1] Instalamos curlftpfs.
sudo apt install curlftpfs
[2] Creamos el directorio en el que montaremos el FTP/FTPS.
sudo mkdir /backups
[3] Montamos la carpeta remota FTP en el sistema local.
sudo curlftpfs -o allow_other usuarioftp:password@servidorftp.com /backups -v
Si queremos que se monte de forma persistente en el sistema, agregamos un nueva entrada al fichero /etc/fstab. Cambiaremos el uid según corresponda al usuario que tendrá acceso a la carpeta.
curlftpfs#servidorftp.com /backups fuse auto,user,uid=1000,allow_other,_netdev 0 0
Para desmotar la carpeta.
fusermount -u /backups
o
umount /backups
CurlFtpFS cuanta con múltiples opciones, para consultar su ayuda.
curlftpfs --help
o
man curlftpfs


SSHFS

SSHFS los usaremos si disponemos de una conexión SSH hacia el servidor FTP remoto (la transferencia de datos es más rápida que CurlFtpFS).

[1] Instamos sshfs.
sudo apt install sshfs

[2] Creamos el directorio en el que montaremos el FTP/FTPS
sudo mkdir /backups
[3] Montamos la carpeta remota FTP en el sistema local.
sudo sshfs -o allow_other usuarioftp@servidorftp.com:/ /backups
Nos pedirá que aceptemos el fingerprint y que introduzcamos el password de usuario.

Con "df -h" podremos ver el directorio remoto FTP/FTPS montamo en el directorio /backup (en este caso) como un volumen del sistema local.

Para montarlo permanentemente en el fichero /etc/fstab lo haremos con la misma sintaxis que en el caso de CurlFtpFS. 

SSHFS cuenta con opciones muy similares a las de CurlFtpFS, para consultar su ayuda.
sshfs --help
o
man sshfs
Saludos!

12 octubre, 2018

Caché de credenciales y passwords almacenadas de los recursos de red de Windows

Existen varias formas de poder visualizar las credenciales "dominio\usuario y password" de los recursos de red almacenados como caché en Windows.

Para que esta caché de almacenamiento sea posible debemos tener habilitado y en ejecución (por defecto ya suele estarlo) el servicio de "Administrador de credenciales" (VaultSvc) que proporciona el almacenamiento seguro y recuperación de credenciales de usuarios.

Hace uso de LSASS (Local Security Authority Subsystem Service) responsable de la política de seguridad en el sistema, audita y verifica quien inicia sesión en sistemas Windows, cambios de contraseñas y crea tokens de acceso.

Figura 1: Servicio de administrador de credenciales.

Cuando se accede a un recurso de red el cual nos solicita usuario y contraseña mediante una autenticación NTLM y se marca el checkbox de "recordar esta contraseña" esta se almacena en un fichero cifrado en nuestro perfil de usuario añadiéndose al Windows Vault.
C:\Users\USUARIO\AppData\Roaming\Microsoft\Credentials

C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Credentials

C:\Users\USUARIO\AppData\Local\Microsoft\Vault

C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Vault

C:\ProgramData\Microsoft\Vault


Administrador de credenciales

Una de las formas más habituales para visualizar las credenciale almacenadas de Windows es a través del Administrador de credenciales situado en el panel de control. Ahí veremos tanto las credenciales de Windows como las credenciales web, en caso de que tengamos guardadas credenciales de sitios web en Internet Explorer únicamente.

Figura 2: Administrador de credenciales de Windows.

KRShowKeyMgr

Otra forma de gestionar estas credenciales es través del "KRShowKeyMgr", se puede ver las credenciales almacenadas, borrarlas y agregar nuevas de forma gráfica.

Para invocar esta ventana escribimos en una cmd o una ventana ejecutar:
rundll32.exe keymgr.dll, KRShowKeyMgr
Figura 3: KRShowKeyMgr - Administrador de nombres de usuario y contraseñas alamacenadas.

cmdkey

Si no tenemos acceso (por restricciones GPO de dominio o similar) al panel de control o poder invocar desde ejecutar, pero si a una consola cmd. Podemos ver estas credenciales a través del comando cmdkey.

Realmente esto es lo que se está usando de forma subyacente a las interfaces gráficas anteriores


Figura 4: cmdkey - Administrador de crecenciales.

Mostrando la ayuda con "cmdkey /?" vemos las posibilidades que tenemos.
Para mostrar la lista de credenciales disponibles:
   cmdkey /list
   cmdkey /list:destino

Para crear credenciales de dominio:
   cmdkey /add:destino /user:usuario /pass:contraseña
   cmdkey /add:destino /user:usuario /pass
   cmdkey /add:destino /user:usuario
   cmdkey /add:destino /smartcard

Para crear credenciales genéricas:
El modificador /add puede reemplazarse por /generic para crear credenciales genéricas

Para eliminar credenciales existentes:
   cmdkey /delete:destino

Para eliminar credenciales RAS (Remote Access Service):
   cmdkey /delete /ras


Herramientas de terceros

Todo lo anterior son formas nativas del sistema de poder gestionar estas credenciales alamacenadas. Pero no permite visualizar las contraseñas en texto plano. Para ello podemos usar algunas herramientas de terceros. Nirsoft desarrolla multitud herramientas de este tipo para sistemas Windows.

CredentialsFileView descifra y muestra las contraseñas en texto plano almacenadas en los archivos de credenciales de Windows (C:\Users\USUARIO\AppData\Roaming\Microsoft\Credentials).

Figura 5: Credentials File View.

VaultPasswordView descifra las contraseñas y otros datos almacenados en Windows Vault (C:\Users\USUARIO\AppData\Local\Microsoft\Vault) del sistema actual o de una unidad externa que se le indique.

Figura 6: Vault Password View.

EncryptedRegView según se le indique escanea el registro de Windows del disco local o de un disco externo. Busca datos cifrados con DPAPI (Data Protection API), intenta descrifralos y mostrarlos en texto plano. No solo mostrará contraseñas almacenadas sino también otro tipo de datos que estuviesen cifrados de productos de Microsoft y también de terceros.

Figura 7: Encrypted Registry View.

Network Password Recovery similar a CredentialsFileView con la diferencia de que este solo muestra aquellas credenciales que afecten con recursos de red.

Figura 8: Network Password Recovery.


Saludos!

19 julio, 2018

Solución al problema de licencias de conexiones RDP entre Windows Server 2016 y Windows Mobile (RDM), Windows CE o versiones antiguas RDP 5.x / 6.x

Actualmente RDP (Remote Desktop Protocol) está en versión 10.x,versiones más actualizadas que incluyen importantes mejoras de seguridad. Como pueden ser: mayor longitud de clave generada por el servidor de licencias RDS 4096 bits con un algoritmo de seguridad SHA256, soportando SSL/TLS y NLA (Network Level Authentication).

Versiones iguales o inferiores a RDP 6.x no soportan las características anteriores. El límite de longitud para las claves es de 2048 bits con algoritmo de seguridad SHA1 (Secure Hash Algorithm 1).

Esta clave se genera en base al método de activación de licencias del administrador de licencias de Escritorio remoto. Si el método empleado es "Web Browser" (Explorador Web) las claves de licencias, se pueden generar un requisitos más bajos que si lo activásemos con otro método, con una longitud de 2048 bits SHA1.

Si aún no tenemos activado el servidor de administración de licencias de Escritorio remoto y queremos tener la compatiblidad entre vesriones más antiguas y actuales para establecer conexiones RDP. Selecionaremos la opción de activar por el método de conexión Web Browser.

En caso de que ya tengamos activado el servidor de licencias procederemos del siguiente modo.

En el servidor Windows Server 2016 que recibirá la conexión RDP desde el dispotivo Windows Mobile o Windows CE comprobamos que NLA esté desactivado.

Figura 1: Desactivar NLA (Autenticación a nivel de red) en Windows Server 2016.
Añadir un rol de instalación de Servicios de Escritorio remoto para VDI (Virtual Desktop Infraestructure).

Figura 2: Añadir rol de instalación de RDS.

En este paso podría ser "Implementación estándar" o "Inicio rápdio".

Figura 3: Implementación estándar para el rol RDS.

Para este esceneario será implementación de escritorio basada en sesión.

Figura 4: Implementaicón de escritorio basada en sesión.

Una vez agregados los servicios RDS. Creamos una colección y no dirigimos a ella.

Figura 5: Colleción de host de sesión de Escritorio remoto.

Dentro de las tareas de colección de RDS configuramos las opciones de seguridad para conexiones RDP.
  • Nivel de seguridad de protocolo de Escritorio remoto (RDP).
  • Nivel de crifrado: Bajo.
  • Deshabilitamos NLA.
Figura 6: Configuración de opciones de seguridad para conexiones RDP.

Como comentaba al princpio, si eligimos un método de conexión basada en Explorador Web. No es necesario realizar ninguna otra acción y las conexión RDP entre Windows Mobile o Windows CE y Windows Server 2012/2016 estarán funcionales.

De igual modo, selecionamos el método de conexión por Explorador Web o Web Browser y aceptamos.

Figura 7: Selección del método de conexión "Web Browser". 

Eliminamos los tipos de claves REG_BINARY correspondientes a las claves de certificado X509 del método anterior de licencias RDS. En el registro del servidor de administrador de licencias de Escritorio remoto.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\RCM
  • Certificate
  • X509 Certificate
  • X509 Certificate ID 
  • X509 Certificate2

Figura 8: Eliminación de claves de licencias generadas por el administrador de licencias de Escritorio remoto.

¿Por qué eliminar estas claves de certificados del registro? 

Entre versiones de RDP actuales la longitud de clave de certificados es de 4096 bits con un algoritmo de seguridad SHA256, estas claves se generan en la primera instancia de conexión entre un acuerdo entre el nivel de seguridad compatible entre las dos máquinas que establecen la conexión RDP.

El equipo del usuario que mantiene la conexión con el servidor al que se conecta establece la longitud y algoritmo de esta clave, si el equipo que se conecta usa una versión de protocolo reciente no habrá problemas, pero si el equipo cliente se trata de un sistema Windows Mobile o similar este no podrá conectarse debido a que el servidor administrador de licencias no puede generar claves de una longitud y algoritmo inferior a los requisitos mínimos que establece el método de conexión (figura 7), por ese motivo el método de conexión Web Browser tiene unos requisitos menos restrictivos y puede generar claves de longitud más corta y cifrados de menor nivel.

Conexión establecida

Como equipo cliente para este ejemplo usaré un Windows XP SP1 que dispone de versión RDP v5.x (funcionaría igual para Windows Mobile, Windows CE o similares con versiones RDP v5.x o v6.x).

Vemos como la conexión RDP se estableció correctamente. En ese momento Windows XP SP1 estableció el acuerdo de certificados X509 de conexión. Si añadimos la desactivación de NLA y el nivel de cifrado más bajo sin SSL/TLS, la conexión es posible.

Figura 9: Conexión RDP establecida entre versioens RDP antiguas y Windows Server 2016.

Saludos!

11 julio, 2018

Ver las passwords Wifis almacenadas a las que nos hemos conectado

Cada vez que desde nuestro equipo Windows nos conectamos a una red inalámbrica WiFi y recordamos la password de indentificación de la red, esta se alamacena en el sistema.

Con el uso de la utilidad de comandos netsh (en la sección de wlan) podemos visualizar las redes que tenemos almacenadas y también la password de acceso que en su momento le indicáramos para autenticarnos en dicha red.

Visualizar los nombres de las redes alamacenadas por Windows en el equipo.
netsh wlan show profile
Establecemos el nombre de la red (SSID - Service Set Identifier) y el valor clear para key.
netsh wlan show profile name=SSID key=clear
Para este ejemplo se usó la red con SSID "prueba".

Figura 1: Netsh - Ver perfiles wlan y obtención de password wifi almacenada.

Otra opción sería usar el "Centro de redes y recursos compartidos" del "Panel control". Una opción con entorno gráfico de Windows 7 es que podíamos ver las redes almacenadas y editar su configuración, en Windows 10 solo podemos ver las redes almacenadas pero no editar su configuración sino estamos conectados en ese momento a esa red. Por lo que hacerlo de una forma gráfica solo nos servirá para ver la password almacenada de la Wifi actual en la que estemos conectados.

Seleccionamos la red Wifi en la que actualmente estemos conectados. Propiedades inalámbricas > Pestaña Seguridad > Mostrar carácteres (nos saltará el UAC por seguridad, para ejecutar esto con privilegios administrativos).

Figura 2: Ver password wifi conectada actualmente.


Saludos!

09 julio, 2018

Especificar servidores de licencias y modo de licencias CAL de servicios de Escritorio remoto (RDS)

Este ejemplo sería aplicable para un entorno en la que disponemos de varios Windows Server. Uno de ellos será el que tendrá el rol instalado de Administrador de licencias de Servicios de Escritorio remoto (RDS - Remote Desktop Services) en el que instalaremos licencias CAL (Client Access Licenses) ya sean por usuario o por dispositivo.

En este caso habrá 5 licencias CAL por usuario para RDS.

Figura 1: Administrador de licencias de Escritorio remoto.

En lo que se centrará esta entrada no será en como activar el servidor de licencias e instalar las licencias CAL para RDS. Sino en como especificamos al resto de servidores que, dependiendo de cada caso, también permitirán conexiones de Escritorio remoto, acepten estas conexiones según el número de licencias CAL disponibles.

Si solo aplicamos esto a la misma máquina que es el administrador de licencias no será necesario nada de esto. 

En caso de una máquina sea el administrador de licencias de Escritorio remoto y queramos que ciertos usuarios se conecten a otro servidor, habrá que especificar en ese otro servidor quien está suministrando las licencias RDS y de que modo se tratan las licencias (por usuario o por dispositivo). 

En el caso de que tengamos más de una máquina que admita conexiones por Escritorio remoto es recomendable emplear objetos de directivas de grupo (GPO - Group Policy Object) de AD (Active Directory).

Por lo que mostraré como hacerlo mediante la instalación de roles RDS y como hacerlo por medio de una GPO.

Método 1: Instalación de roles RDS para VDI (Virtual Desktop Infrastructure)

Agregamos un rol para instalar servicios de Escritorio remoto para VDI.

Figura 2: Instalación de roles RDS para VDI.

Una vez tenemos instalado servicios de Escritorio remoto, en la sección de información general > Administrador de licencias > "Seleccionar el modo de licencias de Escritorio remoto".

Figura 3: Selección del modo de licencias de Escritorio remoto.

En la sección de "Administración de licencias de Escritorio remoto". Establecemos (en este caso) que el modo de licencias CAL será "Por usuario" y que el servidor que proporcionará las licencias será otro. Se podrían agregar varios en caso de haberlos y definir su preferencia, subiendo y bajando su posición en la lista.

Figura 4: Selección del servidor de licencias y el modo de licencias CAL (por usuario o por dispositivo).

Método 2: Creanción de una GPO de Active Directory

Previamente se debería crear una OU (Organizational Unit) en Active Directory e incluír dentro de esta los equipos a los que vincularemos la GPO (aunque esto dependerá de la organización jerarquica de cada sitio). 

Abrimos el "Administrdor de directivas de grupo" (gpmc.msc) de cualquier controlador de dominio, preferiblemente el DC (Domain controller) primario. Creamos una nueva GPO ya vinculada para la la OU donde estarán las máquinas a las que nos conectaremos por Escritorio remoto.

Editamos la GPO y nos situaremos en el siguiente path jerérquico.
Configuración del equipo > Plantillas administrativas > Componentes de Windows > Servicios de Escritorio remoto > Host de sesión de Escritorio remoto > Licencias
Habilitaremos el estado de dos objetos de directiva.

Figura 5: GPO - Licencias CAL para RDS en host de sesión de Escritorio remoto.

Habilitamos: "Usar los servidores de licencias de Escritorio remoto especificados". Espcificando el servidor/es administrador de licencias que se usará.

Figura 6: GPO - "Usar los servidores de licncias de Escritorio remoto especificados".

Habilitamos: "Establecer el modo de licencia de Escritorio remoto". Espefificamos si se trata de licencias CAL por usuario o por dispositivo (en este caso sería por usuario).

Figura 7: GPO - Establecer el modo de licencia de Escritorio remoto.

Aceptamos y cerramos el editor de directivas de grupo. Finalmente podemos abrir una cmd de los servidores a los que les estaría afectando esta directiva y actualizar las políticas con un: gpupdate /force. Puede que nos solicité cerrar sesión y volver iniciarla. 

Para comprobamos la aplicación de directivas, desde un cmd con un gpresult /r o simplemente rsop (RSoP - Resultant Set of Policy).

Saludos!

04 julio, 2018

Exportar certificados digitales no exportables a .PFX (PKCS #12) y restablecer password de la clave privada

En el momento de importar un certificado digital, ya sea para el usuario actual como para el equipo, tenemos la opción de establecer dicho certificado como exportable. Esto nos permite exportar el certificado (clave pública) con la clave privada en un mismo fichero en formato .pfx.


Figura 1: Checkbox "Marcar clave como exportable" al importar un certificado digital.

Si no marcamos el check "Marcar esta clave como exportable" cuando se importar un certificado. En el momento de exportarlo del almacén de certificados del usuario actual: Botón derecho > todas las tareas > exportar...

Figura 2: Exportar certificado del administrador de certificados.
Vemos desmarcada la opción "Exportar la clave privada".

Figura 3: Intento de exportación de clave privada, opción deshabilitada, certificado no exportable.
Para poder exportar un certificado ya instalado en el almacén de certificados del usuario actual, el cual no podemos exportar junto con la clave privada. Podemos usar dos opciones.


Usando Jailbreak

Jailbreak nos permitirá abrir una consola de Microsoft (MSC) del alamacen de certificados de Windows y poder realizar la exportación de la clave privada estableciendo una nueva password.

Una vez descargado Jailbreak abrimos una consola cmd con el mismo usuario donde tenemos instalado el certificado y nos situamos en el raíz, ejecutamos el proceso por lotes "jbcert32.bat". Este nos lanzará una ventana del alamacén de certificados (certmgt.msc).

Figura 4: Ejecución de jailbreak para exportar certificados no exportables.

Ahora vemos como al intentar exportar el certificado nos permite exportar la clave privada.

Figura 5: Opción habilitada para exportar clave privada.

Elegimos un formato .pfx (este almacenará tanto la clave pública como la clave privada), podemos también marca la opción de "Exportar todas las propiedades extendidas".

Figura 6: Opciones disponibles para exportar el certificado en formato .pfx.

Podemos establecer una nueva contraseña para la clave privada, este sería el modo de restablecer la clave privada. Al finalizar el asistentte tendremos exportado un certificado .pfx que contiene ambas claves y volver importarlo en otro usuario o equipo.

Figura 7: Establecer una nueva contraseña para la clave privada.


Usando Mimikatz

Otra opción para poder exportar certificados no exportables de forma sencilla es con la herramienta Mimikatz (comentanda ya en este blog).

Una vez descargado Mimikatz abrimos una consola cmd y nos ubicamos en el raíz ejecutando "mimikatz.exe" (dependiendo la arquitectura del sistema operativo que tengamos win32 o x64).
crypto::capi
crypto::certificates /export
Esto buscará los certificados del alamacén del usuario actual y los exportará en codificación .der y formato .pfx. La contraseña por defecto que establece Mimikatz es "mimikatz" (sin comillas). 

Podremos cambiar la password importando el certificado y volviendo a exportarlo con la clave privada estacleciendo una nueva password (como se muestra en la figura 7).

Figura 8: Mimikatz - Exportar certificados no exportables.

Saludos!

28 junio, 2018

Volcado de las contraseñas de Windows con Mimikatz

Mimikatz es una herramienta archiconocida de cracking que nso permitirá la obtención de contraseñas de usuarios de un sistema. Nos volcará (dumping) las contraseñas den texto plano y los hashses de la SAM (Security Account Manager). que nos mostrará .

Hay mucha información al respecto sobre esta tool y como sacarle un buen partido. Más info: https://adsecurity.org/?page_id=1821

De todos modos, no había hablado de ella hasta ahora. Recientemente tuve que hacer uso de ella para conocer la password de unos usuarios locales creados en un sistema. Comprobé que aún seguía funcionando para Windows 10 como lo hacía para Windows 7 ya que el desarrollador fue actualizando esta herramienta.


Para un correcto funcionamiento Mimikatz debe ejecutarse con privilegios de administrador. Podremos ver en texto plano las contraseñas del resto de usuarios locales y de las credenciales de puntos de montaje que tengamos en el sistema.


Una vez descarguemos Mimikatz, abrimos una consola de comandos y nos situamos en el path donde lo hubiésemos descargado, ejecutamos el binario "mimikatz.exe" dependiento la arquitectura de nuestro sistema (32 bits o 43 bits). Para acceder al prompt que nos proporciona y escribimos.
privilege::debug
sekurlsa::logonpasswords
Figura 1: Ejecutando Mimikatz.

Finalmente obtenemos el resultado con las contraseñas de usuarios locales en texto plano.

Figura 2: Volcado de contraseñas en texto plano de usuarios locales de Windows.

Saludos!

25 junio, 2018

Crear un punto de acceso Wifi (WAP) compartido desde una conexión cableada Ethernet (IEEE 802.3)

En esta entrada se detalla el procedimineto de creación para una zona Wifi a través del adaptador de red cableada de Windows, compartiendo la conexión de este al adaptador inalámbrico que hará de WAP (Wireless Access Point) y puente de conexión.

Será necesario disponer de dos tarjetas de red, una conectada a través de una conexión cableada Ethernet 802.11 y otra tarjeta inalámbrica ya sea mediante un zócalo interno PCI o conectada por un USB.

El esquema que comentaré será para el siguiente ejemplo:

Un dispositivo inalámbrico con el que nos conectaremos (smartphone en este caso) a un punto de acceso que proporciona la adaptador Wifi y que a su vez este mediante una conexión compartida de Internet que proporciona nos proporciona el adaptador de conexión cableada Ethernet.

Figura 1: Esquema de conexión WAP Windows.

Para toda la configuración haremos uso de la herramienta de comandos Netsh (Network Shell) nativa en Windows.

Comprobamos las interfaces disponibles.
netsh wlan show interfaces

Figura 2: Netsh - Listar interfaces wlan.

Será necesario comprobar que el driver de la tarjeta de red inalámbrica admita red hospedada.
netsh wlan show drivers

Figura 3: Netsh - Conocer la compatibilidad de interface wlan para red hospedada.

Si el resultado es una "Red hospedada admitida: si". Procedemos a crear el hostednetwork con su SSID (Service Set Identifier) y contraseña de acceso.
netsh wlan set hostednetwork mode=allow ssid=nombre_wap key=password
Sustituyendo en cada caso el nomre y la contraseña que deseemos.

Figura 4: Netsh - Crear hostednetwork (WAP).

En este punto creamos el "puente de conexión" entre el adaptador inalámbrico (Conexión de área local* 4 en este caso) y el adaptador de red cableada (Ethernet).

En las propiedades de la interface Ethernet, pesataña de "Uso compartido", compartimos la conexión a Internet permitiendo que los usuarios que se conecten desde la red de la interface inalámbrica (Conexión de área local* 4).

Figura 5: Compartir conexión Internet entre dos interfaces de red (cableada e inalámbrica).

Iniciamos el hostednetwork.
netsh wlan start hostednetwork
Podemos consultar su estado.
netsh wlan show hostednetwork

Figura 6: Activar el hostednetwork (WAP).

Para comprobar su funcionamiento me conectaré desde un dispositivo smartphone. Vemos como estoy conectado al WAP con SSID zonasystem.

Figura 7: Conexión desde un terminal inalámbrico a la nueva red inalámbrica creada.

Vemos la MAC y dirección IP que nos está otorgando por DHCP. Generando la propia interface un ámbito de red 192.168.137.0/24. Cuando la red original es de un ámbito 10.0.0.0/24. Por defecto la propia interface crea su propia subred.

Figura 8: Comrobación de información de red de la conexión.

Comprobamos de nuevo el estado del hostednetwork de la wlan. Vemos como hay un dispositivo conectado o autenticado, se trata del smartsphone conectado anteriormente. Consultamos la tabla ARP (arp -a) para contrastar la información.

Figura 9: Verificación del cliente autenticado en el nuevo hostednetwork (WAP).

Ahora bien, si se trata de un sistema operativo Windows 10, todo lo anterior no tendría sentido. Windows 10 incorpora una característica para hacer esto de forma muy sencilla. Igualmente está bien conecer lo anterior para entender este funcionamiento.

De forma automática Windows configurará un WAP en el que podremos personalizar tanto el SSID como la passphrase.

Desde el nuevo panel de control de Windows 10 (Tecla Windows + i) > "Red e Internet" > "Zona con cobertura inalámbrica móvil". Tendremos que estar conectados a internet ya bien sea por que compartimos nosotros la conexión de un adaptador de red a otro o por que nos autenticamos en una red inalámbrica directamente. Habilitamos este modo y listo.

Figura 10: Crear WAP de forma sencilla "Zona con cobertura inalámbrica móvil" en Windows 10.

Saludos!

07 mayo, 2018

Nmap DHCP Discover: Conocer los servidores DHCP de una red

El protocolo de red DHCP (Dynamic Host Configuration Protocol) permite la asignación de configuración IP, como mínimo la dirección IP y máscara de red, en una arquitectura cliente/servidor. Si un equipo cliente tiene una configuración en su interface de red en modo automático, el cliente solicita una configuración IP de red si existe un servidor DHCP en la misma red este ofrece asignando un configuración de direccionamiento IP en el cliente que realizó la solicitud.

Figura 1: Esquema DHCP.

El protocolo BOOTP (Bootstrap Protocol) es utilizado por lo clientes para obtener una dirección IP automáticamente. Los puertos por defecto utilizados por BOOTP son: 67/udp (servidor) y 68/udp (cliente).

Proceso de funcionamiento DHCP en cliente/servidor
  1. El cliente solicita una IP difundiendo una mensaje DHCP DISCOVER á la subred local.
  2. Los servidores ofrecen una dirección IP (DHCP OFFER) y el resto de parámetros de configuraciones locales para el cliente (DNS, nombre de dominio, puerta de enlace, etc.), si esta está configurada para ser entregada en las opciones de configuración del servidor DHCP. Si ningún servidor DHCP responde al cliente, este envia un DHCP DISCOVER cada 0, 4, 8, 16 y 32 segundos y luego un intervalo aleatorio hasta un minuto. Si pasado 1 minuto no se recibe respuesta:
    • Si el cliente usa APIPA (Automatic Private IP addressing), el cliente se autoconfigurará con una IP (en el caso de Microsoft usará una IP de la red 169.254.0.0/24).
    • La interface del cliente no se inicia (IP 0.0.0.0/0).
  3. El cliente al recibir el DHCP OFFER indica a uno de los oferentes que acepta la IP recibida (DHCP REQUEST).
  4. El servidor envía una configuración DHCP ACK al cliente indicándole los términos de arrendamiento. A partir de ahora el cliente ya puede usar una IP asignada.
  5. El cliente solicita una renovación de la IP cuando pase la mitad del tiempo de conesión.
  6. El servidor le concede la renovación.
  7. El cliente libera la IP.

Figura 2: Esquema de funcionamiento DHCP cliente/servidor.

En la figura 3 se puede ver un ejemplo de captura de tráfico pcap de la solicitud cliente-servidor de un asignamiento automático de una dirección IP. Vemos los datagramas DHCP Discover, Offer, Request y finalmente ACK.

Figura 3: Captura pcap Wireshark del funcionamiento DHCP.


Conocer el servidor/es DHCP de una misma red en un cliente Linux

El fichero /var/lib/dhcp/dhclient.leases alamacena, entre otras cosas, las concesiones de direcciones que ofrecen al cliente los servidores DHCP.

Para descubrir los servidores DHCP, si la interface de red está en modo de asignación automática. Podemos liberar la dirección IP actual y volver a asignar una nueva configuración IP con la utilidad dhclient.
$ sudo dhclient -r eth0
$ sudo dhclient eth0
En la imagen de la figura 4 se puede ver como se crea el fichero dhclient.leases después de liberar (parámetro -r de dhclient) y volver a solicitar una nueva dirección IP (simplemente dhclient) a los posibles servidores DHCP de la misma red. En este caso el servidor DHCP es el mismo que la puerta de enlace.

Figura 4: Asignación de direción IP en un cliente Ubuntu.

En el log del sistema /var/log/syslog vemos la comunicación que fue realizada entre el cliente y el servidor DHCP.

Figura 5: Encontrando servidor DHCP en /var/log/syslog.


Conocer el servidor/es DHCP de una misma red en un cliente Windows

Un equipo cliente Windows poderemos liberar su configuración IP actual con el parámetro /release de la utilidad ipconfig y volver a solicitar una nueva configuración IP al servidor DHCP de esa red con el parámetro /renew.
ipconfig /release
ipconfig /renew
Figura 6: Liberación y asignación de nueva IP a un cliente Windows.

Con ipconfig /all se puede ver la configuración completa en las interfaces de red, al contrario que en sistemas Linux, Windows ya nos muestra el servidor DHCP que le ofreció la concesión de dirección IP.

Figura 7: Conocer servidor DHCP en cliente Windows.


Conocer el servidor/es DHCP con Nmap DHCP Discover

Si estamos en una red en la que sabemos que pueden exister múltiples servidores DHCP e incluso servidores DHCP Relay, existe una utilidad-script dentro de la utilidad Nmap que nos permitirá descubrir los servidores DHCP disponibles de la red.

Con -sU escaneamos UDP y -p escaneamos un puerto, que en este caso sería el 67 (67/udp). Pasamos el script "dhcp-discover" y a continuación el target que sería la dirección de red con su notación CIDR.
nmap -sU -p 67 --script=dhcp-discover <target>
En la imagen vemos el servidor DHCP marcado como el server identifier. 

Figura 8: DHCP Discover con nmap.

Estos scripts están ubicados en el directorio scripts/ de Nmap con formato propietario .nse (Nmap Scripting Engine) editables. Otra opción sería utilizar el script "broadcast-dhcp-discover".

En la website oficial de Nmap se detallan las diferencias entre los scripts .nse:

Saludos!
Entradas Relacionadas