jueves, 22 de julio de 2021

Localizar software instalado en servidores con PowerShell

Vamos as ver cómo localizar software instalado en servidores, o equipos en nuestra red, a partir de PowerShell y el uso de WMI.

Partimos de la premisa que no tenemos una herramienta más potente para estas labores de detección e inventariado como SCCM, que nos permite sacar unos informes más completos que solo el nombre de la aplicación. 

El script es el siguiente:

$list = get-content c:\listadoservidores.txt

foreach($PC in $list){

    $data = Get-WmiObject -ComputerName $PC -Class Win32_Product | sort-object Name |

    Select-Object Name | Where-Object { $_.Name -like "*Zoom*" -or $_.name -like "*McAfee*"}

    if($data){

            Write-Output "$PC tiene $($data.name) instalado" |

            out-file c:\temp\maquinasconsoft.txt -Append
    }
}

Si, es el tercer post con un bucle foreach, lo siento... Pero vamos con la explicación del funcionamiento.

Con el $list = get-content c:\listadoservidores.txt metemos en la variable $list el listado de las máquinas que queremos analizar. Otras opciones válidas serian por ejemplo, $list = 'server1','server2' o bien $list = Get-ADComputer -Filter * lo que nos permitiria directamente meter en la variable realizando la búsqueda de maquinas con filtrado directamente en AD.

Luego, desde el foreach hasta la linea del write-output tenemos la búsqueda en si. Es importante indicar que la búsqueda con el parámetro -like y los ** nos permite buscar un nombre que contenga la palabra indicada, no es necesario que sea el nombre completo. Eso si, si se meten varias aplicaciones a buscar, el script te dice si ha encontrado algo o no, pero ni especifica cual, asi que normalmente del -or hasta el } suelo eliminarlo, dejando un solo término.

Finalmente, el  out-file c:\temp\maquinasconsoft.txt -Append lo que hace es indicar en el fichero de salida "maquinasconsoft.txt" en qué maquinas ha encontrado el software instalado. En estos bucles es importante agregar el -append, porque si no, cada ejecución del bucle machaca el archivo, mostrando finalmente sólo la ultima vuelta. En cambio con -append va incorporando, sin machacar el texto previo.


jueves, 1 de julio de 2021

Workaround para Vulnerabilidad 0Day Microsoft Windows Print Spool CVE-2021-1675

 Se ha encontrado una vulnerabilidad 0 Day calificada como crítica que afecta al servicio print spooler que permitiría ejecución de código remoto y escalada de privilegios sobre los servidores. Los datos sobre la vulnerabilidad podéis encontrarlos AQUI.

 Por suerte, es una vulnerabilidad que solo afecta al servicio de impresión, que no tiene por qué estar funcionando en aquellos servidores que no ejerzan específicamente este rol.


Por eso, la mejor solución hasta que aparezca un parche de urgencia, y después, porque no tiene sentido dejar servicios corriendo sin uso, es parar y deshabilitar el servicio de impresión allí donde no se utilice.

Para eso, podemos basarnos en el script de mi anterior post. Partimos de que tenemos un listado de las máquinas donde no debe por que estar corriendo el servicio. Después, ajustamos el script para que lea ese archivo:

$archivo = get-content c:\ficheromaquinas.txt

foreach ( $equipo in $archivo ) {

write-host $equipo

Get-Service -Name spooler -ComputerName $equipo  | stop-Service

Get-Service -Name spooler -ComputerName $equipo  | Set-Service -Status stopped -startuptype disabled

Mismo procedimiento de siempre... se mete en un bucle lo que necesitamos ejecutar ,que es, primero una parada del servicio con "Get-Service -Name spooler -ComputerName $equipo  | stop-Service", y luego lo deshabilitamos, lanzando practicamente el mismo comando pero deshabilitando, con "Get-Service -Name spooler -ComputerName $equipo  | Set-Service -Status stopped -startuptype disabled". No le sienta bien al servidor todo del tirón.

¡Cuidado con dejar saltos de linea en el archivo del que toma las maquinas! No pasaría nada realmente, mas allá de un error al final, o allí donde dejemos el salto de línea.

martes, 29 de junio de 2021

Tratar el contenido de un archivo en Bucle con PowerShell

 A veces es muy útil realizar acciones a partir de algún archivo de datos... Por ejemplo, buscar alguna característica de un listado de equipos o usuarios que te pasan en algún excel, o similar. Bueno, vamos a ver cómo leer un archivo en PowerShell para luego utilizarlo en un bucle. La función es simple, pero lo importante es entender el proceso. 

El script es el siguiente:

$archivo = get-content c:\ficheromaquinas.txt

foreach ( $equipo in $archivo ) {

write-host $equipo

Get-Service -Name spooler -ComputerName $equipo  | Set-Service -Status Running

 La primera línea, $archivo = get-content c:\ficheromaquinas.txt lo que hace es meter en una variable con el nombre "archivo" todo el contenido que hay en el documento "ficheromaquinas.txt" Powershell permite tratar esa variable, que se pasa a llamar $archivo como un único objeto.

El segundo fragmento:

foreach ( $equipo in $archivo ) {....} 

Lo que hace es decir que para cada nuevo elemento que se encuentra en archivo, al que pasaremos a llamar "equipo" haga lo que metamos dentro de las llaves.

Dentro de las llaves hemos metido un script muy simple, 

Get-Service -Name spooler -ComputerName $equipo  | Set-Service -Status Running

Que lo que hace es que mire el servicio spooler (la cola de impresión, vaya) de cada equipo, que metimos en la variable $equipo, y lo arranque, canalizando el comando con el "|" y le pase la orden  Set-Service -Status Running, para arrancarlo.

Igual que podemos obtener ese servicio, podemos hacer lo mismo con, por ejemplo un apache, Oracle Service, RDP...lo que sea, y sólo de las máquinas que tenemos en el archivo. Pero lo importante es el hecho de meter el contenido del archivo en una variable, para a partir de ahí, con un "foreach", pedirle que haga una acción.

miércoles, 16 de junio de 2021

Libro de PowerShell en español

 PowerShell lleva con nosotros desde Windows XP, prácticamente, y poco a poco se ha ido convirtiendo en una herramienta esencial para el entorno Windows, hasta el punto de ser prácticamente esencial en las nuevas versiones de sus productos, puesto que sin esta herramienta, no podríamos realizar tareas básicas que ya no son accesibles mediante GUI. 

Formándome e informándome sobre PowerShell, dí con un libro de Xavier Genestós sobre esta herramienta, en su web, sysadmit.com

Es un libro "peculiar", podríamos decir. Si has visto otros libros sobre esta materia, habrás observado el desarrollo de los mismo hacia el apartado del scripting, orientándolos sobre todo como si de una formación de un libro de programación se tratara. No se si conoces los libros de "Microsoft xxx Pocket Consultant", que eran una especie de manual de trabajo de lo que tratara el libro, de la editorial de Microsoft. Este libro es la versión condensada de esos libros. Tomas lo básico, lo más interesante, y lo plasma en sus páginas. Lo que vendría a ser un "chuletario" de manejo de Powershell, pero en un libro tamaño cuaderno grande, de 200 páginas, indizado. De tener una pega, es que pasa muy de puntillas por la parte del desarrollo de scripts, donde para eso, sí se puede quedar corto. Pero también es cierto que va más focalizado a que entiendas la gramática de PowerShell, para que te busques la vida por internet adaptando los miles de scripts que hay por la web.

Una foto de ejemplo del contenido del libro, que sirve mejor que el índice para hacerse una idea de a qué me refiero con "datos condensados" y de máxima utilidad. Igualmente te encuentras otros comandos de usu muy resumidos para distintas tareas como conexion via ssh con powershell, comprobación de puertos, psremote en reemplazo de psexec de las pstools, etc...

Puedes consultar AQUI el más información del libro en la web de su autor para tener una idea más clara de su contenido.

El libro puedes adquirirlo a través de este ENLACE.


lunes, 31 de mayo de 2021

Cómo comprobar puertos en Windows

 Parafraseando a Pablo Neruda, con el libro de "20 poemas de amor y una canción desesperada", veremos varias maneras de comprobar puertos en Windows con, bueno, no 20 herramientas, pero sí tres, y un Powershell que más que desesperado, es muy socorrido. ¡Vamos allá!

Imagen de Gerd Altmann en Pixabay 

Vamos a utilizar un entorno de 2 maquinas, una "atacante", y otra con IP 192.168.96.128 para las diversas pruebas. Desde la maquina atacante comprobaremos el clásico puerto 80, y el 443, por ejemplo:

Chequeo de puertos con NMAP.

Esto es para comenzar fuerte. Nmap es una herramienta que viene por defecto en Linux, y es realmente potente para muchas funciones. Solo explicar Nmap no es que dé para un artículo aparte, es que da para un libro, sólo para exprimir sus posibilidades. Pero vamos a ver la funcionalidad en Windows.

Porque, sí, es posible instalarlo en Windows, donde además aplica un entorno gráfico que simplifica más cosas. En Windows se llama Zenmap, y lo puedes descargar desde AQUI.

Una vez instalado, lanzamos una consulta simple a los puertos que nos interesa con un nmap -sV -p 80,21,443, 192.168.96.128 (-sV es para comprobar los servicios que usan los puertos que queremos comprobar, y -p especifica los puertos. Realmente Nmap está pensado para rangos muy amplios de redes, no para este tipo de comprobaciones), y obtendremos esto:

Prácticamente de forma automática nos muestra el estado del puerto, y el servicio que lo utiliza.


TCPING

TCPing es una pequeña utilidad que se ejecuta por línea de comandos, y lo que hace es un ping al puerto que le indiques. La utilidad la puedes encontrar AQUI, basta con dejarla en el sitio habitual donde ejecutes este tipo de aplicaciones, y se invoca con "tcping ip puerto. Por ejemplo, 

tcping 192.168.96.128 443

Simple, y cómoda. Lástima que no venga integrada en el sistema.


Telnet

¡El viejo Telnet! Antes venia instalada en Windows, ahora debes buscarla como característica de sistema, por el nombre de Telnet Client. 

Lanzar telnet es tan simple como, en una ventana de comandos, escribir "telnet ip-destino puerto". 

telnet 192.168.96.128 443

Por Si probamos la conexión y esta se ve bloqueada, saldrá el siguiente aviso:

En cambio, si el puerto está abierto, haciendo por ejemplo telnet a 3389, conectará rápidamente, mostrando solamente el prompt:


Powershell

¿Para qué instalar herramientas, si ya tenemos PowerShell? Una herramienta que tenemos disponible sin instalar nada desde Windows Server 2008, pero para sistemas más antiguos, podíamos instalar, incluso en Windows XP.

Para probar un puerto en powershell, la nomenclatura será la siguiente:

Test-netconnection -computername nombremaquina -port 3389

Por ejemplo, Test-NetConnection -computername 192.168.96.128 -port 3389:

Y tenemos los resultados.

Espero os sirva de ayuda a la hora de delimitar problemas de conectividad.


jueves, 27 de mayo de 2021

Nueva vulnerabilidad crítica en VMware, CVE-2021-21985, CVE-2021-21986

 El 26 de Mayo el CCN-Cert ha publicado una nueva vulnerabilidad en el entorno de VMware. Esta vulnerabilidad afecta a los vCenter Server de la version 6.5 a la 7, y a vSAN. La información facilitada sobre la vulnerabilidad es la siguiente:


vulnerabilidad que se sirve de un error de validación de entrada en el complemento Virtual SAN (vSAN), habilitado de forma predeterminada en vCenter Server. Este error permite ejecutar código de forma remota con privilegios ilimitados en el sistema operativo que aloja vCenter Server aprovechando el acceso de red al puerto 443, ya que éste se encuentra expuesto a Internet.

El NIST no tiene todavía una clasificación de la gravedad de la vulnerabilidad, aunque VMware la ha clasificado como crítica. Por suerte, no se han reportado casos del aprovechamiento de las mismas, ni pruebas de concepto, ni exploits específicos. Adicionalmente, VMware ya ha publicado parches para corregirla. Son los siguientes:


Adicionalmente, se ha publicado una serie de instrucciones para deshabilitar los complementos vulnerables a dicha vulnerabilidad, AQUI. Pero claro, esto elimina la posibilidad de utilización de los mismos, y con ello la perdida de gran parte de la capacidad de administración y Monitorizacion de vCenter, ya que los plugins son los siguientes:



Referencias: 
https://www.ccn-cert.cni.es/seguridad-al-dia/avisos-ccn-cert/11024-vulnerabilidad-en-vmware.html
https://www.vmware.com/security/advisories/VMSA-2021-0010.html

viernes, 7 de mayo de 2021

Deshabilitar TOE (TCP-IP Offload Engine) en Windows server 2016 - 2019

 Aunque en esta misma web hice hace tiempo un artículo para deshabilitar el TOE, estaba más orientado a servidores Windows Server 2008 a 2012, sobre todo, ya que algunos parámetros cambian en versiones más modernas de Windows Server.

El antiguo artículo lo puedes consultar AQUI, pero para servidores nuevos, vamos a repasar las instrucciones, que cambian un poco, ya que por hay mas cosas a deshabilitar.

No cambia el tener que deshabilitar el TCP-Offload por el sistema operativo, y por la tarjeta de red, de manera que vamos por partes.

Tarjeta de red:

Para ello, vamos a las propiedades e la tarjeta de red, y pulsamos en Configurar:


Ahora, en la pestaña "Opciones avanzadas" deshabilitaremos las siguientes opciones:

IPv4 Checksum Offload

IPv4 TSO Offload

Large Send Offload V2 (ipv4)

Large Send Offload V2 (ipv6)

Offload IP Options

Offload taggered traffic

Offload TCP Options

Receive Side Scalling

Recv Segment Coalescing (IPv4)

Recv Segment Coalescing (IPv6)

TCP Checksum Offload (IPv4)

TCP Checksum Offload (IPv6)

UCP Checksum Offload (IPv4) 

UDP Checksum Offload (IPv6)   

Agregaría capturas, ¡pero son unas cuantas! Así que solo pondré una, indicativa para localizar las opciones


Sistema operativo

esta parte es mas simple. La configuración inicial se ve con el comando netsh int tcp show global, y se muestra así:

Deberemos modificarla con los siguientes comandos:


Los indico a continuación, para facilitar un poco la tarea:


netsh int tcp set global chimney=Disabled

netsh int tcp set global autotuninglevel=Disabled

netsh int tcp set global ecncapability=Disabled

netsh int ip set global taskoffload=disabled

netsh int tcp set global timestamps=Disabled

netsh int tcp set global rsc= disabled

netsh int tcp set global rss=disabled

Tras ello, si volvemos a ejecutar el comando netsh int tcp show global, quedará así:


Es necesario dar un reinicio al equipo, al finalizar, para que aplique bien los cambios.