IV International Conference of Unix at Uninet
  • Presentation
  • Register
  • Program
  • Organizing Comittee
  • Listing of registered people
  • Translators team
Andrés L. Sclippa

felix|Ramon|
krocz---------------- ATENTION ---------- comenzamos
felix!jaime startlog
kroczBueno un gusto tenerlos por aqui nuevamente
kroczpara nosotros es muy satisfactorio hacer este tipo de charla
kroczpara ello en esta ocacion presentaremos a Andres L. Sclippa
kroczcolaborador Argentino, de la Universidad Tecnolsgica Nacional Facultad Regional Resistencia
kroczel es analista de seguridad y pertenece a www.LinuxDevelopment.com.ar
kroczel hace poco nos presento una conferencia sobre "WBEM en Linux" y para
kroczesta ocacion ha preparado una charla relacionada con
krocz"Unix Application Security Framework"
kroczTenemos la traduccion al ingles en el canal #redes y las preguntas y comentarios en el canal #qc
krocza si que le damos la bienvenida a Andres
kroczadelante Andres
kroczel canal es tuyo :)
feistelok gracias a todos por estar hoy aqui, y estoy muy a gusto colaborando con este noble proyecto
feistelpor favor conectensen a http://170.210.180.9/umeet
feistelahi encontraran
feistelmirrors para las presentaciones
feistely un log para los que llegan tarde :)
feistellas preguntas pueden hacer en #qc
feistelyo las contesto aca
feistelok empecemos
feistelde todos los ataques a los sistemas UNIX
feistela me olvidaba
feistelvoy a ir avisando cuando deben ir cambiando de filmina, ok
feistellos del tipo DoS y buffer overflow son los mas populares y peligrosos
feistel(diapositiva 2)
feistelen esta charla me ocupare de como eliminar o mitigar el segundo tipo de ataque
feistelen UNIX todo proceso corre con un identificador de usuario y de grupo (UID/GID)
feistelesto limita el acceso de tal proceso a los recursos del SO
feistellamentablemente muchas aplicaciones requieren de privilegios root
feistelen *NIX u otros privilegios
feistelpara funcionar correctamente (por ejemplo: cambiar la password, necesitan acceder a dispositivos
feistel<krocz> feistel, te basaras en un SO en especial o es general?
feistelen general
feistelen bruto, a determinadas syscalls privilegiadas o a sistemas de archivos
feistelcomo /etc)
feistelentonces encontraremos que muchos procesos corren con privilegios de root
feistelmientras estos procesos se comporten como fueron diseñados, ningun problema
feistelme ocupare en general de UNIX :)
feistelme piden que vaya mas lento por la traduccion
feistelel problema aparece cuando un atacante logra controlar la ejecucion de tal
feistelproceso y ejecutar codigo arbitrario con los privilegios del proceso
feistelpara limitar esto, las aplicaciones *NIX han utilizado por años
feisteldos metodos, el SUID/SGID y el chroot jailing
feistella idea del primero es la siguiente
feistellos procesos corren normalmente con un usuario no privilegiado pero
feistelcuando requieren acceso privilegiado (como root por ej.)
feistelejecutan una syscall que cambia temporalmente el usuario del proceso
feistelpara ello el binario debe tener el bit S activado
feistel<trulux> feistel, cuando dices en general chroot jailing deberías mencionar otro tipo de jaulas como las de freebsd, y no hablar de jaulas chroot en general en todos los Unices
feistelsi trulux tiene razon
feistelen este caso me refieron al chroot jailing basico disponible en cualquier UNIX
feistelpara el caso de FreeBSD este es mucho mas funcional :-)
feistel------------------------
feistel# ls -aLF /usr/bin/passwd
feistel-rwsr-xr-x   1 root     root        44705 Jul  1 00:49 /usr/bin/passwd
feistel   ^
feistel------------------------
feistelahi ven un binario con el bit activado
feistelfinalizada la ejecucion privilegiada el proceso vuelve a correr con
feistellos privilegios limitados del usuario original
feistelel chroot jailing lo que hace es confinar al proceso en
feistelun filesystem con lo cual si el proceso es hackeado, el atacante
feistelno tiene acceso al resto de los filesystems
feistelestas tecnicas ofrecen una seguridad muy limitada
feistelel SUID/SGID y el chroot pueden cambiarse facilmente una vez que el
feistelproceso ha sido comprometido
feistelel stack-smashing attack o buffer overflow attack aparece cuando un
feistelproceso
feistelrequiere que datos externos sean colocados en un bufer
feistel(en realidad el buffer overflow es un tipo especial de stack-smashing, pero lo tomaremos
feistelcomo sinonimos aqui para facilitar)
feistel<trulux> feistel, el chroot puede comprometerse en tiempo de ejecución con varios tipos de "trucos", desde hacer un doble chroot hasta intentar matar procesos fuera de el
feistelcomo dice trulux chroot es muy vulnerable
feistelo variables
feistely la aplicacion vulnerable no controla correctamente
feistelel tamaño de tales datos externos
feistelesto hace que si tal dato tiene un tamaño mayor al del bufer que lo
feistelalmacenara, al momento de almacenarlo, partes contiguas de la memoria
feistelal bufer son sobreescritas con el contenido sobrante de tal dato
feistelel problema viene en la estructura que utiliza *NIX en la memoria de
feistelcada proceso, entonces el area de memoria contigua a los bufers contiene
feisteldatos criticos del proceso que controlan el flujo de ejecucion del mismo
feistelesto permite que atacantes puedan insertar codigo de maquina (shell codes)
feistelen aplicaciones vulnerables al buffer overflow y realizar asi
feisteloperaciones no contempladas, con los mismos privilegios del proceso
feistel(diapo 4)
feistelen la figura superior vemos la estructura del area de memoria de todo
feistelproceso
feistelesta es la estructura tipica de la stack (area de la memoria del proceso
feisteldonde se almacena datos temporales)
feisteltodo funcion C usa la stack desde el stack pointer hacia arriba en la
feistelfigura (el stack pointer apunta al tope de la stack)
feistelen el siguiente orden: bufers, variables locales, puntero al frame anterior
feistel, la direccion de retorno (desde donde se llamo a esta funcion) y
feistelfinalmente los argumentos de la funcion
feistelcon lo cual si el codigo no controla el tamaño de los datos a escribir
feistelen los buffers las areas siguientes de memoria (para arriba en la fig.)
feistelpueden ser sobreescritas
feistella figura inferior muestra una tipica funcion C vulnerable a este ataque
feistella funcion strcpy() copia el contenido de la variable de entorno $HOME al
feistelbuffer de 128 bytes
feistelcomo no hay control del tamaño de la variable $HOME
feistelsi esta posee mas de 128 bytes el resto del string sobreescribira las
feistelareas contiguas de memoria
feistelentonces un atacante en este caso podra introducir shell code en la
feistelvariable $HOME a partir del byte 129, y este shell code se ejecutara con los
feistelprivilegios del proceso
feistel<krocz> una forma de evitar la ejecucion es dejando el stack, en estado "no execute"
feistelsi eso se conoce como W^X y lo veremos mas adelante
feistelpara eso el shell code sobreescribira la "return address" hacia el area
feistelde memoria donde esta el codigo arbitrario inyectado,
feistely este sera ejecutado cuando la funcion vulnerable finalice y la ejecucion del proceso deba retornar al punto
feisteldesde donde fue llamada la funcion
feistelsegun que area del stack el atacante sobreescriba el stack-smashing puede
feistel<trulux> feistel, no, W^X es de OpenBSD, hay más implementaciones: Stack Guard de Immunity, ExecShield y PaX por ejemplo
feistelW^X es un concepto
feistelno una implementacion
feisteles una tecnica
feistelclasificarse en:
feistel* return address: se modifica la direccion de retorno
feistel* variables locales o argumentos: se modifican tales variables
feistel* previous frame pointer: se modifica el puntero al frame anterior
feistelahora bien
feisteluna solucion es auditar el codigo fuente de la aplicaciones
feistelpara detectar codigo vulnerable, es decir codigo que no controle el
feisteltamaño de los strings
feistella serie de tecnicas y mecanismos presentados aqui formaran un framework
feisteldonde puedan correr sus aplicaciones *NIX con una seguridad proactiva
feisteles decir, en caso de que ocurra un buffer overflow por una vulnerabilidad
feistelno detectada
feisteleste ataque sera eliminado, confinado o a lo sumo limitado.
feistel(diapo 6)
feistelok, la primera tecnica que conforma nuestro framework es una cuestion de diseño
feisteles la tecnica de separacion de privilegios
feistella idea es separar el codigo del proceso en dos partes:
feistel1 - el proceso privilegiado: usara las syscall que requieran permisos privilegiados
feistel2 - el proceso no-privilegiado: accedera al resto de todas las syscall, las cuales no requieran de una cuenta
feistelprivilegiada
feistelentonces cuando el proceso PRIVILEGIADO si inicia hace un fork de si
feistelmismo
feistely su hijo pasa a ser el proceso NOPRIVILEGIADO
feistella idea es que la interaccion con el usuario o con procesos locales o remotos
feistello haga el proceso hijo NOPRIVILEGIADO
feistelcon lo cual si este es comprometido
feistelel atacante tendra limitado su accionar
feistelpara entender mejor la tecnica
feistela la derecha ven la arquitectura de una aplicacion famosa el OpenNTP
feistelque utiliza esta tecnica
feistelel proceso ntp engine es el proceso no privilegiado (que corre como _ntp)
feistelel cual se comunica a traves de un socket UNIX-domain (no accesible
feistelpor TCP/IP) con su proceso padre el ntpd master (que corre como root)
feistelel ntpd master solo usa dos syscall privilegiadas: IMSG_ADJTIME
feistely IMSG_HOST_DNS (setear la hora y llamar al resolver library)
feistelahora si un atacante inyecta por el UDP 123 shell code solo el proceso
feistelntp engine sera comprometido
feistelademas en este caso el proceso ntp engine corre en chroot en /var/empty
feistelcon lo cual el mismo queda confinado a ese directorio
feistel(diaspo 7)
feistelhasta ahora entonces nuestra aplicacion contiene:
feistel* SUID/GUID bits
feistel* chroot jailing
feistel* privilege separation
feistelveremos ahora un mecanismo para proteger la memoria
feistelque algunos OS la implementan, de alguna forma u otra
feistelel mecanismo W^X (lease W xor X)
feistella idea es que areas de memoria tenga un control de acceso
feistelsimilar a los bits RWX del UNIX filesystem
feistelentonces con W^X el OS define una politica por defecto en determinadas
feistelareas de la memoria
feistelde manera tal que tales areas sean de acceso de escritura o de ejecucion
feistelpero nunca ambas
feistelsalvo que la aplicacion lo requiera explicitamente
feistelel problema de implementar esto esta relacionado con la MMU de la
feistelarquitectura subyacente
feistelsparc, sparc64, alpha, amd64, ia64 y hppa tiene todas
feistelMMU=memory management unit
feistelun bit X en cada pagina de memoria
feistelel OS solo debe activar o desactivar este bit y listo ya esta
feistelpero i386 no tiene este bit
feistelW^X puede emularse en esta arquitectura gracias al soporte
feistelde memoria segmentada
feistella idea es que los procesos tengan dos segmentos un CODE (area baja)
feistely un DATA (area alta de la memoria)
feistelal iniciar el proceso (todo el code esta en DATA)
feistelel code es pasado al area baja CODE
feistelmientras que los datos son pasados al area alta DATA
feistelel OS entonces mantiene una politica W en DATA y X en CODE
feisteles decir en i386 el W^X se emula por software
feistellas tecnicas vistas hasta ahora no generan un overhead ni requieren tocar
feistelel code
feistellas dos siguientes generan overhead y una de ellas modifica el code
feistel(diapositiva 8)
feistelnuestra aplicacion ahora ya se ve mas segura:
feistel* SUID/GUID bits
feistel* chroot jailing
feistel* privilege separation
feistel* W^X (o algo parecido)
feistelel problema en el ultimo caso  es que dependemos exclusivamente del OS y de la
feistelarquitectura subyacente
feistelsi bien la ejecucion de codigo esta limitada, la stack todavia puede ser alterado
feistelel ProPolice o Stack Smashing Protector (SSP) es un desarrollo
feistelde la division de investigacion en Tokio de IBM
feisteleste trabaja con gcc para transformar una
feistelfuncion C vulnerable en una funcion C no vulnerable
feistelse obtiene un codigo cuyas funciones estan protegidas contra
feistelcorrupcion de la stack
feistelpara esto ProPolice realiza dos cosas
feistel<trulux> feistel, hay varias implementaciones de SSP: http://wiki.debian-hardened.org/SSP/ProPolice_Implementations
feistella idea de la charla es trabajar con tecnologias independientes del OS
feistelpara varios flavors de Unix
feistel<trulux> feistel, en realidad no se obtiene ningún codigo protegido, sigue sinedo vulenrable pero se llama a la función guard de SSP antes de ejecutar ningún tipo de operación extraña, en el inicio de la ejecución
feistelSSP tambien ordena la memoria de la funcion, ademas del guard
feistelel hecho de no puedas hacer un overflow lo hace invulnerable
feistel1. Reordena la stack
feistelarriba ven la stack clasica
feistelabajo la stack ordenada y modificada por ProPolice
feistellas variables y los arreglos estan en orden opuesto
feistelen la nueva disposicion de memoria
feistel(A) no contiene arreglos ni variables punteros
feistel(B) contiene arreglos y estructuras
feistel(C) no contiene arreglos
feistelen el unico lugar donde una destruccion de la stack puede comenzar es en (B)
feistello anterior es la clave de ProPolice
feistel2. Y agrega codigo en el prologo y en el epilogo de la funcion
feistelveamos como funciona esto
feistelen el prologo de la funcion
feistel(codigo que se ejecuta ni bien la funcion es llamada)
feistelProPolice genera un valor aleatorio, el "guard"
feistelcomo veran el "guard" es lo primero que aparece en la stack
feistel(recuerden que la stack crece para abajo)
feisteles por eso que se lo genera en el prologo
feisteluna copia del "guard" es mantenida en un area protegida fuera del alcance de un overflow
feistelni bien la funcion finaliza, antes de retornar a la funcion que la llamo
feistelse ejecuta el epilogo
feistelel cual compara el "guard" original con el del stack
feistelsi estos son diferentes la ejecucion del proceso finaliza y se genera un log, asi todo shellcode inyectado no es ejecutado
feistelpor la ubicacion del return address
feistella unica forma de modificarlo es a traves de un overflow en los buffers
feistel(B)
feistelpor la ubicaciones de las variables locales en (C)
feistelestas estan protegidas por modificacion ya que la destruccion comienza en (B)
feistellos argumentos (A) por otro lado estan protegidos por el "guard"
feistelProPolice tiene algunas excepciones que se deben tener en cuenta
feistelque estan listadas en el sitio de ProPolice y es de
feistelinteres para programadores en C en UNIX que desean protegerse con ProPolice
feistel(diapos 9)
feistel<trulux> quizás quedaría más claro si cuentas algo sobre tipos de "canarios"
feistella conferencia abarca muchos temas y la idea es dar un puntapie para una investigacion mas profunda por
feistellos interesados
feistelno quieron entrar en la calificaciones de los canarios (otro nombre para el guard)
feisteltrulux, quiere colaborar con un ejemplo real
feisteldice que tiene todo preparado, lo haremos al final de la charla
feistelademas de ProPolice existen otras implementaciones similares
feistelpero todas ellas tienen limitaciones y debilidades
feistelen la figura pueden ver una comparacion
feistel-- aquellos interesados en el tema, pueden quedarse despues ;-) ---
feistelun resumen de las alternativas
feistel* libsafe: es una libreria que agrega un control sobre algunas
feistelfunciones de strings populares como strcpy() y gets()
feistelfunciona como un middleware que intercepta las llamadas a estas funciones
feistely realiza el control necesario
feistel* StackGuard: utiliza el mismo concepto del "guard" que lo llama "canario"
feistelgenera un random y hace un XOR con el return address y eso es el "canario"
feistel* StackShield: utiliza un metodo alternativo, mantiene una copia del return
feisteladdress (durante el prologo, despues de los buffers)
feistelel cual es verificada en el epilogo, no usa "guard" o "canarios"
feisteltanto StackGuard y StackShield tiene famosas vulnerabilidades y ademas
feistelgeneran mayor overhead que ProPolice
feistel"Phrack Magazine - Volume 0xa Issue 0x38"
feistelsi bien ProPolice es bastante seguro y robusto
feistelgenera un overhead que hay que considerar a la hora
feistelde decidir si proteger o no nuestro codigo con SSP
feistelen las diapos 10 y 11 pueden ver algunos benchmark del equipo de desarrollo de ProPolice
feistel(diapositiva 12)
feistelnuestra aplicacion ahora ya se encuentra en un framework bastante confiable:
feistel* SUID/GUID bits
feistel* chroot jailing
feistel* privilege separation
feistel* W^X
feistel* ProPolice
feistelsin embargo...
feistelsupongamos que se detecta una vulnerabilidad en algunos de los
feistelsistemas anteriores, por ejemplo en ProPolice
feistel(como fue detectado antes en StackGuard y StackShield)
feistelnecesitamos de algo que incluso en esas circunstancias
feistelnuestras aplicaciones UNIX no comprometan la seguridad del sistema
feistelentero
feistelel ultimo componente de nuestro framework es entonces: Systrace
feistelSystrace es un mecanismo que corre en parte en userland y en
feistelparte en el kernel
feisteleste mecanismo atrapa todas las syscalls que un proceso utiliza
feistely realiza un control de acceso con ellas como si de un firewall se tratase
feisteles decir definimos politicas de control de acceso Systrace a
feistelnivel de syscalls
feistelpor ejemplo, podemos limitar que un proceso se enlace (bind()) a determinados
feistelpuertos TCP y se deniegue el resto
feistelo por ejemplo, impedir la escritura, limitando el uso de write()
feistelo limitar el write() a especificados archivos o filesystems
feistelimaginen ahora que un proceso es comprometido y un atacante escala
feistelprivilegios con el
feistelcomo nosotros hemos limitado las syscalls que puede usar el proceso o en
feistelel modo en que las usa, el ataque es confinada o limitado a lo que
feistella aplicacion fue desarrollada para hacer
feistelcomo se ven en la figura las aplicaciones con Systrace corren en un
feistelsandbox controlado, donde ellas solo pueden hacer lo que nosotros
feistelles dejamos hacer
feistelen el kernel el "System Call Gateway" captura todas las llamadas
feistela syscalls de la aplicacion sandboxeada, como si fuese un Proxy
feistelesta se encarga de ejecutar las verdaderas syscalls y de devolver el
feistelresultado a la aplicaciones
feistelcomo esto es transparante, la aplicacion no se entera de la presencia
feisteldel syscall gateway
feistelpero antes el syscall gateway debe determinar si las politicas permiten
feistella ejecucion de tal syscall
feistelpara eso el modulo de Systrace en el kernel se encarga de comunicarse
feistelcon el modulo del userland, el cual revisando las politicas determina
feistelsi la syscall debe permitirse o negarse
feistelsi la politica decia "permitir" entonces la syscall se ejecuta normalmente
feistelde lo contrario, no, y la aplicacion recibe un codigo de error (<0)
feistelSystrace tambien funciona como un IDS (Intrusion Detection System)
feistelya puede generar alarmas o notificaciones para el caso en las que syscall
feistelse denieguen
feistelpor ejemplo una entrada en syslog ser veria algo asi:
feistel------------------------------------
feistelDec  2 01:31:11 openbsdtest systrace: deny user: _identd, \
feistelprog: /usr/libexec/identd, pid: 27046(1)[12989], \
feistelpolicy: /usr/libexec/identd, filters: 24, syscall: native-fsread(5), \
feistelfilename: /etc/spwd.db
feistelDec  2 01:31:11 openbsdtest identd[27046]: /etc/pwd.db: Operation not permitted
feistelDec  2 01:31:11 openbsdtest identd[27046]: \
feistelgetpwuid() could not map uid (25) to name
feistel--------------------------------------
feisteles importante recalcar que Systrace funciona si en el kernel hay soporte
feistelpara el trace de las aplicaciones, es decir poder seguir el rastro
feistelde las syscalls que un proceso utiliza
feistel<krocz> feistel, systrace en que status esta en linux??
feistelesta terminado el patch
feistel<krocz> feistel eso de ACL a las syscall viene implementado en el parche de grsec
feistel<trulux> krocz, en la mayoría de sistemas MAC suele venir, RBAC, RSBAC, SELinux, etc
feistelsi es correcto
feistelpero mi idea es presentar un framework para UNIX,
feistelademas a mi me gusta mas Systrace :-)
feisteldespues cada uno elige como armar su framework ;-)
feistel(diapos 13)
feistelcomo se ve una politica Systrace?
feistel------------------------------
feistelPolicy: /bin/ls, Emulation: native
feistel        native-munmap: permit
feistel[...]
feistel        native-stat: permit
feistel        native-fsread: filename match "/usr/*" then permit
feistel        native-fsread: filename eq "/tmp" then permit
feistel        native-fsread: filename eq "/etc" then deny[enotdir]
feistel        native-fchdir: permit
feistel        native-fstat: permit
feistel        native-fcntl: permit
feistel[...]
feistel        native-close: permit
feistel        native-write: permit
feistel        native-exit: permit
feistel----------------------------------
feistelluego como en toda ACL, hay una expresion a evaluar y una accion a tomar
feistelen este caso permit o deny
feistelvean que este caso /bin/ls solo tiene acceso de lectura al filesystem
feistel(fsread) /usr/ y al directorio /tmp
feistelSystrace trae algunas herramientas utiles
feistelprimero un generador de politicas
feistelque monitorea la aplicaciones a sandboxear y genera una politica
feistelcon todas las syscalls que usan, con accion permit
feisteldurante el monitoreo
feistelusas la aplicaciones como en la produccion
feisteltodas las syscall llamadas son registradas
feistely asi se genera las politicas
feistelcon todas "permit" en tu home
feisteluna vez que tienes la politica la aplicas con algo como
feistel# systrace -a /usr/sbin/inetd
feistely listo! /usr/sbin/inetd ya esta en su sandbox!!
feisteluna herramienta grafica (ver la figura)
feistelte puede asistir en la confeccion de las politicas tambien
feistelotra caracteristica que me gusta de Systrace es el soporte
feistelpara escalada de privilegios, lo cual elimina la necesidad de usar
feistellos peligrosos SUID/GUID
feistelestas politicas se ven algo asi:
feistel-------------------------------------------
feistelnative-socket: sockdom eq "AF_INET" and socktype eq "SOCK_RAW" then permit as root
feistel        native-bind: sockaddr eq "inet-[0.0.0.0]:22" then permit as root
feistelnative-fsread: filename eq "/dev/kmem" then permit as :kmem
feistel-------------------------------------------
Session Time: Thu Dec 16 00:00:00 2004
feistel(diapos 15)
feistelfinalmente que hay del costo de overhead de Systrace
feistelpues depende de la aplicacion, ahi pueden ver algunos benchmarks
feistelahora si tenemos un buen framework!
feistel* (sacamos los peligrosos SUID/GUID gracias a Systrace)
feistel* chroot jailing: confinamos la aplicacion a un filesystem
feistel* privilege separation: ocultamos el modulo con acceso privilegiado de los clientes
feistel* W^X: establecemos politicas a las areas de memoria vulnerables
feistel* ProPolice: protegemos nuestra aplicacion contra un stack-smashing attack
feistel* Systrace: confinamos a la aplicacion en un sandbox controlado
feistel--fin---
feistelbueno este es mi framework, espero que les guste y que lo prueben...
kroczCLAP CLAP CLAP
kroczCLAP CLAP CLAP
kroczCLAP CLAP CLAP
kroczCLAP CLAP CLAP
kroczCLAP CLAP CLAP
techiclap clap clap clap clapclap clap clap clap clap
kroczfeistel increible
JulHerplas plas plas plas
JulHerplas plas plas plas
overflow_Clap
JulHerplas plas plas plas
overflow_Clap
overflow_Clap
JulHerplas plas plas plas
overflow_Clap
funkyclap clap clap clap clap clap
PedroJclap,clap,clap,clap,clap
funkyclap clap clap clap clap clap
overflow_FELICITACIONES!
kroczCLAP CLAP CLAP CLAP CLAP CLAP
kroczCLAP CLAP CLAP CLAP CLAP CLAP
kroczCLAP CLAP CLAP CLAP CLAP CLAP
kroczCLAP CLAP CLAP CLAP CLAP CLAP
felixbravo!
feistelbueno gracias, es un gusto colaborar con estos proyectos
PedroJclap,clap,clap,clap,clap,clap
trulux;D
felix!unlog
kroczfeistel conferencia muy buena, de alta calidad :)
truluxbueno, pues voy a intentar enseñar más o menos el concepto de seguridad proactiva
felix!date
jaimefelix: Wed Dec 15 22:55:39 2004
felix!startlog
jaimefelix: Estoy logueando el canal #linux  en [http://felix.zapto.org/jaime/linux.html]
felixfucking jaime! :(
feistelkrocz: gracias, lo menos que podia hacer para la UMEET
truluxy demostrando como funciona ProPolice , en la práctica real
truluxkrocz, ahi va
truluxbien, tenemos una aplicación que gestiona los datos de una empresa, en concreto la base de datos de empleados
truluxes simple, usa una base de datos en plano, y añade salarios, edades, nombres y apellidos y notas
truluxtiene autenticación
truluxpara asegurar que nadie puede modificar los datos
truluxy el bit setuid para poder leer y escribir la .employee2.dbs
truluxveamos como funciona:
truluxlorenzo@estila:~/LIBSSP/tests/employee-0.1$ ./employee2
trulux- No password provided for authentication.
truluxnos pide contraseña, bien
truluxsi fuesemos el "jefe", simplemente haríamos lo siguiente:
truluxlorenzo@estila:~/LIBSSP/tests/employee-0.1$ ./employee2 l33t_b0ss
trulux(!) Logged in.
trulux===========ACME Inc. Employees=============
truluxA: Add an employee to the database
truluxD: Display employee information
truluxL: List employees
truluxM: Load Database
truluxR: Raise the salary of an employee
truluxS: Save Database
truluxX: Exit
truluxYour choice:
truluxbien, es simple
truluxuno de los empleados está enfadado, y mucho
truluxes el típico pisateclas que anda de un lado para otro solucionando problemas al resto de personal
truluxalguien le ha filtrado que el programa tiene un fallo
truluxsabe que es un desbordamiento de buffer, no comoce los detalles pero lo único que puede afectar al programa es el argumento que se pasa como contraseña
truluxeste buen hombre empieza a investigar:
truluxhaciendo un strings ve que hay un hash extraño: 6a3649f2caa1602c52252f336c43a6cc , parece md5, y lo es
truluxle da igual, no busca eso
truluxse da cuenta de que tiene el bit setuid:
trulux-rwsr-sr-x  1 root root 24515 2004-12-14 22:53 employee2
truluxy sabiendo que el problema reside en el control de la longitud y copiado en memoria de los parámetros dados por el usuario...
truluxse pone a investigar y se da cuenta de que el buffer está limitado a 512 bytes
truluxsin mayores dificultades, busca una forma fácil de explotar ese fallo
truluxdespués de una ardua lectura del art?iulo de Aleph1, Smashing the stack for fun and profit, descubre una forma sencilla:
truluxun programa al que le da como parámetros el tamaño del buffer a desbordar y el offset/dirección dónde preparar los datos a ejecutar
truluxen este caso un "shell code"
truluxque arrancará una shell pseudo-interactiva con privilegios de root
truluxarranca una sesión de depuración
truluxgdb employee2
truluxdisassemble main
trulux...
truluxrevisa el código y encuentra el punto donde se llama a strcpy
truluxque copia argven el buffer vulnerable
trulux(...)
trulux0x00000a99 <main+21>:   and    $0xfffffff0,%esp
trulux(...)
trulux0x00000aa3 <main+31>:   lea    0xfffff3b8(%ebx),%eax
trulux0x00000aa9 <main+37>:   mov    %eax,0xfffffd50(%ebp)
trulux0x00000aaf <main+43>:   cmpl   $0x1,0x8(%ebp)
trulux0x00000ab3 <main+47>:   jle    0xbc1 <main+317>
truluxahi lo tenemos, 317
truluxpreviamente ha habilitado el correspondiente espacio de memoria
truluxy ahi copia nuestro registro
truluxel chico ya sabe lo que debe hacer:
trulux:~/project1/$ ./breakfast 612 317
trulux+ Using address: 0xbffff09b
trulux+ Entering a subshell...
truluxdeadbeef@acme:~/project1/$ employee2 $EGG
trulux- Wrong password!
truluxsh-2.05b# id && whoami
truluxuid=1000(deadbeef) gid=1000(deadbeef) euid=0(root) groups=1000(deadbeef)
truluxroot
truluxcomo veis, ha obtenido privilegios de root, asunto concluido, sin necesidad de excesivos conocimientos consigue poner en serio compromiso datos relevantes de su empresa
truluxy ahora veamos que ocurre si employee2 fue compilado con un gcc usando la extensión SSP/ProPolice
truluxrepite basicamente el mismo proceso
truluxpero el encargado de administrar y desarrollar employee2 ha hecho lo siguiente:
truluxpr@acme:~/em/$ gcc employee2.c -fPIE -fstack-protector -lssp -o employee2 -lm md5.c
truluxpr@acme:~/em/$ sudo mv employee2 /usr/bin/ && sudo chown root.root /usr/bin/empl*
truluxpr@acme:~/em/$ sudo chmod u+s+x+r-w /usr/bin/employee2
truluxha usado una biblioteca, la libssp (implementación de SSP como biblioteca independiente de la Glibc o la libgcc)
truluxque contiene las rutinas de protección del SSP
truluxy los demás pasos son idénticos a los que realizó cuando no usó el SSP
truluxdeadbeef (nuestro empleado "cabreado") lo reintenta y...
truluxdeadbeef@acme:~$ ./employee2 $EGG
trulux- Wrong password!
truluxemployee2: stack smashing attack in function main()
trulux----
truluxmain=0x80002828 __guard_setup=0x4001daf0 __guard=0x5fcc95a9
truluxppid=15801 pid=15819 uid=1000 euid=1000 gid=1000 egid=1000
trulux----
truluxAborted
truluxel programa lanza un SIGABRT y finaliza sin compromiso alguno
truluxpor supuesto el evento ha sido registrado
truluxy deadbeef no tendrá que enfadarse nunca más con su empresa porque no volverá a trabajr con ellos
truluxse acabó
overflow_CLAP CLAP CLAP CLAP
overflow_CLAP CLAP CLAP CLAP
kroczCLAP CLAP CLAP CLAP
kroczCLAP CLAP CLAP CLAP
kroczCLAP CLAP CLAP CLAP
p4ch0CLAP CLAP CLAP CLAP
p4ch0CLAP CLAP CLAP CLAP
truluxahora veamos que diferencias hay en el employee2 y las comentaremos entre todos para ver como trabaja de verdad el SSP
trulux;D
xtinAWAY CLAP CLAP CLAP CLAP
xtinAWAY CLAP CLAP CLAP CLAP
truluxbueno, que quede claro que deadbeef es una persona fictia *srugh*
truluxhe colgado unas diapositivas aún no acabadas que podeís ver en http://www.debian-hardened.org/papers/hardened-debian-2005-en.pdf
truluxla explicación es más larga y lamento no haber dado de sí mucho más pero aquí es tarde (24:24) y suelo madrugar ;P
kroczbueno trulux ofrecera una charla el dia 19 de diciembre
krocza las 20 GMT
kroczexplicando en extenso :)
kroczesto solo fue un avance
truluxtengo preparadas un par de sorpresas, alguna que otra herramienta no publicada que será de interés
damage:O!
kroczbueno te esperamos el dia 19

Generated by irclog2html.pl by Jeff Waugh - find it at freshmeat.net!

The Organizing Comittee

Email UsMore information


© 2004 - www.uninet.edu - Contact Organizing Comittee - Valid XHTML - Valid CSS - Based on a Design by Raul Pérez Justicia