You are on page 1of 97

Desarrollo de herramienta honeypot de implantacin y uso gil, Zetsu.

Aplicacin a la deteccin y anlisis de amenazas en la red de la U.G.R PROYECTO FIN DE CARRERA

Juan Luis Matn Acal


Granada, Julio del 2013

UNIVERSIDAD DE GRANADA

Desarrollo de herramienta honeypot de implantacin y uso gil.


Aplicacin a la deteccin y anlisis de amenazas en la red de la U.G.R

Memoria Presentada por Juan Luis Martn Acal


1

D. Gustavo Romero Lpez, Profesor del Departamento de Arquitectura y Tecnologa de Computadores de la Universidad de Granada, como director del proyecto Fin de Carrera de D. Juan Luis Martn Acal

Informa: Que el presente trabajo, titulado:

Desarrollo de herramienta honeypot de implantacin y uso gil.


Aplicacin a la deteccin y anlisis de amenazas en la red de la U.G.R

Ha sido realizado y redactado por el/la mencionado/a alumno/a bajo su direccin, y con esta fcha autorizo a su presentacin.

Granada 15 de Julio de 2013

Fdo. Gustavo Romero Lpez

Este proyecto pone un punto y seguido tanto en mis aspiraciones acadmicas como profesionales en el campo de la seguridad informtica. Nada hubiera sido posible sin el apoyo de familia y amigos, y ellos queda dedicado. A mi abuelo, Luis Acal Rodriguez, y mi ex jefe y amigo Pablo Palacn Gmez El Amo Pablo, dos personas que ejemplarizan para m la constancia en la adquisicin de nuevo conocimiento. A mi familia, que me apoyaron en los primeros y ms difciles aos de carrera fuera de Granada. A Erika de la Hoz Gonzlez, por su paciencia como novia, en las ausencias que han acompaado la elaboracin de este trabajo durante el ltimo ao. A todos los amigos del nodo Santa Luca del C.S.I.R.C que fueron como una segunda familia en el trabajo. Y muy especialmente a mis amigos Rodri y Kiko, Kiko y Rodri. Francisco Miguel Magaa Gonzlez y Rodrigo Gonzlez Glvez, por los buenos momentos que hemos pasado en la cueva. A mi predecesor en el rea de Seguridad Informtica Manuel Correa por su ayuda en las primeras peleas con la compilacin de Dionaea. A mi director de proyecto Gustavo Romero Lpez por la infininiii.iiita paciencia demostrada en la elaboracin de este proyecto. Finalmente al Centro de Servicios de Informtica y Redes de Comunicaciones de la Universidad de Granada por haberme dotado de los medios para la elaboracin de este proyecto.

Contenido
PLANTEAMIENTO Y FORMULACION DEL PROBLEMA: ....................................................................... 5 Resumen: ....................................................................................................................................................... 5 ANTECEDENTES Y JUSTIFICACION DEL PROYECTO:.......................................................................... 5 Problemtica de la implantacin y puesta en funcionamiento. .................................................................... 5 Problemtica con el software y la funcionalidad........................................................................................... 6 Problemtica de la interpretacin de la informacin y la operatividad. ........................................................ 6 Justificacin................................................................................................................................................... 7 INTRODUCCION ............................................................................................................................................. 8 Amenaza por denegacin de servicio. ........................................................................................................... 8 Amenaza por minera de password. .............................................................................................................. 9 Explotacin remota de vulnerabilidades del sistema vinculadas a servicios en red...................................... 9 Elementos de deteccin pasiva: Filosofa de uso, ventajas e inconvenientes ............................................... 9 Taxonoma honeypot. .................................................................................................................................. 10 Cliente/servidor....................................................................................................................................... 10 Modalidad de captura............................................................................................................................... 11 Tipo de respuesta ..................................................................................................................................... 11 Apariencia distribuida ............................................................................................................................. 12 Modo de comunicacin........................................................................................................................... 12 Nivel Interaccin..................................................................................................................................... 12 PLANIFICACION .......................................................................................................................................... 14 Objetivos del proyecto ................................................................................................................................ 14 Requisitos de la herramienta honeypot. ...................................................................................................... 15 Recursos y componentes ............................................................................................................................. 15 Mquina virtual ....................................................................................................................................... 15 Sistema operativo.................................................................................................................................... 16 Dionaea ................................................................................................................................................... 17 Kippo ...................................................................................................................................................... 17 Apache .................................................................................................................................................... 18 Los lenguajes de programacin .............................................................................................................. 18 CODISEO ..................................................................................................................................................... 20 Componentes de deteccin .......................................................................................................................... 20 Componente de control de acceso, consulta y configuracin ..................................................................... 20 Mantenimiento ............................................................................................................................................ 21 Comunicacin con fuente de datos externa (OPCIONAL) ......................................................................... 21 Esquema conceptual .................................................................................................................................... 21 IMPLEMENTACION Y ENSABLADO DEL CODISEO ........................................................................... 22 Ensamblado del codiseo ............................................................................................................................ 22 ANALISIS DE LA INFORMACION ............................................................................................................. 22 Volumen y procedencia ............................................................................................................................... 23 Amenazas ms significativas ...................................................................................................................... 24 Externas .................................................................................................................................................. 25 Internas ................................................................................................................................................... 25 Incidentes secundarios ................................................................................................................................ 26 Escaneos de servicios .................................................................................................................................. 28 Anlisis de amenazas .................................................................................................................................. 29 Intrusin ssh ............................................................................................................................................ 29 Infeccin vrica ....................................................................................................................................... 32 CONCLUSIONES ........................................................................................................................................... 35 GLOSARIO DE TERMINOS ......................................................................................................................... 37 ANEXO DE ESTADISTICAS ATAQUES GLOBALES DE POR PAISES ................................................... 38 ANEXO DE ENSAMBLADO ........................................................................................................................ 38 ANEXO DE CODIGO .................................................................................................................................... 43 REFERENCIAS .............................................................................................................................................. 96

PLANTEAMIENTO Y FORMULACION DEL PROBLEMA:


Resumen:
La finalidad del proyecto es doble. Por un lado es la de proporcionar una herramienta de deteccin, distraccin y anlisis de asaltos a la seguridad de equipos conectados en red, que resulte gil y sencilla de instalar, administrar y consultar. Por otro es la de extraer conclusiones relevantes a la seguridad a partir del anlisis de la informacin recopilada, que oriente en la proteccin de la infraestructura de red, tomando como escenario la red de la Universidad de Granada.

ANTECEDENTES Y JUSTIFICACION DEL PROYECTO:


Problemtica de la implantacin y puesta en funcionamiento.
En Abril del 2010, entre como becario, a travs del programa de becas caro de la Universidad de Granada en el Centro de Servicios de Informtica y redes de la Universidad de Granada, C.S.I.R.C. Por aquel entonces el rea de seguridad contaba con dos fuentes de notificacin de incidencias relativas a seguridad informtica. Una externa, IRIS-CERT, que es el servicio de seguridad de RedIris, el cual o bien directamente o a travs del Centro Informtico Cientfico Andaluz, CICA, transmita las incidencias. La otra era un honeypot, basado en Nephentes, que informaba al correo del rea de seguridad las incidencias detectadas, relativas a las maquinas cuya direccin IP empezara por 150.214.x.y, lo que implicaba posibilidad de pertenecer a la red de la Universidad de Granada. Uno de mis ltimos trabajos como becario fue la experimentacin con software honeypot alternativo, pues Nephentes llevaba tiempo sin mantenimiento por parte de los desarrolladores. Por otro lado el nuevo sistema de gestin de incidencias del rea de Seguridad Informtica, se estaba desarrollando y las herramientas de deteccin del anterior sistema le suponan fuertes restricciones de base para la usabilidad del mismo. En Agosto del 2010 continu mi relacin con el C.S.I.R.C como personal externo y de apoyo en el rea de seguridad informtica, entre mis trabajos asignados estaba el de operador en la gestin incidencias de seguridad, por aquel entonces an segua en funcionamiento el anterior sistema de gestin de incidencias. De mi experiencia con el subsistema encargado de la deteccin encontr numerosas fuentes de problemas. El subsistema estaba totalmente obsoleto y aunque era funcional la usabilidad del subsistema era mnima. Para su puesta en funcionamiento se estaban empleando medios del rea de seguridad, y en concreto de una mquina, en dicho caso fsica, totalmente dedicada l. Adems del uso poco eficiente de recursos, el mantenimiento de estos y su escabilidad carecan de la ms mnima flexibilidad en el marco de divisin de competencias por reas con el que funciona el C.S.I.R.C. Por un lado el rea de gestin de sistemas es quin proporciona el espacio acondicionado y los medios hardware para el software del honeypot, o en su defecto, recurrir a los propios recursos del rea de seguridad. El rea de redes y comunicaciones es quien debe proporcionar al subsistema de deteccin la conectividad y con ella accesibilidad a la "mquina trampa. Por ltimo el tcnico en seguridad debe proporcionar comunicacin del subsistema con el nivel superior, el de gestin de incidencias. Este modelo de implantacin era redundante por 5

elemento del subsistema de deteccin convirtindolo en excesivamente tedioso e ineficiente. Adems, independientemente de la problemtica anterior con raz en el modelo de divisin por reas de la entidad a la que pertenece el rea de seguridad, que penalizaba la flexibilidad del modelo de deteccin; hay otros intrnsecos al propio software de deteccin. Estos problemas influyen directamente en este punto.

Problemtica con el software y la funcionalidad


En la prctica la instalacin de software dependiendo del sistema nos puede obligar incluso a compilar y resolver dependencias entre software y el sistema. Este hecho puede dificultar a veces en gran medida la puesta en funcionamiento de los elementos de deteccin, dependiendo de la pericia como administrador de sistemas del tcnico. Adems es comn no tener disponibilidad completa de una mquina y por sentido comn un software trampa no debe convivir en el mismo host con servicios reales y en produccin. Si finalmente se comprometiera la mquina habra que extraer la mquina de su emplazamiento fsico, extraer discos clonarlos y transportarlos para el anlisis forense. Quedando deshabilitado el servicio de vigilancia hasta la sustitucin y reinstalacin del software. Cuando en mi trabajo diario aparecan discrepancias, de distinta naturaleza (inconsistencia temporal de la incidencia por ejemplo), o se requera extraer ms informacin, era siempre necesario acceder a la maquina en s y consultar ficheros logs grandes dimensiones. Este trabajo supona hasta con el uso de scripts de parsing una labor complicada y tomaba un tiempo que afectaba de manera negativa el tiempo de resolucin de la incidencia. El almacenamiento a largo plazo de toda esa informacin, no normalizada y en texto plano supona otro problema. El estado y configuracin de los antiguos elementos de deteccin hacan inviable el mantenimiento de informacin en texto plano durante tiempo superior a un ao. Se requera labor de limpieza del sistema que albergaba el honeypot, imposibilitndose anlisis de la informacin recopilada en periodos de tiempo superiores a la tarea de limpieza. Es ms supona un riesgo fcilmente explotable el colapso de los mismo para el subsistema de deteccin.

Problemtica de la interpretacin de la informacin y la operatividad.


El principal inconveniente tras la puesta en funcionamiento es la interpretacin de la informacin de manera gil. Dependiendo de la infraestructura de red que se vigile el tiempo requerido para el registro de la incidencia puede ser crtico o no. Pero en mi experiencia para el estudio del origen y naturaleza de la misma siempre es crtico el tiempo. La riqueza de informacin obtenida durante una incidencia captada en caliente nos desvela informacin muy amplia y valiosa. El antiguo subsistema de deteccin solo permita la vigilancia en caliente mediante la continua monitorizacin de los logs y en la prctica no se realizaba dicho trabajo por no ser viable y resultar confuso. Anlisis de procedencia y perfil de los incidentes se realizaban en un desfase de 24 horas lo que supone un control precario mediante una inversin en esfuerzo poco productiva.

Justificacin
De mi experiencia laboral, tanto en el uso de este tipo de software, como en la dotacin de un elemento de deteccin que resuelva los inconvenientes anteriormente descritos, nace el propsito de este proyecto. Dicho propsito es el de proporcionar una herramienta que facilite el trabajo en el campo de la seguridad informtica, mejorando aspectos dbiles percibidos tanto por la comunidad de usuarios como por m.

INTRODUCCION
Como parte del proceso de globalizacin, la misma interconectividad que permite transmitir en un instante informacin a cualquier lugar del planeta, supone una oportunidad para quien se propone daar, espiar, obtener informacin confidencial o apropiarse de recursos de terceros. Segn el informe de sobre cibercrimen de Norton [0], tomando una poblacin de 13000 habitantes repartidos en 24 pases, las prdidas econmicas ascienden 85.000 millones de euros. Cada segundo 18 adultos son vctimas de un delito telemtico. Pero no solo las personas fsicas son susceptibles, empresa, administraciones pblicas, estado y ejrcito llevan desde hace aos fortalecindose ante esta realidad. Las amenazas ms habituales a las que se encuentra un equipo conectado en red, en base a mi experiencia laboral son las siguientes.

Amenaza por denegacin de servicio.


Es la amenaza bsica, el estado ms puro de actividad hostil. Es el aislamiento ya sea por colapso u otra tcnica ms avanzada de un equipo o servicio. Resulta especialmente interesante la consideracin que de este tipo de amenaza se tiene pues afecta de manera muy diversa a distintos perfiles de usuarios. Mientras que para un usuario comn un ataque de este tipo solo supone una molestia, por ello no son las victimas habituales de ellos, en servicios dependientes de empresas y administraciones sus consecuencias son muy amplias y graves. Una denegacin de servicio puede suponer prdidas econmicas para una empresa en la medida que facture en internet. De cara administracin pblica supone una agresin a la imagen del estado y por ello a la sociedad que representa. De cara al ejrcito es doble, en su faceta administrativa como institucin del estado las consecuencias son similares, en la militar puede llegar a la consideracin un acto de guerra. La relacin eficacia dificultad es muy alta, es decir requieren poco esfuerzo y conocimientos iniciales bajos para su ejecucin, por eso nunca han gozado de buena reputacin del lado de Black/Grey & White Hats ni administradores de sistema. Pero desde el punto de vista del atacante y en ciberdefensa son un arma fundamental, que supone por s mismo un apartado especial en auditorias de informtica, pentesting y ciberguerra. Los ejemplos ms famosos son los ataques realizados por Anonymous contra administraciones de distintos estados. El grupo 'hacktivista' Anonymous ha dirigido un ataque contra la pgina web de la Polica Nacional en respuesta a la detencin de tres de sus miembros considerados por las fuerzas de seguridad la "cpula" de la organizacin en Espaa. La web de la Polica Nacional, que ha llegado a estar inoperativa, presentaba en el momento de la redaccin de esta noticia dificultades de carga. Fuente: [0.1] O incluso de ejrcitos como el de Corea del Norte contra administraciones, departamentos y peridico en E.E.U.U y Corea del Sur. 8

Algunos de los sitios estadounidenses afectados son los del Departamento del Tesoro, la Casa Blanca, la Comisin Federal de Valores o el peridico online The Washington Post. Mientras, en el pas surcoreano han sido las pginas Web de la Casa presidencial, el Ministerio de Defensa y algunos bancos. Por otro lado, el motivo de los ataques tambin es una incgnita, ya que no se han robado datos, aunque todo parece indicar que el objetivo era simplemente el de mantener sin acceso a los sitios. Fuente: [0.2]

Amenaza por minera de password.


Es la amenaza de intrusin ms elemental y ms frecuentemente empleada. Se basa en el descubrimiento de claves por defecto, dbiles, fcilmente deducibles y topwords. Generalmente son antesala de otras manazas como: Escalada de privilegios en el sistemas remotos. Robo de informacin. Robo de recursos informticos Espionaje informtico.

Explotacin remota de vulnerabilidades del sistema vinculadas a servicios en red.


Todo servicio conectado a internet supone en si un riesgo en tanto sea vulnerable el software que lo proporciona. Hay infinidad de vulnerabilidades, como mtodos de explotacin de estas que pueden incidir en: Denegaciones de servicio como las que hemos comentado en el apartado anterior. Desbordamiento del buffer de comunicacin del protocolo vinculado al servicio, permitiendo inyectar shellcode: o Acceso a usuarios del sistema, vinculados al servicio para dotarlo de acceso a funciones y aplicaciones pertenecientes al sistema. Como podra ser el usuaria httpd/www-data para Apache o Postgres para la base de datos PostgresSQL. o Acceso a llamadas al sistema en el contexto del usuario que lanzo el servicio. Como son algunas vulnerabilidades vinculadas con Microsoft-DS, que permiten la inyeccin y ejecucin de consolas como Meterpreter , servidor VNC entre otro recursos para interactuar con la mquina comprometida.

Elementos de deteccin pasiva: Filosofa de uso, ventajas e inconvenientes


El campo de la vigilancia en seguridad informtica podemos enmarcarlo en dos filosofas bien diferenciadas. Son la vigilancia activa y la pasiva. La vigilancia activa es aquella que requiere del anlisis global o parcial del trfico de red y el reconocimiento de actividades hostiles en dicho trfico. Por el contrario la vigilancia pasiva se fundamenta en el engao mediante la creacin de focos de atencin que canalizan hacia ellos dichas 9

actividades. Ambas filosofas son complementarias y necesarias para asegurar un desempeo ptimo en la vigilancia de una infraestructura de red. Entre los elementos de deteccin, los honeypots son los encargados de recibir los ataques finales a una red o sistema. Es decir, aquellos destinados a extremos de la red si la visionamos como un con junto de rboles o estrellas con terminacin en hosts. Estos estn enmarcados en la filosofa de seguridad pasiva y cuentan con las siguientes ventajas independientemente de su tipo: El focalizar actividad hostil hacia ellos hace cuantitativamente posible el anlisis de la totalidad de actividad hostil que capten. Obviamente siempre y cuando dicha actividad este contemplada en el concepto del honeypot. El ruido asociado a falsos positivos es variable, por regla general el personal tcnico que mantiene la infraestructura de red est informado de la existencia de ellos resultando ser mnimo. No obstante en mi experiencia laboral si me encontrado falsos positivos, generalmente por escaneos para recopilar informacin estadstica relacionada con el nmero de host activos. El tiempo es un factor crtico en la defensa frente de incidencias de seguridad. Los honeypots adems de elementos de vigilancia realizan labor defensiva mediante distraccin. Esto aumenta el margen de tiempo para la respuesta de la segurizacin de red y servicios. Cuando la seguridad contempla la componente de investigacin y aprendizaje, son herramientas que nos permiten la obtencin de malware para su posterior anlisis. Esto permite la defensa se retroalimente de nuevo conocimiento y se perfeccione. No atentan contra la privacidad al ser pasivos en relacin con la actividad de red.

Por ende encontramos algunos inconvenientes, que son los que vienen a complementar las tcnicas en seguridad activa y en concreto la vigilancia activa. Si fue comprometido un equipo mediante acceso fsico a l, y dicha amenaza no es virulenta, la comunicacin de informacin con y desde el exterior pasar desapercibida. Los honeypots no son eficaces como medio de vigilancia interna contra atacantes familiarizados con el entorno que atacan.

Taxonoma honeypot.
Cliente/servidor
Existen honeypot pensados para funcionar ambos extremos de una comunicacin en red. Los honeypots del lado del cliente (client-side), suelen ser los menos frecuentes. Consisten en una aplicacin cliente que establece conexin a un servidor e interacta con l. El tipo ms popular y el ms amenazado de las aplicaciones del lado del cliente son los navegadores web, junto con las extensiones y plugins asociados. 10

Son muy diferentes en su funcionamiento de los honeypot de servidor, establecen activamente conexiones a los servicios con el fin de detectar comportamientos maliciosos en el servidor o el contenido que sirve. Los honeyclients ms populares son aquellos que detectan ataques a navegadores y sus complementos, propagados a travs de pginas web. Los honeypots diseados para detectar y estudiar los ataques a servicios de red se llaman servidor. Los honeypots de este tipo actan como un servidor, que exponen uno o ms puertos de conexin abiertos, designados aplicaciones integrales y escuchan de modo pasivo las conexiones entrantes establecidas por los clientes a distancia. A menudo, estos tipos de sistemas trampa detectan amenazas que utilizar tramas de establecimiento de conexin para identificar las objetivos potenciales de malware, virus troyanos y botnets. Tambin se pueden utilizar para detectar los intentos de manuales o automatizados de irrumpir en mquinas. Los honeypots de servidor se consideran como los honeypots "tradicionales", y con frecuencia el trmino "honeypots" hace por defecto referencia a ellos.

Modalidad de captura
La modalidad de captura hace referencia al reconocimiento de distintos tipos de informacin que puede detectar. Se distingue entre: Captura de eventos: Es decir, la captura de cambios de estado en el servicio o sistema. Como por ejemplo establecimiento conexin, recepcin de informacin en proceso y desconexin o cambios en la metainformacin del sistema. Captura de ataques: Se captura informacin relativa a la infraccin en la poltica de seguridad del sistema o servicio. Captura de intrusin: La informacin capturada es relativa a la actividad dirigida a explotar vulnerabilidades del sistema comprometido.

Tipo de respuesta
La clasificacin por tipo de repuesta es la perteneciente al comportamiento durante el tiempo que la amenaza esta en accin. Distinguimos: Bloqueo: El ataque es bloqueada antes de acceder al servicio en s. Rechazo: La conexin del ataque consigue llegar al servicio y establecerse, incluso comunicarse, pero una capa previa filtra o desactiva la carga daina de la conexin. Ralentizador o pegajoso (stycky honeypot): Durante la accin amenazante el honeypot vara dinmicamente los tiempos de respuesta de la conexin o la interaccin con el atacante hacindole perder tiempo.

11

Apariencia distribuida
Distinguimos entre honeypots que simulan presencia individual (stand-alone, un solo host) o distribuida simulando multisistemas (honeynet).

Modo de comunicacin
Existen distintos medios de comunicacin con el medio a vigilar, quedando clasificados como: Comunicacin por hardware de interface de red. NI (network interface) Comunicacin por interface hardware, USB por ejemplo. NNHI (Non Network Hardware Interface). Comunicacin software mediante API.

Nivel Interaccin
La interaccin es la clasificacin ms recurrida para los honeypots en el material bibliogrfico sobre seguridad en red y anlisis de malware. Los honeypot de interaccin alta son aquellos que proporcionan una serie de servicios reales y registran la interaccin que el cliente ejerce en ellos. Es un software de investigacin de tcnicas Black Hat (Hacking y Cracking) y aplicaciones forenses de investigacin. Estn totalmente orientados a la bsqueda de vulnerabilidades con fines de depuracin de software servidor e investigacin en ciberdefensa. Ventajas: Ya que suministran servicios reales la interaccin con el atacante es total y no despierta sospechas. El potencial para capturar nuevas tcnicas (aunque limitadas a la versin exacta de los servicios instalados) es total.

Desventajas: En la prctica la inmensa mayora de los ataques son automatizados y no nos van a proporcionar ms informacin que uno de interaccin baja. Su uso implica alto riesgo para los servicios reales y la red que los contiene, ya que pueden dar lugar, y de hecho es lo que se busca, a que se termine con el control sobre la maquina atacada. A posteriori se buscar mantener dicha situacin para avanzar en la recopilacin de informacin y dominio sobre la subred o la infraestructura completa. La mquina trampa puede ser utilizada como puente hacia de subredes y recursos de red protegidos. Por tanto en la prctica requiere de subredes propias altamente limitadas e incomunicadas por el administrador de red. Este es un riesgo difcil de asumir por redes con servicios en produccin que se desean proteger. Pero por otro lado son las subredes con servicios en produccin las que requiere mayores medidas de vigilancia y proteccin. 12

El servicio real consume ms recursos que el emulado, con lo que no es prctica una trampa multiservicio. Adems el mdulo de recoleccin de informacin del ataque suele ser externo a la trampa (mquina virtual trampa + ids snirfando trfico hacia ella). Esto supone instalacin, configuracin y administracin separada para cada parte. Su fin ltimo es descubrir nuevas tcnicas, pero solo tenemos garanta de que los exploits, puertas traseras o fallos de los protocolos sobre los que funcionan los servicios se descubre para versiones puntuales.

Los honeypots de interaccin baja son software que simula, en mayor o menor medida, he aqu la difusa lnea entre media y baja interaccin, servicios de red. Ventajas: Tenemos centralizadas la recopilacin de informacin y los servicios trampa en el mismo componente. Facilitando la instalacin, configuracin y administracin. Podemos hacer simulacin de un mayor nmero de servicios con un consumo mnimo de maquina destinada al propsito de vigilancia. Obtenemos as un espectro ms amplio de servicios y cuales son ms prioritarios a ser protegidos en su explotacin real en la infraestructura de red por frecuencia de ataques. Se minimiza el riesgo derivado de un equipo trampa en una red con servicios reales. No es necesario en principio su aislamiento en una subred independiente. Lo que nos posibilita presencia directa en subredes crticas. Realmente el nico riesgo de compromiso de la mquina viene de las vulnerabilidades del propio sistema que contiene el software honeypot.

Desventajas: Si el atacante tiene la suficiente habilidad sospechara que es un servicio trampa altamente capado o en realidad de una simulacin de este. Al interaccionar segn el patrn esperado del servicio simulado, el ataque ser estndar aunque no sea automatizado. No se espera improvisacin por parte del atacante.

13

Fig1: Taxonoma honeypot Christian Seifert (Meber New Zealand Honeynet Alliance) en [0.3].

PLANIFICACION
En este punto vamos a planificar las tecnologas, software y justificacin de los mismos para el desarrollo de la herramienta honeypot y el cumplimiento de sus objetivos.

Objetivos del proyecto


Liberar al administrador del sistema de las tareas de resolucin de dependencias y compilado del software requerido. Agilizar el trabajo del responsable de la revisin peridica de la informacin capturada por el honeypot. Permitiendo una respuesta rpida. Proporcionar una herramienta que d un medio aislado de deteccin de intrusiones en la seguridad de la red, sin poner en riesgo un recurso hardware de la red ni comprometer el resto de los servicios software que integra. Proporcionar una herramienta de aprendizaje y obtencin de material hack&crack. Y que dicha actividad y material incautado no suponga un riesgo para el hardware ni el software del sistema. Recopilar informacin de actividades hostiles ocurridas en la red de la Universidad de Granada. Analizar dicha informacin y extraer conclusiones que ayuden en la labor de mejora de la seguridad en la red informtica de la universidad de Granada.

14

Requisitos de la herramienta honeypot.


La herramienta se dotara de los siguientes requisitos: 1. Completa y de amplio espectro de deteccin. 2. Inocua y segura para su localizacin en la infraestructura de comunicaciones. 3. Si la herramienta fuese comprometida, debe asegurar su gil sustitucin por una nueva sin suspender el servicio de vigilancia. 4. Si la herramienta fuese comprometida, debe proporcionar agilidad a labor del analista forense. 5. Su sustitucin debe ser lo ms inmediata posible, en caso de mal funcionamiento, compromiso, o destruccin de la misma. 6. Monitorizacin. Comunicar la incidencia en el tiempo de desarrollo de la misma. 7. Almacenamiento local de la informacin recopilada. 8. gil consulta de la informacin reciente. 9. Restriccin de acceso a la informacin recopilada. 10. Consumo de recursos ajustado. 11. Basada en software gratuito sin restricciones de licencia. 12. Es deseable que solo incorpore aquellos servicios reales, fundamentales para la contemplacin de los requisitos anteriores. 13. Facilitar o liberar al operador de la tarea de mantenimiento de la informacin recopilada

Recursos y componentes
Se han optado por los siguientes recursos para alcanzar los objetivos anteriormente enumerados:

Mquina virtual:
Por requisitos de instalacin, mantenimiento, sustitucin y coste se ha optado por una mquina virtual. Se opt por el software de virtualizacin, VirtualBox [1], Oracle VM VirtualBox es un software de virtualizacin para arquitecturas x86/amd64, creado originalmente por la empresa alemana innotek GmbH, que pas a ser propiedad de la empresa Sun Microsystems en febrero de 2008 cuando sta compr a innotek. . Actualmente es desarrollado por Oracle Corporation como parte de su familia de productos devirtualizacin. Por medio de esta aplicacin es posible instalar sistemas operativos adicionales, conocidos como sistemas 15

invitados, dentro de otro sistema operativo anfitrin, cada uno con su propio ambiente virtual.. Fuente: [2] [3] Las razones de su eleccin son: Software gratuito. Sencillez de uso al nivel de los requisitos del proyecto. Compatibilidad con un amplio nmero de sistemas anfitrin. Restauracin a un estado pasado de la mquina mediante snapshot. Soporte para trabajar en formato OVF (Open Virtualization Format), permitiendo migrar la maquina a otras plataformas de virtualizacin. Desarrollo muy activo de mejoras y parches.

El sistema operativo elegido es Ubuntu.


Ubuntu es un sistema operativo basado en Debian y que se distribuye como software libre y gratuito. Est orientado al usuario novel y promedio, con un fuerte enfoque en la facilidad de uso y en mejorar la experiencia de usuario. Est compuesto de mltiple software normalmente distribuido bajo una licencia libre o de cdigo abierto. Cada seis meses se publica una nueva versin de Ubuntu. Esta recibe soporte por parte de Canonical durante nueve meses por medio de actualizaciones de seguridad, parches para bugs crticos y actualizaciones menores de programas. Las versiones LTS (Long Term Support), que se liberan cada dos aos,14 reciben soporte durante cinco aos en los sistemas de escritorio y de servidor.15. Fuente: [4] En concreto Ubuntu 10.04LTS [4.1] [4.2] por los siguientes criterios: Ofrecer un equilibrio entre estabilidad (es la anterior versin LTS) y recursos software actuales. Mantener compatibilidad con las la versiones de las libreras que utilizan el equipo de desarrollo del proyecto Dionaea. Ser relativamente liviana pero no minimalista para mantener un equilibrio entre flexibilidad para su etapa de desarrollo y su consumo de recursos en su etapa de produccin. Est respaldado por una comunidad muy amplia, abierta y activa. La base del sistema ser el software de honeypot. Se han optado por dos soluciones libres.

16

Dionaea [5], considerado en la prctica el sucesor es el sucesor de Nephentes, es un software libre y para el que an se estn desarrollando mejoras y ampliaciones en cuanto a servicios emulados. Cuenta con las siguientes caractersticas:
Emulacin de sevicios: SMB, HTTP, FTP, TFTP, MSSQL, MySQL y SIP. Compatibilidad con TLS y IPv6. Empleo de hebras para obtener paralelismo entre manejo de distintas conexiones y la emulacin de los servicios a los que acceden. Deteccin y ejecucin controlada de nuevos shellcodes ofuscados, mediante libemu VM. Implementa distintas funcionalidades de descarga mediante ftp y http (librera libcurl). Incorpora distintos payloads como: Shells - bind/connectback, URLDownloadToFile y WinExec. Deteccin del sistema operative atacante mediante p0f. Detecta intentos de login contra MsSQL y MySql. Almacenamiento mixto en logs y base de datos SQLite.

Kippo [6] que es un honeypot ssh de media interaccin. An se est intentado incorporar Kippo como un mdulo de Dionaea, pero problemas en la filosofa de desarrollo de ambos proyectos y dependencias lo est dificultando. Por eso la instalacin ser independiente a la de Dionaea. Cuenta con las siguientes caractersticas:
Emulacin de un sistema de ficheros. o Instalacin Debian 5.0. o Permite agregar y quitar ficheros. Implementa funcionalidad de descarga wget mediante librera twysted. Engao de captura de la sesin del atacante o trick. Estos honeypots son de baja y media interaccin respectivamente, en cumplimiento del requisito de que su funcionamiento no entrae riesgo alguno para la infraestructura de comunicaciones que la albergue. Adems tanto de mi experiencia con pruebas con software de este tipo como tomando fuentes de terceros como la Agencia de Seguridad Europea de Redes y la Informacin (ENISA) se destacan frente a los dems por sus caractersticas, soporte y experiencia de los usuarios.

17

Fig1.1: Comparativa de honeypots de la European Network Information Security Agency. Fuente [6.1].

La interface de comunicacin (front web/front end) ser servida mediante el servidor web Apache [7]. Los criterios para su eleccin han sido:
Gran modularidad, lo que nos permite configurarnos la funcionalidad exacta que requerimos a medida. Compatibilidad mediante mdulos con una gran variedad de lenguajes para el desarrollo de webs dinmicas (mod_python, mod_perl, etc). Muy buen soporte en medidas de seguridad incorporadas o Soporte para Secured Socket Layer (SSL) mediante mod_ssl. o Implementa de filtrado contra XSS, inyeccin de comandos etc. La configuracin mediante ficheros de texto es relativamente simple para la complejidad que implica el uso de todas sus caractersticas. Hay gran cantidad de material que facilita y ensea su adecuada configuracin.

Los lenguajes de programacin elegidos para el desarrollo sern Python + Sql y Bash Script
Python es un lenguaje de alto nivel con unas caractersticas sumamente atractivas para este proyecto. Posee una sintaxis muy comprensible, ya que es simple y fuerza de manera amigable a desarrollar un cdigo bien tabulado. El intrprete es ligero y gil. Es muy verstil, nos va a permitir programar aspectos del proyecto a priori muy distintos, como son sistema e interface web.

SQL es el lenguaje para comunicarnos con nuestro sistema gestor de bases de datos. El 18

requisito viene dado por las especificaciones software honeypot. Bash Script es un Shell Script o guion de comandos para el intrprete de comandos Bash. Dota al proyecto de un medio eficaz para el mantenimiento del sistema en relacin con el funcionamiento del software honeypot.

19

CODISEO
En este apartado se va describir el diseo de la herramienta honeypot y la relacin entre los distintos componentes. DIONAEA KIPPO

Componentes de deteccin
Los componentes de deteccin estn formados por los honeypot Dionaea y Kippo. Cuentan con las siguientes caractersticas: Tanto Dionaea como Kippo tienen volcado de informacin en log. Ambos cuentan con almacenamiento de malware. o En el caso de Kippo la emulacin del comando wget implica una posible fuente de vulnerabilidad de la herramienta permitiendo colapsar el sistema de archivos de la mquina virtual. Para prevenir este problema consideraremos un contenedor aislado limitado en tamao. Ambos cuentan con almacenamiento de informacin en base de datos. o En Dionaea el almacenamiento es automtico y en SQLite. o En Kippo el almacenamiento es automtico y en MySQL. En cumplimiento del requisito 10 y 12 de la herramienta honeypot se dotara de soporte para SQLite.

Aplicacin Web

Componente de control de acceso, consulta y configuracin


En cumplimiento de los requisitos 6,8 y 9 dotaremos de una aplicacin web que permita: Control de acceso: Debe implementar un acceso mediante identificacin de usuarios a la funcionalidad de la herramienta. Consulta de la informacin recopilada: Si bien no se busca que sea una herramienta de anlisis y consulta demasiado potente, pues eso escapa a los requisitos expuestos, si debe dar la funcionalidad necesaria para hacer el trabajo diario con ella cmodo y gil, en superacin de las problemticas expuestas en los antecedentes. Configuracin: Debe permitir la configuracin elemental de la deteccin, por las mismas razones expuestas en el apartado anterior.

20

SCRIPTS

Mantenimiento

COMUNICACION & MANTENIMIENTO

En cumplimiento del requisito 13 se contempla la funcionalidad de solucione los problemas en solucin a la problemtica expuesta en el apartado de antecedentes. Implica: Borrado peridico del malware recopilado por Dionaea. Borrado periodico del contenedor de herramientas descargadas durante la amenaza de infiltracin en Kippo Borrado peridico de log de Dionaea y Kippo, post salvado en la base de datos.

Comunicacin con fuente de datos externa (OPCIONAL)


Opcionalmente se ha implementado en detrimento del requisito 11 los mdulos necesarios para comunicar la informacin almacenada en local hacia la base de datos centralizada (Oracle 11g en el C.S.I.R.C). Para ello es necesario que la herramienta honeypot haga uso de los mdulos Oracle InstantClient y cx_Oracle.

Esquema conceptual
ZETSU

Aplicacin Web

DIONAEA

SCRIPTS COMUNICACION & MANTENIMIENTO

KIPPO

REPLICA ZETSU

REPLICA ZETSU

REPLICA ZETSU
Fig2: Esquema conceptual de implantacin de Zetsu en la red dela U.G.R

21

ENSABLADO DEL CODISEO IMPLEMENTACION


En esta fase implementaremos el cdigo necesario para dar la funcionalidad a la herramienta para subsanar la problemtica planteada en los antecedentes con las herramientas elegidas en la planificacin

Ensamblado del codiseo (Ver Anexo de ensamblado) Implementacin de cdigo (Ver Anexo de cdigo)

Fig2.1: Algunas capturas de la interface de usuario de la herramienta honeypot

ANALISIS DE LA INFORMACION
En este apartado analizaremos la informacin recopilada por la herramienta, durante todo el tiempo 22

de que estuvo en funcionamiento, desde el 29-11-2010 hasta la actualidad. NOTA1: Para el anlisis de la informacin se filtrarn equipos de pruebas vinculados al C.S.I.R.C. NOTA2: Por privacidad se omitirn las ip de estos, referencindolos como IPEquipoSEGn.

Volumen y procedencia (Ver Anexo estadsticas de ataques por paises)


En primer lugar identificaremos el volumen de amenazas detectado y su procedencia.
Nmero de conexiones detectadas por Dionaea y Kippo SELECT COUNT(connection) FROM connections WHERE remote_host != 'IPEquipoSEGn' and remote_host != ' IPEquipoSEGn.+1'; = 297510 SELECT COUNT(ip) FROM tablaLogin WHERE ip != ' IPEquipoSEGn ' and ip != ' IPEquipoSEGn+1'; =404268 297510 + 404268 = 701778

Lo que implica un total de 701778 intentos de conexin, de presuntas amenazas. Ahora bien el nmero de conexiones no son una buena medida, pues un solo escaneo puede implicar miles. Distinguimos por IP y obtenemos:
Nmero de direcciones ip detectadas por Dionaea y Kippo SELECT COUNT(DISTINCT(remote_host)) FROM connections WHERE remote_host != 'IPEquipoSEGn' and remote_host != ' IPEquipoSEGn.+1'; =17656 SELECT COUNT(DISTINCT(ip)) FROM tablaLogin WHERE ip != ' IPEquipoSEGn ' and ip != ' IPEquipoSEGn+1 '; =1892 17656 + 1892 =19548

Un total de 19548 direcciones ip involucradas en presuntas amenazas. Lo que nos da una idea del volumen de actividad sospechosa que recibe un solo host (con ip pblica) de una subred cualquiera del C.S.I.R.C. Por ultimo nos preguntamos, cuntas de estas amenazas son generadas desde dentro de la red de investigacin cientfica de Andaluca? Tenemos al enemigo alojado casa?

Network, ASN information and tools (150.214.0.0) Reverse DNS (PTR record) not available ASN number 198096

23

ASN name (ISP) IP-range/subnet Network tools

CICA Centro Informatico Cientifico de Andalucia 150.214.0.0/16 150.214.0.0 - 150.214.255.255

Ping 150.214.0.0 Traceroute 150.214.0.0


Tabla1: Dominio CICA Fuente. Fuente: [8]

Nmero de direcciones ip, pertenecientes a la red R.I.C.A detectadas por Dionaea y Kippo. SELECT COUNT(DISTINCT(remote_host)) FROM connections WHERE remote_host like('150.214.%') and remote_host != 'IPEquipoSEGn''; =171 SELECT COUNT(DISTINCT(ip)) FROM tablaLogin WHERE ip like('150.214.%') and ip != ' IPEquipoSEGn ' and ip != ' IPEquipoSEGn+1'; =5 171 + 5 = 176

Podemos comprobar que son 176 incidentes asociados a distintas direcciones ip de la red R.I.C.A, en contraposicin de las restantes 19372 de origen externo.

Fig3: Porcentaje direcciones vinculadas a incidencias externas frente a internas (R.I.C.A).

Amenazas ms significativas
A la hora de proponer medidas de contingencia ser necesario distinguir entre el origen de la amenaza y el tipo de esta. Dependiendo de la pertenencia de la conexin del equipo involucrado en el incidente de seguridad, y del tipo de la misma, las medidas a tomar pueden ser distintas. 24

Externas
Consultando las conexiones por puertos en la propia herramientas observamos que es con diferencia ssh el servicio ms atacado. Adems, de los datos extrados de las consultas anteriores podemos afirmar que la inmensa mayora son de origen externo.
Nmero de direcciones ip vinculadas a ataques al servicio ssh (puerto 22) SELECT COUNT(DISTINCT(ip)) FROM tablaLogin WHERE ip != ' IPEquipoSEGn ' and ip != ' IPEquipoSEGn+1 '; =1892 Nmero de direcciones ip (R.I.C.A) vinculadas a ataques al servicio ssh (puerto 22) SELECT COUNT(DISTINCT(ip)) FROM tablaLogin WHERE ip like('150.214.%') and ip != ' IPEquipoSEGn ' and ip != ' IPEquipoSEGn+1'; =7

Fig4y5: El tipo de amenaza ms frecuente y de procedencia externa a la red (R.I.C.A) son los ataques mediante fuerza bruta o diccionario al servicio SSH. Los datos muestran 404268 conexiones llevadas a cabo por 1899 direcciones ip, de las cuales solo 7 pertenecan a la U.G.R.

Internas
En contraposicin, si filtramos teniendo solo en cuenta las direcciones ip pertenecientes a la red R.I.C.A observamos que el mayor nmero de ellas vinculadas a incidentes relacionados con el puerto 445, vinculado al protocolo SMB (Server Message Block). 25

La actividad hostil sobre dicho puerto est relacionada principalmente intentos de propagacin de infecciones vricas y acceso medios de control a la mquina, de naturaleza humana o vrica.
Tabla con los puertos atacados por ip internas (R.I.C.A) SELECT remote_host, local_port FROM connections WHERE remote_host like('150.214.%') and remote_host != 'IPEquipoSEGn' ORDER BY local_port DESC;

Nmero de direcciones ip (R.I.C.A) vinculadas a propagacin de malware y ataques a vulnerabilidades SMB (445).

SELECT COUNT(DISTINCT(remote_host)) FROM connections WHERE remote_host like('150.214.%') and local_port = '445' and remote_host != 'IPEquipoSEGn' ; =149

Fig6: De las 171 direcciones ip vinculadas a incidentes de origen interno, 149 fueron relacionadas con la explotacin de vulnerabilidades vinculadas al protocolo SMB.

Incidentes secundarios
Internet es la principal fuente de incidencias en seguridad y la mayor variedad de estas son de procedencia externa. Al ser la primera etapa tras el reconocimiento de la vctima, la bsqueda de credenciales dbiles sobre servicios con control de acceso mediante usuario y clave es muy intensa. Podemos consultar en la propia herramienta el nmero de conexiones contra los servicios que emula, con estas caractersticas, para hacernos una idea de cules son los ms amenazados.

26

Puerto/Servicio 21/FTP 1433/MSSQL 3306/MySQL 5060/VOIP

# de Conexiones
557 18143 28519 28376

Fig7: Podemos interpretar a la luz de los resultados que el acceso a servicios de telefnia IP y bases de datos son muy populares entre los amigos de los ajeno.

A la luz de los resultados podemos afirmar que resulta muy atractivo el acceso a base de datos y telefona VOIP. Es curioso que ms que incluso que a FTP que en principio nos permitira la sustraccin de archivos o dejar malware con la intencin de que un usuario poco experimentado lo ejecute y comprometa por curiosidad el equipo. Esto demuestra que hay un gran inters por el acceso y/o robo de la informacin contenida en base de datos. Y el robo de cuentas VOIP por el dinero que pueden contener o el anonimato que pueden darnos mediante suplantacin de identidad. La informacin no solo es valiosa por la propia naturaleza que pueda tener, en mi experiencia puede ser un vehculo para la escalada de privilegios en el resto del sistema o la red. Este tipo de infiltracin demuestra un comportamiento inteligente y es de sumo inters para localizar amenazas ms serias. La herramienta emula dicho comportamiento, la base de datos MySQL emulada es en realidad un archivo SQLite, configurado para tentar una escalada de privilegios, desvelando comportamiento humano del atacante.

Fig8: Tabla mostrada al atacante en MySQL emulado.

27

Fig9: Atacantes desvelan comportamiento humano al explotar informacin de la base de datos MySQL emulada, para acceder el servicio SSH emulado.

Escaneos de servicios
Aunque no hay manera de analizar incidencias que no llegaron a existir al no emularse determinados servicios, si podemos consultar los intentos de conexin contra determinados puertos, que Dionaea almacena como conexin rechazada. Esto nos dar una idea de los servicios ms buscados durante los escaneos en busca de vctimas potenciales.

Puerto/Servicio
23 / TELNET 25 / SMPT 110 / POP3 143 / IMAP 1080 / PROXY 3389 / RDP 5900 / VNC 6667 / IRC 8080 / HTTPPROXY/TOMCAT

# de Conexiones 2709 25 391 212 8085 6164 2165 52 6883

Fig10: Comparativa de escaneos a algunos servicios comnmente utilizados.

Se observa como: Destacan la bsqueda de proxy al puerto 1080 y 8080, esta prctica es muy habitual para la bsqueda de servidores que permitan navegacin annima. 28

Los servicios de escritorio remoto mediante RDP y VNC, especialmente RDP, tambin despiertan mucho inters por razones obvias, son otra va de tomar el control de la mquina. Telnet no es un servicio olvidado y tiene su lgica. An es muy habitual encontrarlo en sistemas empotrados funcionando en routers, switch kvm (keyborard video mouse) y otros dispositivos de red. Vemos como tambin los servicios de correo despiertan cierto inters. Realmente ms del que demuestra los datos. La razn es que hoy da el envo de spam tiene su principal fuente de recursos en equipos comprometidos por malware que por robo en s de las cuentas.

Anlisis de amenazas
Descritas las amenazas que hemos detectado a lo largo de este tiempo vamos a estudiar en mayor medida el comportamiento de las que suponen mayor riesgo.

Intrusin ssh
Por la informacin recopilada, sin duda la amenaza ms grave tanto por la frecuencia como por los riesgos que supone. Afecta de manera crtica a la seguridad de la red, la intimidad de los usuarios y la seguridad del equipo. El primer paso tras la bsqueda de vctimas potenciales ha sido la bsqueda en ellas de credenciales dbiles. Los diccionarios a veces cuentan con varios miles de pares de usuarios y claves ms o menos habituales o con algn criterio estratgico como el idioma de la vctima potencial o combinaciones con su nombre de dominio.

NOTA: De arriba hacia abajo y de izquierda a derecha Fig11: Podemos observar el volumen de algunos diccionarios es considerable. Fig12: Los diccionarios estan compuestos por claves habituales. Fig13: A veces los diccionarios siguen estrategias como combinaciones con el nombre del domino.

29

Tras el descubrimiento de alguna credencial vulnerable viene la intrusin, pero en contra de lo que podra parecer, esta rara vez es desde el equipo que realizo la bsqueda. Veamos un ejemplo real: 1. Se detect la intrusin desde la direccin ip 95.77.175.43 el 19-5-2013, que volvi a repetirse casi un mes despus.

2. Ese mismo da 5 direcciones ip ms acertaron la clave, dos de ellas tambin a la primera.

3. Solo los pases de la Unin Europea entraron a la primera, Asia solo escane. Ver Fig14. 3.1 NINGUNO tena el puerto 9050, NINGUNO ERA NODO TOR. 3.2 Las dos direcciones ip de Rumania son dinmicas. 3.3 La ip Alemana pertenece a un sitio web con servicio SSH escondido en el puerto 55. 3.3.1 nmap -p 55 -A 85.214.246.127 => 55/tcp open ssh Debian 4 (protocol 2.0). OpenSSH 6.0p1

3.3.2 Es posible que sea un equipo comprometido, aunque es muy poco probable pues demuestra prcticas en seguridad cambiando servicios crticos de puertos por defecto. 3.3.3 Es posible que sea extremo final de un ataque, o simplemente un fisgn. Esta es toda la informacin que podemos obtener dentro de la legalidad y sin salirnos de la temtica del proyecto.

30

EL INTRUSO

ACERTO a la primera NO toco nada

SOLO PASO DICCIONARIO

SOLO PASO DICCIONARIO

SOLO PASO DICCIONARIO

ACERTO a la primera Segunda visita en tres meses

SOLO PASO DICCIONARIO

Fig14: Geolocalizacin IP de los involucrados en un incidente tpico de intrusin a travs de SSH. Fuente: [9] Vctima, honeypot. Red C.S.I.R.C - U.G.R

La actividad en estos incidentes tras la intrusin suele ser: Reconocimiento de la mquina. Robo de informacin Instalacin de software para control de la maquina en actividades de: o Ocultacin de la intrusin. o Robo de informacin. o Bsqueda y ataque otras vctimas potenciales. o Uso como proxy para otras actividades como IRC WAR.

Fig15: Actividad de reconocimiento y descarga de malware tras las intrusin.

31

En algunas ocasiones el servidor emulado es secuestrado. Con credenciales compartidas en los dems secuestros o incluso personales del atacante. Qu verdad y recursos desvelara el acceso a dichos equipos, o incluso al del propio atacante? Al ser algo fuera de la legalidad, este proyecto no puede ni debe dar respuesta, aunque es una duda legtima.

Fig15.1 Claves detectadas en el secuestro de equipo.

El software recopilado est principalmente compuesto por: Scripts de ocultacin mediante borrado o filtrado de logs del sistema. Paquetes fuentes de rootkits. Aplicaciones precompiladas en combinacin con scripts para automatizacin de localizacin y ataque a vctimas. Software para controlar mediante bots conectados a servidores irc la mquina y scripts en perl para escaneo de puertos y denegacin de servicios mediante el envo masivo de tramas SYNC. Software bouncer o proxy.

Infeccin vrica
La principal amenaza interna a la red en este tiempo fue la infeccin propagacin de infecciones vricas. NOTA: Por privacidad se omiti las ip internas involucradas en la incidencia. Veamos un ejemplo real: 1. Bsqueda de equipos infectados
Lista de ip involucradas en propagacin vrica mediante vulnerabilidad (SMB ms08_067)

SELECT DISTINCT(remote_host) FROM connections


WHERE remote_host like('150.214.%') and local_port = '445' and remote_host != 'IPEquipoSEGn' ;

32

2. Fijamos nuestra atencin en dos incidencias en la subred 60, los identificaremos como 150.214.60.A y 150.214.60.B.

3. Si consultamos el identificador universal del servicio solicitado a travs de SMB, veremos que la peticin tiene el identificador universal (4b324fc8-1670-01d3-12785a47bf6ee188)

4. Que se corresponde con la interface lanmanserver service SRVSVC. Y en

concreto a la operacin 22.

5. Que es la emulacin de la fucin NetprPathCanonicalize. Vinculada a la vulnerabilidad MS08-67 [10]. The NetprPathCanonicalize method converts a path name to the canonical format Fuente [11].

6. Esto es explotado para inyectar el shellcode que solicita las siguientes descargas mediante protocolo http. Estas descargas son almacenadas y se obtiene la firma md5 del malware descargado 33

7. Finalmente podemos identificar los servidores exteriores que proporcionan el malware (contenedores), para cortar su comunicacin con la red atacada. Tambin identificamos el malware a travs de su firma md5 en unin de servicios como [12] y lo antivirus efectivos contra l.

Fig16: Malware captado por la herramienta honeypot, detectado e identificado. Mediante servicio VirusTotal [12]

34

CONCLUSIONES
Como se ha demostrado las amenazas que surgen en una infraestrcutura de red son muy variadas. Un sistema de deteccin pasiva como son los honeypots ayudan de manera crucial, junto con tcnicas de deteccin activa, auditorias de pentesnting peridicas y buena praxis en la administracin y segurisacin de equipos y servicios. En concreto la red de la U.G.R, es un complejo ecosistema de subredes pblicas y privadas con equipos, servicios y dispositivos. Con usuarios de perfiles distintos como personal de administracin, personal investigacin, personal laboral y alumnado. El volumen de amenazas y su variedad, tanto por naturaleza como origen, requieren de mtodos efectivos y automatizados que permitan una deteccin temprana y un tratamiento gil de las incidencias que surgen en seguridad informtica. Con la elaboracin de este proyecto se han cumplido dos objetivos. Por un lado proveer de una herramienta a tal fin y por otro la extraccin de informacin que permita la documentacin de amenazas a las que se ve sometida dicha red. Del estudio de dichas amenazas extraemos las siguientes consideraciones y medidas preventivas: NOTA: En fecha de redaccin de este trabajo y durante el tiempo de elaboracin del mismo casi la totalidad de dichas medidas han sido o estn implantndose de manera exitosa. Administracin Una poltica cuidadosa de eleccin de las credenciales. Correcta configuracin de seguridad en sistemas operativos y la aplicacin de reglas de cortafuegos (reas de Sistemas de Investigacin y rea de Sistemas de Gestin). Actualizacin y parcheado peridico de las imgenes que son cargadas en la red administrativa (rea de Micro Informtica) y de aulas (rea de Aulas). Redes Aislamiento mediante VPN o subredes privadas de los servicios en produccin que sean de uso privado del servicio de informtica. Capado del acceso desde redes pblicas, como son la VPN y la red inalmbrica, a subredes que no abastezcan de servicios pblicos. Proveer de mecanismos tcnicos que permitan la utilizacin eficiente de las tcnicas de seguridad activa, como es el registro y consulta eficiente de los histricos de conexin. Seguridad Gestin automatizada del registro y tratamiento de incidencias de seguridad tanto de origen interno como externo. Siempre con soporte humano para la toma final decisiones. Auditorias peridicas de seguridad mediante test de penetracin. o No basta con detectar la amenaza, hay que adelantarse y documentar para la correccin por parte de las reas implicadas de dicha amenaza. Ampliacin del conocimiento del rea hacia campos como el anlisis de malware (Byte Forensic). o Con la deteccin de la amenaza la eficacia es solo parcial. 35

o Es necesario el estudio profesional de la misma para la evaluacin real de su alcance. si la amenaza hubiera sido efectiva. Elaboracin de seminarios enfocados a la seguridad para la comunidad universitaria.

36

GLOSARIO DE TERMINOS
Black/Grey/White Hat: Terminos que hace referencia a hackers segn su tica profesional. Mientras que Black Hat busca negocio o beneficio propio, el White es totalmente altruista dona su conocimiento a la vctima. El Grey Hat es un caso especial en el que segn su afinidad por la vctima toma una postura u otra. Botnet: Botnet es un trmino que hace referencia a un conjunto de robots informticos o bots, que se ejecutan de manera autnoma y automtica. El artfice de la botnet puede controlar todos los ordenadores/servidores infectados de forma remota y normalmente lo hace a travs del IRC. Las nuevas versiones de estas botnets se estn enfocando hacia entornos de control mediante HTTP, con lo que el control de estas mquinas ser mucho ms simple. Electricista Hacker: La amenaza ms eficiente e indetectable, con tan solo descolgar y arrastrar la tapa del la caja los fusibles sobre estos puede dejar incomunicadas infraestructuras completas. Malware: Malware (del ingls malicious software), tambin llamado badware, cdigo maligno, software malicioso o software malintencionado, es un tipo de software que tiene como objetivo infiltrarse o daar una computadora o Sistema de informacin sin el consentimiento de su propietario. Payload: PayLoad es una funcin adicional que posee cierta amenaza en particular. La traduccin exacta del ingls, es ms precisa respecto a su definicin: "carga til". Refiere a acciones adicionales, incluidas en virus, gusanos o troyanos; como por ejemplo robo de datos, eliminacin de archivos, sobre-escritura del disco, reemplazo de la BIOS, etc. Pentest: Un Penetration Testing o Test de Penetracin, es un procedimiento metodolgico y sistemtico en el que se simula un ataque real a una red o sistema, con el fin de descubrir y reparar sus problemas de seguridad, a continuacin veremos la documentacin mas recomendada para aprender a realizar correctamente un test de penetracin. Proxy: Un proxy, en una red informtica, es un programa o dispositivo que realiza una accin en representacin de otro, esto es, si una hipottica mquina A solicita un recurso a una C, lo har mediante una peticin a B; C entonces no sabr que la peticin procedi originalmente de A. Shellcode: Cdigo que proporciona una shell del sistema. Es inyectado en la pila de ejecucin de un programa en formato hexadecimal. Tcnicas ms avanzadas realizan codificacin mediante uso de la funcin xor para su ofuscacin. Troyano: En informtica,se denomina troyano o caballo de Troya (traduccin literal del ingls Trojan horse) a un software malicioso que se presenta al usuario como un programa aparentemente legtimo e inofensivo pero al ejecutarlo ocasiona daos. Zombi: Es la denominacin que se asigna a computadores personales que tras haber sido infectados por algn tipo de malware, pueden ser usadas por una tercera persona para ejecutar actividades hostiles. Este uso se produce sin la autorizacin o el conocimiento del usuario del equipo. El nombre procede de los zombis o muertos vivientes esclavizados, figuras legendarias surgidas de los cultos vud. 37

ANEXO ESTADISTICAS DE ATAQUES GLOBAL POR PAISES


CHINA ESPAA (FALSO, NO ESTAN FILTRADAS PRUEBAS INTERNAS) ESTADOS UNIDOS DE AMRICA ALEMANIA REPBLICA DE COREA CANAD ARGENTINA FEDERACIN DE RUSIA - NO REGISTRADO KOREA, REPUBLIC OF BRASIL TAIWAN INDIA FRANCIA TURQUA REINO UNIDO DE GRAN BRETAA E IRLANDA DEL NORTE TAILANDIA GRECIA JAPN INDONESIA PASES BAJOS PALESTINIAN TERRITORY UCRANIA RUSSIAN FEDERATION NIGERIA POLONIA COLOMBIA JAPAN BRAZIL VIET NAM ITALY FRANCE GERMANY HONG KONG TURKEY CHILE UNITED KINGDOM VENEZUELA ITALIA ISRAEL NETHERLANDS EGYPT IRAN, ISLAMIC REPUBLIC OF RUMANIA AUSTRALIA EMIRATOS RABES UNIDOS CANADA 354.356 115.906 33.604 12.421 7.063 5.688 4.813 4.532 4.437 3.614 3.536 3.314 3.284 2.850 2.780 2.433 2.368 2.155 2.155 1.944 1.944 1.914 1.910 1.843 1.829 1.747 1.715 1.566 1.317 1.298 1.248 1.171 1.140 1.077 1.019 918 871 755 698 676 665 630 612 592 587 498 484

38

MXICO SUDFRICA THAILAND SWEDEN MEXICO KAZAJSTN ROMANIA MALAYSIA SUECIA GUATEMALA SWAZILANDIA PANAM BULGARIA POLAND CHIPRE RWANDA BANGLADESH LUXEMBURGO IRLANDA ISLANDIA FINLANDIA IRN REPBLICA CHECA SWITZERLAND MALASIA PORTUGAL DJIBOUTI AZERBAIYN GREECE ME EGIPTO EL SALVADOR CROATIA KUWAIT GEORGIA LATVIA LITUANIA ARABIA SAUDITA/ARABIA SAUD SINGAPORE SAUDI ARABIA SINGAPUR HONDURAS URUGUAY NUEVA ZELANDA PER PAKISTAN FILIPINAS DENMARK CZECH REPUBLIC AUSTRIA MACAO PHILIPPINES EUROPA PALESTINA BELARUS HUNGARY

466 439 419 388 355 355 344 319 317 315 303 298 247 235 227 223 220 210 205 191 185 175 172 167 163 161 160 151 148 144 138 125 124 116 114 110 101 98 97 92 91 88 80 80 79 79 78 70 69 65 63 62 59 55 50 50

39

ECUADOR GHANA KAZAKHSTAN SUIZA TONGA LITHUANIA LUXEMBOURG PANAMA BELGIUM TANZANIA, UNITED REPUBLIC OF SERBIA KENYA IRELAND RS SLOVAKIA UGANDA LETONIA PERU DINAMARCA ARMENIA NORWAY COSTA RICA BELARS IRAQ MACEDONIA REPBLICA DEMOCRTICA POPULAR LAO MONGOLIA FINLAND NORUEGA BLGICA MOLDOVA, REPUBLIC OF PUERTO RICO MOROCCO REPBLICA DOMINICANA NEW ZEALAND BOLIVIA SLOVENIA CYPRUS UNITED ARAB EMIRATES HUNGRA ESTONIA MOLDOVA JORDANIA KYRGYZSTAN PAKISTN LEBANON SEYCHELLES PARAGUAY JORDAN QATAR ALGERIA ALBANIA JAMAICA MARRUECOS ANTILLAS NEERLANDESAS SEYCHELLES

49 44 43 43 42 42 39 39 36 35 34 34 31 31 30 29 29 29 28 28 27 27 27 27 25 25 25 25 25 24 23 22 22 21 21 21 20 19 19 19 19 18 16 13 13 13 13 12 12 11 10 10 10 10 9 9

40

BAHRAIN LBANO ESLOVENIA NAMIBIA SATELLITE PROVIDER ICELAND NICARAGUA TUNISIA ANONYMOUS PROXY SRI LANKA TNEZ REPBLICA ESLOVACA/ESLOVAQUIA DOMINICAN REPUBLIC OMN CAMBODIA UZBEKISTN NEPAL ZIMBABWE TRINIDAD AND TOBAGO LAO PEOPLE'S DEMOCRATIC REPUBLIC BRUNEI DARUSSALAM ARUBA GUAM TAJIKISTAN ZAMBIA BURUNDI BAHREIN ETHIOPIA MADAGASCAR MACAU MAURITIUS MALI NEW CALEDONIA TAYIKISTN BAHAMAS SAINT LUCIA REPBLICA UNIDA DE TANZANA MONTENEGRO CAMBOYA SENEGAL ANGOLA OMAN TRINIDAD Y TABAGO COTE D'IVOIRE BOSNIA AND HERZEGOVINA IM CENTRAL AFRICAN REPUBLIC ARGELIA SRI LANKA BOTSWANA TURKMENISTAN TOGO BARBADOS YEMEN MOZAMBIQUE GUADELOUPE

9 9 8 7 7 7 7 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 4 4 4 4 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1

41

NORTHERN MARIANA ISLANDS FRENCH GUIANA SUDN

1 1 1

42

ANEXO DE ENSAMBLADO
REQUERIMIENTOS HARDWARE Sistema base + 256 MB Ram + 10Gb Disco Duro.

REQUERIMIENTOS SOFTWARE VirtualBox3.2.X Linux Ubuntu 10.04Lts 32bits Dionaea Kippo http://www.virtualbox.org/ http://www.ubuntu.com/desktop/get-ubuntu/download http://dionaea.carnivore.it/ http://code.google.com/p/kippo/

INSTALACION DEL VIRTUALBOX3 http://www.virtualbox.org/manual/ch02.html

INTALACION DE UBUNTU http://www.guia-ubuntu.org/index.php?title=Instalaci%C3%B3n_est%C3%A1ndar

CONSTRUCCION DE LA MAQUINA VIRTUAL AJUSTES DEL SISTEMA VIRTUAL Desactivacin del servicio dhcp Al configurar la conexin con ip esttica de desactiva. Desactivacin del servicio cups

~$ sudo update-rc.d -f cups remove

Deinstalacin (No funciona desactivacin) del servicio avahi-daemon

~$ sudo update-rc.d -f avahi-daemon remove (NO FUNCIONA) ~$ sudo apt-get remove avahi-daemon (SOLUCION)

Desinstalacin de las herramientas multimedia, ofimtica y juegos Nos vamos a Aplicaciones->Centro de software de Ubuntu y desde ah las quitamos una por una.

43

INSTALACION DEL HONEYPOT DIONAEA (22/08/2011) #DEPENDENCIAS

~# sudo apt-get install libudns-dev libglib2.0-dev libssl-dev libcurl4-openssl-dev libreadline-dev libsqlite3-dev python-dev libtool automake autoconf build-essential subversion git-core flex bison pkg-config

#P0F (OPCIONAL)

~# sudo apt-get install p0f

#OPENSSL (OPCIONAL)

~# sudo apt-get install cvs ~# cvs -d anonymous@cvs.openssl.org:/openssl-cvs co openssl ~# cd openssl ~openssl# ./Configure shared --prefix=/opt/dionaea linux-x86_64 ERROR ~openssl# ./config SOLUCION ~openssl# make SHARED_LDFLAGS=-Wl,-rpath,/opt/dionaea/lib ~openssl# sudo make install ~openssl# cd ..

#LIBLCFG

~# git clone git://git.carnivore.it/liblcfg.git liblcfg ~# cd liblcfg/code ~liblcfg/code# autoreconf -vi ~liblcfg/code# ./configure --prefix=/opt/dionaea ~liblcfg/code# make install ~liblcfg/code# cd .. ~liblcfg# cd ..

#LIBEMU

~# git clone git://git.carnivore.it/libemu.git libemu ~# cd libemu ~libemu# autoreconf -vi ~libemu# ./configure --prefix=/opt/dionaea ~libemu# make install ~libemu# cd ..

44

#LIBNL (OPCIONAL)

~# git clone git://git.kernel.org/pub/scm/libs/netlink/libnl.git ~# cd libnl ~libnl# autoreconf -vi ~libnl# export LDFLAGS=-Wl,-rpath,/opt/dionaea/lib ~libnl# ./configure --prefix=/opt/dionaea ~libnl# make ~libnl# make install ~libnl# cd ..

#LIBEV

~# wget http://dist.schmorp.de/libev/libev-4.04.tar.gz ~# tar xfz libev-4.04.tar.gz ~# cd libev-4.04 ~libev-4.04# ./configure --prefix=/opt/dionaea ~libev-4.04# make install ~libev-4.04# cd ..

#PYTHON 3.2

~# wget http://python.org/ftp/python/3.2/Python-3.2.tgz ~# tar xfz Python-3.2.tgz ~# cd Python-3.2/ ~Python-3.2# ./configure --enable-shared --prefix=/opt/dionaea --with-computed-gotos -enable-ipv6 LDFLAGS="-Wl,-rpath=/opt/dionaea/lib/" ~Python-3.2# make ~Python-3.2# make install ~Python-3.2# cd ..

#CYTHON

~# git clone https://github.com/cython/cython.gi ~# cd cython ~cython# /opt/dionaea/bin/python3 setup.py install ~cython# python setup.py build ~cython# sudo python setup.py install ~cython# cd ..

#LXML Y DEPENDENCIAS (RECOMENDADO)

~# apt-get install libxml2-dev libxslt1-dev ~# wget http://codespeak.net/lxml/lxml-2.3.tgz ~# tar xfz lxml-2.3.tgz ~# cd lxml-2.3 ~lxml-2.3# /opt/dionaea/bin/python3 setup.py install ~lxml-2.3# cd ..

45

#C-ARES

~# wget http://c-ares.haxx.se/c-ares-1.7.3.tar.gz ~# tar xfz c-ares-1.7.3.tar.gz ~# cd c-ares-1.7.3 ~c-ares-1.7.3# ./configure --prefix=/opt/dionaea ~c-ares-1.7.3# make ~c-ares-1.7.3# make install ~c-ares-1.7.3# cd ..

#CURL

~# wget http://curl.haxx.se/download/curl-7.20.0.tar.bz2 ~# tar xfj curl-7.20.0.tar.bz2 ~# cd curl-7.20.0 ~curl-7.20.0# ./configure --prefix=/opt/dionaea --enable-ares=/opt/dionaea ~curl-7.20.0# make ~curl-7.20.0# make install ~curl-7.20.0# cd ..

#LIBPCAP

~# wget http://www.tcpdump.org/release/libpcap-1.1.1.tar.gz ~# tar xfz libpcap-1.1.1.tar.gz ~# cd libpcap-1.1.1 ~libpcap-1.1.1# ./configure --prefix=/opt/dionaea ~libpcap-1.1.1# make ~libpcap-1.1.1# make install ~libpcap-1.1.1# cd ..

#UDNS

~# apt-get install libudns0 libudns-dev

46

#DIONAEA

~# git clone git://git.carnivore.it/dionaea.git dionaea ~# autoreconf -vi ~# cd dionaea/ ~dionaea# autoreconf -vi ~dionaea# ./configure --with-lcfg-include=/opt/dionaea/include/ \ --with-lcfg-lib=/opt/dionaea/lib/ \ --with-python=/opt/dionaea/bin/python3.2 \ --with-cython-dir=/opt/dionaea/bin \ --with-udns-include=/usr/include/ \ --with-udns-lib=/usr/lib/ \ --with-emu-include=/opt/dionaea/include/ \ --with-emu-lib=/opt/dionaea/lib/ \ --with-gc-include=/usr/include/gc \ --with-ev-include=/opt/dionaea/include \ --with-ev-lib=/opt/dionaea/lib \ --with-nl-include=/opt/dionaea/include \ --with-nl-lib=/opt/dionaea/lib/ \ --with-curl-config=/opt/dionaea/bin/ \ --with-pcap-include=/opt/dionaea/include \ --with-pcap-lib=/opt/dionaea/lib/ \ --with-glib=/opt/dionaea ~dionaea# make ~dionaea# make install

47

SCRIPT DE INSTALACION ATUMATICA DE DIONAEA


#!/bin/bash if [ $? != 0 ]; then exit fi #DEPENDENCIAS apt-get install libudns-dev \ libglib2.0-dev \ libssl-dev \ libcurl4-openssl-dev \ libreadline-dev \ libsqlite3-dev \ python-dev \ libtool \ automake \ autoconf \ build-essential \ subversion \ git-core \ flex \ bison \ pkg-config \ gettext ### sqlite3 apt-get install sqlite3 ### p0f apt-get install p0f if [ ! -e "/opt/dionaea" ]; then mkdir /opt/dionaea fi if [ ! -e "dionaea" ]; then mkdir dionaea fi cd dionaea MYPWD=`pwd` ### openssl (OPCIONAL) if [ ! -e "openssl" ]; then apt-get install cvs cvs -d anonymous@cvs.openssl.org:/openssl-cvs co openssl cd openssl ./config make SHARED_LDFLAGS=-Wl,-rpath,/opt/dionaea/lib make install cd $MYPWD fi ### liblcfg if [ ! -e "liblcfg" ]; then git clone git://git.carnivore.it/liblcfg.git liblcfg cd liblcfg/code else cd liblcfg/code git pull fi autoreconf -vi ./configure --prefix=/opt/dionaea make install cd $MYPWD ### libemu if [ ! -e "libemu" ]; then git clone git://git.carnivore.it/libemu.git libemu cd libemu else cd libemu git pull fi autoreconf -vi ./configure --prefix=/opt/dionaea

48

make install cd $MYPWD ### libnl (OPCIONAL) if [ ! -e "libnl" ]; then git clone git://git.kernel.org/pub/scm/libs/netlink/libnl.git cd libnl else cd libnl git pull fi autoreconf -vi export LDFLAGS=-Wl,-rpath,/opt/dionaea/lib ./configure --prefix=/opt/dionaea make make install cd $MYPWD ### libev if [ ! -e "libev-4.04" ]; then wget http://dist.schmorp.de/libev/libev-4.04.tar.gz tar xfz libev-4.04.tar.gz cd libev-4.04 ./configure --prefix=/opt/dionaea make install cd $MYPWD fi ### python3 if [ ! -e "Python-3.2" ]; then wget http://python.org/ftp/python/3.2/Python-3.2.tgz tar xfz Python-3.2.tgz cd Python-3.2/ ./configure --enable-shared --prefix=/opt/dionaea --with-computed-gotos \ --enable-ipv6 LDFLAGS="-Wl,-rpath=/opt/dionaea/lib/" make make install cd $MYPWD fi ### cython if [ ! -e "cython" ]; then git clone https://github.com/cython/cython.git cd cython else cd cython git pull fi /opt/dionaea/bin/python3 setup.py install cd $MYPWD ### lxml if [ ! -e "lxml-2.3" ]; then ### DEPENDENCIAS libxml2 libxslt apt-get install libxml2-dev libxslt1-dev wget http://lxml.de/files/lxml-2.3.tgz tar xfz lxml-2.3.tgz cd lxml-2.3/ /opt/dionaea/bin/python3 setup.py install cd $MYPWD fi ### c-ares (OBSOLETO? NECESARIO PARA CURL) if [ ! -e "c-ares-1.7.5" ]; then wget http://c-ares.haxx.se/download/c-ares-1.7.5.tar.gz tar xfz c-ares-1.7.5.tar.gz cd c-ares-1.7.5 ./configure --prefix=/opt/dionaea make make install cd $MYPWD fi ### curl if [ ! -e "curl-7.20.0" ]; then wget http://curl.haxx.se/download/curl-7.20.0.tar.bz2 tar xfj curl-7.20.0.tar.bz2

49

cd curl-7.20.0 ./configure --prefix=/opt/dionaea --enable-ares=/opt/dionaea make make install cd $MYPWD fi ### libpcap if [ ! -e "libpcap-1.1.1" ]; then wget http://www.tcpdump.org/release/libpcap-1.1.1.tar.gz tar xfz libpcap-1.1.1.tar.gz cd libpcap-1.1.1 ./configure --prefix=/opt/dionaea make make install cd $MYPWD fi ### udns ###(OPCIONAL NO USAR EN DEBIAN - INSTALAR libudns0_0.0.9-3_i386.deb Y libudns-dev_0.0.9-3_i386.deb) ###(OPCIONAL NO USAR EN UBUNTU) apt-get install libudns0 libudns-dev #if [ ! -e "udns-0.0.9" ]; then # wget http://www.corpit.ru/mjt/udns/old/udns_0.0.9.tar.gz # tar xfz udns_0.0.9.tar.gz # cd udns-0.0.9/ # ./configure # make shared # cd $MYPWD #fi ### dionaea ###(CAMBIAR PARA DEBIAN Y UBUNTU) ###--with-udns-include=/opt/dionaea/include/ \ ###--with-udns-lib=/opt/dionaea/lib/ \ ### POR ###--with-udns-include=/usr/include/ \ ###--with-udns-lib=/usr/lib/ \# git clone git://git.carnivore.it/dionaea.git dionaea cd dionaea autoreconf -vi ./configure --with-lcfg-include=/opt/dionaea/include/ \ --with-lcfg-lib=/opt/dionaea/lib/ \ --with-python=/opt/dionaea/bin/python3.2 \ --with-cython-dir=/opt/dionaea/bin \ --with-udns-include=/usr/include/ \ --with-udns-lib=/usr/lib/ \ --with-emu-include=/opt/dionaea/include/ \ --with-emu-lib=/opt/dionaea/lib/ \ --with-gc-include=/usr/include/gc \ --with-ev-include=/opt/dionaea/include \ --with-ev-lib=/opt/dionaea/lib \ --with-nl-include=/opt/dionaea/include \ --with-nl-lib=/opt/dionaea/lib/ \ --with-curl-config=/opt/dionaea/bin/ \ --with-pcap-include=/opt/dionaea/include \ --with-pcap-lib=/opt/dionaea/lib/ \ --with-glib=/opt/dionaea make make install cd $MYPWD

50

CONFIGURACION DE DIONAEA Configuracin de inicio como demonio del sistema durante el arranque: Creamos el script de arranque.

~$ cd /etc/init.d /etc/init.d/$ sudo nano dionaea.sh

Escribimos el comando de inicio.

#!/bin/sh #Carga del proceso p0f (deteccin del S.O que se nos conecta al honeypot) p0f -i any -u root -Q /tmp/p0f.sock -q -l -d -o /tmp/p0f.log #OJO CON u nobody NO FUNCIONA EN RASPBERRY PI, PC POR CONFIRMAR #/opt/dionaea/bin/dionaea -D -u nobody -g nogroup -r /opt/dionaea -w /opt/dionaea -p #/opt/dionaea/var/dionaea.pid /opt/dionaea/bin/dionaea -D -u root -r /opt/dionaea -w /opt/dionaea -p /opt/dionaea/var/dionaea.pid

Ctrl+x para salir preguntndonos si queremos guardar. Le damos permiso de ejecucin.

/etc/init.d/$ sudo chmod 744 dionaea.sh

Creamos los enlaces automticamente a cada uno de los directorios para los runcommands (/etc/rcX.d) de los distintos modos de arranque. Por defecto se nos crearn como activados S y prioridad 20 durante el arranque. S20dionaea.sh ../init.d/dionaea.sh

/etc/init.d/$ sudo update-rc.d dionaea.sh defaults

Creamos el archivo /opt/zetsuBD/zetsu.sqlite y damos de alta al administrador.

CREATE TABLE "login" ("username" VARCHAR PRIMARY KEY , "rol" VARCHAR NOT NULL )

NOT NULL , "password" VARCHAR NOT NULL

INSERT INTO "main"."login" ("username","password","rol") VALUES (?1,?2,?3) Parameters: param 1 (text): zetsu param 2 (text):

51

15e907c0e30958e3882bcd552b4216106f8c52f2cb767be788c446664aaf20d5de6019148cf2d70001f618cb17cd 4399fbfbb7c7257a9c05ea00ca55e25cbeb9 param 3 (text): administrador

Modificacin de permisos de dionaea: /opt/dionaea/var/dionaea/logsql.sqlite (Base de datos de intentos de conexin) /opt/dionaea/var/dionaea/zetsu.sqlite (Base de datos de Usuarios) /opt/dionaea/etc/dionaea/dionaea.conf (Configuracin de dionaea)

$ sudo chown root:www-data /opt/dionaea/var/dionaea $ sudo chown root:www-data /opt/dionaea/var/dionaea/logsql.sqlite /opt/dionaea/var/dionaea/sipaccounts.sqlite /opt/dionaea/var/dionaea/vtcache.sqlite $ sudo chown root:www-data /opt/dionaea/etc/dionaea/dionaea.conf $ sudo chmod 664 /opt/dionaea/etc/dionaea/dionaea.conf $ sudo chown root:www-data /opt/zetsuBD/ $ sudo chmod 664 /opt/zetsuBD/zetsu.sqlite

52

INSTALACION DEL HONEYPOT KIPPO #DEPENDENCIAS

~# sudo apt-get install python-twisted

Instalacin.

~$ sudo mkdir /opt/kippo ~$ sudo chown zetsu:zetsu /opt/kippo ~$ cd /opt/kippo ~/opt/kippo$ wget http://kippo.googlecode.com/files/kippo-0.5.tar.gz ~/opt/kippo$ tar -xvzf kippo* ~/opt/kippo$ mv kippo-0.5 /opt/kippo

CONFIGURACION DE KIPPO Configuracin de inicio en el arranque del sistema sistema: Kippo no permite por razones de seguridad ser lanzado como usuario root. Por ello durante el arranque tendremos que cambiar de contexto del usuario root al usuario zetsu como se indica mas adelante. Creamos el script de arranque.

~$ cd /etc/init.d /etc/init.d/$ sudo nano kippo.sh Escribimos el comando de inicio. (Cambio de contexto a usuario zetsu)

#!/bin/sh iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j REDIRECT --to-port 2222 su - zetsu -c "rm /opt/kippo/kippo.pid" su - zetsu -c "cd /opt/kippo/;twistd -y /opt/kippo/kippo.tac -l /opt/kippo/log/kippo.log -pidfile /opt/kippo/kippo.pid"

Le damos permiso de ejecucin.

/etc/init.d/$ sudo chmod 755 kippo.sh

53

Modificacin de permisos de kippo: /opt/kippo/log/kippoBD.sqlite (Base de datos intentos de conexin)

~$ sudo chown -R zetsu:www-data /opt/kippo

Creamos los enlaces automticamente a cada uno de los directorios para los runcommands (/etc/rcX.d) de los distintos modos de arranque. Por defecto se nos crearn como activados S y prioridad 20 durante el arranque. S20kippo.sh ../init.d/kippo.sh

/etc/init.d/$ sudo update-rc.d kippo.sh defaults

54

INSTALACION DE SERVIDOR APACHE Y MODULO PYTHON Instalacin.

~$ sudo apt-get install apache2 libapache2-mod-python

CONFIGURACION DEL SERVIDOR APACHE (HTTP) Cambiar el puerto de escucha de apache:

~$ sudo nano /etc/apache2/ports.conf

Modificamos las siguientes directivas dejndolas como sigue...

NameVirtualHost *:3650 Listen 3650

Configuracin del host virtual y activacin del modulo python.

~$ sudo nano /etc/apache2/sites-avariable/zetsuHttp

Usamos la siguiente configuracin.


<VirtualHost *:3650> ServerAdmin webmaster@localhost DocumentRoot /var/www #Carga del modulo python LoadModule python_module modules/mod_python.so <Directory /> #-FollowSymLinks No seguir enlaces simbolicos (seguridad) Options -FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> #-Indexes No mostrar contenido del directorio (seguridad) Options -Indexes -FollowSymLinks MultiViews #No usamos .htaccess AllowOverride None #Manejador PSP de mod_python AddHandler mod_python .psp PythonHandler mod_python.psp PythonDebug On </Directory> <Directory /var/www/imagenes> Options -Indexes -FollowSymLinks MultiViews AllowOverride None

55

</Directory> <Directory /var/www/js> Options -Indexes -FollowSymLinks MultiViews AllowOverride None </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> </VirtualHost>

Activamos el sitio zetsuHttp.

~$

sudo a2ensite zetsuHttp

Finalmente reiniciamos el demonio apache2.

~$

sudo service apache2 restart

56

CONFIGURACION DEL SERVIDOR APACHE (HTTP-S) Activamos el modulo ssl de apache:

~$ sudo a2enmod ssl

Cambiar el puerto de escucha de apache:

~$ sudo nano /etc/apache2/ports.conf

Modificamos las siguientes directivas dejndolas como siguen.

#ZETSU HHTP #NameVirtualHost *:3650 #Listen 3650 <IfModule mod_ssl.c> # If you add NameVirtualHost *:443 here, you will also have to change # the VirtualHost statement in /etc/apache2/sites-available/default-ssl # to <VirtualHost *:443> # Server Name Indication for SSL named virtual hosts is currently not # supported by MSIE on Windows XP. #ZETSU HTTPS NameVirtualHost *:4093 Listen 4093 </IfModule> <IfModule mod_gnutls.c> Listen 4093 </IfModule>

Configuracin del host virtual para ssl y activacin del modulo python

~$ sudo nano /etc/apache2/sites-available/zetsuHttps

Usamos la siguiente configuracin.

<IfModule mod_ssl.c> <VirtualHost _default_:4093> ServerAdmin webmaster@localhost DocumentRoot /var/www #Carga del modulo python LoadModule python_module modules/mod_python.so <Directory /> #-FollowSymLinks No seguir enlaces simbolicos (seguridad) Options -FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> #-Indexes No mostrar contenido del directorio (seguridad)

57

Options -Indexes -FollowSymLinks MultiViews #No usamos .htaccess AllowOverride None #Manejador PSP de mod_python AddHandler mod_python .psp PythonHandler mod_python.psp PythonDebug On </Directory> <Directory /var/www/imagenes> Options -Indexes -FollowSymLinks MultiViews AllowOverride None </Directory> <Directory /var/www/js> Options -Indexes -FollowSymLinks MultiViews AllowOverride None </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> # SSL Engine Switch: # Enable/Disable SSL for this virtual host. SSLEngine on # A self-signed (snakeoil) certificate can be created by installing # the ssl-cert package. See # /usr/share/doc/apache2.2-common/README.Debian.gz for more info. # If both key and certificate are stored in the same file, only the # SSLCertificateFile directive is needed. SSLCertificateFile /etc/ssl/certs/zetsu.pem #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key # Server Certificate Chain: # Point SSLCertificateChainFile at a file containing the # concatenation of PEM encoded CA certificates which form the # certificate chain for the server certificate. Alternatively # the referenced file can be the same as SSLCertificateFile # when the CA certificates are directly appended to the server # certificate for convinience. #SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt # Certificate Authority (CA): # Set the CA certificate verification path where to find CA # certificates for client authentication or alternatively one # huge file containing all of them (file must be PEM encoded) # Note: Inside SSLCACertificatePath you need hash symlinks # to point to the certificate files. Use the provided # Makefile to update the hash symlinks after changes. #SSLCACertificatePath /etc/ssl/certs/ #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt # # # # Certificate Revocation Lists (CRL): Set the CA revocation path where to find CA CRLs for client authentication or alternatively one huge file containing all of them (file must be PEM encoded)

58

# Note: Inside SSLCARevocationPath you need hash symlinks # to point to the certificate files. Use the provided # Makefile to update the hash symlinks after changes. #SSLCARevocationPath /etc/apache2/ssl.crl/ #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl # Client Authentication (Type): # Client certificate verification type and depth. Types are # none, optional, require and optional_no_ca. Depth is a # number which specifies how deeply to verify the certificate # issuer chain before deciding the certificate is not valid. #SSLVerifyClient require #SSLVerifyDepth 10 # Access Control: # With SSLRequire you can do per-directory access control based # on arbitrary complex boolean expressions containing server # variable checks and other lookup directives. The syntax is a # mixture between C and Perl. See the mod_ssl documentation # for more details. #<Location /> #SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \ # and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \ # and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \ # and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \ # and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \ # or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/ #</Location> # SSL Engine Options: # Set various options for the SSL engine. # o FakeBasicAuth: # Translate the client X.509 into a Basic Authorisation. This means that # the standard Auth/DBMAuth methods can be used for access control. The # user name is the `one line' version of the client's X.509 certificate. # Note that no password is obtained from the user. Every entry in the user # file needs this password: `xxj31ZMTZzkVA'. # o ExportCertData: # This exports two additional environment variables: SSL_CLIENT_CERT and # SSL_SERVER_CERT. These contain the PEM-encoded certificates of the # server (always existing) and the client (only existing when client # authentication is used). This can be used to import the certificates # into CGI scripts. # o StdEnvVars: # This exports the standard SSL/TLS related `SSL_*' environment variables. # Per default this exportation is switched off for performance reasons, # because the extraction step is an expensive operation and is usually # useless for serving static content. So one usually enables the # exportation for CGI and SSI requests only. # o StrictRequire: # This denies access when "SSLRequireSSL" or "SSLRequire" applied even # under a "Satisfy any" situation, i.e. when it applies access is denied # and no other module can change it. # o OptRenegotiate: # This enables optimized SSL connection renegotiation handling when SSL # directives are used in per-directory context. SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> # # # # # # # # # # # # # SSL Protocol Adjustments: The safe and default but still SSL/TLS standard compliant shutdown approach is that mod_ssl sends the close notify alert but doesn't wait for the close notify alert from client. When you need a different shutdown approach you can use one of the following variables: o ssl-unclean-shutdown: This forces an unclean shutdown when the connection is closed, i.e. no SSL close notify alert is send or allowed to received. This violates the SSL/TLS standard but is needed for some brain-dead browsers. Use this when you receive I/O errors because of the standard approach where mod_ssl sends the close notify alert. o ssl-accurate-shutdown: This forces an accurate shutdown when the connection is closed, i.e. a

59

# SSL close notify alert is send and mod_ssl waits for the close notify # alert of the client. This is 100% SSL/TLS standard compliant, but in # practice often causes hanging connections with brain-dead browsers. Use # this only for browsers where you know that their SSL implementation # works correctly. # Notice: Most problems of broken clients are also related to the HTTP # keep-alive facility, so you usually additionally want to disable # keep-alive for those clients, too. Use variable "nokeepalive" for this. # Similarly, one has to force some clients to use HTTP/1.0 to workaround # their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and # "force-response-1.0" for this. BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 # MSIE 7 and newer should be able to use keepalive BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>

Creamos el certificado para la sesin ssl. Generamos una llave privada sin passphrase de 2048 bits (zetsu.key). Generamos la solicitud de firma (Certificate Sign Request) (zetsu.csr). Rellenamos los datos solicitados. Autofirmamos nuestro certificado con 10 aos de tiempo de expiracin. Generamos el archivo pem uniendo clave privada y certificado.

~$ ~$ ~$ ~$ ~$ ~$

cd /etc/apache2 sudo openssl genrsa -out zetsu.key 2048 sudo openssl req -new -key zetsu.key -out zetsu.csr sudo openssl x509 -req -days 36500 -in zetsu.csr -signkey zetsu.key -out zetsu.crt sudo cat zetsu.key zetsu.crt > zetsu.pem sudo mv zetsu.* /etc/ssl/certs/

Activamos el sitio zetsuHttps.

~$

sudo a2ensite zetsuHttp

Finalmente reiniciamos el demonio apache2.

~$

sudo service apache2 restart

60

CONFIGURACION DEL ENTORNO DE DESARROLLO Y USUARIOS Permisos en /var/www

~$ sudo chown root:www-data /var/www

Agregamos el usuario zetsu al grupo www-data, para poder acceder a /var/www y desarrollar la aplicacin.

~$ sudo nano /etc/group

Modificamos la siguiente linea dejndola como sigue.

www-data:x:33:zetsu

Permisos para el usuario www-data: Al permitir la aplicacin el cambio de la configuracin de los servicios que se emulan, es necesario dar permisos a www-data para parar y relanzar el demonio de dionaea. Al ser este lanzado durante el arranque como root tenemos que darle permisos sudo y por seguridad limitarlo a tan solo a los scripts de parada e inicio.

~$ sudo nano /etc/sudoers Modificamos la seccin # User privilege specification como sigue. # User privilege specification root ALL=(ALL) ALL www-data ALL = NOPASSWD: /opt/scriptsCronJobs/offDionaea.sh, /opt/scriptsCronJobs/onDionaea.sh

61

INSTALACION EN EL ENTORNO DE PRODUCION Tras la instalacin de VirtualBox en el servidor para explotacn existen dos filosofas de arranque de las mquinas virtuales. Inicio manual por el administrador del sistema arranque de la misma como un servicio del sistema. En concreto durante el desarrollo el proyecto el honeypot estar instalado en humo.ugr.es (servidor Supermicro Intel Xeon ,8GB Ram, Windows Server 2003), que realiza la funcin de virtualizacin de servicios en Betatesting para el C.S.I.R.C, y es iniciado como un servicio del sistema durante el arranque (prelogin) junto con otras mquinas virtuales. Instalacin y configuracin (Windows Server 2003) Nota Importante: Es altamente recomendable que las mquinas arrancadas como servicios del sistema no esten levantadas en el momento de arrancar VirtualBox (interface grfica). Ya que se pueden dar errores de consistencia entre VirtualBox y VboxHeadless (manejador de mquinas virtuales sin la interface), si accedemos por error a la configuracin de alguna de las mquinas que estn corriendo en ese momento. Copiamos el archivo zetsu.vdi en C:\Documents and Settings\usuario\.VirtualBox\HardDisks Arrancamos VirtualBox -> Pulsamos el boton Nueva ->

En el men crear nueva mquina virtual Nombre zetsu Sistema operativo: Linux Versin: Ubuntu

Pulsamos Next En la siguiente pantalla nos saldr seleccionado por defecto 512 MB pero con 256 MB podemos funcionar sin problemas y economizaremos recursos del sistema anfitrin

Pulsamos Next

62

En la siguiente pantalla seleccionamos usar disco duro existente

Pulsamos

Pasamos al men del administrador de medios virtuales y pulsamos

Navegamos por el men hasta C:\Documents and Settings\usuario\.VirtualBox\HardDisks, seleccionamos zetsu.vdi y pulsamos abrir. Volveremos al men de medios virtuales y nos saldr como un disco duro.

Lo marcamos y pulsamos seleccionar. Ahora nos saldr seleccionado como disco duro de nuestra maquina virtual.

Pulsamos Next y terminar. Por ltimo la nica configuracin pos instalacin es asignarle una interface de red virtual conectada mediante bridge a la interface de red del equipo anfitrin (maquina fsica). Para ello pulsamos configuracin

Y en la seccin de Red Marcamos habilitar conector. Seleccionamos Conectado a Adaptador puente Seleccionamos a interface fsica Desplegamos Avanzadas Seleccionamos tipo de adaptador alguno de los existentes (menos red paravirtualizada) Y marcamos cable conectado

63

En el caso de la red de la ugr es importante que el servicio de redes nos de una mac asociada a una ip para tener acceso a la red. Y ser en este men donde la asignemos.

64

CONFIGURACION DEL HONEYPOT VIRTUAL EN EL HOST REAL Arranque como servicio del sistema del honeypot virtual: Requisitos: Instalar Windows Resource Kits en la carpeta srvany. Crear una carpeta srvany, en system32 se facilita no usar direcciones absolutas. Creacin del servicio del sistema: Desde dentro de la carpeta ejecutamos. "ruta del sistema\INSTSRV.EXE MaquinaVirtualZetsu ruta del sistema\SRVANY.EXE" Se nos creara el servicio de sistema MaquinaVirtualZetsu dentro del registro de windows. Configuracin del registro de Windows: Buscamos MaquinavirtualZetsu. Dentro del registro se crea una carpeta Parameters. Dentro de Parameters creamos tres registros de strings values tales como: AppDirectory "c:\Program Files\Oracle\VirtualBox\" Application "c:\windows\system32\cmd.exe" AppParameters /c "c:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe" -startvm zetsu -p 3380 Apagado como servicio del sistema del honeypot virtual: El apagado del servidor no contempla el apagado seguro de las mquinas virtuales lanzadas como servicios del sistema. Por eso definimos el siguiente script y lo aadimos a las polticas de apagado del sistema como se indica en: http://technet.microsoft.com/en-us/library/cc783802(v=ws.10).aspx

C:\notepad shutdownVM.bat

@ECHO off ECHO ----------------------------------------- >> VMShutdown.log ECHO Registro de apagado de maquinas virtuales >> VMShutdown.log ECHO ----------------------------------------- >> VMShutdown.log sc stop MaquinaVirtualZetsu >> VMShutdown.log ECHO. >> VMShutdown.log ECHO Apagado del servicio MaquinaVirtualZetsu registrado el "%date%" a las "%time%" >> VMShutdown.log ECHO ----------------------------------------- >> VMShutdown.log

65

ANEXO DE CODIGO
Cabecera.psp
<% from mod_python import Session, util sesionWeb = Session.Session(req,timeout=86400) %> <div id="cabecera"> <div id="logotipoI"></div> <div id="logotipoD"></div> <div id="navegador"> <table id="tablaNavegador"> <tr> <% try: if(sesionWeb['sesion'] != "granted"): %> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/login.psp">Login-2</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/consultaBD.psp">Tablas</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/consultaSshBD.psp">TablasSSH</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/graficaBD.psp">Estadisticas</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/configuracion.psp">Configuracion</a></td> <% else: %> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/login.psp">UnLogin</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/consultaBD.psp">Tablas</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/consultaSshBD.psp">TablasSSH</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/graficaBD.psp">Estadisticas</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/configuracion.psp">Configuracion</a></td> <% except: %> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/login.psp">Login-1</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/consultaBD.psp">Tablas</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/consultaSshBD.psp">TablasSSH</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/graficaBD.psp">Estadisticas</a></td> <td onmouseover="javascript:this.style.background='#808080';" onmouseout="javascript:this.style.background='#c0c0c0';"><a href="/configuracion.psp">Configuracion</a></td> <% #end/try %> </tr> </table> </div><!--navegador--> </div><!--cabecera-->

66

Controlsesion.psp
<% try: if(sesionWeb['sesion'] == "granted"): pass else: sesionWeb['exceptionErrorMsg']="ERROR1: No tiene permisos de usuario" sesionWeb.save() util.redirect(req,"error.psp") except Exception,e: try: sesionWeb['exceptionErrorMsg']="ERROR2: No tiene permisos de usuario" sesionWeb.save() util.redirect(req,"error.psp") except Exception,e: util.redirect(req,"error.psp") #end/try/try %>

error.psp
<html> <head> <style type="text/css" media="all"> @import "zetsu.css"; </style> </head> <body> <div id="pagina"> <%@ include file="./cabecera.psp"%> <div id="contenido"> <%=str(sesionWeb['exceptionErrorMsg'])%> </div><!--contenido--> </div><!--pagina--> </body> </html>

login.psp
<html> <head> <style type="text/css" media="all"> @import "zetsu.css"; </style> </head> <body> <div id="pagina"> <%@ include file="./cabecera.psp"%> <center><img src="./imagenes/cabecera.jpg"></center> <% import hashlib from pysqlite2 import dbapi2 sesionWeb['sesion'] = form.getfirst('sesion') sesionWeb['username'] = form.getfirst('username') sesionWeb['password'] = form.getfirst('password') sesionWeb['exceptionErrorMsg'] = None sesionWeb.save() if (sesionWeb['sesion']==None): %> <div id="menu"> <form action="login.psp" method="post" name="formLogin"> <fieldset class="greenFieldSet"> <div> <label class="loginFormDivLabel">Nombre de usuario:</label> <input class="loginFormDivInput" value="" name="username"></input> </div>

67

<br /> <div> <label class="loginFormDivLabel">Password:</label> <input class="loginFormDivInput" value="" name="password" type="password"></input> </div> <br /> <div> <input type="submit" value="Login" name="button1"></input> </div> <input name="sesion" type="hidden" value="postLogin"></input> </fieldset> </form> </div><!--menu--> <!--<div id="contenido"></div>--><!--contenido--> <!--<div id="pie"></div></div>--> </div> <!--pagina--> </body> </html> <% elif (sesionWeb['sesion']=="postLogin"): consultaLogin=False try: conexionBD = dbapi2.connect("/opt/dionaea/var/dionaea/zetsu.sqlite") cursorBD = conexionBD.cursor() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") else: try: cadenaClave = hashlib.sha512(sesionWeb['password']).hexdigest() cursorBD.execute("SELECT * FROM login WHERE username='"+sesionWeb['username']+"'") row = cursorBD.fetchall() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") else: try: consultaLogin = (cadenaClave==row[0][1]) except Exception,e: sesionWeb['exceptionErrorMsg']="ERROR2: Usuario/Clave incorrectos" sesionWeb.save() util.redirect(req,"error.psp") else: if (consultaLogin): sesionWeb['sesion']="granted" sesionWeb.save() util.redirect(req,"consultaBD.psp") else: sesionWeb['exceptionErrorMsg']="ERROR1: Usuario/Clave incorrectos" sesionWeb.save() util.redirect(req,"error.psp") cursorBD.close() conexionBD.close() else: sesionWeb['exceptionErrorMsg']="ERROR: Estado de sesion ilegal" sesionWeb.save() util.redirect(req,"error.psp") #end/if/elif/else %>

68

consultaBD.psp
<html> <head> <style type="text/css" media="all"> @import "zetsu.css"; </style> <script type="text/javascript" src="js/zetsuFunciones.js"></script> </head> <body> <div id="pagina"> <div id="capaFlotante"><span id="posicion"></span></div> <%@ include file="./cabecera.psp"%> <%@ include file="./controlSesion.psp"%> <div id="contenido"> <center> <form action="./consultaBD.psp" method="post" name="formConsultas"> <textarea name="consultaPersonalizada" cols="75%" rows="2"></textarea> <br /> <input type="submit" class="botonLargo" name="botonConsulta" value="Enviar consulta SQlite"> </form> </center> <table id="tablaConsulta"> <% from pysqlite2 import dbapi2 from datetime import datetime try: conexionBD = dbapi2.connect("/opt/dionaea/var/dionaea/logsql.sqlite") cursorBD = conexionBD.cursor() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") datosXconsulta = 20 cadenaDesplazar = form.getfirst('desplazar') cadenaPosicion = form.getfirst('posicion') cadenaTabla = form.getfirst('tablasDionaea') cadenaConsulta = form.getfirst('consultaPersonalizada') if (not cadenaDesplazar) and (not cadenaPosicion) and (not cadenaTabla): cadenaTabla = 'connections' indice = 0 elif (cadenaDesplazar=="="): indice = 0 elif (cadenaDesplazar=="+"): indice = float(cadenaPosicion) + datosXconsulta elif (cadenaDesplazar=="-"): indice = float(cadenaPosicion) - datosXconsulta else: cadenaTabla = 'connections' indice = 0 try: cursorBD.execute("PRAGMA TABLE_INFO('" + str(cadenaTabla) + "')") rowCabecera = cursorBD.fetchall() cadenaPKey=rowCabecera[0][1] except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") if (not cadenaConsulta): try: cursorBD.execute("SELECT MAX(" + cadenaPKey + ") FROM " + cadenaTabla) maxIdTabla = cursorBD.fetchone()[0] except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp")

69

if not maxIdTabla: maxIdTabla = 0 if (maxIdTabla <= indice): indice=maxIdTabla if (indice < 20): indice = 20 try: cursorBD.execute("SELECT * FROM " + str(cadenaTabla) + " WHERE (" + cadenaPKey + "<=" + str( maxIdTabla - indice + 20) + " AND " + cadenaPKey + ">=" + str(maxIdTabla - indice) + " ) ORDER BY " + cadenaPKey + " DESC") rows = cursorBD.fetchall() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") else: try: cursorBD.execute(cadenaConsulta) rows = cursorBD.fetchall() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") for row in rows: %> <tr onmouseover="javascript:this.style.background='#3f5e74';javascript:this.style.color='#ffffff';" onmouseout="javascript:this.style.background='#ffffff';javascript:this.style.color='#000000';"> <% for posicion in range(len(row)): #if (not cadenaConsulta) and (str(rowCabecera[posicion][1])<>"connection_timestamp"): if (not cadenaConsulta) and (type(row[posicion]).__name__<>"float"): %> <th onmouseover="showdiv(event,'<%=str(rowCabecera[posicion][1])%>');" onmousemove="showdiv(event,<%=str(rowCabecera[posicion][1])%>);" onmouseout="javascript:document.getElementById('capaFlotante').style.display='none';" onclick="consultaCelda('<%=cadenaTabla%>','<%=cadenaPKey%>','<%=str(rowCabecera[posicion][1])%>', '<%=unicode(row[posicion]).encode("utf-8")%>')"> <%=unicode(row[posicion]).encode("utf-8")%> </th> <% elif (not cadenaConsulta) and (type(row[posicion]).__name__=="float"): objetoMedioDiaAtras= float(row[posicion])-86400.0 objetoMedioDiaAdelante= float(row[posicion])+86400.0 objetoDate=datetime.fromtimestamp(float(row[posicion])) objetoDate=objetoDate.strftime("%Y-%m-%d %H:%M:%S") %>

<th onmouseover="showdiv(event,'<%=str(rowCabecera[posicion][1])%>');" onmouseout="javascript:document.getElementById('capaFlotante').style.display='none';" onclick="consultaCeldaFecha('<%=cadenaTabla%>','<%=cadenaPKey%>','<%=str(rowCabecera[posicion][1])%>','<%=unicode(row[posicion]).e 8")%>','<%=objetoMedioDiaAtras%>','<%=objetoMedioDiaAdelante%>')"> <%=objetoDate%> </th> <% else: if (type(row[posicion]).__name__<>"float"): %> <th> <%=unicode(row[posicion]).encode("utf-8")%> </th> <% else: objetoMedioDiaAtras= float(row[posicion])-86400.0 objetoMedioDiaAdelante= float(row[posicion])+86400.0 objetoDate=datetime.fromtimestamp(float(row[posicion])) objetoDate=objetoDate.strftime("%Y-%m-%d %H:%M:%S") %> <th>

70

<%=objetoDate%> </th> <% #end/if/elif/else %> </tr> <% #end/for %> </table> </div><!--contenido--> <div id="menu"> <form action="" method="post" name="formTablas"> <input type="hidden" name="posicion" value="<%=indice%>"> <input type="hidden" name="desplazar" value="="> <input type="submit" class="boton" name="botonDesplazaTabla" value="<<" onclick="document.formTablas.desplazar.value='+';document.formTablas.tablasDionaea.value ='<%=cadenaTabla%>'"> <input type="submit" class="boton" name="botonDesplazaTabla" value=">>" onclick="document.formTablas.desplazar.value='-';document.formTablas.tablasDionaea.value ='<%=cadenaTabla%>'"> <br /> <% try: cursorBD.execute('SELECT name FROM sqlite_master WHERE type="table"') rows = cursorBD.fetchall() cursorBD.close() conexionBD.close() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") #end/try %> <select name="tablasDionaea" size="<%=len(rows)%>" onchange="document.formTablas.desplazar.value='=';document.formTablas.posicion.value='0';document.formTablas.submit()"> <% for row in rows: %> <option value="<%=row[0]%>"> <%=row[0]%> </option> <% #end/for %> </select> </form> </div><!--menu--> <div id="pie"> <br /><%=indice%><br /><%=str(rowCabecera[1][1])%><br /><%=cadenaConsulta%> </div><!--pie--> </div><!--pagina--> </body></html>

71

ConsultaSshBD.psp
<html> <head> <style type="text/css" media="all"> @import "zetsu.css"; </style> <script type="text/javascript" src="js/zetsuFunciones.js"></script> </head> <body> <div id="pagina"> <div id="capaFlotante"><span id="posicion"></span></div> <%@ include file="./cabecera.psp"%> <%@ include file="./controlSesion.psp"%> <div id="contenido"> <center> <form action="./consultaSshBD.psp" method="post" name="formConsultas"> <textarea name="consultaPersonalizada" cols="75%" rows="2"></textarea> <br /> <input type="submit" class="botonLargo" name="botonConsulta" value="Enviar consulta SQlite"> <input type="checkbox" name="opcionSimplificada" value="ok">Tabla Simplificada</input> </form> </center> <table id="tablaConsulta"> <% from pysqlite2 import dbapi2 from datetime import datetime try: conexionBD = dbapi2.connect("/opt/kippo/log/kippoBD.sqlite") cursorBD = conexionBD.cursor() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") datosXconsulta = 20 cadenaDesplazar = form.getfirst('desplazar') cadenaPosicion = form.getfirst('posicion') cadenaTabla = form.getfirst('tablasKippo') cadenaConsulta = form.getfirst('consultaPersonalizada') cadenaSimplificada = form.getfirst('opcionSimplificada') cadenaPKey="rowid" if (not cadenaDesplazar) and (not cadenaPosicion) and (not cadenaTabla): cadenaTabla = 'tablaLogin' indice = 0 elif (cadenaDesplazar=="="): indice = 0 elif (cadenaDesplazar=="+"): indice = float(cadenaPosicion) + datosXconsulta elif (cadenaDesplazar=="-"): indice = float(cadenaPosicion) - datosXconsulta else: cadenaTabla = 'tablaLogin' indice = 0 try: cursorBD.execute("pragma table_info('" + str(cadenaTabla) + "')") rowCabecera = cursorBD.fetchall() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") if (not cadenaConsulta): try: cursorBD.execute("SELECT MAX(rowid) FROM " + cadenaTabla) maxIdTabla = cursorBD.fetchone()[0] except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save()

72

util.redirect(req,"error.psp") if not maxIdTabla: maxIdTabla = 0 if (maxIdTabla <= indice): indice=maxIdTabla if (indice < 20): indice = 20 try: cursorBD.execute("SELECT * FROM " + str(cadenaTabla) + " WHERE (" + cadenaPKey + "<=" + str( maxIdTabla - indice + 20) + " AND " + cadenaPKey + ">=" + str(maxIdTabla - indice) + " ) ORDER BY fechaTimeStamp DESC") rows = cursorBD.fetchall() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") else: try: cursorBD.execute(cadenaConsulta) rows = cursorBD.fetchall() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") for row in rows: if (not cadenaSimplificada): %> <tr onmouseover="javascript:this.style.background='#3f5e74';javascript:this.style.color='#ffffff';" onmouseout="javascript:this.style.background='#ffffff';javascript:this.style.color='#000000';"> <% else: %> <br/> <% for posicion in range(len(row)): #if (not cadenaConsulta) and (str(rowCabecera[posicion][1])<>"fechaTimeStamp"): if (not cadenaConsulta) and (type(row[posicion]).__name__<>"float"): %> <th onmouseover="showdiv(event,'<%=str(rowCabecera[posicion][1])%>');" onmousemove="showdiv(event,<%=str(rowCabecera[posicion][1])%>);" onmouseout="javascript:document.getElementById('capaFlotante').style.display='none';" onclick="consultaCelda('<%=cadenaTabla%>','<%=cadenaPKey%>','<%=str(rowCabecera[posicion][1])%>', '<%=unicode(row[posicion]).encode("utf-8")%>')"> <%=unicode(row[posicion]).encode("utf-8")%> </th> <% elif (not cadenaConsulta) and (type(row[posicion]).__name__=="float"): objetoMedioDiaAtras= float(row[posicion])-86400.0 objetoMedioDiaAdelante= float(row[posicion])+86400.0 objetoDate=datetime.fromtimestamp(float(row[posicion])).strftime("%Y-%m-%d %H:%M:%S") %> <th onmouseover="showdiv(event,'<%=str(rowCabecera[posicion][1])%>');" onmouseout="javascript:document.getElementById('capaFlotante').style.display='none';" onclick="consultaCeldaFecha('<%=cadenaTabla%>','<%=cadenaPKey%>','<%=str(rowCabecera[posicion][1])%>', '<%=unicode(row[posicion]).encode("utf-8")%>','<%=objetoMedioDiaAtras%>','<%=objetoMedioDiaAdelante%>')"> <%=objetoDate%> </th> <% else: if(not cadenaSimplificada) and (type(row[posicion]).__name__<>"float"): %> <th> <%=unicode(row[posicion]).encode("utf-8")%> </th>

73

<% elif (not cadenaSimplificada) and (type(row[posicion]).__name__=="float"): objetoMedioDiaAtras= float(row[posicion])-86400.0 objetoMedioDiaAdelante= float(row[posicion])+86400.0 objetoDate=datetime.fromtimestamp(float(row[posicion])).strftime("%Y-%m-%d %H:%M:%S") %> <th> <%=objetoDate%> </th> <% else: %> <%=unicode(row[posicion]).encode("utf-8")%> <% #end/if/elif/else if (not cadenaSimplificada): %> </tr> <% #end/if/for %> </table> </div> <div id="menu"> <form action="./consultaSshBD.psp" method="post" name="formTablas"> <input type="hidden" name="posicion" value="<%=indice%>"> <input type="hidden" name="desplazar" value="="> <input type="submit" class="boton" name="botonDesplazaTabla" value="<<" onclick="document.formTablas.desplazar.value='+';document.formTablas.tablasKippo.value ='<%=cadenaTabla%>'"> <input type="submit" class="boton" name="botonDesplazaTabla" value=">>" onclick="document.formTablas.desplazar.value='-';document.formTablas.tablasKippo.value ='<%=cadenaTabla%>'"> <br /> <% try: cursorBD.execute('SELECT name FROM sqlite_master WHERE type="table"') rows = cursorBD.fetchall() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") #end/try %> <select name="tablasKippo" size="<%=len(rows)%>" onchange="document.formTablas.desplazar.value='=';document.formTablas.posicion.value='0';document.formTablas.submit()"> <% for row in rows: %> <option value="<%=row[0]%>"> <%=row[0]%> </option> <% #end/for %> </select> </form> </div> <div id="pie"> <br /><%=indice%><br /><%=cadenaPKey%><br /><%=str(rowCabecera[1][1])%><br /><%=cadenaConsulta%> </div> </div> </body></html>

74

graficaBD.psp
<html> <head> <style type="text/css" media="all"> @import "zetsu.css"; </style> <script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/jquery.gchart.js"></script> </head> <body> <div id="pagina"> <%@ include file="./cabecera.psp"%> <%@ include file="./controlSesion.psp"%> <div id="menu"> <form action="./graficaBD.psp" method="post" name="formGrafica"> <select name="graficasDionaea" size="2" onchange="document.formGrafica.submit()"> <option value="1"> Conecciones aceptadas </option> <option value="2"> Conecciones rechazadas </option>> </select> <br /> <br /> <input class="graficaFormDivInput" value="" name="puerto1"></input> <input class="graficaFormDivInput" value="" name="puerto2"></input> <input class="graficaFormDivInput" value="" name="puerto3"></input> <br /> <input class="graficaFormDivInput" value="" name="puerto4"></input> <input class="graficaFormDivInput" value="" name="puerto5"></input> <input class="graficaFormDivInput" value="" name="puerto6"></input> <br /> <input class="graficaFormDivInput" value="" name="puerto7"></input> <input class="graficaFormDivInput" value="" name="puerto8"></input> <input class="graficaFormDivInput" value="" name="puerto9"></input> <br /> <input type="submit" class="boton" value="Busca" name="botonBusca" ></input> </form> </div><!--menu--> <div id="contenido"> <% from pysqlite2 import dbapi2 try: conexionBDD = dbapi2.connect("/opt/dionaea/var/dionaea/logsql.sqlite") cursorBDD = conexionBDD.cursor() conexionBDK = dbapi2.connect("/opt/kippo/log/kippoBD.sqlite") cursorBDK = conexionBDK.cursor() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") cadenaNumGrafica = form.getfirst('graficasDionaea') numGrafica = cadenaNumGrafica tamanoGrafica = "400px" cadenaPuerto1 = form.getfirst('puerto1') cadenaPuerto2 = form.getfirst('puerto2') cadenaPuerto3 = form.getfirst('puerto3') cadenaPuerto4 = form.getfirst('puerto4') cadenaPuerto5 = form.getfirst('puerto5') cadenaPuerto6 = form.getfirst('puerto6') cadenaPuerto7 = form.getfirst('puerto7') cadenaPuerto8 = form.getfirst('puerto8') cadenaPuerto9 = form.getfirst('puerto9') if((not numGrafica) and (not cadenaPuerto1) and (not cadenaPuerto2) and (not cadenaPuerto3) and (not cadenaPuerto4) and (not cadenaPuerto5) and (not cadenaPuerto6) and (not cadenaPuerto7) and (not cadenaPuerto8) and (not cadenaPuerto9)): select1 = '' select2 = '' select3 = '' elif ((not numGrafica) and ((cadenaPuerto1<>"") or (cadenaPuerto2<>"") or (cadenaPuerto3<>"") or (cadenaPuerto4<>"") or (cadenaPuerto5<>"") or (cadenaPuerto6<>"") or (cadenaPuerto7<>"") or (cadenaPuerto8<>"") or (cadenaPuerto9<>""))): if (cadenaPuerto1==""): cadenaPuerto1 = "-1" if (cadenaPuerto2==""):

75

cadenaPuerto2 = "-1" if (cadenaPuerto3==""): cadenaPuerto3 = "-1" if (cadenaPuerto4==""): cadenaPuerto4 = "-1" if (cadenaPuerto5==""): cadenaPuerto5 = "-1" if (cadenaPuerto6==""): cadenaPuerto6 = "-1" if (cadenaPuerto7==""): cadenaPuerto7 = "-1" if (cadenaPuerto8==""): cadenaPuerto8 = "-1" if (cadenaPuerto9==""): cadenaPuerto9 = "-1" select1 = "SELECT DISTINCT local_port FROM connections WHERE local_port = "+ str(cadenaPuerto1) +" OR local_port = "+ str(cadenaPuerto2) +" OR local_port = "+ str(cadenaPuerto3) +"OR local_port = "+ str(cadenaPuerto4) +" OR local_port = " + str(cadenaPuerto5) +" OR local_port = "+ str(cadenaPuerto6) +" OR local_port = "+ str(cadenaPuerto7) +" OR local_port = "+ str(cadenaPuerto8) +" OR local_port = "+ str(cadenaPuerto9) +" GROUP BY local_port ORDER BY local_port ASC" select2 = "SELECT COUNT(local_port) FROM connections WHERE local_port = "+ str(cadenaPuerto1) +" OR local_port = "+ str(cadenaPuerto2) +" OR local_port = "+ str(cadenaPuerto3) +" OR local_port = "+ str(cadenaPuerto4) +" OR local_port = " + str(cadenaPuerto5) +" OR local_port = "+ str(cadenaPuerto6) +" OR local_port = "+ str(cadenaPuerto7) +" OR local_port = "+ str(cadenaPuerto8) +" OR local_port = "+ str(cadenaPuerto9) +" GROUP BY local_port ORDER BY local_port ASC" elif (numGrafica == "1"): select1 = 'SELECT DISTINCT local_port FROM connections WHERE connection_type="accept" and connection_protocol!="ftpdatalisten" GROUP BY local_port ORDER BY local_port ASC' select2 = 'SELECT COUNT(local_port) FROM connections WHERE connection_type="accept" and connection_protocol!="ftpdatalisten" GROUP BY local_port ORDER BY local_port ASC' select3 = 'SELECT COUNT(fechaTimeStamp) FROM tablaLogin' elif (numGrafica == "2"): select1 = 'SELECT DISTINCT local_port FROM connections WHERE local_port="23" OR local_port="139" OR local_port="143" OR local_port="443" OR local_port="1080" OR local_port="3306" OR local_port="3389" OR local_port="5900" OR local_port="8080" OR local_port="60666" OR local_port="61666" OR local_port="62666" GROUP BY local_port ORDER BY local_port ASC' select2 = 'SELECT COUNT(local_port) FROM connections WHERE local_port="23" OR local_port="139" OR local_port="143" OR local_port="443" OR local_port="1080" OR local_port="3306" OR local_port="3389" OR local_port="5900" OR local_port="8080" OR local_port="60666" OR local_port="61666" OR local_port="62666" GROUP BY local_port ORDER BY local_port ASC' try: cursorBDD.execute(select1) rows1 = cursorBDD.fetchall() cursorBDD.execute(select2) rows2 = cursorBDD.fetchall() if (numGrafica == "1"): cursorBDK.execute(select3) rows3 = cursorBDK.fetchall() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") if (len(rows1) and len(rows2)): if (numGrafica == "1"): maximoValor = max(max(rows2),rows3[0]) else: maximoValor = max(rows2) else: maximoValor = "-1" #end/if/else %>

<div id="basicGChart" style="width: <%=tamanoGrafica%>"></div> <script type="text/javascript"> $(function () { $('#basicGChart').gchart({ type:'barVertGrouped', title: '', titleColor: '#ffffff',

76

backgroundColor: $.gchart.gradient('horizontal', '000000', 'ffffff00'), maxValue: <%=maximoValor[0]%>, series: [$.gchart.series([ <% for row2 in rows2: %> <%=row2[0]%>, <% #end/for if (numGrafica == "1"): %> <%=rows3[0][0]%>, <% #end/if %> ])], axes:[ $.gchart.axis('left', 0, <%=maximoValor[0]%>, 'red', 'right'), $.gchart.axis('bottom', [ <% for row1 in rows1: %> <%=row1[0]%>, <% #end/for if (numGrafica == "1"): %> 22, <% #end/if %>

], 'red') ],}); }); </script> </div><!--contenido--> <div id="pie"> <% for row1,row2 in zip(rows1,rows2): %> <%=row1[0]%>,<%=row2[0]%><br> <% #end/for if (numGrafica == "1"): %> 22,<%=rows3[0][0]%><br> <% #end/if %> <%=numGrafica%><%=cadenaPuerto1%><%=cadenaPuerto2%><%=cadenaPuerto3%><%=cadenaPuerto4%><%=cadenaPuerto5%> <%=cadenaPuerto6%><%=cadenaPuerto7%><%=cadenaPuerto8%><%=cadenaPuerto9%> <%=maximoValor%> <%=rows1%> <%=rows2%> </div><!--pie--> </div><!--pagina--> </body></html>

77

Configuracin.psp
<html> <head> <style type="text/css" media="all"> @import "zetsu.css"; </style> </head> <body> <div id="pagina"> <%@ include file="./cabecera.psp"%> <%@ include file="./controlSesion.psp"%> <% import re import string import commands import hashlib from pysqlite2 import dbapi2 try: conexionBD = dbapi2.connect("/opt/dionaea/var/dionaea/zetsu.sqlite") cursorBD = conexionBD.cursor() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") sesionWeb = "" dionaeaPID = "" cadenaServiciosNew = "" dionaeaConfNew = "" cadenaPerfilSeleccionado = "" cadenaAltaBaja = form.getfirst('altaBaja') if (cadenaAltaBaja=="alta"): cadenaUsernameSeleccionado = form.getfirst('usernameSeleccionado') cadenaPasswordSeleccionado = form.getfirst('passwordSeleccionado') cadenaClave = hashlib.sha512(cadenaPasswordSeleccionado).hexdigest() cadenaPerfilSeleccionado = form.getfirst('listaPerfiles') try: cursorBD.execute("INSERT INTO 'login' ('username','password','rol') VALUES ('" + cadenaUsernameSeleccionado + "','" + cadenaClave + "','" + cadenaPerfilSeleccionado + "')") conexionBD.commit() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") elif (cadenaAltaBaja=="baja"): cadenaUsernameSeleccionado = form.getfirst('usernameSeleccionado') try: cursorBD.execute("DELETE FROM 'login' WHERE username='" + cadenaUsernameSeleccionado + "'") conexionBD.commit() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") #end/try/if %> <div id="menu"> <form action="" method="post" name="formAltasBajas"> <fieldset class="greenFieldSet"> <label class="confFormDivLabel">Nombre de usuario:</label> <input class="confFormDivInput" name="usernameSeleccionado" value=""></input> <br /> <label class="confFormDivLabel">Password:</label> <input type="password" class="confFormDivInput" name="passwordSeleccionado" value=""></input> <br />

78

<label class="confFormDivLabel">Perfil:</label> <select class="confFormDivInput" name="listaPerfiles" size="1" onchange=""> <option value="invitado"> Invitado </option> <option value="operador"> Operador </option> <option value="admin"> Admin </option> </select> <br /> <input type="hidden" name="altaBaja" value=""> <input type="submit" class="boton" value="Alta" name="botonAlta" onclick="document.formAltasBajas.altaBaja.value='alta'"></input> <input type="submit" class="boton" value="Baja" name="botonBaja" onclick="document.formAltasBajas.altaBaja.value='baja'"></input> <br /> <% try: cursorBD.execute("SELECT username FROM login") rows = cursorBD.fetchall() cursorBD.close() conexionBD.close() except Exception,e: sesionWeb['exceptionErrorMsg']="EXCEPCION: " + str(e) sesionWeb.save() util.redirect(req,"error.psp") #end/try %> <select name="listaUsuarios" size="<%=len(rows)%>" onchange=""> <% for row in rows: %> <option value="<%=row[0]%>"> <%=row[0]%> </option> <% #end/for %> </select> </fieldset> </form> </div><!--menu--> <% serviciosDionaea = ["http", "https", "tftp", "ftp", "mirror", "smb", "epmap", "sip", "mssql", "mysql"] patronServiciosDionaeaActuales = re.compile('serve = \[([a-z\s\"\,]+)\]') cadenaModificarConf = form.getfirst('modificarConf') if (cadenaModificarConf=="1"): archivoDionaeaConf = open("/opt/dionaea/etc/dionaea/dionaea.conf","r") dionaeaConf = archivoDionaeaConf.read() archivoDionaeaConf.close() #dionaeaPID = commands.getoutput("ps -e | grep dionaea | tr -s ' ' | cut -d' ' -f 2").split() #os.system("sudo kill -9 $(ps -e | grep dionaea | tr -s ' ' | cut -d ' ' -f 2 | head -1)") os.system("sudo /opt/scriptsCronJobs/offDionaea.sh") cadenaServiciosNew = "serve = [" for servicioDionaea in serviciosDionaea: if (form.getfirst(servicioDionaea)!=None): cadenaServiciosNew = cadenaServiciosNew + '"' + str(form.getfirst(servicioDionaea)) + '"' + ',' cadenaServiciosNew = cadenaServiciosNew + "]" cadenaServiciosNew = re.sub(',]',']',cadenaServiciosNew) dionaeaConfNew = re.sub('serve = \[([a-z\s\"\,]+)\]',cadenaServiciosNew,dionaeaConf) archivoDionaeaConf = open("/opt/dionaea/etc/dionaea/dionaea.conf","w") archivoDionaeaConf.write(dionaeaConfNew) archivoDionaeaConf.close() os.system("sudo /opt/scriptsCronJobs/onDionaea.sh") archivoDionaeaConf = open("/opt/dionaea/etc/dionaea/dionaea.conf","r") dionaeaConf = archivoDionaeaConf.read() archivoDionaeaConf.close() %>

79

<div id="menu2"> <form action="./configuracion.psp" method="post" name="formConfiguracion"> <fieldset class="greenFieldSet"> <% serviciosDionaeaActuales = str(re.findall(patronServiciosDionaeaActuales,dionaeaConf)).replace(' ','').replace('"','').replace("['",'').replace("']",'').split(',') for servicio in serviciosDionaea: if (servicio in serviciosDionaeaActuales): %> <label class="confFormDivLabel"><%=servicio%></label> <input class="confFormCheckBox" type="checkbox" name="<%=servicio%>" value="<%=servicio%>" checked><br /> <% else: %> <label class="confFormDivLabel"><%=servicio%></label> <input class="confFormCheckBox" type="checkbox" name="<%=servicio%>" value="<%=servicio%>"><br /> <% #end/for/if/else %> <br /> <input type="hidden" name="modificarConf" value="1"> <input type="submit" class="botonMediano" name="botonModificaConf" value="Modifica"> </fieldset> </form> </div><!--menu2--> <!--<div id="contenido"></div>--><!--contenido--> <div id="pie"> <%=cadenaAltaBaja%><br /> <%=cadenaPerfilSeleccionado%><br /> <%=cadenaModificarConf%><br /> <%=sesionWeb%><br /> CADENA DE SERVICIOS NUEVOS<br/><%=cadenaServiciosNew%><br/><br /> NUEVO ARCHIVO DE CONFIGURACION<br/><%=dionaeaConfNew%><br/><br /> </div><!--pie--> </div><!--pagina--> </body> </html>

80

CSS
body { background-color: #ffffff; text-align: center; font-family: sans-serif,arial,verdana; font-size: 10pt; margin: 0px auto; } table { border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; background-color: rgb(100,225,55); background: linear-background(top, rgba(225,235,205,0.75)25%, rgba(205,235,142,0.75)75%); background: -moz-linear-gradient(top, rgba(225,235,205,0.75)25%, rgba(205,235,142,0.75)75%); background: linear-gradient(top, rgba(225,235,205,0.75)25%, rgba(205,235,142,0.75)75%); background: -o-linear-gradient(top, rgba(225,235,205,0.75)25%, rgba(205,235,142,0.75)75%); background: -webkit-linear-gradient(top, rgba(225,235,205,0.75)25%, rgba(205,235,142,0.75)75%); background: -ms-linear-gradient(top, rgba(225,235,205,0.75)25%, rgba(205,235,142,0.75)75%); text-align: left; margin: 0px auto; border: 1.5px solid rgb(60,130,10); } tr:hover { background-color: rgba(125,150,160,0.75); color: rgb(255,255,255); } form input { text-align: center; width: 50px; } a{ color: #000000; font-size: 10pt; } div#pagina { margin: 0 auto; text-align: left; width: 1024px; } div#pagina div#cabecera { margin:auto auto 20px auto; } div#pagina div#cabecera div#titulo { height: 60px; } div#pagina div#cabecera div#logotipoI { float: left; width: 200px; height: 60px; background-image: url(./imagenes/logoUgr.jpg); } div#pagina div#cabecera div#logotipoD { float: right; width: 200px; height: 60px; background-image: url(./imagenes/logoCsirc.jpg); background-repeat: no-repeat; } div#pagina div#cabecera div#navegador { float: center; height: 60px; } div#pagina div#cabecera div#navegador table#tablaNavegador { border-spacing: 0px; text-align: center; } div#pagina div#cabecera div#navegador table#tablaNavegador td { background-color: rgb(100,225,55); background: linear-background(top, rgb(100,225,55) 0%, rgb(70,155,10)); background: -moz-linear-gradient(top, rgb(100,225,55) 0%, rgb(70,155,10)); background: linear-gradient(top, rgb(100,225,55) 0%, rgb(70,155,10));

81

background: -o-linear-gradient(top, rgb(100,225,55) 0%, rgb(70,155,10)); background: -webkit-linear-gradient(top, rgb(100,225,55) 0%, rgb(70,155,10)); background: -ms-linear-gradient(top, rgb(100,225,55) 0%, rgb(70,155,10)); -moz-box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); -webkit-box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); text-shadow: 0px -1px 0px rgba(000,000,000,0.4), 0px 1px 0px rgba(255,255,255,0.3); height: 30px; width: 128px; } div#pagina div#cabecera div#navegador table#tablaNavegador td:hover { background-color: rgb(100,240,114); background: linear-background(top, rgb(60,130,10)25%, rgb(70,155,10)75%); background: -moz-linear-gradient(top, rgb(60,130,10)25%, rgb(70,155,10)75%); background: linear-gradient(top, rgb(60,130,10)25%, rgb(70,155,10)75%); background: -o-linear-gradient(top, rgb(60,130,10)25%, rgb(70,155,10)75%); background: -webkit-linear-gradient(top, rgb(60,130,10)25%, rgb(70,155,10)75%); background: -ms-linear-gradient(top, rgb(60,130,10)25%, rgb(70,155,10)75%); } div#pagina div#cabecera div#navegador table#tablaNavegador a { color: rgb(255,255,255); text-decoration: none; font-size: 10pt; } div#pagina div#menu { margin: auto auto auto 5px; text-align: center; float: left; } div#pagina div#contenido { overflow: auto; min-height:670px; margin: auto; float: right; width: 75%; background-image: url(./imagenes/logoUgr.gif); background-position: center; background-repeat: no-repeat; } div#pagina div#contenidoMonitor { overflow: auto; min-height:670px; margin: auto; float: center; width: 100%; background-image: url(./imagenes/logoUgr.gif); background-position: center; background-repeat: no-repeat; } div#pagina div#pie { clear: both; } div#pagina div#basicGChart { overflow: auto; float: left; height: 80%; } div#pagina div#capaFlotante { position: absolute; display: none; font-family: Arial; font-size: 0.8em; border: 1px solid #808080; background-color: #ffffff; } .confFormCheckBox { margin: 15px auto; width: 100px;

82

text-align: left; } .confFormDivInput { margin: 10px auto 15px; width: 100px; text-align: left; } .confFormDivLabel { margin: 10px auto; float: left; width: 200px; text-align: left; } .graficaFormDivInput { width: 50px; text-align: center; } .greenFieldSet { border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; background-color: rgb(100,225,55); background: linear-background(top, rgb(225,235,205)25%, rgb(205,235,142)75%); background: -moz-linear-gradient(top, rgb(225,235,205)25%, rgb(205,235,142)75%); background: linear-gradient(top, rgb(225,235,205)25%, rgb(205,235,142)75%); background: -o-linear-gradient(top, rgb(225,235,205)25%, rgb(205,235,142)75%); background: -webkit-linear-gradient(top, rgb(225,235,205)25%, rgb(205,235,142)75%); background: -ms-linear-gradient(top, rgb(225,235,205)25%, rgb(205,235,142)75%); border: 2px solid rgb(60,130,10); margin: 50px auto; -moz-box-shadow: 0px 5px 5px rgba(000,000,000,0.5); -webkit-box-shadow: 0px 1px 5px rgba(000,000,000,0.5); box-shadow: 2px 2px 5px rgba(000,000,000,0.5); } .loginFormDivInput { width: 100px; text-align: left; } .loginFormDivLabel { float: left; width: 150px; text-align: left; } .zetsuBoton { font-family: sans-serif,arial,verdana; font-size: 10pt; color: #ffffff; margin: 10px auto; padding: 3px 3px; background: -moz-linear-gradient( top, rgb(100,225,55) 0%, rgb(70,155,10)); background: -webkit-gradient( linear, left top, left bottom, from(rgb(100,225,55)), to(rgb(70,155,10))); -moz-border-radius: 2.5px; -webkit-border-radius: 2.5px; border-radius: 2.5px; border: 0px; -moz-box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); -webkit-box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); text-shadow: 0px -1px 0px rgba(000,000,000,0.4), 0px 1px 0px rgba(255,255,255,0.3); }

83

.zetsuBoton:hover { background: -moz-linear-gradient( top, rgb(60,130,10)20%, rgb(70,155,10)75%); background: -webkit-gradient( linear, left top, left bottom, from(rgb(60,130,10)), to(rgb(70,155,10))); } .zetsuBotonLargo { font-family: sans-serif,arial,verdana; font-size: 10pt; color: #ffffff; margin: 10px auto; padding: 3px 3px; width: 150px; background: -moz-linear-gradient( top, rgb(100,225,55) 0%, rgb(70,155,10)); background: -webkit-gradient( linear, left top, left bottom, from(rgb(100,225,55)), to(rgb(70,155,10))); -moz-border-radius: 2.5px; -webkit-border-radius: 2.5px; border-radius: 2.5px; border: 0px; -moz-box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); -webkit-box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); text-shadow: 0px -1px 0px rgba(000,000,000,0.4), 0px 1px 0px rgba(255,255,255,0.3); } .zetsuBotonLargo:hover { background: -moz-linear-gradient( top, rgb(60,130,10)20%, rgb(70,155,10)75%); background: -webkit-gradient( linear, left top, left bottom, from(rgb(60,130,10)), to(rgb(70,155,10))); } .zetsuBotonErrorAtras { font-family: sans-serif,arial,verdana; font-size: 10pt; color: #ffffff; margin: 10px auto; padding: 10px 10px; align: center; background: -moz-linear-gradient(top, rgb(255,50,25)25%, rgb(205,15,5)75%); background: -webkit-gradient( linear, left top, left bottom, from(rgb(255,50,25)), to(rgb(205,15,5))); -moz-border-radius: 2.5px; -webkit-border-radius: 2.5px; border-radius: 2.5px; border: 0px; -moz-box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); -webkit-box-shadow: 0px 1px 3px rgba(000,000,000,0.5), inset 0px 0px 10px rgba(087,087,087,0.7); box-shadow: 0px 1px 3px rgba(000,000,000,0.5),

84

inset 0px 0px 10px rgba(087,087,087,0.7); text-shadow: 0px -1px 0px rgba(000,000,000,0.4), 0px 1px 0px rgba(255,255,255,0.3); } .zetsuBotonErrorAtras:hover { background: -moz-linear-gradient( top, rgb(205,15,5)25%, rgb(180,3,3)75%); background: -webkit-gradient( linear, left top, left bottom, from(rgb(205,15,5)), to(rgb(180,3,3))); }

85

zetsu.js
function consultaCelda(nombreTabla,nombrePKey,nombreColumna,valorBuscado) { //alert(valorBuscado); document.formConsultas.consultaPersonalizada.value = "SELECT * FROM " + nombreTabla + " WHERE " + nombreColumna + " = '" + valorBuscado + "' ORDER BY " + nombrePKey + " DESC"; } function consultaCeldaFecha(nombreTabla,nombrePKey,nombreColumna,fechaAntes,fechaDespues) { //alert(fechaDespues); document.formConsultas.consultaPersonalizada.value = "SELECT * FROM " + nombreTabla + " WHERE " + nombreColumna + " BETWEEN '" + fechaDespues + "' AND '" + fechaAntes + "' ORDER BY " + nombrePKey + " DESC" ; } //Funcion que muestra el div en la posicion del mouse function showdiv(event,texto) { //determina un margen de pixels del div al raton margin=5; //La variable IE determina si estamos utilizando IE var IE = document.all?true:false; //Si no utilizamos IE capturamos el evento del mouse if (!IE) document.captureEvents(Event.MOUSEMOVE) var tempX = 0; var tempY = 0; if(IE) { //para IE tempX = event.clientX + document.body.scrollLeft; tempY = event.clientY + document.body.scrollTop; }else{ //para netscape tempX = event.pageX; tempY = event.pageY; } if (tempX < 0){tempX = 0;} if (tempY < 0){tempY = 0;} //modificamos el valor del id "posicion" para indicar la posicion del mouse //document.getElementById('posicion').innerHTML="PosX = "+tempX+" | PosY = "+tempY; document.getElementById('posicion').innerHTML="Campo<br />"+texto+"<br />"; document.getElementById('capaFlotante').style.top = (tempY+margin); document.getElementById('capaFlotante').style.left = (tempX+margin); document.getElementById('capaFlotante').style.display='block'; return; }

86

MODULOS DE COMUNICACIN

Comunicacin: log de dionaea + geolocalizacion => BD central Oracle


#!/usr/bin/env python #import py_compile #py_compile.compile("analizadiolog.py") import commands import sys import re import httplib import string import cx_Oracle def sepfecha(fecha): return fecha[0]+fecha[1], fecha[2]+fecha[3], fecha[4]+fecha[5]+fecha[6]+fecha[7]

def whoisProveedor(ip): geoProveedor="" geoProveedorDB="" if ip.startswith('150.214.'): geoProveedor = "Proveedor: Red Informatica Cientifica de Andalucia|" geoProveedorDB = "Red Informatica Cientifica de Andalucia" return geoProveedor,geoProveedorDB else: geoProveedor="Proveedor: " whoisOutPut = commands.getoutput("whois "+ ip +" | grep descr:") geoProveedor = geoProveedor + whoisOutPut + "|" geoProveedor = geoProveedor.replace("descr:","") geoProveedor = geoProveedor.replace("\n","") geoProveedor = geoProveedor.replace("\t","") geoProveedorDB = whoisOutPut geoProveedorDB = geoProveedorDB.replace("descr:","") geoProveedorDB = geoProveedorDB.replace("\n","") geoProveedorDB = geoProveedorDB.replace("\t","") if (geoProveedor=="Proveedor: Early registration addresses|") or (geoProveedor=="Proveedor: |"): return "","" else: return geoProveedor,geoProveedorDB

def geo(host): try: h=httplib.HTTP("www.geoiptool.com") h.putrequest('GET',"/es/?IP="+host ) h.putheader('Host', 'www.geoiptool.com') h.putheader('User-agent', 'Internet Explorer 6.0 ') h.endheaders() returncode, returnmsg, headers = h.getreply() response=h.file.read() res=re.compile("<td align=\"left\" class=\"arial_bold\">.*</td>") results=res.findall(response) res=[] for x in results: x=x.replace("<td align=\"left\" class=\"arial_bold\">","") x=x.replace("</td>","") res.append(x) if len(res)<>0: country=re.sub("<.*nk\">","",res[1]) country=country.replace("</a>","") country=re.sub("<.*middle\" >","",country) geoPais = "Pais: " + country + ","+ res[2]+"|" geoPaisDB = country + "," + res[2] city=re.sub("<.*nk\">","",res[3]) city=city.replace("</a>","") geoCiudad = "Ciudad: " + city + ","+ res[4]+"|" geoCiudadDB = city + "," + res[4] geoProveedor = "" geoCoordenadas = "Coordenadas: " + res[8] + "," +res[7]+"|"

87

geoYDB = res[8] geoXDB = res[7] geoGoogleMaps = "<a href=\"http://maps.google.com/maps?q="+res[8]+", "+res[7]+"\">Mapa</a>" return geoPais, geoPaisDB, geoCiudad, geoCiudadDB ,geoCoordenadas, geoXDB, geoYDB, geoGoogleMaps else: return "", "", "", "", "", "", "", "" except: print "Excepcion captada en geo1" return "", "", "", "", "", "", "", ""

def geo2(host): try: body="ips="+host h = httplib.HTTP("www.maxmind.com") h.putrequest('POST',"/app/locate_demo_ip" ) h.putheader('content-type',"application/x-www-form-urlencoded") h.putheader('content-length', str(len(body))) h.endheaders() h.send(body) errcode, errmsg, headers = h.getreply() response=h.file.read() limit=re.compile("reached.*") if limit.findall(response)!=[]: print "Limit reached in maxmind :(\n" else: res=re.compile("<td><font size=\"-1\">.*</font>") results=res.findall(response) res=[] for x in results: x=x.replace("<td><font size=\"-1\">","") x=x.replace("</font>","") res.append(x) if len(res)<>0: country=re.sub("<.*nk>\">","",res[1]) country2=country.replace("</a>","") country=re.sub("<.*middle\" >","",country2) geoPais = "Pais: " +country+","+res[2]+"|" geoPaisDB = country+","+res[2] geoCiudad = "Ciudad: " + res[4]+","+res[5]+"|" geoCiudadDB = res[4]+","+res[5] geoCoordenadas = "Coordenadas: "+res[7]+","+res[8]+"|" geoYDB = res[7] geoXDB = res[8] geoProveedor = "Proveedor: "+res[9]+","+res[10]+"|" geoGoogleMaps = "<a href=\"http://maps.google.com/maps?q="+res[7]+", "+res[8]+"\">Mapa</a>" return geoPais, geoPaisDB, geoCiudad, geoCiudadDB, geoCoordenadas, geoXDB, geoYDB, geoProveedor, geoGoogleMaps else: return "", "", "", "", "", "", "", "", "" except: print "Excepcion captada en geo2" return "", "", "", "", "", "", "", "", "" def creaTablas(listaDataR,listaDataA): dataEXTfile = open ("dataEXT.html", "w") dataEXTfile.write("<html> <head> <title> Resumen de informacion de ataque</title> </head> <body>\n") dataEXTfile.write("<b>Resumen de intentos de conexion<BR>Autor:Juan Luis Martin Acal<BR>Correo:jlmacal@ugr.es</b>") dataEXTfile.write("<TABLE BORDER=\"1\">\n") dataEXTfile.write("<TR><TH>#Intentos</TH><TH>IP Remota</TH><TH>Puerto Remoto</TH><TH>Puerto Local CERRADO </TH><TH>Localizacion</TH></TR>\n") fila = 0 hostAnterior = 0 while fila < len(listaDataR): dataEXTfile.write("<TR><TH>"+listaDataR[fila]+"</TH><TH>"+listaDataR[fila+1]+"</TH><TH>"+listaDataR[fila+2]+" </TH><TH>"+listaDataR[fila+4]+"</TH>\n") if (hostAnterior <> listaDataR[fila+1]) and (listaDataR[fila+1] <> "127.0.0.1"): dataEXTfile.write("<TH>") geoPais,geoPaisDB,geoCiudad,geoCiudadDB,geoCoordenadas,geoXDB,geoYDB,geoProveedor, geoGoogleMaps = geo2(listaDataR[fila+1]) if (geoPais=="" or geoProveedor==""):

88

geoPais,geoPaisDB,geoCiudad,geoCiudadDB,geoCoordenadas,geoXDB,geoYDB, geoGoogleMaps = geo(listaDataR[fila+1]) geoProveedor,geoProveedorDB = whoisProveedor(listaDataR[fila+1]) dataEXTfile.write(geoPais) dataEXTfile.write(geoCiudad) dataEXTfile.write(geoProveedor) dataEXTfile.write(geoCoordenadas) dataEXTfile.write(geoGoogleMaps) dataEXTfile.write("</TH>") else: dataEXTfile.write("<TH></TH>") hostAnterior = listaDataR[fila+1] fila = fila + 5 dataEXTfile.write("</TABLE>\n") dataEXTfile.write("<BR><BR>") dataEXTfile.write("<TABLE BORDER=\"1\">\n") dataEXTfile.write("<TR><TH>#Intentos</TH><TH>IP Remota</TH><TH>Puerto Remoto</TH><TH>Puerto Local ABIERTO </TH><TH>Localizacion</TH></TR>\n") fila = 0 hostAnterior = 0 while fila < len(listaDataA): dataEXTfile.write("<TR><TH>"+listaDataA[fila]+"</TH><TH>"+listaDataA[fila+1]+"</TH><TH>"+listaDataA[fila+2]+" </TH><TH>"+listaDataA[fila+4]+"</TH>\n") if hostAnterior <> listaDataA[fila+1]: dataEXTfile.write("<TH>") geoPais,geoPaisDB,geoCiudad,geoCiudadDB,geoCoordenadas,geoXDB,geoYDB,geoProveedor, geoGoogleMaps = geo2(listaDataA[fila+1]) if (geoPais=="" or geoProveedor==""): geoPais,geoPaisDB,geoCiudad,geoCiudadDB,geoCoordenadas,geoXDB,geoYDB, geoGoogleMaps = geo(listaDataA[fila+1]) geoProveedor,geoProveedorDB = whoisProveedor(listaDataA[fila+1]) dataEXTfile.write(geoPais) dataEXTfile.write(geoCiudad) dataEXTfile.write(geoProveedor) dataEXTfile.write(geoCoordenadas) dataEXTfile.write(geoGoogleMaps) dataEXTfile.write("</TH>") else: dataEXTfile.write("<TH></TH>") hostAnterior = listaDataA[fila+1] fila = fila + 5 dataEXTfile.write("</TABLE>\n") dataEXTfile.write(" </body> </html>") dataEXTfile.close()

def insertaDB(listaDataR,listaDataA): ip = 'XXX.ugr.es' #ip = '150.214.XXX.XXX' port = XXX SID = 'XXX' dsn_tns = cx_Oracle.makedsn(ip, port, SID) conexionBD = cx_Oracle.connect('XXX', 'XXX', dsn_tns) #conexionBD = cx_Oracle.connect('XXX/XXX@127.0.0.1:1521/XE') cursor = conexionBD.cursor() fila=0 hostAnterior = 0 while fila < len(listaDataR): hora,minuto,segundo = listaDataR[fila+2], listaDataR[fila+3],listaDataR[fila+4] dia,mes,anio = sepfecha(listaDataR[fila+1]) geoPais,geoPaisDB,geoCiudad,geoCiudadDB,geoCoordenadas,geoXDB,geoYDB,geoGoogleMaps = geo(listaDataR[fila+5]) geoProveedor,geoProveedorDB = whoisProveedor(listaDataR[fila+5]) paisFormateado=geoPaisDB.split(',') fechaFormateada= anio+"-"+mes+"-"+dia+" "+hora+":"+minuto+":"+segundo resultado= cursor.callfunc("seguridad.set_Ataque",cx_Oracle.NUMBER,[],{'p_servidor':'01','p_fecha':fechaFormateada,'p_ip':listaDataR[fila+5], 'p_puertoatacado':listaDataR[fila+8],'p_codpais':paisFormateado[1],'p_pais':paisFormateado[0],'p_longitud':geoXDB,'p_latitud':geoYDB})

89

#print "INSERTADO 06 esta es la fecha " + fechaFormateada + " esta es la ip " + listaDataR[fila+5] + " este es el puerto atacado " + listaDataR[fila+8] + " esto es codPais " + paisFormateado[1] + " esto es el pais " + paisFormateado[0] + " coord x " + geoXDB + " coord y " + geoYDB conexionBD.commit() hostAnterior = listaDataR[fila+5] fila = fila + 9 fila=0 hostAnterior = 0 while fila < len(listaDataA): hora,minuto,segundo = listaDataA[fila+2], listaDataA[fila+3],listaDataA[fila+4] dia,mes,anio = sepfecha(listaDataA[fila+1]) geoPais,geoPaisDB,geoCiudad,geoCiudadDB,geoCoordenadas,geoXDB,geoYDB,geoGoogleMaps = geo(listaDataA[fila+5]) geoProveedor,geoProveedorDB = whoisProveedor(listaDataA[fila+5]) paisFormateado=geoPaisDB.split(',') fechaFormateada= anio+"-"+mes+"-"+dia+" "+hora+":"+minuto+":"+segundo resultado= cursor.callfunc("seguridad.set_Ataque",cx_Oracle.NUMBER,[],{'p_servidor':'01','p_fecha':fechaFormateada,'p_ip':listaDataA[fila+5], 'p_puertoatacado':listaDataA[fila+8],'p_codpais':paisFormateado[1],'p_pais':paisFormateado[0],'p_longitud':geoXDB,'p_latitud':geoYDB}) #print "INSERTADO 06 esta es la fecha " + fechaFormateada + " esta es la ip " + listaDataA[fila+5] + " este es el puerto atacado " + listaDataA[fila+8] + " esto es codPais " + paisFormateado[1] + " esto es el pais " + paisFormateado[0] + " coord x " + geoXDB + " coord y " + geoYDB conexionBD.commit() hostAnterior = fila = fila + 9 cursor.close() conexionBD.close() listaDataA[fila+5]

if (len(sys.argv) == 2) and ((sys.argv[1] == "--tablas") or (sys.argv[1] == "--db")): if sys.argv[1] == "--tablas": dataR= commands.getoutput("cat /opt/dionaea/var/log/dionaea.log grep '\[' | cut -d' ' -f 8,10 | tr -sc '0-9.\012' ' ' | sort | uniq -c") dataA= commands.getoutput("cat /opt/dionaea/var/log/dionaea.log grep '\[' | cut -d' ' -f 8,10 | tr -sc '0-9.\012' ' ' | sort | uniq -c") listaDataR = dataR.split() listaDataA = dataA.split() creaTablas(listaDataR,listaDataA) elif sys.argv[1] == "--db": dataR= commands.getoutput("cat /opt/dionaea/var/log/dionaea.log cut -d' ' -f 1,2,8,10 | tr -sc '0-9.\012' ' ' | sort | uniq -c") dataA= commands.getoutput("cat /opt/dionaea/var/log/dionaea.log cut -d' ' -f 1,2,8,10 | tr -sc '0-9.\012' ' ' | sort | uniq -c") listaDataR = dataR.split() listaDataA = dataA.split() insertaDB(listaDataR,listaDataA) else: print "" else: print ""

| grep reject | grep dionaea/logsql | | grep accept | grep dionaea/logsql |

| grep reject | grep logsql | | grep accept | grep logsql |

90

Comunicacin: BD SQLite de Dionaea => BD central Oracle


import sqlite3 import datetime import time import cx_Oracle, sys import commands import os print "---------------------------------------------------------------------------------" print "Fecha comienzo : %s" % time.asctime() conexionSqlite = sqlite3.connect('/opt/dionaea/var/dionaea/logsql.sqlite') #conexion a la BD sqlite cursorSqlite=conexionSqlite.cursor() #en el cursor cursorSqlite tenemos los ataques del dia anterior cursorSqlite.execute("SELECT remote_host, local_port, datetime(connection_timestamp,'unixepoch','localtime') "+ "FROM connections where date(connection_timestamp,'unixepoch','localtime') = date('now','-1 day') "+ "group by remote_host, local_port, datetime(connection_timestamp,'unixepoch','localtime')") dsn = cx_Oracle.makedsn('XXX.ugr.es', XXXX, 'XXX')#conexion a la BD oracle conexionOracle = cx_Oracle.connect('XXX', 'XXX', dsn) cursorOracle = conexionOracle.cursor() cursorOracle = conexionOracle.cursor() cursorOracle.arraysize = 100 contador_ok=0 contador_fallo=0 contador=0 print "" for registro in cursorSqlite: #recorremos el cursor e insertamos cada incidendia en la BD oracle try: contador=contador+1 resultadoGeoIP=commands.getoutput("./geoip "+registro[0]) #calculamos los datos de la geolocalizacion de la IP informacion=resultadoGeoIP.split(":") #separamos cada informacion que esta separado por : y lo introducimos en una matriz ordenSQL="select seguridad.get_DetalleIncidencia(:p_incidencia) from dual" resultado=cursorOracle.callfunc("seguridad.set_Ataque",cx_Oracle.NUMBER,[],{'p_servidor':'03','p_fecha':registro[2],'p_ip': registro[0],'p_puertoatacado':registro[1],'p_codpais':informacion[0],'p_pais':informacion[1],'p_longitud':informacion[2],'p_latitud': informacion[3]}) if resultado==-1: #error al insertar el ataque en la BD print "%i\t%s\t%s\t%s\t%s\t%s\t%s\t%s --> Fallo" % (contador,registro[0],registro[1],registro[2],informacion[0],informacion[1],informacion[2],informacion[3]) contador_fallo=contador_fallo+1 else: #todo correcto #print "%i\t%s\t%s\t%s\t%s\t%s\t%s\t%s --> Ok" % (contador,registro[0],registro[1],registro[2],informacion[0],informacion[1],informacion[2],informacion[3]) contador_ok=contador_ok+1 except: print "%i\t%s\t%s\t%s --> error excepcion" % (contador,registro[0],registro[1],registro[2]) contador_fallo=contador_fallo+1 conexionOracle.close conexionSqlite.close print "" print "Incidencias insertadas : %i" % contador_ok print "Errores : %i" % contador_fallo print "Fecha fin : %s" % time.asctime() if contador_fallo>0: os.system("echo 'Hubo "+str(contador_fallo)+" fallos, se insertaron correctamente ',str(contador_ok) | mail -s 'errores insertar incidencias honeypot XXX.ugr.es' XXX@ugr.es")

91

Comunicacin: Log de Kippo => BD SQLite Kippo


import sys import os import string import re import time import glob from datetime import datetime from pysqlite2 import dbapi2

def insertaTablaLogin(rutaBD,fechaTimeStamp,tty,ip,login,password,resultado): try: conexionBD = dbapi2.connect(rutaBD) except Exception, e: print str(e) sys.exit(1) else: try: cursorInsercion = conexionBD.cursor() cadenaInsercion = 'insert or ignore into tablaLogin (fechaTimeStamp,tty,ip,login,password,resultado) values (?,?,?,?,?,?)' parametros = (fechaTimeStamp,tty,ip,login,password,resultadoToBinRes(resultado)) cursorInsercion.execute(cadenaInsercion,parametros) conexionBD.commit() cursorInsercion.close() except Exception, e: print str(e) cursorInsercion.close()

def insertaTablaCmd(rutaBD,fechaTimeStamp,sesion,tty,ip,cmd): try: conexionBD = dbapi2.connect(rutaBD) except Exception, e: print str(e) sys.exit(1) else: try: cursorInsercion = conexionBD.cursor() cadenaInsercion = 'insert or ignore into tablaCmd (fechaTimeStamp,sesion,tty,ip,cmd) values (?,?,?,?,?)' parametros = (fechaTimeStamp,sesion,tty,ip,cmd) cursorInsercion.execute(cadenaInsercion,parametros) conexionBD.commit() cursorInsercion.close() except Exception, e: print str(e) cursorInsercion.close()

def insertaTablaCliente(rutaBD,fechaTimeStamp,tty,ip,cliente): try: conexionBD = dbapi2.connect(rutaBD) except Exception, e: print str(e) sys.exit(1) else: try: cursorInsercion = conexionBD.cursor() cadenaInsercion = 'insert or ignore into tablaCliente (fechaTimeStamp,ip,cliente) values (?,?,?)' parametros = (fechaTimeStamp,ip,cliente) cursorInsercion.execute(cadenaInsercion,parametros) conexionBD.commit() cursorInsercion.close() cursorInsercion.close() except Exception, e: print str(e) cursorInsercion.close()

def strToTimeStamp (fecha,hora):

92

date_str = fecha + " " + hora time_tuple = time.strptime(date_str, "%Y-%m-%d %H:%M:%S") fechaTimeStamp = time.mktime(time_tuple) return fechaTimeStamp

def resultadoToBinRes(resultado): resBin=None if(resultado=="failed"): resBin=0 else: resBin=1 return resBin

def parseaLog(rutaBD,nombreLog): #2011-04-19 13:36:50+0200 [SSHService ssh-userauth on HoneyPotTransport,1,150.214.21.31] login attempt [root/123] failed #2011-04-19 13:36:58+0200 [SSHChannel session (0) on SSHService ssh-connection on HoneyPotTransport,1,150.214.21.31] CMD: prueba2 #011-04-19 13:36:44+0200 [HoneyPotTransport,1,150.214.21.31] Remote SSH version: SSH-2.0-PuTTY_Release_0.60 try: archivoLog=open(nombreLog,"r") patronFechaIpLoginPassSesion = re.compile('(^[0-9\-]+) ([0-9\:]+)\+[0-9]+ \[SSHService ssh-userauth on HoneyPotTransport,([0-9]+),([0-9.]+)\] login attempt \[([a-zA-Z0-9\-\[\]\#\.\:\%\@\&\_]+)\/([a-zA-Z0-9\-\[\]\#\.\:\%\@\&\_]+)\] ([a-z]+)$') patronFechaIpCmd = re.compile('(^[0-9\-]+)\s([0-9\:]+)\+[0-9]+ \[SSHChannel session \(([0-9]+)\) on SSHService sshconnection on HoneyPotTransport,([0-9]+),([0-9.]+)\] CMD\: ([a-zA-Z0-9\-\[\]\#\.\:\%\@\&\"\'\_\s\\\/]+)$') patronFechaIpClient = re.compile('(^[0-9\-]+)\s([0-9\:]+)\+[0-9]+ \[HoneyPotTransport,([0-9]+),([0-9.]+)\] Remote SSH version: ([a-zA-Z0-9\-\[\]\#\.\:\%\@\&\_]+)') for linea in archivoLog: inicioSesion = re.findall(patronFechaIpLoginPassSesion,linea) comandoSesion = re.findall(patronFechaIpCmd,linea) clienteSesion = re.findall(patronFechaIpClient,linea) if inicioSesion: insertaTablaLogin(rutaBD,strToTimeStamp (inicioSesion[0][0],inicioSesion[0][1]),inicioSesion[0][2],inicioSesion[0][3],inicioSesion[0][4],inicioSesion[0][5],inicioSesion[0][6]) #print inicioSesion #pass elif comandoSesion: insertaTablaCmd(rutaBD,strToTimeStamp (comandoSesion[0][0],comandoSesion[0][1]),comandoSesion[0][2],comandoSesion[0][3],comandoSesion[0][4],comandoSesion[0][5]) #print comandoSesion #pass elif clienteSesion: insertaTablaCliente(rutaBD,strToTimeStamp (clienteSesion[0][0],clienteSesion[0][1]),clienteSesion[0][2],clienteSesion[0][3],clienteSesion[0][4]) #print clienteSesion #pass archivoLog.close() except Exception, e: print str(e) + str(nombreLog)

def OffKippo(rutaPidFile): try: archivoPid=open(rutaPidFile,"r") pid=archivoPid.readline() os.kill(int(pid),9) archivoPid.close() except Exception, e: print str(e) sys.exit(1)

def OnKippo(rutaDirLogs): try: os.system("rm -rf " + rutaDirLogs + "kippo.log*") os.system("rm -rf " + rutaDirLogs + "tty/*.log") os.system("twistd -y kippo.tac -l log/kippo.log --pidfile kippo.pid")

93

except Exception, e: print str(e)

def main(): rutaBD="log/kippoBD.sqlite" rutaDirLogs="log/" rutaPidFile="kippo.pid" try: os.chdir("/opt/kippo") except Exception, e: print str(e) sys.exit(1) OffKippo(rutaPidFile) for file in glob.glob(rutaDirLogs + "/kippo.log*"): parseaLog(rutaBD,file) OnKippo(rutaDirLogs)

if __name__=="__main__": main()

Comunicacin: Log de Kippo => BD central Oracle


import cx_Oracle, sys v_servidor='03' #servidor que recibe los ataques ssh s={} dsn = cx_Oracle.makedsn('XXX.ugr.es', XXXX, 'XXX')#conexion a la BD oracle conexionOracle = cx_Oracle.connect('XXX', 'XXX', dsn) cursorOracle = conexionOracle.cursor() fichero=open("/opt/kippo/log/kippo.log") for linea in fichero.readlines(): if linea.find("New connection:")>=0: try: inicio=linea[0:19] tmp=linea[linea.find("New connection: ")+16:] ip=tmp[0:tmp.find(":")] sesion=linea[linea.find("session:")+9:-2] cliente='' fin='' resultado=cursorOracle.callfunc("seguridad.set_AtaqueSSH",cx_Oracle.NUMBER,[],{'p_fecha_inicio': inicio,'p_ip':ip,'p_cliente': cliente,'p_fecha_fin':fin,'p_honeypot':v_servidor}) if resultado==-1: #error al insertar el ataque en la BD print "Error al insertar" else: s[sesion]=resultado except: print "error New connection -> %s" % linea if linea.find("Remote SSH version: ")>=0: try: tmp=linea[linea.find("HoneyPotTransport")+18:] sesion=tmp[0:tmp.find(",")] cliente=linea[linea.find("Remote SSH version: ")+20:] resultado=cursorOracle.callfunc("seguridad.set_ClienteSSH",cx_Oracle.NUMBER,[],{'p_ataque':s[sesion],'p_cliente': cliente}) if resultado==-1: #error al insertar el ataque en la BD print "Error al insertar el cliente en la incidencia %s" % s[sesion] except: print "error Remote SSH version -> %s" % linea if linea.find("connection lost")>=0: try: tmp=linea[linea.find("HoneyPotTransport")+18:] sesion=tmp[0:tmp.find(",")] fin=linea[0:19] resultado=cursorOracle.callfunc("seguridad.set_FinalizacionSSH",cx_Oracle.NUMBER,[],{'p_ataque':s[sesion], 'p_fecha_fin':fin}) if resultado==-1: #error al insertar el ataque en la BD print "Error al insertar la fecha de finalizacion en la incidencia %s" % s[sesion] except: print "error connection lost -> %s" % linea

94

if linea.find("login attempt")>=0: try: fecha=linea[0:19] tmp=linea[linea.find("login attempt")+15:] login=tmp[0:tmp.find("/")] password=tmp[tmp.find("/")+1:tmp.find("]")] tmp=linea[linea.find("HoneyPotTransport")+18:] sesion=tmp[0:tmp.find(",")] if linea.find("failed")>=0: resultado="N" else: resultado="S" resultado=cursorOracle.callfunc("seguridad.set_LoginSSH",cx_Oracle.NUMBER,[],{'p_ataque':s[sesion],'p_fecha':fecha,'p_login': login,'p_password':password,'p_resultado':resultado}) if resultado==-1: #error al insertar el ataque en la BD print "Error al insertar login en la incidencia %s fecha %s login %s password %s estado %s" % (s[sesion],fecha, login, password, resultado) print linea except: print "error login attempt -> %s" % linea if linea.find("Command found:")>=0: try: fecha=linea[0:19] tmp=linea[linea.find("HoneyPotTransport")+18:] sesion=tmp[0:tmp.find(",")] comando=linea[linea.find("Command found:")+15:] resultado=cursorOracle.callfunc("seguridad.set_cmdSSH",cx_Oracle.NUMBER,[],{'p_ataque':s[sesion],'p_fecha':fecha,'p_comando': comando}) if resultado==-1: #error al insertar el ataque en la BD print "Error al insertar %s en la incidencia %s" % (comando,s[sesion]) except: print "error -> %s" % linea if linea.find("Command not found:")>=0: try: fecha=linea[0:19] tmp=linea[linea.find("HoneyPotTransport")+18:] sesion=tmp[0:tmp.find(",")] comando=linea[linea.find("Command not found:")+19:] resultado=cursorOracle.callfunc("seguridad.set_cmdSSH",cx_Oracle.NUMBER,[],{'p_ataque':s[sesion],'p_fecha':fecha,'p_comando': comando}) if resultado==-1: #error al insertar el ataque en la BD print "Error al insertar %s en la incidencia %s" % (comando,s[sesion]) except: print "error Command not found -> %s" % linea fichero.close conexionOracle.close

95

REFERENCIAS
[0] http://nowstatic.norton.com/now/en/pu/images/Promotions/2012/cybercrimeReport/2012_Norton_Cybercrime _Report_Master_FINAL_050912.pdf [0.1] http://www.rtve.es/noticias/20110612/anonymous-tumba-web-policia-respuesta-lasdetenciones/439337.shtml [0.2] http://www.csirtcv.gva.es/html/es/news/1268/ [0.3] http://www.mcs.vuw.ac.nz/comp/Publications/archive/CS-TR-06/CS-TR-06-12.pdf [1] https://www.virtualbox.org/ [2] http://es.wikipedia.org/wiki/VirtualBox [3] http://virtualbox.es/ [4] http://es.wikipedia.org/wiki/Ubuntu [4.1] http://releases.ubuntu.com/lucid/ [4.2] http://old-releases.ubuntu.com/releases/10.04.0/ubuntu-10.04.4-desktop-i386.iso [5] http://dionaea.carnivore.it/ [6] https://code.google.com/p/kippo/ [6.1] http://www.enisa.europa.eu/activities/cert/support/proactive-detection/proactive-detection-ofsecurity-incidents-II-honeypots [7] http://httpd.apache.org/ [8] http://www.tcpiputils.com/browse/ip-address/150.214.0.0 [9] http://ipinfodb.com/ip_locator.php [10] http://technet.microsoft.com/en-us/security/bulletin/ms08-067 [11] http://msdn.microsoft.com/en-us/library/cc247258.aspx [12] https://www.virustotal.com/es/#search

96

You might also like