SCHOOL OF HACKING 2015 RETO BUFFER OVERFLOW

Documentos relacionados
Contenido. Primera Parte: Sockets. Segunda Parte: Shellcodes

Ejercicio Sockets Suma Resta. Descripción

Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso de Redes I CI-4815 Trimestre Septiembre Diciembre 2013

PRÁCTICA 4 PASO DE MENSAJES

Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP. Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011

PRÁCTICA 2: Cliente-servidor UDP

Sockets: funcionamiento y programación. Sockets tipo UNIX. MSc. Ivan A. Escobar

-> Todo socket viene definido por dos características fundamentales:

ARQUITECTURA DE REDES Laboratorio

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO. Facultad de Ingeniería

sockets Flujo (SOCK_STREAM) Comunicación bidireccional Confiable (entrega garantizada) Información ordenada en el destino Datagrama (SOCK_DGRAM)

ARQUITECTURA DE REDES Laboratorio

.: ASM / Shellcoding Series :. III Bypassing Remote Linux x86 ASLR protection

Aplicación Multiproceso sobre HTTP Ejemplo -

Redes de Computadores Nivel de Aplicación: Programación con sockets I

Tema 4: Sockets: Un interfaz con TCP/IP

Introducción a la programación con sockets en C

Boletín 7- Sockets. Departamento de Lenguajes y Sistemas Informáticos

Sistema Cliente Servidor Con Sockets

Diagrama de transiciones del autómata. Tabla de transiciones

Programación (PRG) PRACTICA 3. Compilación: concepto. Ejecución de programas.

Nombre y apellidos: DNI: 1

Problemas de Redes de Computadores. Conjunto de problemas 1

Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1

ARQUITECTURA DE REDES Laboratorio PRÁCTICA 2: MANUAL DE SOCKETS EN C. Grado en Ingeniería Informática Curso 2014/15

Características de un lenguaje ideal para robótica

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Sistemas de Transportes de Datos (STD) Tema III: UDP y TCP (Entrega 4) Grupo de Aplicaciones Telemáticas. Grupo de Aplicaciones Telemáticas

Qué es un socket? Dominios de comunicación. Tipos de sockets en el dominio AF_INET. Sockets Stream. Sockets Datagram. Sockets Raw

Taller de Sistemas Operativos Introducción

Tema 4 Sockets: Un interfaz con TCP/IP

Redes de Computadores: Relación de problemas 1. Sockets

Redes de Computadores I. NAT Traversal

Redes (IS20) Ingeniería Técnica en Informática de Sistemas - (2º Curso)

PROGRAMACIÓN CON SOCKETS

Programación C/S Básica

CENTRO DE ESTUDIOS NOVA - Cartagena Laboratorio de Software de Comunicaciones Ejercicios de Examenes

Computación de Alta Performance Curso 2009 PROGRAMACIÓN PARALELA EN LENGUAJE C

UNIVERSIDAD DE CANTABRIA DEPARTAMENTO DE INGENIERÍA DE COMUNICACIONES GRUPO DE INGENIERÍA TELEMÁTICA

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

1_servicio_eco_stream_secuencial/eco_clie_tcp.c Tue Mar 09 09:57:

Análisis Experimental de la Transmisión de Datos

Migrando aplicaciones a IPv6

HOWTO TORNEO SHELL WARZONE

Introducción a Sistemas Operativos: La red

TP N 14 Compilando C/C++ bajo GNU/Linux

Mecanismos IPC: sockets

Sockets (TCP) Tema 2.- Nivel de aplicación en Internet

Administración de memoria: Memoria y seguridad

Archivos & Cadenas CURSO DE PROGRAMACIÓN EN C. Centro de Investigación y de Estudios Avanzados del IPN. CINVESTAV - Tamaulipas.

S C TP: Una alternativa al protocolo TC P s obre Linux. Ing. Isaac Fernández Baca Peña

Práctica 0 Introducción a la programación en C

Sockets (UDP) Tema 2.- Nivel de aplicación en Internet

TimeOut RTT medido 1 5 seg. 2*5= ,7 3 TimeOut 3 TimeOut 3 0, ,35 5 0,44

Arquitectura de Computadores: Exámenes y Controles

Práctica de gsoap. int ns enviar (unsigned nodo, std::string cadena, std::string &resultado); int ns recibir(unsigned nodo, std::string &resultado);

Ejercicios sobre tuberías

Sockets Básicos. Sockets Básicos

Estructuras y funciones de programación de sockets.

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

IMPLEMENTACIÓN DE APLICACIONES DE SEGURIDAD CON OPENSSL

Introducción a Sockets en Linux

INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C

COMUNICACIÓN Sistemas Distribuidos

Prueba de Laboratorio Modelo B01 Semáforos y Memoria Compartida

Introducción a Sistemas Operativos: Ficheros

Estructuras y funciones de programación de sockets.

Adaptación de aplicaciones a IPv6

COMPILADORES ANALIZADOR SINTÁCTICO

Examen Final de Teoría. Grupo de teoría:

Cadena de caracteres. 1. Fundamentos de cadenas y caracteres

Programación Básica de Sockets en Unix para Novatos

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

Práctica 1: Intérprete de mandatos. Sistemas Operativos Área de Arquitectura y Tecnología de Computadores

Lenguaje de Programación: C++ ARCHIVOS I/O

Programación con sockets

TIPOS DE DATOS BASICOS EN LENGUAJE C

Introducción a Sistemas Operativos: Ficheros

EDITRAN/TR. Windows/Unix. Manual de referencia

SISTEMAS PARALELOS Y DISTRIBUIDOS. 3º GIC. PRÁCTICA 9 Departamento de Arquitectura y Tecnología de Computadores Universidad de Sevilla

Odin Hugo Daniel Orozco Camacho. Universidad Oberta de Catalunya Proyecto Final de Master. 2 de enero de Resumen

Tema 5 El Modelo Cliente-Servidor

Comunicación entre procesos mediante Sockets Preparado por Gabriel Astudillo Muñoz Escuela de Ingeniería Civil Informática Universidad de Valparaíso

Funciones POSIX (I): Introducción

Ejercicios de la sesión 4 de C resueltos

Sockets Básicos. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. Temas a tratar...

Estructuras de Datos Estáticas. Diseñar y programar en lenguaje C soluciones utilizando estructuras de datos estáticas

DEFINICIÓN FORMAL DE UN AFP

Seminario 1. Conexión a Oracle

Seguridad. Felipe Andres Manzano FaMAF - Universidad Nacional de Córdoba - Argentina

LENGUAJE. Tema 4 Vectores, Matrices y Cadenas de caracteres.

COMUNICACIÓN ENTRE PROCESOS SOCKETS

El lenguaje de Programación C. Fernando J. Pereda

Bibliografía [COM00] Internetworking with TCP/IP, vol. 3, Cap. 2 y del 7 al 15.

Realizar el ejercicio anterior utilizando Punteros

Escuela Politécnica Superior de Elche

Ingeniería Técnica de Telecomunicación, esp. Telemática Universidad de Jaén

Sistemas Operativos (prácticas) E.U. Informática en Segovia Universidad de Valladolid

Introducción a C. Grupo de Sistemas y Comunicaciones. Febrero 2008 C 1. Programación imperativa estructurada.

Tema 2. Comunicación entre procesos

Transcripción:

SCHOOL OF HACKING 2015 RETO BUFFER OVERFLOW INSTRUCCIONES Para la resolución del reto habrá que tener una máquina física o virtual Linux instalada al menos con las siguientes características: - Compilador gcc. La aplicación en el sistema vulnerable se ha compilado con la versión gcc 4.4.3 - netcat - perl El fichero reto.c con el código fuente de la aplicación vulnerable se debe copiar a una máquina LINUX para su examen y pruebas. Para la resolución del reto se seguirán los pasos que se sugieren a continuación. La aplicación vulnerable estará disponible para ser atacada solamente durante un periodo de tiempo que se anunciará por email a los que se han inscrito en el reto. Esta aplicación estará disponible en los puertos TCP 5000 a 5015 de la máquina víctima. También en este email se indicará la IP del servidor. En caso de que la aplicación deje de funcionar en un puerto debido a la interacción del ataque, hay que tener en cuenta que se puede acceder en alguno de los otros puertos disponibles. El puerto atacado volverá a estar disponible en un plazo de un minuto. Está ABSOLUTAMENTE PROHIBIDO realizar escaneos, pruebas y ataques contra la máquina servidor que no sean los que se contemplan en los ejercicios a realizar. Se registrarán los accesos para poder comprobar que no se saltan estas reglas. Solamente hay tres ejercicios que puntuarán para la consecución del reto. Cuando el participante crea haber resuelto estos ejercicios deberá mandar un email a la dirección gmacia@ugr.es conteniendo de forma breve y clara la solución a los 3 ejercicios, con la plantilla de la siguiente página. Solamente se aceptará una respuesta por participante. Cada ejercicio puntuable será evaluado por separado. La puntuación se obtendrá por el orden en el que se da la solución. Ejemplo. Los ejercicios A, B y C valen, respectivamente 10, 15 y 20 puntos. Pepe manda la primera respuesta correcta a ejercicios A y B, pero errónea (o incompleta) para el C. Después de Pepe, Juan manda la solución correcta a los ejercicios A, B y C. Puntuación de Pepe: 10 puntos (A) + 15 puntos (B), 0 puntos (C) = 25 puntos Puntuación de Juan: 9 puntos (A), 14 puntos (B), 20 puntos (C) = 43 puntos

EJERCICIO 8 (10 puntos): Nombre de la función: Número de la línea: Código en dicha línea: EJERCICIO 9 (15 puntos): Dirección IP desde la que se ha hecho el ejercicio: Fecha y hora en la que se ha realizado con éxito: Cadena introducida: EJERCICIO 10 (20 puntos): Dirección IP desde la que se ha hecho el ejercicio: Fecha y hora en la que se ha realizado con éxito: Password obtenida: EJERCICIOS A REALIZAR Los ejercicios a realizar son los siguientes: 1. Examina el código fuente del programa y trata de averiguar qué hace. 2. Compila el programa con el siguiente comando (desde el directorio donde está reto.c): gcc -g -fno-stack-protector -z execstack -o reto reto.c 3. Deshabilita la protección de aleatorización (ASLR): sudo su echo 0 > /proc/sys/kernel/randomize_va_space 4. En una terminal ejecuta el programa para que escuche en un puerto (ej. 5000):./reto 5000 5. Conéctate desde otro terminal a la aplicación vulnerable desde la misma máquina: nc <nombre_servidor> 5000 donde nombre_servidor será localhost si la aplicación se ejecuta en nuestra máquina. 6. Haz pruebas introduciendo passwords diferentes y trata de adivinar con el código del programa la contraseña que te da acceso al sistema. 7. Prueba con la aplicación corriendo en el servidor oficial del reto UCyS.

Funciona dicha clave en el servidor también? 8. (PUNTUACIÓN: 10 Puntos) Identifica la vulnerabilidad de buffer overflow que se podría explotar para tener acceso al sistema sin conocer la password. En qué función aparece la vulnerabilidad? En qué línea del fichero reto.c aparece el código vulnerable (enviar en la respuesta el número de línea y el código de dicha línea)? NOTA: Tomar la línea del fichero original, no del modificado por el participante. 9. (PUNTUACIÓN:15 puntos) Adivina qué cadena podríamos introducir como password para entrar en el sistema sin conocer la clave. Prueba en tu máquina local y también en el servidor oficial del reto UCyS. Pista: estudia bien la función check_password. 10. (PUNTUACIÓN: 20 puntos) Trata de explotar una vulnerabilidad de la aplicación para obtener la password almacenada en el servidor oficial del reto UCyS. Pista: trata de ejecutar la función show_password. (4 puntos). Pista general: para mandar una cadena de texto creada con perl ejecutar: perl -e 'print "cadena"' nc <servidor> <puerto>

CÓDIGO DE LA APLICACIÓN VULNERABLE /* * APLICACIÓN reto.c * RETO UCyS - 2015 * By: Gabriel Maciá */ #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <time.h> char password_global[30] = ""; int socket_global; int show_password () { int sock = socket_global; write (sock, "The password is: ", 17); write (sock, password_global, strlen(password_global)); write (sock, "\n", 1); return 0; int check_password (char *pass) { char password[32] = "hacking"; char buf[32]; memset (buf, '\0', 32); if (strcmp (password_global, "")!= 0) { strcpy (password, password_global); strcpy (buf, pass); if (strncmp (buf+2, password+2,4)==0 && strncmp(buf, "ha",2)==0) { return 1; else { return 0; void imprime_banner(int sock) { char mensaje[500]; FILE *f = fopen ("/home/admin/bufferoverflowseminar/reto/banner.txt", "rt"); if (f!= NULL) { while (fgets(mensaje, 500, f)!= NULL) { write (sock, mensaje, strlen(mensaje)); strcpy (mensaje,"------------------------------------------------------- -------\n BIENVENIDO AL SISTEMA RETOS UCyS\n------------------------------- -------------------------------\n Introduzca la contraseña: "); write (sock, mensaje, strlen(mensaje));

int main(int argc, char *argv[]) { int sockd = 0, connfd = 0; struct sockaddr_in serv_addr; struct sockaddr_in cliente; size_t addr_len = sizeof(struct sockaddr_in); char ip_cliente [INET_ADDRSTRLEN]; char sendbuff[1025]; char recvbuff[1025]; time_t ticks; if (argc < 2) {printf ("Usage:./reto <#puerto>\n"); exit(0); // Lectura de password del fichero FILE *fp = fopen ("/home/admin/bufferoverflowseminar/reto/password.txt", "r"); if (fp!= NULL) { fscanf (fp, "%s", password_global); fclose(fp); // Apertura de socket para escuchar conexiones entrantes if ((sockd = socket(pf_inet, SOCK_STREAM, 0)) == -1){ perror("error al crear socket\n"); close(sockd); exit (0); memset(&serv_addr, '0', sizeof(struct sockaddr_in)); memset(sendbuff, '\0', 1025); memset(recvbuff, '\0', 1025); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(inaddr_any); serv_addr.sin_port = htons(atoi(argv[1])); if (bind(sockd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))<0) { perror ("Error al hacer bind\n"); exit(0); if (listen(sockd, 1) < 0) { perror ("Error en listen\n"); close(sockd); exit(0); // Bucle principal while(1) { // Aceptación de nuevas conexiones por parte de clientes. connfd = accept(sockd, (struct sockaddr *)&cliente, &addr_len); if (connfd == -1) { perror ("Error en accept\n"); close (sockd); close (connfd); exit(0); socket_global = connfd; contraseña // Envío de mensaje de pregunta de contraseña y lectura de imprime_banner (connfd);

int n = read (connfd, recvbuff, sizeof (recvbuff)-1); recvbuff[n-1] = '\0'; //Conversion de la IP del cliente para imprimirla e impresion de la contraseña recibida y hora de recepcion inet_ntop(af_inet, &cliente.sin_addr.s_addr, ip_cliente, INET_ADDRSTRLEN); ticks = time(null); snprintf(sendbuff, sizeof(sendbuff), "%.24s: ", ctime(&ticks)); printf ("%s %s %s ", sendbuff, ip_cliente, recvbuff); fflush(stdout); // Comprobacion de la contraseña recibida int resultado = check_password (recvbuff); if (resultado) { printf ("ACCESO PERMITIDO\n"); fflush(stdout); strcat (sendbuff, "\n\n!!!!!!!!!!!!\n\n"); else { printf ("password incorrecta\n"); fflush(stdout); strcat (sendbuff, "\n\n -----> ACCESO PERMITIDO Password incorrecta\n\n"); //Se envia el resultado al cliente write(connfd, sendbuff, strlen(sendbuff)); close(connfd);