wShark - Pàgina inicial de UPCommons

Anuncio
Aplicación web para la monitorización de redes virtuales:
wShark
Agustı́n Leyenda Duarte
Director de proyecto: Juanjo Alins Delgado
Noviembre 2012
Escola Tècnica Superior d’Enginyeria de Telecomunicació de Barcelona
Universitat Politécnica de Catalunya
2
WSHARK
2
All of time and space; everywhere and anywhere; every star that ever was.
Where do you want to start?
Eleventh Doctor
Things need not have happened to be true. Tales and dreams are the shadow-truths that will endure
when mere facts are dust and ashes, and forgot.
Dream
It is an old maxim of mine that when you have excluded the impossible, whatever remains,
however improbable, must be the truth.
Sherlock Holmes
This is your captain speaking: we may experience some minor turbulence and then... erm, explode.
Malcolm Reynolds
The Internet? Is that thing still around?
Homer Simpson
3
4
WSHARK
4
Agradecimientos
Lo primero, obviamente, agradecer especialmente a mi familia, por apoyarme en todo (en todo
lo moral y éticamente aceptable, al menos) desde la más tierna infancia. A mi padre, por estar
siempre ahı́ cuando se le necesita. A mi hermano, porque le ha tocado aguantarme las tonterı́as más
de una vez, como buen hermano mayor. Y a mi madre, por haberla obligado a resignarse a mis idas
y venidas, pasadas y futuras, por el mundo adelante.
Este PFC se ha llevado a buen puerto trabajando en tres lugares que siempre serán especiales
para mı́, tanto por el tiempo y las experiencias vividas, como por la magnı́fica gente que he conocido
en ellos. A pesar de que es imposible mantener el contacto con todas estas personas, han sido y
serán una parte fundamental de mi vida.
En Galicia, a la gente de Delegación de Alumnos de Teleco de Vigo, con los que compartı́ mis
años de carrera allı́. A Lino, colocado en Galicia por colocarlo en alguna de las clasificaciones,
aunque podrı́a estar en todas. A Jorge, por ser ese tipo de amigo que te hace querer volver a casa
estés donde estés. A Silvia, la mejor amiga polı́tica que se podrı́a desear. A Alicia, por apoyarme
todos esos años y hacerme creer que podı́a lograr todo lo que me propusiese. A Paula, por ser una
de mis mejores amigas mientras crecı́amos juntos. Y a Artanis, por tener la santa paciencia y el
conocimiento para echarme una mano todas esas veces que me quedaba atascado.
En Barcelona, a Juanjo, mi tutor, por confiar en mı́ en un primer momento y ayudarme siempre,
a pesar de las diferentes circunstancias que hicieron que éste fuese un proyecto temporalmente
inconstante. A Gerard, por mostrarme lo realmente genial que puede llegar a ser compartir piso. A
toda la gente del Omega y, muy especialmente, a la gente del despacho de Revistes, desde los HOFs
a los nuevos. Aunque son demasiados para nombrarlos a todos, saben que para mı́, la familia de
Revistes siempre ha sido lo mejor que me ha pasado en mi época en Barcelona.
En Delft, por un lado al grupo Erasmus, con mis magnı́ficos compañeros y casi-compañeros de
casa: Dani, Jon, Alec, Martı́ y Chira; y a las chicas que hicieron que el tiempo extra de estancia que
me quedé por allı́ fuese de lo mejor de mi etapa holandesa: Mireia, Susana y Noa. Por el otro, a la
gente de mi trabajo, por ser amigos además de compañeros. A Ruben, Siebe, Annemieke, Diederik,
Niek, Cristofaro y al resto de Riscure. Especialmente a Eloi, por ser un colega genial además de
estar siempre dispuesto a echar una mano, y a Ileana, por ser la mejor jefa que un intern puede
pedir (aunque no le guste que la llamemos ası́).
Finalmente, a todos aquellos que no he nombrado, por despiste o falta de espacio. Como la gente
de Frozen-Layer, que a pesar de los años y los kilómetros de distancia, siguen ocupando un lugar
muy importante en mi memoria.
Gracias. Al fin y al cabo, en gran parte esto merece la pena por todos vosotros.
Y a Raquel, donde quiera que estés, onee-san.
5
6
WSHARK
6
Resumen
En el Departamento de Ingenierı́a Telemática de la ETSETB se está trabajando en el desarrollo
y despliegue de un Laboratorio de Redes Virtual con acceso remoto y gestión a través de una interfaz
web. Este proyecto, llamado LabXar, ha sido dividido en diferentes subproyectos, cada uno de los
cuales ataca diferentes problemas.
El PFC que aquı́ se presenta se enmarca dentro de este proyecto LabXar y su objetivo es el
desarrollo de una interfaz web que permita el acceso remoto y en tiempo real a los datos de captura
de tráfico de las redes virtualizadas. Es importante también presentar la información de forma
adecuada para su supervisión y análisis.
Para este fin, se ha trabajado tanto en el cliente (navegador) como en el propio servidor. La
parte del cliente se ha focalizado en obtener una presentación de los datos de tráfico de una forma
intuitiva y amigable, al estilo de los programas estándar. En la parte del servidor, la principal
motivación ha sido obtener un refresco apropiado y una interactividad adecuada para con los datos
presentados en el navegador.
El desarrollo de la aplicación web propia viene motivado por la limitada memoria de la que gozan
las máquinas virtuales que conforman las redes virtuales. Obviamente debe existir una restricción en
las caracterı́sticas asociadas a ellas ya que las simulaciones implican múltiples máquinas virtuales
por cada uno de los usuarios conectados y, a su vez, múltiples usuarios simultáneamente, todo
sobre un mismo equipo. Ello implica buscar una solución sin una carga excesiva sobre la memoria
y descarta herramientas convencionales de análisis de redes, como Wireshark.
Ası́ pues, wShark solventa estos problemas creando un entorno gráfico sobre el navegador y
añadiendo funcionalidades interesantes para la salida de la versión de lı́nea de comandos de Wireshark, a través de distintos lenguajes de desarrollo web. Esto distribuye la carga entre el servidor y
el propio usuario y permite al alumno visualizar la red sin necesidad de instalar ningún software
especı́fico y sin preocuparse de su sistema operativo.
Además, se introduce una versión autónoma de wShark, que permite a cualquier usuario de
cualquier parte del mundo, con cualquier sistema operativo y sin tener instalado ningún programa
de análisis de redes, visualizar sus ficheros de captura .cap en la nube.
7
8
WSHARK
8
Índice general
Agradecimientos
5
Resumen
7
Lista de figuras
11
I
13
Proyecto Marco: LabXar
1. Introducción
15
1.1. Motivación del proyecto LabXar . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
1.2. Estructuración del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
1.3. Estructura del documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2. Virtualización
17
2.1. Redes virtuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.2. Virtualización de máquinas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.2.1. Tipos de virtualización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.2.2. UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.3. Conmutadores de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.3.1. uml switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.3.2. VDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.4. VNUML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.4.1. Ejemplo de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
3. Gestión de la simulación en LabXar
25
3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.2. Laboratorio virtual de redes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
9
10
WSHARK ÍNDICE GENERAL
3.3. Conformación de tráfico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4. Captura de tráfico en LabXar
II
26
31
4.1. Analizadores de redes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
4.2. Wireshark y Tshark como estándar de captura . . . . . . . . . . . . . . . . . . . . .
32
4.2.1. Wireshark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4.2.2. TShark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4.3. La captura de tráfico en LabXar . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
4.3.1. uml switch y VDE switch: Generación de ficheros de captura. . . . . . . . . .
33
4.3.2. Acceso remoto a los datos de captura y presentación de la información . . . .
36
Aplicación web para la monitorización de redes virtuales: wShark
5. wShark
39
41
5.1. Estructura del programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
5.1.1. Lenguajes y herramientas . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
5.2. Versiones previas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
5.2.1. wShark v0.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
5.2.2. wShark v1.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
5.3. Version final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
5.3.1. Versión integrada en LabXar de wShark . . . . . . . . . . . . . . . . . . . . .
50
5.3.2. Stand-alone wShark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
5.4. Algoritmia y estructura interna de la aplicación . . . . . . . . . . . . . . . . . . . . .
63
5.4.1. Muestreo del fichero de captura . . . . . . . . . . . . . . . . . . . . . . . . . .
63
5.4.2. Actualización de información en el navegador . . . . . . . . . . . . . . . . . .
67
5.4.3. Estadı́sticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
5.4.4. Stand-Alone Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
6. Conclusiones y trabajo futuro
77
Apéndices
79
A. Estructura concisa de wShark
81
A.1. Versión wShark de la plataforma LabXar
. . . . . . . . . . . . . . . . . . . . . . . .
81
A.2. Versión Stand-Alone wShark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
10
WSHARK ÍNDICE GENERAL
11
A.3. Otros ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
B. Comunicación en wShark
85
87
B.1. Versión wShark de la plataforma LabXar
. . . . . . . . . . . . . . . . . . . . . . . .
87
B.1.1. Inicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
B.1.2. Detección de nuevos paquetes en la red . . . . . . . . . . . . . . . . . . . . .
88
B.1.3. Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
B.2. Versión Stand-Alone wShark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
B.2.1. Inicio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
B.2.2. Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
B.3. Versión wShark de la plataforma LabXar
. . . . . . . . . . . . . . . . . . . . . . . .
93
B.3.1. Inicio de la conexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
C. Código fuente de wShark
95
C.1. Versión de wShark en LabXar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
C.1.1. Inicio de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
95
C.1.2. Simulación de captura en tiempo real . . . . . . . . . . . . . . . . . . . . . . 114
C.1.3. Guardar ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
C.1.4. Estadı́sticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
C.1.5. Hoja de estilo CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
C.2. Version Stand-Alone de wShark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
C.2.1. Inicio de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
C.2.2. Hoja de estilo CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
D. Logos
135
D.1. Logos descartados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
E. Licencia GPL
139
Bibliografı́a
151
11
12
WSHARK ÍNDICE GENERAL
12
Índice de figuras
2.1. Arquitectura de una máquina virtual. . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.2. Red a simular en una de la prácticas. . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.3. La terminal superior muestra parte de la ejecución de vnumlparser.pl, generando la
red virtual. La terminal inferior muestra la conexión telnet a una de las máquinas
virtuales de dicha red. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
3.1. Página de inicio del laboratorio virtual de redes. . . . . . . . . . . . . . . . . . . . .
26
3.2. Página para seleccionar el escenario de las prácticas a virtualizar. . . . . . . . . . . .
27
3.3. Red virtual iniciada y comunicación con la misma mediante telnet. . . . . . . . . . .
28
3.4. Usuarios conectados a través de internet al servidor que gestione el laboratorio virtual
con las simulaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
3.5. Dentro del servidor, las simulaciones de cada uno de los usuarios es independiente y
accesible sólo por dicho usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
4.1. Interfaz gráfica del Wireshark.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
4.2. TShark ejecutado en la lı́nea de comandos. . . . . . . . . . . . . . . . . . . . . . . .
34
4.3. Salida generada por TShark para la comunicación de la figura 2.3 sobre la red 1. . .
34
4.4. Salida generada por TShark para la comunicación de la figura 2.3 sobre la red 0 . . .
35
4.5. Captura de Wireshark mostrando la información relativa al campo “host” del encapsulado HTTP en un paquete del mismo protocolo. . . . . . . . . . . . . . . . . . . .
37
4.6. Formato de salida pdml (información de los campos del datagrama) para un único
paquete con TShark. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
5.1. Estructura en árbol XML DOM adoptada por muchos de los archivos a leer de TShark. 44
5.2. Una de las primeras versiones funcionales de wShark . . . . . . . . . . . . . . . . . .
47
5.3. wShark v1.0. Esta versión fue la usada en la primera versión completa de la plataforma, en conjunción con el sistema de generación de las redes virtuales. . . . . . . .
48
5.4. Paquetes de la subred 0 – iguales a los de la figura 5.2 – filtrados para mostrar
únicamente los paquetes del protocolo arp. . . . . . . . . . . . . . . . . . . . . . . . .
49
13
14
WSHARK ÍNDICE DE FIGURAS
5.5. Red virtual iniciada y comunicación con la misma mediante telnet. . . . . . . . . . .
50
5.6. Interfaz final de wShark. Los paquetes que aparecen son los generados al iniciar la
comunicación de la red virtual. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
5.7. Los pings enviados en 5.5 son recibidos y mostrados en el sumario de wShark. . . . .
52
5.8. Menú Fichero de wShark. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
5.9. Menú Ir de wShark. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
5.10. Menú Captura de wShark. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
5.11. Ventana modal para seleccionar el cambio de red. . . . . . . . . . . . . . . . . . . . .
55
5.12. Diferentes estadı́sticas referentes a la información de wShark. . . . . . . . . . . . . .
56
5.13. Ventana modal con información genérica sobre el fichero del que se está capturando.
56
5.14. Ventana modal con información organizada jerárquicamente referente a los protocolos
incluidos en los diferentes de paquetes enviados. . . . . . . . . . . . . . . . . . . . . .
57
5.15. Menú, sobre la ventana modal, para la selección de conversaciones de diferentes protocolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
5.16. Información, en este caso, sobre las diferentes conversaciones del protocolo ethernet
en la captura.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
5.17. Menú sobre la ventana modal para escoger si se desea mostrar la gráfica de la densidad
de paquetes o de bytes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
5.18. Gráfica colocada sobre la ventana modal del número de paquetes frente al intervalo
temporal de captura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
5.19. Gráfica del número de bytes frente al intervalo temporal de captura que se actualiza
de forma dinámica con los nuevos paquetes que llegan en la simulación. . . . . . . .
59
5.20. Menú para escoger el lenguaje de la interfaz de wShark. . . . . . . . . . . . . . . . .
60
5.21. Ventana modal para aplicar un filtro a la captura. . . . . . . . . . . . . . . . . . . .
60
5.22. Página de inicio de la versión Stand Alone de wShark. . . . . . . . . . . . . . . . . .
61
5.23. Ventana modal para seleccionar el idioma en la página de inicio de la versión Stand
Alone de wShark. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
5.24. Ventana modal para cambiar entre los diferentes ficheros subidos. . . . . . . . . . . .
62
A.1. Estructura de archivos de la versión de wShark incluida en LabXar. . . . . . . . . .
84
A.2. Estructura de archivos de la versión Stand-Alone de wShark. . . . . . . . . . . . . .
86
B.1. Diagrama secuencial de inicio para la versión de wShark de LabXar. . . . . . . . . .
88
B.2. Diagrama secuencial de la llega de nuevos paquetes en la versión de wShark de LabXar. 90
B.3. Diagrama secuencial para la gestión de eventos. . . . . . . . . . . . . . . . . . . . . .
91
B.4. Diagrama secuencial de inicio para la versión Stand-Alone de wShark. . . . . . . . .
92
14
WSHARK ÍNDICE DE FIGURAS
15
D.1. Logo HTML5 que representa la parte web de la aplicación. . . . . . . . . . . . . . . 135
D.2. Logo de Wireshark que representa la parte de analizador de redes de la aplicación. . 136
D.3. Combinación de los dos logos previos que muestran las dos caracterı́sticas principales
de wShark. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
D.4. Segundo Logo de Wireshark. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
D.5. Adaptación del segundo logo de Wireshark para su uso en la interfaz gráfica de
captura de paquetes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
D.6. Modificación del logo principal con la aleta en blanco. . . . . . . . . . . . . . . . . . 137
D.7. Modificación del logo principal sin bordes. . . . . . . . . . . . . . . . . . . . . . . . . 138
15
16
WSHARK ÍNDICE DE FIGURAS
16
Parte I
Proyecto Marco: LabXar
17
Capı́tulo 1
Introducción
1.1.
Motivación del proyecto LabXar
LabXar es un proyecto para el desarrollo y despliegue de un laboratorio de redes virtual con
acceso remoto y gestión desde una interfaz web. Se encuentra actualmente en uso en diferentes
asignaturas impartidas por el departamento de ENTEL y permite a los alumnos interactuar con
diferentes escenarios de red en un entorno controlado, individual y sencillo.
Este proyecto se originó como una herramienta docente para la asignatura Laboratorio de Telemática II en la titulación superior de Ingenierı́a de Telecomunicaciones de la ETSETB. Este
laboratorio consiste en una introducción a la estructura de las redes de comunicaciones y una aproximación práctica a los diferentes protocolos que componen las pilas OSI y TCP/IP. Los alumnos
pueden observar cómo se interconectan entre sı́ conceptos estudiados previamente como IPs, tablas
de rutas, máscaras o subnetting (por citar algunos) y cuál es su cometido en una red real y funcional
desplegada en el laboratorio. Configurando los ordenadores conectados a la red y comunicándolos
entre ellos, los estudiantes adquieren un conocimiento más profundo de las complejidades en una
red telemática.
El desarrollo de este PFC fue motivado principalmente por diferentes limitaciones relativas a la
organización de la asignatura:
La red está limitada al hardware fı́sico disponible (hosts, routers, switches, etc).
Para la correcta realización de las prácticas, todos los ordenadores de la red – el propio y
el de los demás alumnos de la clase – han de estar configurados acorde al ejercicio que se
esté realizando en ese momento. Esto significa que los alumnos que vayan más rápido deberán
esperar continuamente al resto.
Los recursos están limitados a las horas de laboratorio, imposibilitando a los alumnos la
finalización o la repetición de los escenarios de las prácticas fuera del horario de las clases.
La principal idea detrás de este proyecto es crear un entorno propio para cada estudiante, donde
pueda realizar las tareas que se le requieren a su propio ritmo y sin las limitaciones previamente
mentadas. Además, se busca añadir también la posibilidad de acceder a estas prácticas en cualquier
momento de forma remota.
19
20
WSHARK CAPÍTULO 1. INTRODUCCIÓN
1.2.
Estructuración del proyecto
El proyecto se divide en dos etapas principales con respecto a su funcionalidad:
1. Cuando el usuario se conecta a la web de la herramienta a través de un navegador, se le asocia
una sesión única y se simulan todos los elementos de la red escogida de forma virtual sobre
un único host.
2. Una vez la red virtual está generada, el usuario puede interactuar con ella remotamente y
observar el comportamiento de los paquetes con el analizador de paquetes integrado, wShark.
El proyecto LabXar completo consta de dos partes, por un lado la generación de la red virtual
y por otro la aplicación de monitorización de la red, wShark. La primera parte se trata del proyecto
documentado en [1] y se puede encontrar una explicación más exhaustiva del mismo más adelante
(capı́tulo 3) y en la memoria referenciada en la bibliografı́a.
Este PFC trata sobre la segunda parte, el analizador de redes. En el marco docente en el que
se posiciona el proyecto, el análisis del tráfico a través de herramientas sencillas y claras ayuda
inmensamente a los alumnos a entender cómo funciona internamente una red telemática y sus
protocolos. La interfaz de la herramienta, su usabilidad y presentación, son vitales para lograr un
uso eficiente y extensivo de la plataforma.
1.3.
Estructura del documento
Esta memoria está estructurada en tres partes principales:
Parte 1: sitúa el marco del proyecto LabXar completo, explicando en este primer capı́tulo de
qué se trata el proyecto y sus motivaciones. En los siguientes capı́tulos introduce las diferentes
herramientas y los estándares utilizados, ası́ como el posicionamiento de la aplicación en el
conjunto completo de la plataforma.
Parte 2: descripción extensa de la propia herramienta web, wShark, explicando sus diferentes
funcionalidades y versiones.
Parte 3: anexos con información sobre la estructuración del software de la aplicación, las
comunicaciones internas y otra información como el diseño y las licencias.
Para finalizar, en la bibliografı́a se pueden encontrar referencias a todos los textos y artı́culos
usados a lo largo de la elaboración de la memoria, que constituye una literatura muy interesante
para profundizar en los temas tratados más allá del objetivo de este documento.
20
Capı́tulo 2
Virtualización
2.1.
Redes virtuales
Una red virtual se puede definir como una red compuesta de máquinas virtuales – simuladas
a través de software –, que están conectadas a través de dispositivos de red virtuales (switches,
routers, etc), de la misma forma que una red fı́sica conecta máquinas fı́sicas con dispositivos fı́sicos
[2]. Esto permite simular redes complejas con multitud de elementos sobre un único ordenador fı́sico,
denominado host de virtualización o, simplemente, host.
Los componentes básicos de una red virtual son:
Máquinas Virtuales: hacen el papel de los equipos fı́sicos en una red fı́sica.
Switches Virtuales: interconectan las máquinas virtuales a nivel de la capa de enlace. Información más especı́fica puede encontrarse en la sección 2.3.
Conexiones: la topologı́a de la red y las comunicaciones en ella dependen completamente de
cómo se interconectan los equipos y los dispositivos de red dentro de ella. Ası́ pues, los “cables”
virtuales juegan un importante papel en el despliegue de la misma.
Potencialmente, elementos más complejos pueden formar parte de la red, como routers y gateways. Todos estos elementos simulan fielmente las funciones de sus homónimos fı́sicos. En las
siguientes secciones se explicarán con más detalle los componentes de la red virtual.
2.2.
Virtualización de máquinas
Una máquina virtual (MV) es un contenedor software completamente aislado que puede ejecutar
su propio sistema operativo y aplicaciones como si fuese un ordenador fı́sico. Una máquina virtual
se comporta exactamente como un ordenador fı́sico y contiene su propia CPU, RAM, disco duro y
tarjeta de red virtuales (simulados sobre software) [3].
Un sistema operativo no puede diferenciar entre una máquina virtual y una máquina fı́sica, ni
son capaces las aplicaciones ni otros ordenadores en red. Incluso la propia máquina virtual cree que
es un ordenador real. Sin embargo, la MV está compuesta sólo de software y no tiene absolutamente
ningún componente hardware.
21
22
WSHARK CAPÍTULO 2. VIRTUALIZACIÓN
2.2.1.
Tipos de virtualización
Las máquinas virtuales se pueden separar en dos grandes grupos, basados en su uso y en el grado
de correspondencia con una máquina real [4]:
Máquinas virtuales de sistema: proporcionan una plataforma de sistema completa que
soporta la ejecución de todo un sistema operativo. Permiten a la máquina fı́sica subyacente
multiplexarse entre varias máquinas virtuales, cada una ejecutando su propio sistema operativo. A la capa de software que permite la virtualización se la llama monitor de máquina
virtual o hypervisor. Un monitor de máquina virtual puede ejecutarse o bien directamente sobre el hardware o bien sobre un SO. Parallels o VMware son ejemplos de conocidas máquinas
virtuales de sistema.
Máquinas virtuales de proceso: se ejecutan como un proceso normal dentro de un SO y
soportan un solo proceso. La máquina se inicia automáticamente cuando se lanza el proceso
que se desea ejecutar y se detiene cuando éste finaliza. Su objetivo es el de proporcionar un
entorno de ejecución independiente de la plataforma de hardware y del SO, que oculte los
detalles de la plataforma subyacente y permita que un programa se ejecute siempre de la
misma forma sobre cualquier plataforma. El ejemplo más conocido es la máquina virtual de
Java.
En la figura 2.1 podemos observar como el bloque de las máquinas virtuales (en gris) es independiente de las aplicaciones del propio sistema operativo que está ejecutando las mismas. El hypervisor
se encarga de gestionar la comunicación con el SO del host (máquina donde se está virtualizando),
proporciona el ambiente de ejecución aislado y da soporte para que en una misma plataforma de
hardware se ejecuten diferentes sistemas operativos sobre diferentes MVs. Las n máquinas virtuales
controladas por el hypervisor tendrán sus propias caracterı́sticas y su propio sistema operativo –
igual o diferente al del host – y ejecutarán sus propias aplicaciones, que estarán completamente
aisladas al resto.
Figura 2.1: Arquitectura de una máquina virtual.
22
WSHARK CAPÍTULO 2. VIRTUALIZACIÓN
2.2.2.
23
UML
UML (User Mode Linux) es una técnica de virtualización que se puede clasificar como una
máquina virtual de proceso y será el mecanismo utilizado para generar las máquinas virtuales en
la plataforma LabXar. Es una herramienta integrada con el núcleo de Linux que permite ejecutar
múltiples sistemas Linux virtuales (o guests) como simples aplicaciones sobre un Linux normal (o
host). Debido a que cada guest se trata de una aplicación normal ejecutándose como un proceso
en el espacio de usuario, esta aproximación proporciona una forma de ejecutar múltiples máquinas
virtuales Linux en un único hardware, ofreciendo excelentes condiciones de seguridad sin afectar
a la configuración del entorno o a la estabilidad de la máquina origen. Como puede comprobarse
consultando [5], existen numerosos ejemplos del uso de UML:
Ejecución de servicios de red desde un entorno UML permaneciendo totalmente aislado del
sistema principal.
Configuración de honeypots (trampas) con el objetivo de probar la seguridad de los equipos o
de la red.
Testeo y depuración de software nuevo sin afectar al sistema del host.
Simulación de redes realistas sobre Linux para entornos docentes y de investigación, con un
alto grado de seguridad.
2.3.
Conmutadores de Software
Como se ha comentado previamente, se pueden simular los conmutadores o switches a través
de software. Un switch o conmutador virtual es un programa software que permite a una máquina
virtual comunicarse con otra. Se trata de una conexión a nivel 2 de la capa OSI, la capa de enlace.
Se comporta de forma análoga a su contrapartida fı́sica, direccionando de forma inteligente la
comunicación en la red, inspeccionando los paquetes antes de enviarlos.
En el caso particular del proyecto, los conmutadores de software enlazan las máquinas virtuales
generadas con UML para crear una estructura de red virtual. Existen diferentes opciones entre los
switches a utilizar en el proyecto que se introducen a continuación.
2.3.1.
uml switch
Se trata del switch propio incluido en UML para formar redes virtuales. uml switch es un daemon
para la gestión de una red virtual entre sistemas UML, sin conexión por defecto a la red propia del
host.
Escucha por conexiones en un par de sockets de dominio de UNIX que son usados para las
comunicaciones entre uml switch y las máquinas UML conectadas a su red.
2.3.2.
VDE
VDE (Virtual Distributed Ethernet) es otra alternativa en el conmutador de la red virtual. Su
nombre es autoexplicativo: es virtual, ya que se genera completamente a través de software; distri23
24
WSHARK CAPÍTULO 2. VIRTUALIZACIÓN
buido, ya que ofrece componentes que permiten interconectar diferentes conmutadores localizados
en máquinas reales distintas; y ethernet, debido a que la estructura completa es capaz de enrutar y
enviar paquetes ethernet. Las principales caracterı́sticas de VDE son:
Cumple con los estándares Ethernet.
Es general, es decir, es una infraestructura virtual que da conectividad a diferentes tipos
de componentes software: emuladores/máquinas virtuales, sistemas operativos reales y otras
herramientas de conectividad.
Es distribuido.
No necesita permisos de administración para ejecutarse.
VDE tiene la misma estructura que una red ethernet normal. Los componentes principales son
vde switches, que tienen múltiples puertos donde el usuario puede conectar otros elementos virtuales
como ordenadores o routers, y vde cables, que permiten interconectar dos vde switches. Para obtener
más información al respecto, puede consultarse el exhaustivo informe citado en [6].
Actualmente VDE soporta distintas soluciones de emulación o virtualización, como Qemu,
Bochs, Virtualbox o, el usado en nuestro caso, User-Mode Linux.
2.4.
VNUML
VNUML (Virtual Network User Mode Linux) es una herramienta open-source de virtualización
desarrollada por la Universidad Politécnica de Madrid, que permite definir y simular de forma
rápida redes complejas con todos sus elementos (switches, routers, cables, equipos, etc). Esto es
especialmente útil ya que definir topologı́as grandes es especialmente difı́cil y propenso a errores.
VNUML ayuda a generar estas redes virtuales de forma sistemática.
VNUML está enfocado al testeo de aplicaciones y servicios de red en escenarios complejos,
formados por múltiples nodos sobre una única máquina Linux, sin la necesidad del desembolso y
organización necesarios para crear la red usando equipamiento real [7]. Desde su desarrollo en 2002,
ha sido usado ampliamente en diversos campos relacionados con las redes de ordenadores:
Arquitecturas de enrutado, como IPv6 IX.
Plataformas de servicios multimedia sobre IP.
Seguridad.
Laboratorios y prácticas en universidades.
VNUML consiste en dos componentes principales: el lenguaje VNUML usado para describir las
simulaciones en XML; y el interprete del lenguaje, que compila y controla el escenario escondiendo
las complejidades de UML al usuario.
24
WSHARK CAPÍTULO 2. VIRTUALIZACIÓN
2.4.1.
25
Ejemplo de uso
El procedimiento necesario para generar la red de esta forma comienza por la necesidad de
definir los elementos virtuales de la red en un fichero, en el lenguaje propio de la herramienta. Por
ejemplo, la red de la figura 2.2 se describirı́a con el código 2.1:
Figura 2.2: Red a simular en una de la prácticas.
El fichero comienza describiendo parámetros como el sistema de ficheros y el kernel del sistema
operativo a utilizar en la máquina virtual, que pueden ser completamente diferentes al del host
donde se está ejecutando. A continuación, se describen las redes, con los elementos (switches, en
este caso) que se utilizan en ella dentro de la etiqueta net. Finalmente, se definen cada uno de los
guests (máquinas virtuales) que forman la red completa y sus interfaces con sus parámetros – como
a la subred a la que están conectados y sus IP. Nótese que también se define, en una de las tres
máquinas, la terminal que será lanzada – xterm – para interactuar con la red.
Una vez descrita la red a generar – que puede ser mucho más compleja –, se invoca un script en
Perl denominado vnumlparser.pl que interpreta el fichero XML y lanza las máquinas y los elementos
virtuales de la red simulada. Una vez terminada la generación, el usuario recibe una terminal que
simula uno de los equipos en la red (en este caso el telm2-8 ) y desde dicha terminal puede interactuar
con el resto de la red. En la figura 2.3 se puede observar en la terminal superior el log de la generación
de la red virtual y en la inferior cómo los pings enviados desde telem2-8 a los demás elementos de
la red son recibidos y contestados perfectamente por los mismos, como si de una red real se tratase.
25
26
WSHARK CAPÍTULO 2. VIRTUALIZACIÓN
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE vnuml SYSTEM "/usr/share/xml/vnuml/vnuml.dtd">
<vnuml>
<global>
<version>1.8</version>
<simulation name>Practica3 Ex 1 i 2</simulation name>
<automac/>
<vm mgmt type="none" />
<vm defaults exec mode="mconsole">
<filesystem type="cow">/usr/share/vnuml/filesystems/root fs tutorial</filesystem>
<kernel>/usr/share/vnuml/kernels/linux</kernel>
<!−− <console id="0">xterm</console> −−>
</vm defaults>
</global>
<net name="Net0" mode="uml_switch"
uml switch binary="/usr/bin/uml_switch4capture" capture file="/tmp/capture/capture0.cap" />
<net name="Net1" mode="uml_switch"
uml switch binary="/usr/bin/uml_switch4capture" capture file="/tmp/capture/capture1.cap" />
<net name="Net2" mode="uml_switch" />
<vm name="telm2-9">
<if id="1" net="Net0">
<ipv4>147.83.40.29</ipv4>
</if>
<if id="2" net="Net1">
<ipv4>147.83.39.50</ipv4>
</if>
<forwarding type="ip" />
</vm>
<vm name="t145">
<if id="1" net="Net1">
<ipv4>147.83.39.145</ipv4>
</if>
<route type="ipv4" gw="147.83.39.50">default</route>
</vm>
<vm name="telm2-8">
<console id="0">xterm</console>
<if id="1" net="Net0">
<ipv4>147.83.40.28</ipv4>
</if>
<if id="2" net="Net2">
<ipv4>192.168.1.240</ipv4>
</if>
<route type="ipv4" gw="147.83.40.29">default</route>
</vm>
</vnuml>
Código 2.1: Ejemplo de código VNUML de generación de la red virtual.
26
WSHARK CAPÍTULO 2. VIRTUALIZACIÓN
27
Figura 2.3: La terminal superior muestra parte de la ejecución de vnumlparser.pl, generando la red
virtual. La terminal inferior muestra la conexión telnet a una de las máquinas virtuales
de dicha red.
27
28
WSHARK CAPÍTULO 2. VIRTUALIZACIÓN
28
Capı́tulo 3
Gestión de la simulación en LabXar
3.1.
Introducción
Este capı́tulo es un resumen de la primera parte de la plataforma LabXar, que genera las redes
a simular y gestiona el laboratorio de redes virtual a través de una interfaz web. Esta parte del
proyecto, como se ha mencionado previamente, ha sido desarrollada por Gustau Pérez y en la
documentación de la misma se puede encontrar una explicación concienzuda del sistema [1].
Los objetivos que se buscan en este proyecto son:
Explorar las diferentes tecnologı́as que permiten implementar escenarios de redes complejas.
Implementar una plataforma que permita el acceso remoto a estos escenarios y que permita a
los alumnos observar y experimentar con los protocolos y las herramientas de red.
Implementar las modificaciones necesarias para poder observar el comportamiento de los protocolos de red bajo condiciones especiales o anómalas.
Ası́ pues, se pueden diferenciar dos partes principales que se detallarán en las siguientes secciones:
la generación de la red virtual y la alteración del tráfico.
3.2.
Laboratorio virtual de redes
Se trata de una plataforma de virtualización, una herramienta de ejecución virtual de redes
y acceso remoto de los usuarios. Los usuarios podrán lanzar, acceder, explorar y modificar estas
simulaciones.
Al conectarse a la web del proyecto https://vsertel.upc.edu/labxar/, la página principal
muestra una breve explicación de cómo funcionan las simulaciones y pide un usuario y contraseña
(ver figura 3.1).
Después de autenticarse, la interfaz web permite escoger uno de los escenarios asociados a las
prácticas, con las diferentes redes a simular (figura 3.2).
Una vez escogida y arrancada la simulación, la plataforma creará un entorno de virtualización
distinto para cada usuario autenticado. En este entorno se crearán los diferentes procesos UML
29
30
WSHARK CAPÍTULO 3. GESTIÓN DE LA SIMULACIÓN EN LABXAR
que forman las máquinas virtuales de la red y los vde switches que las interconectan siguiendo la
topologı́a que se observa a la izquierda de la figura 3.3.
La interfaz proporciona una dirección ip y un puerto para conectarse a través de telnet a una
de las máquinas virtuales de la red (en este caso, a la denominada telm2-8). En la terminal a la
derecha de la imagen 3.3 puede observarse la conexión telnet, cómo los pings que se envı́an a t145
son respondidos, y cómo la interfaz eth1 de telm2-8 está configurada de acuerdo al esquema.
Finalmente, en la misma imagen puede verse un enlace a WebShark (en las últimas versiones el
nombre ha cambiado a wShark) que es la aplicación de análisis de la red (ver capı́tulo 4) desarrollada
en esta segunda parte del proyecto y que permite visualizar las comunicaciones que ocurren en la
red virtual.
Figura 3.1: Página de inicio del laboratorio virtual de redes.
3.3.
Conformación de tráfico
La gestión de la simulación también incluye ciertas modificaciones sobre VDE para poder alterar
el tráfico de la red. Esto permite simular comportamientos de una red real, como limitación, descarte
y retardo del tráfico.
30
WSHARK CAPÍTULO 3. GESTIÓN DE LA SIMULACIÓN EN LABXAR
31
Figura 3.2: Página para seleccionar el escenario de las prácticas a virtualizar.
Limitación de tráfico
Esta limitación significa que un puerto determinado sólo puede aceptar una cantidad de tráfico
máxima por unidad de tiempo. Todo el tráfico que sobrepase este lı́mite, no se podrá servir a la red.
Los conmutadores fı́sicos actuales implementan mecanismos similares. Su funcionamiento se
basa en disponer de una memoria caché para cada puerto, donde se almacenan paquetes preparados
para ser reenviados. Si un sistema envı́a tráfico muy rápido y el destino es incapaz de procesarlo, el
conmutador acumula hasta N paquetes y, llegado a este punto, avisa al sistema de que está saturado.
En este caso, se simula un medio genérico donde no hay garantı́a de entrega de tráfico. Los
paquetes que no se puedan procesar se perderán. Además se implementan dos lı́mites, dependiendo
de si es tráfico entrante o saliente de un puerto.
Descarte de tráfico
Debe poderse descartar de forma probabilı́stica un paquete que entra o sale de un puerto determinado del conmutador.
La solución propuesta es sencilla, ofreciendo la posibilidad de dar un valor de descarte – entre
0 y 100 – de manera que la implementación descartará un tanto por ciento de los paquetes totales
según el valor recibido.
31
32
WSHARK CAPÍTULO 3. GESTIÓN DE LA SIMULACIÓN EN LABXAR
Figura 3.3: Red virtual iniciada y comunicación con la misma mediante telnet.
Esquemas y explicación de la conexión remota
El esquema de conexión a la plataforma puede observarse en las figuras 3.4 y 3.5, donde los
diferentes usuarios se conectan a través de internet y la página web al servidor que gestiona las
redes virtuales (figura 3.4). Este servidor crea una red virtual independiente para cada uno de
los n usuarios conectados, con sus máquinas virtuales y elementos de red, con los que sólo puede
interactuar el usuario que ha arrancado la simulación (figura 3.5). A través de telnet, los usuarios se
conectan a una de las máquinas de su espacio virtual, y es a través de ella con la que interactúan con
la red (ver figura 3.3). Los conmutadores de red almacenan en el espacio de usuario ficheros con el
intercambio de paquetes que ocurre en la red, que serán posteriormente utilizados por el analizador
de red (ver capı́tulo 4) para estudiar el tráfico.
Retardo de tráfico
En el caso del conmutador de tráfico, la idea general es disponer de un programador de servicio
para cada puerto. De esa manera, cuando llega un paquete se decide por qué puerto sale y por cada
puerto de salida se mantiene una cola de tráfico saliente, ordenada según el orden de servicio de los
paquetes. Para cada puerto, se extrae el primer paquete de la cola y se sirve a la red.
32
WSHARK CAPÍTULO 3. GESTIÓN DE LA SIMULACIÓN EN LABXAR
33
Figura 3.4: Usuarios conectados a través de internet al servidor que gestione el laboratorio virtual
con las simulaciones.
Figura 3.5: Dentro del servidor, las simulaciones de cada uno de los usuarios es independiente y
accesible sólo por dicho usuario.
33
34
WSHARK CAPÍTULO 3. GESTIÓN DE LA SIMULACIÓN EN LABXAR
34
Capı́tulo 4
Captura de tráfico en LabXar
4.1.
Analizadores de redes
Existen diferentes métodos para monitorizar lo que ocurre en una red (real o virtual). En este
caso, la monitorización dependerá de un analizador de paquetes (o analizador de redes) que puede
interceptar y registrar el tráfico que pasa a través de una red completa o partes de ésta. Conforme
los flujos de datos atraviesan la red, el analizador captura cada paquete y, si es necesario, decodifica
los datos del mismo, mostrando los valores de sus diferentes campos. Su versatilidad permite su uso
en muy diferentes ámbitos [8]:
Analizar problemas de red.
Detectar intentos de intrusión en la red.
Detectar un mal uso de la red por usuarios internos y externos.
Aislar redes comprometidas.
Monitorizar el uso del ancho de banda.
Monitorizar la seguridad de la red.
Recolectar estadı́sticas de la red.
Filtrar contenido sospechoso del tráfico de la red.
Recuperar información sensible como contraseñas.
Aplicar ingenierı́a inversa sobre protocolos propietarios usados en la red.
Depurar comunicaciones cliente/servidor.
Depurar implementaciones de protocolos de red.
Verificar la efectividad de los sistemas de control internos como firewalls, proxys, filtros de
spam, etc.
35
36
WSHARK CAPÍTULO 4. CAPTURA DE TRÁFICO EN LABXAR
4.2.
Wireshark y Tshark como estándar de captura
4.2.1.
Wireshark
Wireshark es un analizador de paquetes open-source y de software libre. Es estándar de facto en
muchas industrias e instituciones educativas. Se utiliza para realizar análisis y solucionar problemas
en redes de comunicaciones, en el desarrollo de software y protocolos, y como una herramienta
didáctica. Cuenta con todas las caracterı́sticas estándar de un analizador de redes.
Wireshark proporciona una interfaz gráfica, que ayuda a entender lo que está ocurriendo en
la red, y muchas opciones de organización y filtrado de información. También permite al usuario
configurar los controladores de red en modo promiscuo, capturando todo el tráfico visible en la
interfaz en cuestión. La interfaz gráfica de Wireshark se ha utilizado en este proyecto como modelo
de referencia en el diseño de la interfaz gráfica implementada sobre el navegador.
Es un software que “entiende” la estructura de los diferentes protocolos de red. Es decir, es
capaz de mostrar la encapsulación y los campos, al mismo tiempo que sus significados, con diferentes
paquetes de diferentes protocolos de red.
Sus principales caracterı́sticas son [9]:
Los datos pueden ser capturados de una conexión de red en vivo o leı́dos de un fichero de
paquetes previamente capturado.
Los datos live se pueden leer desde diferentes tipos de red, incluyendo Ethernet, IEEE 802.11,
PPP y loopback.
Se puede navegar por los datos capturados de la red a través de la interfaz gráfica del Wireshark
o a través de TShark, la versión lı́nea de comandos del analizador.
Los datos mostrados se pueden refinar usando un filtro.
Es sencillo añadir nuevos protocolos a través de plug-ins.
Las llamadas VoIP se pueden detectar e incluso reproducir si están codificadas correctamente.
Se puede capturar tráfico USB bruto.
La figura 4.1 es una captura de pantalla del Wireshark mostrando información de los paquetes
intercambiados en una comunicación sobre la red.
4.2.2.
TShark
TShark es la versión para lı́nea de comandos de Wireshark. Toda la comunicación consiste en
comandos en la terminal y las respuestas se muestran por pantalla o en ficheros. A pesar de ello,
TShark incluye todas las funcionalidades principales de Wireshark.
La figura 4.2 muestra la salida de TShark para la misma captura que la de la figura 4.1. El resto
de campos se pueden obtener, con diversos formatos de salida, dependiendo de los parámetros y
opciones con los que se invoque a TShark.
36
WSHARK CAPÍTULO 4. CAPTURA DE TRÁFICO EN LABXAR
4.3.
37
La captura de tráfico en LabXar
Una vez generada la red virtual, los conmutadores que interconectan las máquinas de la red
generan ficheros con la comunicación que se produce en la misma, como se comentó en la sección
3.2. Estos ficheros pueden ser analizados y representados con un analizador de redes. A continuación
se presentan las diferencias entre los dos switches propuestos y los problemas de los analizadores
convencionales que llevan al desarrollo de una aplicación propia.
Figura 4.1: Interfaz gráfica del Wireshark.
4.3.1.
uml switch y VDE switch: Generación de ficheros de captura.
uml switch
En el caso del conmutador propio de UML, uml switch, para ser capaz de capturar y monitorizar
los paquetes enviados por la red, se hace necesaria la introducción de una modificación sobre el
uml switch original. Esta modificación es el proyecto final de carrera de Esteban Martı́n para la
Universidad Politécnica de Madrid [10] y el nuevo elemento se denomina uml switch4capture (se
37
38
WSHARK CAPÍTULO 4. CAPTURA DE TRÁFICO EN LABXAR
Figura 4.2: TShark ejecutado en la lı́nea de comandos.
puede ver definido en el código de la figura 2.1). Usando este binario en la red de interés, se genera
un fichero en la ruta definida por la opción capture file de la etiqueta net que puede ser leı́do a
posteriori con un analizador de paquetes, como los presentados en las secciones 4.2.1 y 4.2.2.
Las figuras 4.3 y 4.4 muestran la salida de TShark para los ficheros generados con la comunicación
de la figura 2.3. La explicación de la disparidad en el número de paquetes es trivial observando el
esquema de la figura 2.2, ya que todos los paquetes destinados a una interfaz conectada a la red 1
han de pasar obligatoriamente por la red 0 (siendo capturados en ambos ficheros) pero no al revés.
Figura 4.3: Salida generada por TShark para la comunicación de la figura 2.3 sobre la red 1.
Limitaciones
Existen ciertas limitaciones sobre este sistema, basado en el uml switch con las modificaciones
para la captura de paquetes. Esto obliga a la búsqueda de alternativas para la generación del
38
WSHARK CAPÍTULO 4. CAPTURA DE TRÁFICO EN LABXAR
39
Figura 4.4: Salida generada por TShark para la comunicación de la figura 2.3 sobre la red 0
conmutador de red. Las limitaciones más importantes son las siguientes:
Empı́ricamente se ha comprobado que los ficheros generados con uml switch4capture tienen un
máximo de 1000 paquetes. Una vez se alcanza este número, los siguientes paquetes enviados por
la red serán completamente ignorados. Aunque para los escenarios tratados en el laboratorio,
es un número suficientemente grande, sigue suponiendo una limitación que puede ocasionar
problemas en algún caso puntual.
uml switch sólo permite interconectar máquinas virtuales generadas con UML. Esto puede
suponer un problema futuro.
No soporta las opciones de conformación de tráfico definidas como parte del proyecto [1].
VDE switch
VDE elimina las restricciones anteriores, permitiendo diferentes tecnologı́as para la generación
de máquinas virtuales, como el propio UML u otros métodos como qemu, Bochs o MPS. Varios de
estos métodos son multiplataforma, pudiendo alojar el sistema de virtualización sobre una máquina
corriendo cualquier sistema operativo.
Además, facilita las modificaciones requeridas para las funciones de conformación de tráfico
incluidas en LabXar (limitación, descarte y retardo).
Los ficheros de captura son de la misma forma que los del uml switch, haciendo sencilla la
migración del sistema.
39
40
WSHARK CAPÍTULO 4. CAPTURA DE TRÁFICO EN LABXAR
Si el lector desea más información al respecto, podrá encontrarla en la memoria del proyecto
final de carrera de Gustau Pérez [1].
4.3.2.
Acceso remoto a los datos de captura y presentación de la información
Una vez generado el entorno de trabajo, con el escenario simulado y la comunicación establecida,
es necesario dotar al alumno de una forma simple de observar qué está ocurriendo en la red. El uso
de Wireshark para leer los ficheros de salida, en alguna de las dos versiones explicadas en las
secciones previas 4.2.1 y 4.2.2, comportarı́a una gran ayuda de cara a entender cómo funciona
la comunicación en la red y comprobar la estructura y los diferentes campos que conforman los
datagramas estudiados en asignaturas anteriores. Sin embargo, ambas versiones aplicadas al caso
actual presentan sus propios problemas, que serán tratados en las siguientes secciones.
Problemas de uso de Wireshark con máquinas virtuales
Lo solución óptima serı́a poder utilizar la versión gráfica de Wireshark, ya que ofrece una interfaz
mucho más sencilla de entender y es mucho más fácil acceder a toda la información contenida en cada
uno de los paquetes enviados. Esto se consigue simplemente haciendo clic en el paquete deseado
y extendiendo los menús que aparecen. Además, en el momento en que se selecciona un campo
particular del datagrama, automáticamente se marcan los bytes que lo codifican en la representación
hexadecimal y ascii de la parte inferior de la interfaz, como puede verse en la imagen 4.5. Esto es
una ayuda enorme de cara a entender cómo los diferentes protocolos funcionan y saber qué efectos
producen las diferentes acciones que se ejecutan en las máquinas virtuales.
Fijándose en la figura 4.5 puede verse que, sin contar la barra de herramientas, el GUI (Graphical
User Interface) está dividido en tres regiones:
1. Muestra un resumen de la comunicación realizada sobre la red captura. Permite consultar en
una ojeada campos importantes, como las direcciones origen y destino, el tiempo de envı́o o
el protocolo del paquete.
2. Consiste en menús desplegables donde los campos padres son las diferentes encapsulaciones
del datagrama y los campos hijos van descendiendo hasta el detalle de los campos individuales
de cada uno de los protocolos, como podrı́a ser el campo de dirección ethernet destino o el
checksum del encapsulado IP.
3. Esta última sección contiene la representación hexadecimal y ascii del paquete completo.
Cuando se selecciona un campo particular en la región previa (de mayor o menor abstracción),
se marcan los bytes y los sı́mbolos que codifican ese campo.
Obviamente, el poseer toda esta información en la misma pantalla y en una forma sencilla de
interpretar permite al alumno entender mucho más fácilmente los entresijos de la red telemática.
Lamentablemente, el hecho de estar ejecutando múltiples máquinas virtuales y elementos virtuales de red para cada uno de los usuarios conectados sobre un único equipo host significa que
los recursos disponibles son limitados. La interfaz gráfica de Wireshark es muy potente pero, a su
vez, consume una cantidad de recursos considerable. Esto hace necesario buscar una alternativa que
permita suplir la funcionalidad que provee Wireshark con un consumo mucho menor. Aquı́ es donde
entra en escena su versión de lı́nea de comandos: TShark.
40
WSHARK CAPÍTULO 4. CAPTURA DE TRÁFICO EN LABXAR
41
Figura 4.5: Captura de Wireshark mostrando la información relativa al campo “host” del encapsulado HTTP en un paquete del mismo protocolo.
Problemas de uso de TShark para entorno docente
Como se comentó en la sección 4.2.2, TShark permite ejecutar todas las funcionalidades (o casi
todas) de Wireshark pero de una forma más compleja. Siendo toda la comunicación exclusivamente
a través de una terminal, el consumo de recursos es infinitamente menor.
A costa de esta mejora de recursos perderemos importantes ventajas de la interfaz gráfica, sobre
todo de cara a la docencia, como es la sencillez y la facilidad de acceso a la información. La triple
información comentada en la sección anterior (resumen, campos del datagrama, hexadecimal y ascii)
precisa de múltiples invocaciones al programa, y la información de salida se encontrará desperdigada
y con un formato complicado de entender y visualizar. Como ejemplo, la figura 4.6 muestra parte
del contenido de un fichero donde se ha volcado la salida de TShark referente a la información de
los campos del datagrama.
Como puede verse en dicha imagen, el formato es XML pero extenso y complejo de entender. Si
se está capturando de una red en vivo o el fichero que se está leyendo contiene un número elevado
de paquetes, la salida será larga y engorrosa.
Esto, añadido a otros problemas como dificultad extrema de visualizar estadı́sticas en texto
plano, hace que el uso de TShark de forma directa no sea la mejor solución de cara a su uso en
un laboratorio orientado a la docencia. Siendo éste uno de los primeros contactos prácticos de la
41
42
WSHARK CAPÍTULO 4. CAPTURA DE TRÁFICO EN LABXAR
Figura 4.6: Formato de salida pdml (información de los campos del datagrama) para un único
paquete con TShark.
mayor parte de los alumnos con estos temas, es necesario encontrar un compromiso entre las dos
propuestas comentadas.
Solución
Necesitamos pues una herramienta que proporcione una interfaz parecida a Wireshark, con un
consumo de recursos idealmente similar al de TShark. Asimismo, para facilitar la funcionalidad de
realización remota de la que consta el laboratorio virtual, la posibilidad de acceso desde cualquier
lugar, por ejemplo con un simple navegador, serı́a altamente deseable. Además, ninguna de las dos
opciones está preparada para tratar con ficheros que se van actualizando con los nuevos paquetes
que se envı́an por la red virtual. La solución debe solventar este problema y simular de una forma
lo más realista posible que la captura de los paquetes en la red se está realizando en tiempo real.
Para conseguir todas estas caracterı́sticas, se decide desarrollar una aplicación web que corra
en los principales navegadores. Esta aplicación parsea la información de salida de TShark y añade
(a través de diferentes lenguajes de programación web) parte de las diferentes funcionalidades de
Wireshark, como los menús desplegables, las gráficas de las estadı́sticas o los filtros. Además, incluye
funcionalidades nuevas como la versión Stand-Alone o la carga de diferentes ficheros.
Se ha decidido llamar a esta aplicación wShark (de w ebShark ) y el siguiente capı́tulo la explica
en detalle.
42
Parte II
Aplicación web para la monitorización
de redes virtuales: wShark
43
Capı́tulo 5
wShark
wShark (abreviación de WebShark) es una aplicación web que permite monitorizar el tráfico de la
red virtual generada con LabXar como se ha explicado en capı́tulos anteriores. wShark utiliza como
base TShark para leer los ficheros capturados en la red y muestra su contenido de forma sencilla
e interactiva, más cercana a la interfaz gráfica de Wireshark que a la lı́nea de comandos de éste.
Asimismo, añade funcionalidades como la posibilidad de leer de forma autónoma (sin necesidad de
generar ninguna red previamente) ficheros de captura en la nube. Cualquier usuario puede acceder
a la aplicación web desde un navegador y subir y visualizar sus propios ficheros de captura sin
necesidad de tener instalado ningún programa de monitorización de red e independientemente del
sistema operativo que esté usando.
En las siguientes secciones se explicará, entre otras cosas, la estructura de la aplicación, las
diferentes versiones y las funcionalidades que ofrece. Finalmente, se tratará de explicar de forma
general el funcionamiento interno de la aplicación y algunas decisiones sobre la algoritmia y el diseño
apoyándose en fragmentos representativos del código fuente.
5.1.
Estructura del programa
Prácticamente cualquier proyecto de diseño web implica una amplia diversidad de tareas de
diferentes ámbitos y especialidades, ya que se han de tener en cuenta temas como navegabilidad,
interactividad, usabilidad, arquitectura de la información y diseño multimedia de la página. Esto
lleva a una labor que comprende multitud de lenguajes de programación orientados a las diferentes
tareas a realizar y a la necesidad de una planificación correcta de la estructura y la interacción entre
las diferentes partes que componen la aplicación completa.
Toda la programación de una aplicación web se divide en dos parte principales: front-end y
back-end. El front-end comprende las partes que se ejecutan en el ordenador del cliente y con las
que éste puede interaccionar. El back-end son las partes del código ejecutadas en el propio servidor,
que gestionan las peticiones y interactúan con los ficheros y las bases de datos. Cada parte consta de
diferentes lenguajes especı́ficos que serán tratados a continuación. Para obtener mayor información
sobre la estructura de la aplicación y la comunicación entre sus diferentes partes, pueden consultarse
los anexos A y B. El código fuente completo de los siguientes ejemplos (ası́ como de otras partes de
la aplicación) puede consultarse en el apéndice C: Código fuente de wShark.
45
46
WSHARK CAPÍTULO 5. WSHARK
5.1.1.
Lenguajes y herramientas
La suma de los siguientes lenguajes y utilidades web constituye la base en la que se sustenta
wShark. Cada uno de ellos tiene una función especı́fica que se tratará de explicar de forma general:
HTML
HTML (HyperText Markup Language) es el lenguaje básico para crear el “esqueleto” de la página
web. A través de las diferentes etiquetas del lenguaje, se diseña la estructura de la página web, como
el texto plano, las imágenes o las distintas secciones.
El código 5.1 muestra un fragmento de código HTML de una de las páginas principales de
wShark:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</head>
<body>
<div id="header">
<img src="images/entel_logo.jpg" style="float: left;" alt=""/>
<img src="images/ETSETB2.jpg" style="float: right;" alt="" />
</div>
<div id="body">
<img src="images/wSharkLogoBlack.png" id="wLogo" alt="" />
<div id="dialog">
<h1>
<script type="text/Javascript">
document.write(manageLanguage("Welcome") + "wShark!");
</script>
</h1>
<div id="file-uploader">
</div>
<!−− <button type=”button” id=”buttonSingle” value=”File”>File</button>
<button type=”button” value=”Directory”>Directory</button> −−>
</div>
</div>
<div id="foot">
Código 5.1: Ejemplo de HTML en el proyecto. Se pueden diferenciar distintas etiquetas, como la
que delimita el “cuerpo” (<body>) de la página o la que permite introducir imágenes
(<img>).
CSS
CSS (Cascading Style Sheets) se usa para definir la presentación de un documento estructurado
en HTML. A través de él se pueden definir el estilo de los diferentes elementos de la página, desde el
color que debe mostrar hasta su tamaño y forma. Es un lenguaje sencillo pero potente, que permite
dotar a la página de su propia “personalidad”. Para dar formato a un documento HTML se puede
incluir el código CSS en las propias etiquetas, como un preámbulo al principio del documento o en
un fichero aparte, lo cual es más común debido a la facilidad posterior de edición y reutilización.
El código 5.2 muestra un fragmento de la hoja de estilo de la página principal de wShark.
46
WSHARK CAPÍTULO 5. WSHARK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
47
.empty−cell {
overflow:hidden;
}
table { font−family: monospace; color: #000; border−top:2px solid black; border−collapse: collapse; border−
spacing: 10px !important; }
th { font−family:Helvetica; text−align:left !important; padding: 5px; font−weight: bold; vertical−align:bottom;}
th:last−child { border−right: none; }
table#summary td:last−child { white−space: nowrap; overflow: hidden; position: absolute; }
#summary { width: 100 %; }
#summary tbody td { cursor: pointer; font−size: 14px; overflow: auto !important }
tr.picked { background−color: rgb(167, 203, 253); border: 1px solid #3691FB; }
#wholeSummary { width: 100 %; height: 50 %; overflow−x: auto; overflow−y: auto; }
Código 5.2: Extracto del documento CSS que define el estilo de la interfaz principal de wShark.
Pueden observarse, entre otras cosas, parte de los atributos asociados al sumario central.
XML
XML (Extensible Markup Language) es un lenguaje de marcado (como HTML) que define una
serie de normas para codificar documentos en un formato legible tanto para personas como para
máquinas. Se trata de una lenguaje de etiquetas donde cada una de ellas define su propio contenido.
Esto se entiende mejor viendo el código 5.3, que se trata de un extracto de un fichero de salida de
TShark.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
<psml version="0" creator="wireshark/1.6.7">
<structure>
<section>No.</section>
<section>Time</section>
<section>Source</section>
<section>Destination</section>
<section>Protocol</section>
<section>Length</section>
<section>Info</section>
</structure>
<packet>
<section>1</section>
<section>0.000000</section>
<section>::</section>
<section>ff02::16</section>
<section>ICMPv6</section>
<section>130</section>
<section>Multicast Listener Report Message v2</section>
</packet>
Código 5.3: Estructura en XML del fichero de salida de TShark para el sumario de paquetes. La
codificación en este caso no es demasiado detallada, diferenciando sólo tres tipos de
elementos.
47
48
WSHARK CAPÍTULO 5. WSHARK
XML DOM
DOM (Document Object Model ) define un estándar para interactuar y actualizar el contenido,
estructura o estilo de un documento XML o HTML. Muchos de los ficheros de salida con los que
trabaja wShark siguen un estilo de árbol XML (ver figura 5.1) lo cual nos lleva al uso de este tipo
de interfaz estándar para interactuar y actualizar la información contenida en los ficheros sobre la
interfaz principal de wShark (como el sumario o los detalles de los paquetes).
Figura 5.1: Estructura en árbol XML DOM adoptada por muchos de los archivos a leer de TShark.
Javascript
Javascript es el principal lenguaje de programación usado en el front-side, previamente definido,
y el principal lenguaje usado en este proyecto. Como ya se ha dicho, corre en el lado del cliente y
simula todos los comportamientos de la versión gráfica de Wireshark. Es el que permite seleccionar
paquetes, extender los menús, simular las capturas en vivo o detectar las interacciones del teclado,
entre muchas otras cosas. Javascript gestiona todos los eventos que van apareciendo en la página y
ejecuta el código indicado para cada uno de ellos.
El código 5.4 muestra un fragmento de código Javascript que gestiona la selección del ascii
correspondiente al campo escogido del paquete.
1
2
3
4
5
6
7
8
9
10
11
function selectAscii(field)
{ // select (blue color) ascii and hexadecimal info of the field picked in details table
var classType = field.getAttribute("class");
if (!((classType == "protocol") || ((classType == "parent field"))))
{ // not protocol nor parent field (not expanded)
if (!subFieldsExpanded)
{
var position = field.getAttribute("pos");
var size = field.getAttribute("size");
position = parseInt(position);
48
WSHARK CAPÍTULO 5. WSHARK
12
13
14
15
16
17
18
19
20
21
22
23
24
49
//pickJustThisPacket(document.getElementById("h0"),'');
for (var i = 0; i < size; i++)
{
var hexadecimal = document.getElementById("h" + (position + i));
var ascii = document.getElementById("d" + (position + i));
hexadecimal.setAttribute("class", "h ascii-selection");
ascii.setAttribute("class", "d ascii-selection");
}
}
}
}
Código 5.4: Extracto del fichero Javascript que gestiona los eventos en la web. Esta función
selecciona los valores ascii que serán marcados por el CSS.
PHP
PHP (Hypertext Preprocessor ) es el principal lenguaje de programación usado en el back-side.
Es un lenguaje de programación interpretado, diseñado para la creación de páginas web dinámicas,
que suele correr en el lado del servidor. PHP recoge la información volátil solicitada por la página
y que se encuentra almacenada en ficheros o bases de datos y el servidor web con un procesador
PHP genera la página web resultante.
El código mostrado en 5.5 es el código PHP que se ejecuta cuando es necesario llamar a TShark
para actualizar los datos usados para generar las gráficas.
1
2
3
4
5
6
7
8
9
10
11
<?php
$interval = $ GET['interval'];
$file = "../" . $ GET['path'] . $ GET['net'];
if (file exists($file)) {
shell exec("tshark -r " . $file . " -q -z io,stat," . $interval . " > ../" . $ GET['path'] . "
statsDensity.txt");
}
else echo "Session Expired";
?>
Código 5.5: Código PHP que ejecuta TShark en el servidor y actualiza el fichero de salida para las
estadı́sticas que será leı́do por el Javascript en el lado del cliente.
Ajax
AJAX es un acrónimo de Asynchronous Javascript and XML y es un conjunto de técnicas en el
desarrollo web que permiten crear aplicaciones interactivas. Estas aplicaciones se ejecutan en el lado
del cliente, es decir, en el navegador de los usuarios, mientras se mantiene la comunicación ası́ncrona
con el servidor en segundo plano. De esta forma es posible realizar cambios sobre las páginas sin
necesidad de recargarlas, lo que significa aumentar la interactividad, velocidad y usabilidad en las
aplicaciones.
49
50
WSHARK CAPÍTULO 5. WSHARK
En este caso particular, AJAX permite ejecutar el PHP que actualiza los ficheros de captura en
el servidor y recibir la nueva información a mostrar en wShark. El código siguiente, 5.6, muestra
una petición AJAX al servidor en Javascript plano.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function ()
{
if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) {
var str = xmlhttp.responseText;
if (str != "Session Expired") {
$.get('php/session.php');
globalError = (str.substring(0, str.indexOf(" %")));
ascii = str.substring(str.indexOf(" %") + 1);
fileReady = true;
newPackets = true;
}
else manageErrors("Session Expired");
}
}
xmlhttp.open("GET", "php/changeFile.php?net=" + net + "&path=" + path + "&lastPacket=" +
lastPacket +
"&packet=" + packetPDML + "&filter=" + CaptureFilter, true);
xmlhttp.send();
}
}
Código 5.6: Petición AJAX que recibe la respuesta del fichero PHP ejecutado en el servidor en una
variable del tipo XMLHttpRequest y la procesa conforme al código Javascript de la
función.
jQuery
jQuery es un framework o librerı́a de Javascript diseñada para simplificar la manera de interactuar con los documentos HTML, manipular los árboles DOM, manejar eventos, desarrollar
animaciones y gestionar peticiones AJAX. jQuery es una librerı́a más usada y más popular de
Javascript en la actualidad, y su soporte está ampliamente extendido.
En wShark, jQuery ha sido añadido en los últimos pasos del desarrollo debido a que algunas
de las librerı́as integradas en el proyecto (menús, generación gráficas, etc) precisan de su uso – ya
que están desarrolladas con este framework. Asimismo, una vez integrado, algunas de las funciones
nuevas de la aplicación han sido desarrolladas utilizándolo, debido a su simplicidad y potencia.
En el siguiente fragmento de código 5.7 se puede observar el uso de jQuery en la generación de
estadı́sticas.
50
WSHARK CAPÍTULO 5. WSHARK
1
2
3
4
5
6
7
51
$.ajax({url:"php/statsDensity.php", data: { interval: intervals, path: path, net: CaptureNet},
success: function(response) {
if (response != "Session Expired") {
$.get(path+'statsDensity.txt'+'?nocache='+Math.random(), function(data) {
var lines = data.split("\n");
var series = {
name: "",
Código 5.7: Fragmento de jQuery, que se diferencia del Javascript normal por comenzar por el
sı́mbolo $, y que genera parte de las gráficas asociadas a las estadı́sticas de wShark.
5.2.
Versiones previas
Debido a la necesidad de la aplicación para el uso docente de la plataforma, existen diferentes
versiones funcionales de wShark que han sido utilizadas a lo largo del tiempo. A través de ellas,
puede verse la evolución del programa, desde sus funcionalidades mı́nimas hasta el estado actual de
desarrollo.
5.2.1.
wShark v0.7
Como se puede ver en la figura 5.2, no sólo las funcionalidades del entorno gráfico de Wireshark
se han tomado como modelo, sino también su diseño, haciendo más fácil al alumno la integración
con la nueva herramienta.
Figura 5.2: Una de las primeras versiones funcionales de wShark
51
52
WSHARK CAPÍTULO 5. WSHARK
Esta versión permite visualizar los paquetes que se están enviando por la red y simula su llegada
como si se estuviesen capturando en tiempo real – y no almacenándose en un fichero, como es el caso.
Permite seleccionar el paquete deseado y expandir los menús que incluyen la información especı́fica
de los campos del datagrama. Además implementa las primeras aproximaciones a funcionalidades
como el cambio de red (menú en la parte superior derecha de la pantalla) – que permite visualizar
por separado las distintas subredes independientes de la red virtual – o el filtrado de paquetes. A
pesar de ello, carece todavı́a de ciertos aspectos fundamentales como es la sección con la codificación
ascii y hexadecimal del paquete. La casilla de Aturar captura permite dejar de actualizar la captura
y ası́ poder moverse más fácilmente por los paquetes ya mostrados.
5.2.2.
wShark v1.0
Esta versión es la primera final que se integró con la plataforma y ha sido usada oficialmente
para las prácticas. En la figura 5.3 se puede comprobar que la parte principal de la interfaz ya se
encuentra completa y que las tres regiones de las que consta el Wireshark y de las que se habló en
la sección 4.3.2 se encuentran fielmente reproducidas aquı́.
Figura 5.3: wShark v1.0. Esta versión fue la usada en la primera versión completa de la plataforma,
en conjunción con el sistema de generación de las redes virtuales.
La cabecera ha cambiado ligeramente, perdiendo uno de los logos y mejorando la interfaz para
detener la captura. Asimismo, la sección ascii y hexadecimal funciona de la misma forma que en
Wireshark, marcando la región correspondiente al campo seleccionado en estas dos codificaciones.
Como se ha comentado previamente, los principales bloques que se pueden observar son cuatro:
52
WSHARK CAPÍTULO 5. WSHARK
53
1. La cabecera con diferentes opciones de control de la simulación.
2. Un sumario de los paquetes que se han enviado por la red analizada con información relevante
como el instante en el que se ha captado, relativo al primer paquete enviado; su dirección de
origen y destino o el protocolo que utiliza.
3. Menú desplegable con información detallada incluida en el paquete de cada una de sus cabeceras y secciones.
4. Contenido del paquete en hexadecimal y ascii, que nos permitirá observar cómo está codificada
cada una de las cabeceras y secciones mentadas en el punto anterior.
A diferencia del Wireshark, si la arquitectura de la red hace que ésta esté dividida en diferentes
subredes, nuestro programa permite cambiar de una a otra de forma rápida a través del menú desplegable de la esquina superior derecha de la pantalla. A través de este menú se puede cambiar de
subred de forma dinámica sin necesidad de volver a cargar la página.
En la siguiente captura, figura 5.4, puede verse dicho cambio en el menú desplegable, el funcionamiento del filtrado de paquetes y cómo cambia la interfaz de captura cuando se detiene.
Figura 5.4: Paquetes de la subred 0 – iguales a los de la figura 5.2 – filtrados para mostrar únicamente
los paquetes del protocolo arp.
Estas versiones, aún siendo funcionales, se encontraban todavı́a en una fase muy básica, careciendo de funciones muy interesantes para facilitar la comprensión de los eventos de la red. Por ello,
el desarrollo siguió avanzando hacia la versión final.
53
54
5.3.
WSHARK CAPÍTULO 5. WSHARK
Version final
El trabajo principal para la versión final es añadir funcionalidades nuevas, desde estadı́sticas
a funciones de navegación y guardado. Además, se añade la posibilidad de utilizar la aplicación
en solitario, permitiendo a los usuarios entrar a la página web de wShark y subir y visualizar sus
propias capturas de redes aunque no dispongan de ningún software especı́fico para ello.
En esta sección se tratará primero la versión integrada en LabXar, con la simulación de captura
en tiempo real – ya que es la que originó inicialmente el proyecto –, y después se comentarán
las motivaciones de la versión en solitario y la decisión de licenciar el proyecto bajo una licencia
GPL, haciendo accesible el código al público general. Para leer en detalle el texto de la licencia,
se puede consultar el apéndice E – en inglés, ya que no existen traducciones oficiales de la misma.
Se diferenciará también entre las funcionalidades de las dos versiones ya que existen opciones que
sólo tienen sentido en una de ellas por lo que sólo son accesibles en la adecuada (como el detener
y reanudar la captura, que no tiene cabida en la versión autónoma). Además, se introducen por
primera vez los logos diseñados especı́ficamente para la aplicación. En el Apéndice D: Logos puede
consultarse más información sobre el diseño y el significado de los mismos.
5.3.1.
Versión integrada en LabXar de wShark
Esta es la versión que se ejecuta con la red virtual generada. Una vez el usuario accede a LabXar
y genera la red a simular, la propia herramienta proporciona un enlace a una instancia de wShark
asociada a la comunicación de dichas máquinas virtuales.
Figura 5.5: Red virtual iniciada y comunicación con la misma mediante telnet.
54
WSHARK CAPÍTULO 5. WSHARK
55
La figura 5.5 (es la misma imagen que la figura 3.3 del capı́tulo de explicación de LabXar)
muestra la comunicación con la red generada y el enlace a wShark en la plataforma.
Cualquier comunicación que se realice a través de la lı́nea de comandos abierta, que se trata de
nuestra ventana a la red virtual, se verá reflejada casi instantáneamente en wShark. En la figura
5.6 puede observarse la ventana principal de wShark en el estado de apertura de la comunicación,
habiendo intercambiado sólo los paquetes de inicio. En la siguiente imagen, figura 5.7, puede verse
cómo los paquetes ARP y los paquetes ICMP del ping generado en la terminal de la esquina inferior
derecha aparecen en el sumario de la comunicación de red.
Figura 5.6: Interfaz final de wShark. Los paquetes que aparecen son los generados al iniciar la
comunicación de la red virtual.
Como se puede observar en las imágenes anteriores, los cambios entre esta versión y las previas se
han producido principalmente en la cabecera. Comenzando por la parte superior izquierda, puede
apreciarse uno de los nuevos logos de la aplicación, seguido por la información del estado de la
captura, la red de la que se está capturando, el filtro aplicado y el idioma. Finalmente, la introducción
del menú ayuda a poder acceder fácilmente a todas las nuevas funciones que no tenı́an espacio en
las cabeceras anteriores.
Para entender mejor las funcionalidades incluidas, se hablará en más detalle de cada uno de los
apartados del mencionado menú. En este caso se mencionarán las funciones comunes con la versión
Stand-Alone y las propias de la esta versión. En el apartado de la aplicación autónoma sólo se
recogerán las diferencias con las ya mentadas aquı́.
55
56
WSHARK CAPÍTULO 5. WSHARK
Figura 5.7: Los pings enviados en 5.5 son recibidos y mostrados en el sumario de wShark.
Fichero
En la figura 5.8 se pueden observar las diferentes opciones a seleccionar en el menú de Fichero
en wShark:
Guardar: Permite almacenar en el disco duro, en formato .cap, la captura que se está mostrando para poder visualizarla en cualquier momento con otro analizador de redes o con la
versión Stand-Alone de wShark.
Guardar (filtro): Igual que la anterior pero aplicando al fichero el filtrado que se esté usando
en la captura.
Guardar todas las redes: Cuando se está capturando más de una red, esta opción crea un
archivo .zip con los ficheros .cap de cada una de las redes y lo guarda en el disco.
Guardar todas las redes (filtro): Combinación de las dos anteriores opciones, almacenando
un .zip con todas las redes filtradas en el disco.
56
WSHARK CAPÍTULO 5. WSHARK
57
Figura 5.8: Menú Fichero de wShark.
Ir
En la figura 5.9 se pueden ver las diferentes opciones de navegación de paquetes que se pueden
seleccionar en el menú Ir en wShark:
Siguiente Paquete: Selecciona el siguiente paquete al que está seleccionado, actualizando el
menú desplegable de los campos y el hexadecimal y ascii.
Anterior Paquete: Selecciona el paquete anterior.
Primer Paquete: Selecciona el primer paquete de la captura actual y mueve el scroll al
comienzo.
Último Paquete: Selecciona el último paquete de la captura actual y mueve el scroll al final.
Estas funciones pueden realizarse también con el teclado, pulsando respectivamente las flechas
de dirección y los botones de Inicio y Fin.
57
58
WSHARK CAPÍTULO 5. WSHARK
Figura 5.9: Menú Ir de wShark.
Captura
La figura 5.10 muestra las dos secciones del menú de captura: gestión de redes y captura live.
Gestionar Redes
• Cambiar red: Abre una ventana modal (ver figura 5.11) que permite seleccionar entre
las diferentes redes disponibles para capturar en la simulación.
Captura Live
• Play: Reanuda la simulación de captura, detectando cambios en el fichero y reflejándolos
en wShark como nuevos paquetes que aparecen en el sumario.
• Stop: Detiene la simulación de captura, deteniendo las consultas AJAX que comprueban
si ha habido cambios en los ficheros de captura.
Estadı́sticas
La generación de gráficas y estadı́sticas para visualizar entender mejor la información de wShark
es una de las funcionalidades principales implementadas. Como se puede ver en la figura 5.12, las
funciones disponibles son:
58
WSHARK CAPÍTULO 5. WSHARK
59
Figura 5.10: Menú Captura de wShark.
Figura 5.11: Ventana modal para seleccionar el cambio de red.
59
60
WSHARK CAPÍTULO 5. WSHARK
Figura 5.12: Diferentes estadı́sticas referentes a la información de wShark.
Información del Fichero
• Información General: despliega una ventana modal con información sobre el archivo
.cap del que se está sacando información sobre los paquetes. Entre la información incluido
se cuenta el nombre del fichero, su tipo, la fecha de captura o su MD5 (ver figura 5.13).
Figura 5.13: Ventana modal con información genérica sobre el fichero del que se está capturando.
60
WSHARK CAPÍTULO 5. WSHARK
61
• Información Jerárquica: muestra el número de paquetes y bytes de cada tipo de
encapsulación por protocolos de forma jerárquica, organizado en árbol horizontal (ver
figura 5.14).
• Conversaciones de Protocolos: permite escoger entre diferentes protocolos y ver
qué tramas se han intercambiado del mismo y cómo se ha producido la comunicación
a lo largo de todo el fichero, incluyendo el número de paquetes y bytes que se han enviado en cada dirección para cada una de las diferentes entradas (ver figuras 5.15 y
5.16).
Figura 5.14: Ventana modal con información organizada jerárquicamente referente a los protocolos
incluidos en los diferentes de paquetes enviados.
Figura 5.15: Menú, sobre la ventana modal, para la selección de conversaciones de diferentes protocolos
61
62
WSHARK CAPÍTULO 5. WSHARK
Figura 5.16: Información, en este caso, sobre las diferentes conversaciones del protocolo ethernet en
la captura..
Gráficas
• Densidad: ayudado del módulo jQuery para representar gráficas, highcharts, muestra
la distribución de paquetes o bytes a lo largo del tiempo de captura (ver figuras 5.17 y
5.18).
• Densidad Dinámica: Igual que la anterior, pero actualizándose dinámicamente con los
paquetes o bytes que van llegando a la captura (ver figura 5.19).
Figura 5.17: Menú sobre la ventana modal para escoger si se desea mostrar la gráfica de la densidad
de paquetes o de bytes.
62
WSHARK CAPÍTULO 5. WSHARK
63
Figura 5.18: Gráfica colocada sobre la ventana modal del número de paquetes frente al intervalo
temporal de captura.
Figura 5.19: Gráfica del número de bytes frente al intervalo temporal de captura que se actualiza
de forma dinámica con los nuevos paquetes que llegan en la simulación.
63
64
WSHARK CAPÍTULO 5. WSHARK
Idioma
El menú de la figura 5.20 permite escoger entre diferentes idiomas de forma dinámica. Las
lenguas incluidas en la actualidad son:
Inglés.
Castellano.
Catalán.
Gallego.
Euskera.
Figura 5.20: Menú para escoger el lenguaje de la interfaz de wShark.
Filtro
Esta opción despliega otra ventana modal que permite introducir el filtro de captura deseado,
desde el protocolo (por ejemplo, arp o icmp) o expresiones más complejas como sólo mostrar el
tráfico proveniente de una ip en particular (ip.src == 147.83.39.145 ). En la figura 5.21 puede verse
este último ejemplo.
Figura 5.21: Ventana modal para aplicar un filtro a la captura.
64
WSHARK CAPÍTULO 5. WSHARK
5.3.2.
65
Stand-alone wShark
La motivación detrás de la versión autónoma de wShark es que cualquier persona del mundo,
desde cualquier equipo con cualquier sistema operativo, que desee consultar un fichero de tipo pcap
con el tráfico capturado en una red, pueda hacerlo simplemente conectándose a la web y subiendo
sus archivos.
Se puede acceder a esta versión de wShark a través de la dirección www.wshark.org y la página
principal puede verse en la figura 5.22.
Figura 5.22: Página de inicio de la versión Stand Alone de wShark.
En la imagen se puede observar un diseño minimalista, con el logo principal de wShark dominando la página. El menú de subida de ficheros permite hacer clic en el botón y navegar el disco
duro, escogiendo los ficheros a subir, o arrastrarlos y soltarlos directamente. Una vez subidos, se
carga la página con la interfaz que muestra el tráfico, como en la versión normal pero cambiando
algunas de las funcionalidades que no tienen sentido en esta versión. Haciendo clic en la lı́nea de
“Cambiar Idioma” se abre una ventana modal permitiendo escoger la lengua en la que mostrar la
página, como puede verse en la imagen 5.23. Esta elección se mantendrá en la interfaz de wShark
en sı́, con los ficheros subidos del usuario
Las diferencias principales que pueden observarse en los diferentes menús son:
65
66
WSHARK CAPÍTULO 5. WSHARK
Figura 5.23: Ventana modal para seleccionar el idioma en la página de inicio de la versión Stand
Alone de wShark.
Fichero
Las opciones de guardado se eliminan (ya que todos los ficheros han sido subidos por el usuario).
Se añaden nuevas entradas:
Nuevo: Elimina la sesión actual de usuario y los ficheros subidos y reenvı́a a la página inicial
para poder subir nuevos archivos.
Cambiar: Permite cambiar entre los diferentes ficheros subidos de forma dinámica, de la
misma forma que antes se podı́a cambiar de red (ver figura 5.24).
Figura 5.24: Ventana modal para cambiar entre los diferentes ficheros subidos.
66
WSHARK CAPÍTULO 5. WSHARK
67
Captura
Se elimina completamente, perdiendo el sentido en esta versión, ya que no se está simulando
ninguna captura en vivo.
Estadı́sticas
Se mantienen todas las estadı́sticas a excepción de la que se actualiza dinámicamente, ya que
no tiene ningún sentido debido a que los ficheros subidos son estáticos.
5.4.
Algoritmia y estructura interna de la aplicación
En esta sección se muestran algunas pinceladas de cómo se ha codificado wShark para obtener
los resultados finales. Sólo se incluyen consideraciones generales y deliberadamente se obvian pasos
intermedios para evitar extender demasiado el capı́tulo. El objetivo es enseñar las partes más importantes del código y de los algoritmos utilizados, a través de unos pocos casos particulares, para
entender mejor la aplicación en sı́.
Para profundizar más en el tema se puede revisar el apéndice C: Código fuente de wShark, que
contiene el código completo de las funciones de las que aquı́ se incluyen fragmentos ası́ como el
código fuente de otras partes relevantes del proyecto.
5.4.1.
Muestreo del fichero de captura
Como ya se ha dicho previamente, la información de la salida mostrada en el navegador se
encuentra codificada en el fichero de captura en formato .pcap. TShark se encarga de decodificarla,
procesarla y mostrarla en un formato más accesible. La información básica necesaria para iniciar
wShark se consigue invocando TShark con tres formatos de salida distintos: psml (packet summary
markup language), pdml (packet details markup language) y hexadecimal/ascii. Puede verse cómo
se generan los tres ficheros de salida en estos formatos usando PHP en el código 5.8.
1
2
3
shell exec($tshark." -r " . $file . " -T psml -R 'frame.number > " . $ GET['lastPacket'] . " "
. $filter . "' > ".$vnuml working dir.$ SESSION['usuari']."/psml.xml";
shell exec($tshark." -r " . $file . " -T pdml -R 'frame.number == " . $ GET['packet'] ."' > ".
$vnuml working dir.$ SESSION['usuari']."/pdml.xml";
shell exec($tshark." -r " . $file . " -x -R 'frame.number == " . $ GET['packet'] ."' > ".
$vnuml working dir.$ SESSION['usuari']."/ascii.txt";
Código 5.8: changeFile.php, ejecuta TShark en el servidor genreando los ficheros de salida con los
formatos psml, pdml y ascii
Se ha de usar PHP para esto, ya que es el lenguaje de la parte del servidor que puede interactuar
con los ficheros almacenados en él. El código completo de este fichero puede consultarse en C.6.
Información más completa de la comunicación que se produce entre el cliente y el servidor al
iniciar wShark puede encontrarse en el apéndice B y en particular en la figura B.1.
67
68
WSHARK CAPÍTULO 5. WSHARK
PSML
Este es el formato que genera la información del sumario. Esto significa que el XML del fichero
de salida (código 5.9) ha de ser transformado a un HTML de la forma que se puede ver en el código
5.10.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<packet>
<section>1</section>
<section>0.000000</section>
<section>::</section>
<section>ff02::16</section>
<section>ICMPv6</section>
<section>130</section>
<section>Multicast Listener Report Message v2</section>
</packet>
<packet>
<section>2</section>
<section>0.279999</section>
<section>::</section>
<section>ff02::1:ff00:101</section>
<section>ICMPv6</section>
<section>78</section>
<section>Neighbor Solicitation for fe80::fcfd:ff:fe00:101</section>
</packet>
Código 5.9: psml.xml, fragmento del fichero de salida en formato XML con la información del
sumario de wShark.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<tr class="" onmousedown="packetDetails(this)" id="">
<td>1</td>
<td>0.000000</td>
<td>::</td>
<td>ff02::16</td>
<td>ICMPv6</td>
<td>130</td>
<td>Multicast Listener Report Message v2</td>
</tr>
<tr class="" onmousedown="packetDetails(this)">
<td>2</td>
<td>0.279999</td>
<td>::</td>
<td>ff02::1:ff00:101</td>
<td>ICMPv6</td>
<td>78</td>
<td>Neighbor Solicitation for fe80::fcfd:ff:fe00:101</td>
</tr>
Código 5.10: Información del código XML 5.9 codificada en HTML para mostrarla en el sumario de
wShark
Para ello, se recibe la estructura XML en formato árbol DOM en una variable de respuesta de
AJAX y con javascript se procesan los datos. Con javascript se escribe también el HTML resultante.
68
WSHARK CAPÍTULO 5. WSHARK
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
69
for (i = 0; i < x.length; i++)
{ // all <packet> from file
y = x[i].childNodes; // y tree from section
var row = document.createElement("tr");
row.setAttribute("class", "");
for (j = 1; j < y.length; j = j + 2)
{ // j + 2 because text type is in the odd positions
var cell = document.createElement("td");
if (y[j].childNodes.length != 0)
var cellText = document.createTextNode(y[j].childNodes[0].nodeValue); // Each section's value
cell.appendChild(cellText);
row.appendChild(cell);
}
row.setAttribute('onmousedown', 'packetDetails(this)');
if (i == 0) {
row.setAttribute('class', 'picked'); // pdml details from first packet by default
row.setAttribute('id','picked'); // needed to navigate packets
}
tabla.appendChild(row);
}
Código 5.11: io.js, el bucle recorre la estructura en árbol del código 5.9 creando los elementos HTML
necesarios para generar el código 5.10.
En particular, en el código 5.11 el primer bucle en la lı́nea 1 selecciona cada uno de los paquetes
y el segundo bucle (lı́nea 6) permite acceder a los campos de texto en cada uno de ellos. Como
puede verse, en las lı́neas 4 y 8 se crean las etiquetas tr y td de HTML y en la 12 el campo de texto
que encierran. Es interesante hacer mención aparte al código de la lı́nea 17 – donde se define qué se
debe hacer cuando se hace clic en el paquete – y a las lı́neas 19 y 20 que definen la clase y el id del
paquete que empieza escogido por defecto.
PDML
Del mismo modo que en la sección anterior, se debe transformar la información del código 5.12
en la del código 5.13. En este caso, las etiquetas y los atributos son más complejos ya que se deben
poder expandir y contraer los campos al hacer clic en ellos.
1
2
3
<field name="eth.dst" showname="Destination: IPv6mcast_00:00:00:16 (33:33:00:00:00:16)" size="6"
pos="0" show="33:33:00:00:00:16" value="333300000016">
<field name="eth.addr" showname="Address: IPv6mcast_00:00:00:16 (33:33:00:00:00:16)" size="6"
pos="0" show="33:33:00:00:00:16" value="333300000016"/>
<field name="eth.ig" showname=".... ...1 .... .... .... .... = IG bit: Group address (
multicast/broadcast)" size="3" pos="0" show="1" value="1" unmaskedvalue="333300"/>
Código 5.12: psml.xml, fragmento del fichero de salida en formato XML con la información de los
detalles de un paquete en wShark.
El código javascript es más complejo pero similar al de la sección anterior. Puede consultarse
ı́ntegro en el apéndice C en el código C.10.
69
70
1
2
3
4
5
6
7
8
WSHARK CAPÍTULO 5. WSHARK
<div id="eth" class="protocol picked expanded" size="14" pos="0">
<span class="protoLabel" onmousedown="expandClass(this.parentNode)" style="cursor:pointer">Ethernet
II, Src: fe:fd:00:00:01:01 (fe:fd:00:00:01:01), Dst: IPv6mcast 00:00:00:16 (33:33:00:00:00:16)</span>
<div id="eth.dst" class="parent field" size="6" pos="0">
<img class="" align="left" src="images/arrow-rigth12px.png">
<span class="fieldLabel" onmousedown="expandClass(this.parentNode)" style="cursor:pointer">
Destination: IPv6mcast 00:00:00:16 (33:33:00:00:00:16)</span>
<div id="eth.addr" class="field" size="6" pos="0">
<span class="fieldLabel" onmousedown="expandClass(this.parentNode)">Address: IPv6mcast 00:00:00:16
(33:33:00:00:00:16)</span>
</div>
Código 5.13: Información del código XML 5.12 codificada en HTML para mostrarla los detalles de
paquete de wShark
Es interesante hacer notar que la salida pdml de TShark se filtra, almacenando los detalles de
un único paquete en el fichero de salida. Esto puede hacerse ya que sólo se muestra al mismo tiempo
la información del paquete seleccionado entre todos los del sumario. Además, aunque serı́a más
rápido de procesar – no habrı́a que solicitar los datos al servidor y ejecutar TShark cada vez que se
selecciona otro paquete – no serı́a viable guardar la información de todos al mismo tiempo. Como
puede verse en C.8, la descripción de cada uno de los paquetes es extensa, haciendo crecer muy
rápido el tamaño del fichero si se guardase la información pdml de todos ellos.
Hexadecimal y ascii
Estos datos se reciben en texto plano, ası́ que la única diferencia en este caso es que, en vez de
recorrer árboles XML, se ha de procesar los datos con funciones de tratamiento de cadenas, como
puede verse en 5.14.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (var i = 0; i < 16; i++)
{ // 16 hex values per file
text = aux.substr(0, aux.indexOf(" "));
aux = aux.substr(aux.indexOf(" ") + 1);
if (!(text == ""))
{
var spanText = document.createTextNode(text);
span = document.createElement("span");
span.setAttribute("class", "h");
span.setAttribute("id", "h" + (i + index)); // used to select this packets when needed
span.appendChild(spanText);
pre.appendChild(span);
text = " ";
spanText = document.createTextNode(text);
pre.appendChild(spanText);
}
Código 5.14: io.js, bucle para escribir los valores hexadecimales que forman el paquete en formato
HTML.
En la lı́nea 3 se selecciona el valor hexadecimal a escribir y en la 4 avanza la cadena al próximo
elemento a procesar en la siguiente vuelta del bucle. Las etiquetas son distintas pero el procedimiento es el mismo al de los dos casos anteriores. En el apéndice (código C.10) puede verse que el
procedimiento para parsear el ascii es similar (lı́neas 79 a 91). Cada uno de los valores tiene que ir
en etiquetas independientes para poder ser referenciado ya que, cuando se selecciona un campo en
particular del paquete, se marca con otro color sólo los valores ascii y hexadecimal que lo codifican.
70
WSHARK CAPÍTULO 5. WSHARK
5.4.2.
71
Actualización de información en el navegador
Existen múltiples eventos que provocan cambios en la interfaz de la aplicación, desde seleccionar
opciones en el menú hasta desplegar la información de un paquete en particular. Por ello, nos
centraremos en explicar tres casos particulares que son especialmente importantes.
Selección de un nuevo paquete en el sumario
Al seleccionar un paquete nuevo, la lı́nea del sumario se resalta en color azul y se debe cambiar
la región de la interfaz con los detalles del paquete para que refleje los nuevos datos. Se ha de
actualizar también el fichero pdml ya que sólo contiene los detalles de un único paquete.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function eventPDML() {
if (numEvents == 1) {
updatingPDML = true;
deleteTable("detail-div");
deleteTable("tab-0");
updateFile(CaptureNet, CaptureFilter);
showLoadingDetails();
setTimeout("newPacketDetails()", 1000);
}
else if ((numEvents == 2)&&(updatingPDML)) {
setTimeout("eventPDML()", 1000);
}
else numEvents−−;
}
function newPacketDetails() {
// writes details and ascii tables with the info of new packet selected
if (fileReady) {
deleteTable("detail-div");
var xmlDoc = loadXMLDoc(path + 'pdml.xml');
if (numEvents == 1) {
writePDML('packet', xmlDoc, 0);
writeAscii();
}
numEvents−−;
updatingPDML = false;
}
else setTimeout("newPacketDetails()", 500);
}
function packetDetails(packet) {
// update pdml.xml with the xml info of the new packet selected
if (!Capturing) {
numEvents++;
packetPDMLref = packet;
pickJustThisPacket(packet, '');
packet.setAttribute('class', 'picked');
packet.setAttribute('id', 'picked');
71
72
45
46
47
48
49
50
WSHARK CAPÍTULO 5. WSHARK
packetPDML = packet.firstChild.firstChild.nodeValue; // update the packet which need to show
details
eventPDML();
}
else manageErrors("Capturing");
}
Código 5.15: Events.js, funciones para la actualización de la región de detalles del paquete.
En las lı́neas 43 y 44 del código 5.15 se cambian los atributos de la lı́nea del sumario referente al
paquete, lo que cambia su color (a través de CSS, código C.16) y lo remarca en azul. En la función
eventPDML() se borran las etiquetas con la información del paquete previo y en la lı́nea 7 se invoca
a la función que hará la petición AJAX para que PHP (código 5.8) actualice el fichero pdml y el
ascii con el paquete seleccionado. Finalmente, se invoca a los métodos que se vieron en la sección
previa (códigos 5.15 y 5.14) para reescribir el PDML y el hexadecimal/ascii en las lı́neas 25 y 26.
Este evento se puede definir con la comunicación que se muestra en el apéndice B en la figura
B.3 y la explicación asociada.
Simulación en tiempo real de nuevos paquetes
Cuando se intercambian paquetes en la red virtual, los ficheros .pcap de captura de las diferentes
subredes se actualizan con los nuevos datos. wShark monitoriza si estos ficheros han sido modificados
a través del código PHP 5.16 que es llamado periódicamente.
1
2
3
$fich = ( $vnuml working dir.$ SESSION['usuari']."/capture" . $ GET['net'] . ".cap");
$modified = filemtime($fich);
echo $modified;
Código 5.16: fileModified.php, detecta si ha habido cambios en los ficheros .pcap de captura de las
redes.
La función filemtime de la lı́nea 2 devuelve el tiempo de la última modificación del fichero. Si es
distinto del último registrado, el fichero ha sufrido cambios y debemos actualizar los paquetes. Esto
provoca una actualización de los ficheros psml, pdml y ascii y desemboca en la simulación usando
javascript de la llegada de paquetes como si se estuviesen detectando consecutivamente en tiempo
real. Esto se consigue con la función mostrada en el código 5.17.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function simulateCaptureLive()
{ /* Show packets one by one in the summary simulating real time capture */
if (fileReady)
{
if (!Capturing)
{
Capturing = true;
xmlDocLive = loadXMLDoc("psml.xml");
}
var x = xmlDocLive.getElementsByTagName("packet"); // x is the tree from <packet>
if (currentPacket < x.length)
{
var tabla = document.getElementById("SummaryTable"); // table's beggining reference
y = x[currentPacket].childNodes; // y tree from section
72
WSHARK CAPÍTULO 5. WSHARK
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
73
var row = document.createElement("tr");
for (j = 1; j < y.length; j = j + 2)
{ // j + 2 because text type is in the odd positions
var cell = document.createElement("td");
if (y[j].childNodes.length != 0)
var cellText = document.createTextNode(y[j].childNodes[0].nodeValue); // each section's value
cell.appendChild(cellText);
row.appendChild(cell);
}
row.setAttribute('class', '');
row.setAttribute('onmousedown', 'packetDetails(this)');
tabla.appendChild(row);
currentPacket = currentPacket + 1;
setTimeout("simulateCaptureLive()", 500);
scrollDown();
}
else
{
updating = false;
Capturing = false;
if (currentPacket != 0) lastPacket = x[currentPacket − 1].childNodes[1].childNodes[0].nodeValue; //
last packet value
currentPacket = 0;
setTimeout("modifyFile(CaptureNet)", 2500);
}
}
else
{
setTimeout("simulateCaptureLive()", 500);
}
}
Código 5.17: WebShark.js, simulación de la captura en tiempo real.
La función lee el nuevo árbol DOM que contiene el psml de los nuevos paquetes de la misma
forma que cuando se escribe el sumario. Sin embargo, en vez de crear toda la estructura al mismo
tiempo, se crean las nuevas etiquetas tr y td de cada paquete por separado y se colocan al final
de la estructura ya existente. Usando la llamada recursiva de la lı́nea 30, retardada 500 ms con la
función setTimeout, se añade un paquete nuevo al sumario cada medio segundo, simulando ası́ la
llegada consecutiva de los paquetes nuevos.
Cambio de red
Cuando la red simulada está formada por diferentes subredes, el menú de cambio de red permite
visualizar los paquetes propios de cada una de ellas. Para que se puedan mostrar, se ha de actualizar
los ficheros psml, pdml y ascii invocando TShark con el fichero .pcap de la nueva red elegida (de
idéntica manera a como se ha enseñado previamente), eliminar la información mostrada en la interfaz
y reconstruirla con los nuevos datos. El código 5.18 genera la ventana modal que puede verse en la
figura 5.11.
73
74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
WSHARK CAPÍTULO 5. WSHARK
function changeNetwork() {
var mod = document.createElement("div");
mod.setAttribute("id","simplemodal-container");
var headerNet = document.createElement("h3");
headerNet.setAttribute("style","text-align: center;");
headerNet.appendChild(document.createTextNode(manageLanguage("Red")));
var br = document.createElement("br");
headerNet.appendChild(br);
for (var i=0 ; i<nets ; i++) {
var buttonNet = document.createElement("button");
buttonNet.setAttribute("type","button");
buttonNet.setAttribute("value",i);
buttonNet.setAttribute("onmousedown","onChange(this.value,filter); $.modal.close();");
buttonNet.appendChild(document.createTextNode(manageLanguage("Droplist")+" "+i));
headerNet.appendChild(buttonNet);
}
mod.appendChild(headerNet);
$.modal(mod);
}
Código 5.18: Events.js, generación de la ventana modal con la elección de las distintas subredes.
Al hacer clic en el botón de la subred escogida, se llama a la función onChange – como puede
verse en la lı́nea 16 – que actualiza los datos de la cabecera. En el siguiente fragmento de código,
esta función junto con newSummary y rewriteTable son las que se encargan de volver a crear las
etiquetas y los datos que forman la información de los nuevos paquetes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function onChange(net, filter)
{ // Network change event or filter
updating = true;
CaptureNet = net;
CaptureFilter = filter;
deleteTable("infoNet");
deleteTable("infoFilter");
deleteTable("infoLang");
infoStatus();
lastPacket = 0; // new net, whole new file
packetPDML = "1"; // first packet's details by default
newSummary(net);
updating = false;
}
Código 5.19: Events.js, código que se ejecuta al hacer clic en los botones de la ventana modal.
1
2
3
4
5
6
7
8
function rewriteTable()
{ // rewrite summary and details with the new information in psml and pdml
if (fileReady)
{
$("#summaryLoading").remove();
$("#detailsLoading").remove();
if (!manageErrors(globalError))
{ // if true, error detected
74
WSHARK CAPÍTULO 5. WSHARK
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
75
var xmlDoc = loadXMLDoc(path + "psml.xml");
writePSML("packet", xmlDoc);
scrollDown();
if (!manageErrors(globalError))
{ // if there are no packets, error
var xmlDoc = loadXMLDoc(path + "pdml.xml");
writePDML("packet", xmlDoc, 0);
writeAscii();
}
}
}
else setTimeout("rewriteTable()", 500);
}
function newSummary(net)
{ // info psml.xml is written together
deleteTable("SummaryTable");
deleteTable("detail-div");
deleteTable("tab-0");
updateFile(net, CaptureFilter);
showLoadingSummary();
showLoadingDetails();
setTimeout("rewriteTable()", 1000);
}
Código 5.20: ManageTables.js, simulación de la captura en tiempo real.
La función newSummary elimina todos los datos de la subred previa del HTML de la página,
coloca las animaciones de carga en su lugar (ver código C.5) e invoca a la función que realiza
la petición AJAX al PHP para actualizar los ficheros. La reescritura de los nuevos datos se deja a
rewriteTable, que invoca a las ya comentadas funciones de escribir psml, pdml y ascii. Es interesante
hacer mención especial a las lı́neas 5 y 6 del código 5.20, donde la eliminación dinámica del código
HTML de la página se realiza usando las librerı́as de jQuery.
5.4.3.
Estadı́sticas
Existen diversas estadı́sticas que se pueden aplicar sobre los paquetes capturados, pero como
ejemplo explicaremos la algoritmia seguida para mostrar las gráficas (estáticas y dinámicas) de las
figuras 5.18 y 5.19 al ser éstas parte representativa de las estadı́sticas.
Gráficas estáticas
Primero se hace una petición al servidor para generar un fichero de salida de TShark en texto
plano con los datos de las estadı́sticas. El PHP que ejecuta TShark es el 5.21 y el fichero de salida
a partir del cual se saca toda la información necesaria para las gráficas se puede ver en (5.22).
El valor del intervalo de tiempo se calcula tomando el tiempo total y dividiéndolo entre diez.
Este valor se ha escogido para mantener una relación de aspecto fácil de visualizar en las gráficas.
75
76
1
2
3
4
5
6
7
8
9
10
11
WSHARK CAPÍTULO 5. WSHARK
<?php
$interval = $ GET['interval'];
$file = "../" . $ GET['path'] . $ GET['net'];
if (file exists($file)) {
shell exec("tshark -r " . $file . " -q -z io,stat," . $interval . " > ../" . $ GET['path'] . "
statsDensity.txt");
}
else echo "Session Expired";
?>
Código 5.21: statsDensity.php, genera el fichero de salida en texto plano que se puede ver en el
código 5.22
1
2
===================================================================
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
IO Statistics
Interval: 7.300 secs
Column #0:
| Column #0
Time |frames| bytes
000.000−007.300 3 338
007.300−014.600 0 0
014.600−021.900 0 0
021.900−029.200 4 328
029.200−036.500 2 140
036.500−043.800 0 0
043.800−051.100 0 0
051.100−058.400 0 0
058.400−065.700 0 0
065.700−073.000 10 756
===================================================================
Código 5.22: statsDensity.txt, fichero de salida en texto plano con la información para generar las
gráficas.
Estos datos se procesan con javascript y se pasan a la librerı́a jQuery que genera las gráficas,
highcharts. El siguiente bucle (código 5.23) se mueve de elemento en elemento (time, frame y bytes
de las lı́neas 8 a 17 del texto plano anterior) y los envı́a a la librerı́a. En este caso, el valor 0
corresponde al intervalo particular de tiempo (por eso se envı́a al eje x, como se ve en la lı́nea 4) y
el 1 al número de frames (paquetes) en ese intervalo.
1
2
3
4
5
6
7
8
9
10
$.each(items, function(itemNo, item) {
if (item != "") {
switch (i) {
case 0: item = item.replace("<>", "-"); options.xAxis.categories.push(item); break;
case 1: series.data.push(parseInt(item)); break;
}
i++;
}
})
Código 5.23: Events.js, código que parsea parte del texto plano para generar las gráficas estadı́sticas.
76
WSHARK CAPÍTULO 5. WSHARK
77
La gráfica generada se muestra en una ventana modal usando la librerı́a highcharts en conjunto
con la libreria simplemodal. Esto supone una complicación añadida que se solventa en la función
initDensityGraph() que puede consultarse (ası́ como el resto del código de las gráficas) en el apéndice
C en el código C.15.
Gráficas dinámicas
El caso de las gráficas dinámicas es similar al anterior, pero implica la necesidad de ir actualizando el fichero statsDensity.txt periódicamente para reflejar los paquetes que van llegando a la
red. Esto se consigue con peticiones AJAX periódicas que ejecutan el código PHP de 5.21.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
events: {
load: function() {
// set up the updating of the chart each second
series = this.series[0];
finished = true;
setInterval(function() {
if (newPackets) {
$.ajax({url:"php/statsDensity.php", data:"interval=" + intervals + "&file=capture" +
CaptureNet + ".cap" + "&filter=" + lastPacketStats,
success: function(response) {
$.get('statsDensity.txt'+'?nocache='+Math.random(), function(data) {
newPackets = false;
var lines = data.split("\n");
finished = false;
linesStats = lines;
});
}
});
}
if (!finished) {
processLinesStats(linesStats);
}
else {
series.addPoint([(offset++∗intervals), 0], false, true);
series.addPoint([(offset∗intervals−0.005),0], true, true);
}
}, intervals∗1000);
}
}
Código 5.24: Events.js, código a ejecutar en el momento en el que se carga (load) la gráfica dinámica.
Cada intervals segundos (lı́nea 29) se hace una nueva petición AJAX para actualizar la estadı́stica de los paquetes. Además, la imposibilidad de usar el formato de columnas en las gráficas
dinámicas por limitaciones de la librerı́a obliga a simularlas con las lı́neas 25 y 26.
De nuevo, para obtener más información sobre cómo se parsea y envı́a la información, puede
consultarse el código C.15 del apéndice.
77
78
WSHARK CAPÍTULO 5. WSHARK
5.4.4.
Stand-Alone Version
Todo lo anterior puede aplicarse de forma prácticamente directa a la versión stand-alone de
wShark. En esta última sección se incluyen ejemplos, por tanto, de algunas de las particularidades
que carecen de sentido en la versión integrada en LabXar, como puede ser la subida de ficheros de
captura al servidor o la creación de la estructura de carpetas de sesión de los distintos usuarios.
Subir ficheros
En la página inicial de esta versión de wShark se ha añadido un plugin de jQuery que permite
facilitar la subida de ficheros múltiples. En el siguiente código (5.25) puede verse la inicialización
del mismo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<script type="text/javascript">
$(document).ready(function(){
var running = 0;
var uploader = new qq.FileUploader({
// pass the dom node (ex. $(selector)[0] for jQuery users)
element: document.getElementById('file-uploader'),
// path to server-side upload script
action: 'php/php.php',
allowedExtensions: ['cap', 'pcap'],
sizeLimit: 1000000, // 1 MB
maxConnections: 12,
onSubmit: function() {
running++;
},
onComplete: function() {
running−−;
if (running == 0) // only trigger the event when there is no more files to upload
window.location.replace("WebShark.php");
}
});
});
Código 5.25: IntroWebShark.php, inicialización del plugin utilizado para subir los ficheros del
usuario al navegador en un jQuery incrustado en el HTML de la página.
Pueden verse la definición del fichero PHP que se ejecutará en el servidor para copiar los archivos
en la lı́nea 8, las extensiones permitidas de ficheros en la 9 y el tamaño máximo de los ficheros en la
lı́nea 10. Cuando terminan de subirse todos los ficheros escogidos, se lanza la página con la interfaz
de la aplicación, WebShark.php (lı́nea 18).
El esquema de la comunicación cliente/servidor que se produce puede consultarse en la imagen
B.4 de los apéndices.
Generación de la estructura de ficheros de usuario
Los ficheros de captura y los ficheros de salida generados por wShark se almacenan en una carpeta
propia del usuario en el servidor. Para cada usuario único se genera una sesión y un identificador
único de sesión dependiente de su dirección IP y del navegador que está utilizando para conectarse.
78
WSHARK CAPÍTULO 5. WSHARK
79
El PHP que se encarga de subir los ficheros crea también la carpeta de usuario con el nombre de
sesión, como puede verse en el siguiente fragmento.
1
2
3
$uploader = new qqFileUploader($allowedExtensions, $sizeLimit);
mkdir("../" . session id());
$result = $uploader−>handleUpload("../" . session id() ."/", TRUE);
Código 5.26: php.php, crea una carpeta con el identificador único de sesión del usuario como nombre
y la selecciona como destino de los ficheros subidos.
Cada usuario tendrá su propia carpeta en el servidor, que existirá mientras el usuario siga
manteniendo la sesión. La sesión puede acabarse manualmente o automáticamente si ha pasado
más de una hora desde la última actividad en la aplicación. De la segunda se encarga el Garbage
Collector, del que hablaremos en la última sección. Si se cierra manualmente, el encargado de
eliminar la carpeta, su contenido y el fichero de sesión es el código 5.27.
1
2
3
4
5
6
7
8
9
10
<?php
session start();
$dir = '../' . session id();
foreach(glob($dir . '/*') as $file) {
unlink($file);
}
rmdir($dir);
unlink('../sess_' . session id());
?>
Código 5.27: deleteUserFolder.php, elimina en el bucle todos los ficheros de la carpeta, en la lı́nea
7 la propia carpeta y finalmente el fichero de sesión en la 9.
Garbage Collector
Para acabar, existe el caso particular en que el usuario cierra la aplicación de forma brusca,
cerrando el navegador directamente o apagando el ordenador. Este evento no se puede detectar, ya
que una vez el navegador se cierra, no existe la parte del cliente que ejecute código javascript. Si esto
no se tuviese en cuenta, las carpetas de sesión de esos usuarios se almacenarı́an indefinidamente
en el servidor. Para evitarlo, se ha programado un script en bash que se ejecuta periódicamente
con un cronjob (administrador de procesos de UNIX que permite programar tareas a ejecutar
periódicamente). El contenido del script puede verse en el código 5.28.
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
for session file in `find /home/aleyenda/WebShark/∗ −maxdepth 0 −iname sess ∗`
do
id=$(echo $session file | sed 's/sess //')"/"
if [ −d $id ]
then
chown root $session file
chmod 660 $session file
expire time=$(head −n 1 $session file)
expire time=${expire time:16}
expire time=${expire time %?}
79
80
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
WSHARK CAPÍTULO 5. WSHARK
time=$(date + %s)
echo $time >> /home/aleyenda/WebShark/log.txt
diff=$(($time−$expire time))
echo $diff >> /home/aleyenda/WebShark/log.txt
if [ "$diff" −gt "3600" ]
then
rm −rf $id
rm −f $session file
fi
else
rm −f $session file
fi
done
Código 5.28: GarbageCollector.sh, se encarga de eliminar las carpetas y los ficheros de sesión del
espacio de usuario cuando la sesión ha expirado.
El proceso se ejecuta como superusuario ya que es preciso cambiar los permisos y el propietario
del fichero de sesión para leer los datos contenidos en él (lı́neas 8 a 12). A continuación se calcula
el tiempo que ha transcurrido desde la última actividad en la aplicación, y si éste es mayor de una
hora (lı́nea 19), se eliminan todos los ficheros de usuario.
Es necesario añadir que cada vez que se ejecuta una acción en wShark (seleccionar un paquete,
elegir alguna opción del menú, etc), se ejecuta el código 5.29 a través de AJAX para actualizar el
tiempo de la última actividad.
1
2
3
4
5
6
<?php
$path = session save path("../");
session start();
$ SESSION['last_activity'] = time();
echo time();
?>
Código 5.29: session.php, actualiza el tiempo en el que realizó la última acción en la sesión.
80
Capı́tulo 6
Conclusiones y trabajo futuro
La creación de la aplicación ha sido un trabajo de valor incalculable para afianzar las conocimientos de las asignaturas relacionadas con las redes telemáticas y, en general, para comprender
mejor las necesidades que comporta un proyecto de dicha magnitud. Indudablemente, los conocimientos necesarios de desarrollo web adquiridos son un recurso muy interesante y útil de cara al
mercado laboral. Además, el hecho de haber desarrollado una aplicación de claro valor docente y que
será utilizada de forma regular, constituye un valor añadido para nada menospreciable. Finalmente,
el contacto con el mundo del software libre y las licencia de copyleft añaden otro punto a favor del
proyecto.
En general, el desarrollo de wShark ha sido una experiencia muy positiva y, a mi parecer, se
han conseguido satisfacer de forma más que correcta las metas iniciales buscadas. La aplicación
es totalmente funcional y ayuda enormemente a la comprensión de las herramientas usadas y de
los temas explicados en las asignaturas relacionadas por parte de los alumnos. Por último, pero no
por ello menos importante, ha servido para afianzar la pasión del autor por el campo de las redes
telemáticas, ayudando a abrir al mismo tiempo un posible camino laboral con un gran número de
excitantes posibilidades.
De cara a la expansión y mejora de la aplicación en un futuro, serı́a interesante explorar ciertas
posibilidades como:
Nuevas funcionalidades para wShark, como nuevas estadı́sticas y gráficas; o funciones interesantes implementadas por Wireshark, como las reglas definibles por el usuario para diferenciar
por colores los paquetes en el sumario dependiendo de sus particularidades.
Mejorar la seguridad de la aplicación. Este es un campo muy amplio, tremendamente mutable
y que por tanto necesita constante actualización. Parte de los principales ataques que se
pueden realizar sobre aplicaciones web de este estilo se encuentran contemplados pero se
podrı́a realizar un estudio más extenso y una mejora de estas caracterı́sticas.
Refactorización y mejora del código. El proyecto se ha extendido durante un largo periodo
de tiempo y los conocimientos iniciales de programación en la mayor parte de los lenguajes
aplicados distan mucho de los finales. Existen partes del código que podrı́an mejorarse tanto
en legibilidad como en eficiencia con un trabajo de ingenierı́a del software en esta dirección.
Asimismo, podrı́an migrarse parte de las funciones codificadas en Javascript plano a jQuery,
por simplicidad o consistencia a lo largo del código.
81
82
WSHARK CAPÍTULO 6. CONCLUSIONES Y TRABAJO FUTURO
SEO, posicionamiento en buscadores de la aplicación. Existen diversos métodos para mejorar
la visibilidad de las páginas web en los principales motores de búsqueda. De cara a lograr una
mayor repercusión en la red, este paso es un paso muy importante.
Migración de ciertos elementos (como las gráficas) a nuevos estándares. HTML5 es la nueva
revisión del lenguaje de marcado HTML con caracterı́sticas muy potentes que permiten añadir
directamente a la página elementos multimedia o gráficas, entre otras cosas.
Todas estas opciones y muchas otras no mentadas llevarı́an a mejorar cuantitativamente la plataforma en general y la aplicación en particular, ofreciendo una mejor y más productiva experiencia
a los usuarios. Todas ellas, no obstante, suponen una carga de trabajo considerable, por lo que serı́a
interesante estudiar – desde el punto de vista ingenieril – la viabilidad de dichos proyectos.
Además, el mantenimiento de la versión Stand-Alone de cara al futuro es un tema a considerar,
teniendo que sufragar los gastos de hosting y dominio. Estos podrı́an llegar a suponer una carga
dependiendo del tráfico que pudiese sufrir la web. Encontrar una solución óptima para todas las
partes implicadas es otra de las medidas a tener en cuenta.
82
Apéndices
83
Apéndices A
Estructura concisa de wShark
En este apéndice se explicará cómo se encuentra estructurado wShark y la función de cada uno
de los ficheros de la aplicación. La primera sección se refiere a la estructura de la versión incluida en
la plataforma LabXar (figura A.1) y la segunda a la versión Stand-Alone (figura A.2). Los nombres
marcados en negrita corresponden a directorios y aquellos en cursiva, a ficheros.
A.1.
Versión wShark de la plataforma LabXar
css: incluye todos los archivos relacionados con las hojas de estilos de las diferentes páginas y
componentes de la aplicación.
• skins: imágenes y hojas de estilo relacionadas con el plugin jquery dcmegamenu que
implementa el menú desplegable de la parte superior derecha de wShark.
• basic.css: hoja de estilo del plugin jquery simplemodal para las ventanas modales emergentes (donde van las gráficas, el menú del filtro, la selección de red, etc).
• dcmegamenu.css: otra hoja de estilo para dcmegamenu.
• Webshark.css: la hoja de estilo que modela el aspecto principal de wShark.
images: todas las imágenes incluidas en la aplicación, desde las flechas que indican que se
puede expandir un campo de un paquete, hasta los logos. Todos los archivos de la carpeta son
imágenes, por lo cual no precisan una explicación más detallada.
• ...
js: todos los ficheros javascript que manejan la interactividad de la aplicación.
• adapters: ficheros de apoyo para el plugin jquery highcharts.
• modules: ficheros de apoyo para el plugin jquery highcharts.
• themes: ficheros de apoyo para el plugin jquery highcharts.
• Errors.js: gestiona los diferentes errores que se pueden producir en la ejecución de wShark.
85
86
WSHARK APÉNDICES A. ESTRUCTURA CONCISA DE WSHARK
• Events.js: gestiona los eventos de javascript que ocurren en la página, desde un evento
de clic o de teclado, hasta la petición de una gráfica dinámica. Es el módulo más extenso
de wShark.
• highcharts.src.js: funciones principales del plugin highcharts.
• highcharts-more.js: funciones adicionales de highcharts
• io.js: presenta en pantalla de forma adecuada la información recibida en xml desde el
servidor.
• jquery.dcmegamenu.1.3.2.js: funciones principales del plugin dcmegamenu.
• jquery.hoverIntent.minified.js: funciones principales del plugin hoverIntent, que añade la
caracterı́stica de desplegado de dcmegamenú.
• jquery.simplemodal.js: funciones principales del plugin simplemodal.
• jquery-1.6.2.min.js: libererı́a jquery para javascript.
• Language.js: gestiona los diferentes idiomas incluidos en wShark.
• ManageTables.js: se encarga de todo lo relacionado con las tres regiones de la interfaz de
wShark, como borrar las listas de paquetes, reescribirlas con nuevos datos o añadir las
animaciones de carga.
• Menu.js: escribe el HTML del menú de la esquina superior izquierda, con los diferentes
eventos que lanza cada una de las opciones del mismo.
• SaveFiles.js: gestiona las opciones de guardado de las simulaciones, realizando las peticiones AJAX al servidor si es necesario.
• WebShark.js: javascript principal, que inicia la página, comprueba periódicamente si hay
cambios en el fichero de captura y simula la captura en vivo.
php: todos los ficheros php que se ejecutan en el servidor para actualizar datos de la página.
• changeFile.php: ejecuta TShark sobre el fichero de captura para crear las salidas xml que
la aplicación puede leer.
• conversationsInfo.php: ejecuta TShark solicitando estadı́sticas referentes a las conversaciones los protocolos seleccionados por el usuario para la comunicación de la red de la
que se está capturando.
• fileModified.php: devuelve el timestamp de la última modificación del fichero de captura
para comprobar si hay nuevas comunicaciones en la red o se ha cambiado de red de
captura.
• generalInfo.php: ejecuta TShark solicitando datos generales sobre el fichero de captura,
como su tamaño, duración de la captura, tamaño medio de los paquetes o su MD5.
• hierarchyInfo.php: ejecuta TShark solicitando información sobre la jerarquı́a de encapsulación de los paquetes.
• log.txt: archivo .txt que recoge datos de salida de las ejecuciones de los ficheros .php y es
utilizado para comprobar el correcto comportamiento de los mismos.
• removeSaveZip.php: elimina los .zip en los que se se han comprimido los ficheros de
captura de todas las redes para ser guardados por el usuario.
• saveAllFiles.php: envı́a los ficheros de captura pcap de todas las redes al usuario comprimidos en un .zip.
86
WSHARK APÉNDICES A. ESTRUCTURA CONCISA DE WSHARK
87
• SaveAllFilesFilter.php: igual que el anterior, pero aplicando el filtro indicado en la interfaz
de wShark.
• SaveFileFilter.php: envı́a el fichero de la red que se está visualizando al usuario aplicando
el filtro escogido en la interfaz de wShark.
• statsDensity.php: ejecuta TShark solicitando estadı́sticas de la densidad de paquetes y
bytes por cada intervalo de tiempo escogido. Se utiliza para generar las gráficas.
WebShark.php: fichero HTML principal de la aplicación que forma el esqueleto de la página.
A.2.
Versión Stand-Alone wShark
Debido a que las dos versiones comparten un número considerable de ficheros con una finalidad
similar (aunque no siempre con una estructura interna similar), en esta sección se detallarán sólo
aquellos archivos que no aparecı́an en la anterior versión.
css
• fileuploader.css: hoja de estilo para el plugin jquery que permite subir los archivos escogidos al servidor.
• IntroWebShark.css: hoja de estilo para la página inicial de la versión Stand-Alone de
wShark.
images
• wSharkLogoWhite.png
• wSharkLogoBlack.png
js:
• fileuploader.js: funciones javascript que gestionan el evento de subida de archivos a través
de fileuploader.
• jquery.cookie.js: librerı́a que facilita el uso de cookies con jquery.
php:
• alreadyInSession.php: comprueba si existe una sesión en activo para el usuario.
• defaultExample.php: crea la carpeta de sesión del usuario con el archivo pcap de ejemplo.
• deleteUserFolder.php: elimina la carpeta de la sesión del usuario, que contiene los ficheros
de captura subidos y los ficheros de salida del TShark, para comenzar una sesión nueva
y poder subir nuevos ficheros.
• php.php: gestiona la creación de la carpeta de sesión del usuario y la subida de los ficheros
seleccionados a dicha carpeta.
• session.php: actualiza el tiempo de última actividad de la sesión, para saber si el usuario
está inactivo o si se ha cerrado el navegador sin cerrar la sesión.
87
88
WSHARK APÉNDICES A. ESTRUCTURA CONCISA DE WSHARK
Figura A.1: Estructura de archivos de la versión de wShark incluida en LabXar.
88
WSHARK APÉNDICES A. ESTRUCTURA CONCISA DE WSHARK
89
default.cap: fichero de captura por defecto que se copia a la carpeta de sesión si el usuario ha
escogido ver el fichero de ejemplo en vez de subir sus propios ficheros.
GarbageCollector.sh: script bash que se ejecuta periódicamente con cron y comprueba si la
sesión del usuario ha expirado. Si es ası́, elimina la carpeta de la sesión.
IntroWebShark.php: página de inicio de la versión Stand-Alone que permite subir los archivos
que se desean visualizar en la nube al servidor.
A.3.
Otros ficheros
Finalmente, en esta sección comentaremos aquellos ficheros que no son código fuente del programa, sino los ficheros de captura y los ficheros de salida que wShark parsea para conseguir los datos
a mostrar.
capture*.cap: ficheros de captura de las diferentes subredes de la red virtual generada. En la
posición del asterisco se pondrı́a el número identificador de la subred.
psml.xml : xml con el resumen de los paquetes que se escriben en al región del sumario de
wShark.
pdml.xml : xml de los detalles del paquete seleccionado en el sumario.
ascii.txt: texto plano con el hexadecimal y el ascii del paquete seleccionado en el sumario.
statsDensity.txt: texto plano con la cantidad de paquetes y bytes para cada intervalo de tiempo
escogido.
89
90
WSHARK APÉNDICES A. ESTRUCTURA CONCISA DE WSHARK
Figura A.2: Estructura de archivos de la versión Stand-Alone de wShark.
90
Apéndices B
Comunicación en wShark
B.1.
Versión wShark de la plataforma LabXar
B.1.1.
Inicio
Cuando se genera la red virtual, los switches virtuales almacenan en el servidor, en el espacio del
disco asociado al usuario, los archivos de captura de cada una de las redes con formato pcap. Estos
ficheros se van actualizando conforme se intercambian paquetes a través de las redes. Al pinchar en
el enlace a wShark, se inicia la comunicación entre el navegador del cliente o usuario y el servidor que
ha generado la red y la gestiona. El javascript ejecutado en el usuario para previo a las peticiones
AJAX y la gestión de eventos no se incluye en el diagrama debido a que los tiempos son negligibles
comparados a los de acceso al servidor. El diagrama puede consultarse en la figura B.1.
1. Usuario −→ Servidor: Solicita la página WebShark.php
2. Servidor: Ejecuta el php incluido en WebShark.php, generando el html de la página principal.
3. Usuario ←− Servidor: Envı́a el html que ha de representar el navegador, junto con las
imágenes necesarias, los archivos de estilo y los scripts.
4. Usuario −→ Servidor Envı́a una petición AJAX solicitando la generación de los archivos
de salida de TShark para la red actual.
5. Servidor: Ejecuta TShark sobre el fichero pcap y crea los ficheros psml, pdml y ascii con la
información de los paquetes de la comunicación en la red.
6. Usuario ←− Servidor: Confirma la creación de los ficheros y devuelve la salida de ascii (el
hexadecimal y el ascii del paquete a mostrar) como texto plano.
7. Usuario −→ Servidor: Envı́a un GET AJAX para que el servidor le envı́e el XML psml.xml.
8. Usuario ←− Servidor: Responde con el contenido del fichero.
9. Usuario −→ Servidor: Envı́a un GET AJAX para que el servidor le envı́e el XML pdml.xml.
10. Usuario ←− Servidor: Responde con el contenido del fichero.
91
92
WSHARK APÉNDICES B. COMUNICACIÓN EN WSHARK
11. Usuario −→ Servidor: Periódicamente pregunta al servidor cuándo se ha modificado el
fichero pcap de captura por última vez.
12. Usuario ←− Servidor: Responde con el timestamp de la última modificación del archivo de
captura de la red.
Figura B.1: Diagrama secuencial de inicio para la versión de wShark de LabXar.
B.1.2.
Detección de nuevos paquetes en la red
Si el timestamp de la última modificación del archivo de captura de red es diferente al que
tenemos guardado en el usuario quiere decir que han ocurrido comunicaciones nuevas en la red.
Ası́ pues, habrá que procesar estos cambios y mostrar los nuevos paquetes enviados en wShark,
simulando una comunicación en tiempo real. Todo esto puede observarse en el diagrama de la figura
B.2.
92
WSHARK APÉNDICES B. COMUNICACIÓN EN WSHARK
93
1. Usuario −→ Servidor: Pregunta al servidor cuándo se ha modificado el fichero pcap de
captura por última vez.
2. Usuario ←− Servidor: Responde diciendo que el archivo de captura se ha modificado más
recientemente que la última vez que lo hemos procesado.
3. Usuario −→ Servidor Envı́a una petición AJAX solicitando la generación de los archivos
de salida de TShark para la red actual, pero sólo para los paquetes nuevos.
4. Servidor: Ejecuta TShark sobre el fichero pcap y crea los ficheros psml, pdml y ascii con la
información de los paquetes nuevos de la comunicación en la red.
5. Usuario ←− Servidor: Confirma la creación de los ficheros y devuelve la salida de ascii (el
hexadecimal y el ascii del paquete a mostrar) como texto plano.
6. Usuario −→ Servidor: Envı́a un GET AJAX para que el servidor le envı́e el nuevo XML
psml.xml con sólo los paquetes nuevos.
7. Usuario ←− Servidor: Responde con el contenido del fichero.
8. Usuario −→ Servidor: Envı́a un GET AJAX para que el servidor le envı́e el XML pdml.xml
del paquete seleccionado.
9. Usuario ←− Servidor: Responde con el contenido del fichero.
10. Usuario: Simula la recepción en tiempo real de los nuevos paquetes mostrándolos en la interfaz
uno por uno.
11. Usuario −→ Servidor: Cuando termina de mostrar todos los paquetes nuevos, reinicia las
consultas periódicas sobre si el fichero de captura ha sido modificado.
12. Usuario ←− Servidor: Responde con el timestamp de la última modificación del archivo de
captura de la red.
B.1.3.
Eventos
En cualquier momento puede producirse un evento que javascript procesará. Estos eventos son
de diversa ı́ndole, entre los que se encuentran, por ejemplo, clicar en un paquete para ver su información detallada, el cambio de la red de captura, la ejecución de una estadı́stica sobre los datos
o la aplicación de un filtro de captura. Algunos otros eventos, como el despliegue de algún campo particular del encapsulado del paquete mostrado, no precisan de consultas al servidor, por lo
que simplemente reportarı́an la ejecución de un script local. El siguiente diagrama (figura B.3) y
explicación corresponde a la comunicación de los eventos que provocan peticiones al servidor.
1. Usuario −→ Servidor: Solicita con AJAX la información particular sobre el evento registrado. Ésta podrı́a ser, por ejemplo, el archivo pdml de un paquete distinto seleccionado, la
salida de TShark para una estadı́stica concreta o el psml filtrado según la condición escogida.
2. Servidor: Ejecuta el php especı́fico para calcular la información pedida, generando los ficheros
necesarios.
93
94
WSHARK APÉNDICES B. COMUNICACIÓN EN WSHARK
Figura B.2: Diagrama secuencial de la llega de nuevos paquetes en la versión de wShark de LabXar.
94
WSHARK APÉNDICES B. COMUNICACIÓN EN WSHARK
95
3. Usuario ←− Servidor: Devuelve la información, que será procesada en local por javascript.
Al volver de la gestión del evento, se reanuda la consulta periódica sobre la modificación del
archivo (obviamente, si el evento ha sido un cambio de red, la consulta se hará sobre este nuevo
fichero de captura). Si el evento procesado ha sido una gráfica dinámica, se harán además peticiones
periódicas al servidor para recoger los nuevos datos y mostrarlos en la gráfica.
Figura B.3: Diagrama secuencial para la gestión de eventos.
B.2.
Versión Stand-Alone wShark
B.2.1.
Inicio
En este caso, la página de inicio es IntroWebShark.php, desde la que se pueden subir los ficheros a analizar. Cuando el usuario selecciona los ficheros de captura de su disco duro, se inicia la
comunicación con la aplicación (figura B.4).
1. Usuario −→ Servidor: Envı́a a través de AJAX los datos – nombre, parámetros, rutas, etc
– de los ficheros a subir al servidor.
2. Servidor: Comprueba que los ficheros sean válidos, crea una carpeta en el servidor propia
para la sesión del usuario y, a través de php, sube los archivos a dicha carpeta.
3. Usuario −→ Servidor: Solicita la página WebShark.php
4. Servidor: Ejecuta el php incluido en WebShark.php, generando el html de la página principal.
5. Usuario ←− Servidor: Envı́a el html que ha de representar el navegador, junto con las
imágenes necesarias, los archivos de estilo y los scripts de wShark.
95
96
WSHARK APÉNDICES B. COMUNICACIÓN EN WSHARK
6. Usuario −→ Servidor Envı́a una petición AJAX solicitando la generación de los archivos
de salida de TShark para el fichero seleccionado.
7. Servidor: Ejecuta TShark sobre el fichero pcap y crea los ficheros psml, pdml y ascii con la
información de los paquetes de la comunicación guardada en el archivo.
8. Usuario ←− Servidor: Confirma la creación de los ficheros y devuelve la salida de ascii (el
hexadecimal y el ascii del paquete a mostrar) como texto plano.
9. Usuario −→ Servidor: Envı́a un GET AJAX para que el servidor le envı́e el XML psml.xml.
10. Usuario ←− Servidor: Responde con el contenido del fichero.
11. Usuario −→ Servidor: Envı́a un GET AJAX para que el servidor le envı́e el XML pdml.xml.
12. Usuario ←− Servidor: Responde con el contenido del fichero.
Figura B.4: Diagrama secuencial de inicio para la versión Stand-Alone de wShark.
Nótese que en este caso, el javascript del cliente consulta periódicamente por cambios (ya que
los ficheros son fijos).
96
WSHARK APÉNDICES B. COMUNICACIÓN EN WSHARK
B.2.2.
97
Eventos
La comunicación en los eventos se comporta de manera similar a la de la versión de LabXar.
B.3.
Versión wShark de la plataforma LabXar
B.3.1.
Inicio de la conexión
Cuando se genera la red virtual, los switches virtuales almacenan en el servidor, en el espacio del
disco asociado al usuario, los archivos de captura de cada una de las redes con formato pcap. Estos
ficheros se van actualizando conforme se intercambian paquetes a través de las redes. Al pinchar en
el enlace a wShark, la siguiente comunicación ocurre entre el navegador del cliente o usuario (U)
y el servidor que ha generado la red y la gestiona (S). El javascript ejecutado en el usuario para
previo a las peticiones AJAX y la gestión de eventos no se incluye en el diagrama debido a que los
tiempos son negligibles comparados a los de acceso al servidor.
1. Usuario −→ Servidor: Solicita la página WebShark.php
2. Servidor: Ejecuta el php incluido en WebShark.php, generando el html de la página principal.
3. Usuario ←− Servidor: Envı́a el html que ha de representar el navegador, junto con las
imágenes necesarias, los archivos de estilo y los scripts.
4. Usuario −→ Servidor Envı́a una petición AJAX solicitando la generación de los archivos
de salida de TShark para la red actual.
5. Servidor: Ejecuta TShark sobre el fichero pcap y crea los ficheros psml, pdml y ascii con la
información de los paquetes de la comunicación en la red.
6. Usuario ←− Servidor: Confirma la creación de los ficheros y devuelve la salida de ascii (el
hexadecimal y el ascii del paquete a mostrar) como texto plano.
7. Usuario −→ Servidor: Envı́a un GET AJAX para que el servidor le envı́e el XML psml.xml.
8. Usuario ←− Servidor: Responde con el contenido del fichero.
9. Usuario −→ Servidor: Envı́a un GET AJAX para que el servidor le envı́e el XML pdml.xml.
10. Usuario ←− Servidor: Responde con el contenido del fichero.
11. Usuario −→ Servidor: Periódicamente pregunta al servidor cuándo se ha modificado el
fichero pcap de captura por última vez.
12. Usuario ←− Servidor: Responde con el timestamp de la última modificación del archivo de
captura de la red.
97
98
WSHARK APÉNDICES B. COMUNICACIÓN EN WSHARK
98
Apéndices C
Código fuente de wShark
En este apéndice se incluye parte del código fuente de la aplicación con objeto de mostrar cómo
ha sido codificada. Tener accesible el código en los apéndices también permite referenciar fragmentos
especı́ficos para explicar en profundidad las decisiones de diseño tomadas. Sólo se incluye el código
de algunos de los ficheros ya que la inclusión del código completo supondrı́a ampliar demasiado la
extensión de la memoria.
Las diferentes secciones de este apéndice no están divididas por lenguajes de programación, sino
según la finalidad con la que están escritos los fragmentos de código. Por ejemplo, la primera sección
incluye los distintos códigos – HTML, PHP, Javascript – que permiten iniciar wShark y mantenerlo
a la espera de nuevos paquetes. Debido a la longitud de los distintos códigos, se han movido los pies
de figura a la parte superior de los bloques de código, para ası́ facilitar su entendimiento.
En el apéndice A: Estructura concisa de wShark, puede consultarse la finalidad general de los
ficheros de código aquı́ mentados.
C.1.
Versión de wShark en LabXar
C.1.1.
Inicio de la aplicación
Código C.1: WebShark.php, HTML de la página principal de wShark
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$vista="webshark";
session start();
include("../../lt2vnuml_config/config.php");
?>
<!DOCTYPE html>
<head>
<title>WebShark</title>
<meta http−equiv="content-type" content="text/html; charset=utf-8" />
<META HTTP−EQUIV="PRAGMA" CONTENT="NO-CACHE">
<META HTTP−EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<meta http−equiv="expires" content="Fri, 5 Apr 1996 23:59:59 GMT">
<link type="text/css" charset="utf-8" rel="Stylesheet" media="all" href="css/Webshark.css" />
<link type="text/css" rel="stylesheet" href="css/dcmegamenu.css" />
99
100
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
<link type="text/css" rel="stylesheet" href="css/skins/white.css"/>
<link type="text/css" rel="stylesheet" href="css/basic.css"/>
<?
echo "<link href=\"".$url_app_root."/files/style.css\" rel=\"stylesheet\" type=\"text/css\" media=\"
screen\" />";
?>
<script type="text/javascript" charset="utf-8" src="js/WebShark.js"></script>
<script type="text/javascript" charset="utf-8" src="js/Errors.js"></script>
<script type="text/javascript" charset="utf-8" src="js/Language.js"></script>
<script type="text/javascript" charset="utf-8" src="js/io.js"></script>
<script type="text/javascript" charset="utf-8" src="js/Events.js"></script>
<script type="text/javascript" charset="utf-8" src="js/ManageTables.js"></script>
<script type="text/javascript" charset="utf-8" src="js/SaveFiles.js"></script>
<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/jquery.cookie.js"></script>
<script type='text/javascript' src='js/jquery.hoverIntent.minified.js'></script> <!−− Menu −−>
<script type='text/javascript' src='js/jquery.dcmegamenu.1.3.2.js'></script> <!−− Menu −−>
<script type='text/javascript' src='js/Menu.js'></script> <!−− Menu −−>
<script type='text/javascript' src='js/jquery.simplemodal.js'></script> <!−− Modal for filter
and other things −−>
<script type="text/javascript" src="js/highcharts.js"></script>
<meta name="apple-mobile-web-app-capable" content="yes">
<script type="text/javascript">
if ($.cookie('lang') != null)
language = $.cookie('lang');
</script>
</head>
<body onload="detectBrowser(); if ('Navigator' == navigator.appName) document.forms[0].reset();
navigatePacketsKeyboard()" >
<?
$missatge['ca']['sessio_expirada']="Sessió expirada";
$missatge['en']['sessio_expirada']="Expired session";
$missatge['es']['sessio_expirada']="Sesión expirada";
$missatge['ca']['fora_sessio']="Esteu fora de sessió. No tenieu sessió o potser el vostre temps de
sessió s'ha exhaurit.";
$missatge['en']['fora_sessio']="You have no web session. Either you did not have one or your
session time has expired.";
$missatge['es']['fora_sessio']="Está fuera de sesión. O bién no tenı́a sessió o su tiempo de sessión
se acabó.";
$missatge['ca']['una_altra_sessio']="Per tornar a tenir sessió web fes click";
$missatge['en']['una_altra_sessio']="To obtain a web session again, press";
$missatge['es']['una_altra_sessio']="Para volver a tener sesión otra vez, clica";
$missatge['ca']['aqui']="aquı́";
$missatge['en']['aqui']="here";
$missatge['es']['aqui']="aquı́";
$missatge['ca']['missatge_no_xarxes']="No hi ha cap xarxa";
$missatge['en']['missatge_no_xarxes']="There is no network";
$missatge['es']['missatge_no_xarxes']="No hay ninguna red";
$missatge['ca']['no_xarxes']="No teniu cap xarxa disponible. Possiblement no teniu cap escenari
arrancat o bé l'escenari no us permet explorar cap xarxa.";
$missatge['en']['no_xarxes']="You have no networks to monitor. Either you did not started an
100
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
101
scenario or maybe the scenario running does not allow to monitor any of its networks";
$missatge['es']['no_xarxes']="No tiene ninguna red disponible. Posiblemente no tenga ningún
escenario en marcha o bién el escenario no le permite explorar ninguna de sus redes";
$missatge['ca']['tancar_missatge']="Per tancar aquest missatge, cliqueu ";
$missatge['en']['tancar_missatge']="To close this message, please press ";
$missatge['es']['tancar_missatge']="Para cerrar este mensaje, aprete ";
global $base language;
if(!isset($ SESSION['llengua'])){
$idioma=$base language;
}
else{
$idioma=$ SESSION['llengua'];
}
$out session=false;
if( isset($ SESSION['expire_time']) ){
if((strtotime($ SESSION['expire_time'])) < (strtotime(date()) )){
$out session=true;
}
}
else{
$out session=true;
}
if($out session){
?>
<script type="text/javascript">
$.modal("<h2> <? echo($missatge[$idioma]['sessio_expirada']); ?> </h2> <p> <? echo($missatge[
$idioma]['fora_sessio']); ?> </p> <p> <? echo ($missatge[$idioma]['una_altra_sessio']); ?>
<a href=\"<? echo $url app root; ?>/\"> <? echo($missatge[$idioma]['aqui']); ?> </a> </p>",{
overlayClose:true,
closeClass:"tancaExpira",
minHeight: 200,
minWidth: 400,
opacity:80,
overlayClose:false,
focus: true,
overlayCss: {backgroundColor:"#222222"}
});
</script>
<?
}
?>
<div id='header' class='ui-widget-header' style='border:none; '>
<img src='images/wSharkSecondaryLogo.jpg' align='left' style="margin-left: 5px" />
<script type="text/javascript">
<?php // php − detects how many networks (files) we have
$nets=0;
$path = $vnuml working dir.$ SESSION['usuari']."/capture";
while (file exists($path . $nets . ".cap")) {
$nets = $nets+1;
}
$path = $vnuml working dir.$ SESSION['usuari']."/";
?>
nets = <?php echo $nets; ?> ;
path = "<?php echo $path; ?>";
101
102
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
if(nets==0){
<?
if(!$out session){
?>
$.modal("<h2> <? echo($missatge[$idioma]['missatge_no_xarxes']); ?> </h2> <p> <? echo
$missatge[$idioma]['no_xarxes']; ?> </p> <p> <? echo($missatge[$idioma]['tancar_missatge
']); ?> <a href=\"#\" class=\"tancaExpira\"> <? echo($missatge[$idioma]['aqui']); ?> </a>
</p>",{
overlayClose:true,
closeClass:"tancaExpira",
minHeight: 200,
minWidth: 400,
opacity:80,
overlayClose:false,
overlayCss: {backgroundColor:"#222222"}
});
<?
}
?>
}
document.write("<div id='stopCaptureTitle'>");
document.write("<span style='margin-left: 3px;'>" + manageLanguage("Status") + "</span>");
document.write('<div><input style="float:left;" type="button" id="statusBar" class="Capturing"
value="' + manageLanguage("StatusBarPlay") + '"></input> ');
document.write('</div></div><div id="infoNet" class="infoHeader"></div>');
document.write('<div id="infoFilter" class="infoHeader"></div>');
document.write('<div id="infoLang" class="infoHeader"></div>');
infoStatus();
</script>
<div class="white" style="float:right;">
<ul id="mega-menu-2" class="mega-menu">
<script type="text/javascript">
writeMenu();
</script>
</ul>
</div>
</div>
<!−− ”Rails” for summary −−>
<div id='wrapper' class='expanded' style='overflow:hidden'>
<div class="fht_fixed_header">
<table style="width: 100 %; height: 26px; background-color: #eee; ">
<thead>
<tr>
<script type="text/javascript">
document.write('<th class="first-cell" style="width:3.5 %"><div class="empty-cell">No.</div></
th>');
document.write('<th style="width:8 %"><div class="empty-cell">' + manageLanguage("Time") + '</div
></th>');
document.write('<th style="width:13 %"><div class="empty-cell">' + manageLanguage("Source") + '</
div></th>');
102
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
103
document.write('<th style="width:13 %"><div class="empty-cell">' + manageLanguage("Destination")
+'</div></th>');
document.write('<th style="width:8 %"><div class="empty-cell">' + manageLanguage("Protocol") + '</
div></th>');
document.write('<th style="width:6 %;"><div class="empty-cell">' + manageLanguage("Length") + '</
div></th>');
document.write('<th class="last-cell" style="width:48.5 %"><div class="empty-cell">' +
manageLanguage("Info") + '</div></th>');
</script>
</tr>
</thead></table>
</div>
<div id="wholeSummary" class="fht_table_body" >
<table id="summary" style="width: 100 %; margin-top: -30px; "> <!−− son los ”raı́les” para que los datos
del paquete vayan en la posición correcta −−>
<thead>
<tr>
<script type="text/javascript">
document.write('<th class="first-cell" style="width:3.6 %"><div class="empty-cell">No.</div></th>'
);
document.write('<th style="width:8.1 %"><div class="empty-cell">Time</div></th>');
document.write('<th style="width:13.1 %"><div class="empty-cell">Source</div></th>');
document.write('<th style="width:13.1 %"><div class="empty-cell">Destination</div></th>');
document.write('<th style="width:8.1 %"><div class="empty-cell">Protocol</div></th>');
document.write('<th style="width:5.1 %;"><div class="empty-cell">Length</div></th>');
document.write('<th class="last-cell" style="width:48.9 %"><div class="empty-cell">Info</div></th>
');
</script>
</tr>
</thead>
<tbody id="SummaryTable" tabindex="0">
<script type="text/javascript">
modifyFile(CaptureNet);
</script>
</tbody>
</table>
</div>
<div id="detail-div" class="pane">
</div>
<div id="ascii-div" class="pane ui-widget-header"><div id="tab-0" style="top:0 !important">
</div></div>
</body>
</html>
103
104
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
Código C.2: Events.js, función llamada desde la lı́nea 148 de WebShark.php para generar los datos
de información de la cabecera de la aplicación.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function infoStatus() {
var spanNet = document.createElement("span");
spanNet.setAttribute("class","infoHeader");
spanNet.appendChild(document.createTextNode(manageLanguage("Filename")));
var inputNet = document.createElement("input");
inputNet.setAttribute("style","float:left");
inputNet.setAttribute("type","button");
inputNet.setAttribute("id","statusBar");
inputNet.setAttribute("class","infoNet");
if (CaptureNet.length > 12)
var net = CaptureNet.substring(0,9) + "...";
else var net = CaptureNet;
inputNet.setAttribute("value",net);
inputNet.setAttribute("title",CaptureNet);
document.getElementById("infoNet").appendChild(spanNet);
document.getElementById("infoNet").appendChild(inputNet);
var spanFilter = document.createElement("span");
spanFilter.setAttribute("class","infoHeader");
spanFilter.appendChild(document.createTextNode(manageLanguage("Filter")+":"));
var inputFilter = document.createElement("input");
inputFilter.setAttribute("style","float:left");
inputFilter.setAttribute("type","button");
inputFilter.setAttribute("id","statusBar");
inputFilter.setAttribute("class","infoFilter");
if (filter.length > 12)
var f = filter.substring(0,9) + "...";
else var f = filter;
inputFilter.setAttribute("value",f);
inputFilter.setAttribute("title",filter);
document.getElementById("infoFilter").appendChild(spanFilter);
document.getElementById("infoFilter").appendChild(inputFilter);
var spanLang = document.createElement("span");
spanLang.setAttribute("class","infoHeader");
spanLang.appendChild(document.createTextNode(manageLanguage("MenuLanguage")+":"));
var inputLang = document.createElement("input");
inputLang.setAttribute("style","float:left");
inputLang.setAttribute("type","button");
inputLang.setAttribute("id","statusBar");
inputLang.setAttribute("class","infoFilter");
if (language.length > 12)
var lang = language.substring(0,9) + "...";
else var lang = language;
inputLang.setAttribute("value",manageLanguage(language));
inputLang.setAttribute("title",language);
104
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
57
58
59
105
document.getElementById("infoLang").appendChild(spanLang);
document.getElementById("infoLang").appendChild(inputLang);
}
Código C.3: WebShark.js, funciones principales en javascript, que detectan cambios en los ficheros
(a través de PHP) y conectan con el server para modificar los ficheros de salida.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function modifyFile(net)
{ /* main js function. Detects if there is any change in .cap files that lead to
* update information. Loop here checking. */
if ((!updating) && (fileReady) && (!stopCapture))
{
updating = true;
CaptureNet = net;
if (window.XMLHttpRequest) // ajax
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function ()
{ // Ajax. Change -> Update
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
updating = true;
if (fileDate != xmlhttp.responseText)
{
if (lastPacket == 0)
{ // first time or net change. Update all summary together
fileDate = xmlhttp.responseText;
newSummary(net);
updating = false;
}
else
{ // Simulate real time capture.
fileDate = xmlhttp.responseText;
updateFile(net, CaptureFilter);
setTimeout("simulateCaptureLive()", 500);
return;
}
}
else updating = false;
//if (!(CaptureNet == "")) // if there is still files, loop.
//setTimeout("modifyFile(CaptureNet)", 2500); // recursive call
}
}
xmlhttp.open("GET", "php/fileModified.php?net=" + CaptureNet + "&path=" + path, true);
105
106
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
xmlhttp.send();
}
else setTimeout("modifyFile(CaptureNet)", 2500); // recursive call
}
function updateFile(net, filter)
{ /* Call php function that execute tshark to update psml.xml, pdml.xml and ascii.txt */
fileReady = false;
if (!Capturing)
{
//CaptureFilter = filter; // update filter
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function ()
{
if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) {
var str = xmlhttp.responseText;
globalError = (str.substring(0, str.indexOf(" %")));
ascii = str.substring(str.indexOf(" %") + 1);
fileReady = true;
newPackets = true;
}
}
xmlhttp.open("GET", "php/changeFile.php?net=" + CaptureNet + "&path=" + path + "&lastPacket="
+ lastPacket +
"&packet=" + packetPDML + "&filter=" + CaptureFilter, true);
xmlhttp.send();
}
}
Código C.4: fileModified.php, detecta si ha habido cambios en los ficheros .pcap de captura de las
redes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
include ("../../lt2vnuml_config/config.php");
session start();
$out session=false;
if( isset($ SESSION['expire_time']) ){
if((strtotime($ SESSION['expire_time'])) < (strtotime(date()) )){
$out session=true;
}
}
else{
$out session=true;
}
if(!$out session){
$fich = ( $vnuml working dir.$ SESSION['usuari']."/capture" . $ GET['net'] . ".cap");
106
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
18
19
20
21
22
23
24
107
$modified = filemtime($fich);
echo $modified;
}
else{
echo "no web session";
}
?>
Código C.5: ManageTables.js, funciones principales en javascript, que detectan cambios en los ficheros (a través de PHP) y conectan con el server para modificar los ficheros de salida.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function scrollDown()
{ /* scroll summary table till the end */
var objDiv = document.getElementById("wholeSummary");
objDiv.scrollTop = (objDiv.scrollHeight);
}
function showLoadingSummary()
{ /* show loading image in the middle of the summary table */
table = document.getElementById("wholeSummary"); // table's reference
var loading = document.createElement("img");
loading.setAttribute("src", "images/loading.gif");
loading.setAttribute("id", "summaryLoading");
loading.setAttribute("style", "margin-left: 45 % ; margin-top: 5 %; ");
table.appendChild(loading);
}
function showLoadingDetails()
{ // show loading image in the packets details table
tabla = document.getElementById("detail-div");
var loading = document.createElement("img");
loading.setAttribute("src", "images/loadingPDML.gif");
loading.setAttribute("id", "detailsLoading");
loading.setAttribute("style", "margin-left: 47 % ; margin-top: 3 % ; ");
tabla.appendChild(loading);
}
function deleteTable(ref)
{ // delete information in any table (xml tree structure)
var Parent = document.getElementById(ref);
while (Parent.hasChildNodes())
{
Parent.removeChild(Parent.firstChild);
}
}
function rewriteTable()
{ // rewrite summary and details with the new information in psml and pdml
if (fileReady)
{
$("#summaryLoading").remove();
$("#detailsLoading").remove();
107
108
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
if (!manageErrors(globalError))
{ // if true, error detected
var xmlDoc = loadXMLDoc(path + "psml.xml");
writePSML("packet", xmlDoc);
scrollDown();
if (!manageErrors(globalError))
{ // if there are no packets, error
var xmlDoc = loadXMLDoc(path + "pdml.xml");
writePDML("packet", xmlDoc, 0);
writeAscii();
}
}
}
else setTimeout("rewriteTable()", 500);
}
function newSummary(net)
{ // info psml.xml is written together
deleteTable("SummaryTable");
deleteTable("detail-div");
deleteTable("tab-0");
updateFile(net, CaptureFilter);
showLoadingSummary();
showLoadingDetails();
setTimeout("rewriteTable()", 1000);
}
Código C.6: changeFile.php, si ha habido cambios, ejecuta TShark para actualizar el contenido de
los ficheros psml, pdml y ascii
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
error log("script was called, processing request changeFile...");
include ("../../lt2vnuml_config/config.php");
global $tshark;
echo $tshark;
session start();
$out session=false;
if(isset($ SESSION['expire_time']) ){
if((strtotime($ SESSION['expire_time'])) < (strtotime(date()) )){
$out session=true;
}
}
else{
$out session=true;
}
if(!$out session){
$file = $vnuml working dir.$ SESSION['usuari']."/capture" . $ GET['net'] . ".cap";
if (file exists($file)) {
if ( $ GET['filter'] != "" ) {
$filter = "&& " . $ GET['filter'] ; // add the condition of the filter
108
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
}
else $filter = ""; // if there isn't filter condition, we can't put the &&
shell exec($tshark." -r " . $file . " -T psml -R 'frame.number > " . $ GET['lastPacket'] . " "
. $filter . "' > ".$vnuml working dir.$ SESSION['usuari']."/psml.xml";
shell exec($tshark." -r " . $file . " -T pdml -R 'frame.number == " . $ GET['packet'] ."' > ".
$vnuml working dir.$ SESSION['usuari']."/pdml.xml";
shell exec($tshark." -r " . $file . " -x -R 'frame.number == " . $ GET['packet'] ."' > ".
$vnuml working dir.$ SESSION['usuari']."/ascii.txt";
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
109
$ascii = "";
$ascii = file get contents($vnuml working dir.$ SESSION['usuari']."/ascii.txt"); //
hexadecimal and ascii packet information
$ascii = substr($ascii, strpos($ascii, "\n")); // delete first line (packet text information)
$ascii = substr($ascii, strpos($ascii, "\n")); // delete second line (line break)
$ascii = ltrim($ascii); // delete blank spaces
$varReturn = $log . " %" . $ascii;
echo $varReturn;
}
}
else echo "no web session";
?>
Código C.7: psml.xml, fragmento del fichero de salida en formato XML con la información del
sumario de wShark.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0"?>
<psml version="0" creator="wireshark/1.6.7">
<structure>
<section>No.</section>
<section>Time</section>
<section>Source</section>
<section>Destination</section>
<section>Protocol</section>
<section>Length</section>
<section>Info</section>
</structure>
<packet>
<section>1</section>
<section>0.000000</section>
<section>::</section>
<section>ff02::16</section>
<section>ICMPv6</section>
<section>130</section>
<section>Multicast Listener Report Message v2</section>
</packet>
<packet>
<section>2</section>
<section>0.279999</section>
<section>::</section>
<section>ff02::1:ff00:101</section>
<section>ICMPv6</section>
<section>78</section>
<section>Neighbor Solicitation for fe80::fcfd:ff:fe00:101</section>
</packet>
109
110
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
Código C.8: pdml.xml, fichero de salida de TShark con la información detallada de un único paquete.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0"?>
<?xml−stylesheet type="text/xsl" href="pdml2html.xsl"?>
<!−− You can find pdml2html.xsl in /usr/share/wireshark or at http://anonsvn.wireshark.org/trunk/wireshark/
pdml2html.xsl. −−>
<pdml version="0" creator="wireshark/1.6.7" time="Wed Nov 21 13:02:33 2012" capture file="../5
heuslvr1sm8sj0jmn290p2qe5/default.cap">
<packet>
<proto name="geninfo" pos="0" showname="General information" size="130">
<field name="num" pos="0" show="1" showname="Number" value="1" size="130"/>
<field name="len" pos="0" show="130" showname="Frame Length" value="82" size="130"/>
<field name="caplen" pos="0" show="130" showname="Captured Length" value="82" size="130"/>
<field name="timestamp" pos="0" show="May 13, 2010 16:40:11.593103000 CEST" showname="Captured
Time" value="1273761611.593103000" size="130"/>
</proto>
<proto name="frame" showname="Frame 1: 130 bytes on wire (1040 bits), 130 bytes captured (1040
bits)" size="130" pos="0">
<field name="frame.time" showname="Arrival Time: May 13, 2010 16:40:11.593103000 CEST" size="0"
pos="0" show="May 13, 2010 16:40:11.593103000"/>
<field name="frame.time_epoch" showname="Epoch Time: 1273761611.593103000 seconds" size="0" pos=
"0" show="1273761611.593103000"/>
<field name="frame.time_delta" showname="Time delta from previous captured frame: 0.000000000
seconds" size="0" pos="0" show="0.000000000"/>
<field name="frame.time_delta_displayed" showname="Time delta from previous displayed frame:
0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
<field name="frame.time_relative" showname="Time since reference or first frame: 0.000000000
seconds" size="0" pos="0" show="0.000000000"/>
<field name="frame.number" showname="Frame Number: 1" size="0" pos="0" show="1"/>
<field name="frame.len" showname="Frame Length: 130 bytes (1040 bits)" size="0" pos="0" show="
130"/>
<field name="frame.cap_len" showname="Capture Length: 130 bytes (1040 bits)" size="0" pos="0"
show="130"/>
<field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
<field name="frame.ignored" showname="Frame is ignored: False" size="0" pos="0" show="0"/>
<field name="frame.protocols" showname="Protocols in frame: eth:ipv6:icmpv6" size="0" pos="0"
show="eth:ipv6:icmpv6"/>
</proto>
<proto name="eth" showname="Ethernet II, Src: fe:fd:00:00:01:01 (fe:fd:00:00:01:01), Dst:
IPv6mcast_00:00:00:16 (33:33:00:00:00:16)" size="14" pos="0">
<field name="eth.dst" showname="Destination: IPv6mcast_00:00:00:16 (33:33:00:00:00:16)" size="6"
pos="0" show="33:33:00:00:00:16" value="333300000016">
<field name="eth.addr" showname="Address: IPv6mcast_00:00:00:16 (33:33:00:00:00:16)" size="6"
pos="0" show="33:33:00:00:00:16" value="333300000016"/>
<field name="eth.ig" showname=".... ...1 .... .... .... .... = IG bit: Group address (
multicast/broadcast)" size="3" pos="0" show="1" value="1" unmaskedvalue="333300"/>
<field name="eth.lg" showname=".... ..1. .... .... .... .... = LG bit: Locally administered
address (this is NOT the factory default)" size="3" pos="0" show="1" value="1"
unmaskedvalue="333300"/>
</field>
<field name="eth.src" showname="Source: fe:fd:00:00:01:01 (fe:fd:00:00:01:01)" size="6" pos="6"
show="fe:fd:00:00:01:01" value="fefd00000101">
<field name="eth.addr" showname="Address: fe:fd:00:00:01:01 (fe:fd:00:00:01:01)" size="6" pos=
"6" show="fe:fd:00:00:01:01" value="fefd00000101"/>
<field name="eth.ig" showname=".... ...0 .... .... .... .... = IG bit: Individual address (
unicast)" size="3" pos="6" show="0" value="0" unmaskedvalue="fefd00"/>
<field name="eth.lg" showname=".... ..1. .... .... .... .... = LG bit: Locally administered
address (this is NOT the factory default)" size="3" pos="6" show="1" value="1"
unmaskedvalue="fefd00"/>
110
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
111
</field>
<field name="eth.type" showname="Type: IPv6 (0x86dd)" size="2" pos="12" show="0x86dd" value="86
dd"/>
</proto>
<proto name="ipv6" showname="Internet Protocol Version 6, Src: :: (::), Dst: ff02::16 (ff02::16)
" size="48" pos="14">
<field name="ipv6.version" showname="0110 .... = Version: 6" size="1" pos="14" show="6" value="6
" unmaskedvalue="60">
<field name="ip.version" showname="0110 .... = This field makes the filter "ip.version
== 6" possible: 6" size="1" pos="14" show="6" value="6" unmaskedvalue="60"/>
</field>
<field name="ipv6.class" showname=".... 0000 0000 .... .... .... .... .... = Traffic class: 0
x00000000" size="4" pos="14" show="0x00000000" value="0" unmaskedvalue="60000000">
<field name="ipv6.traffic_class.dscp" showname=".... 0000 00.. .... .... .... .... .... =
Differentiated Services Field: Default (0x00000000)" size="4" pos="14" show="0x00000000"
value="0" unmaskedvalue="60000000"/>
<field name="ipv6.traffic_class.ect" showname=".... .... ..0. .... .... .... .... .... = ECNCapable Transport (ECT): Not set" size="4" pos="14" show="0" value="0" unmaskedvalue="
60000000"/>
<field name="ipv6.traffic_class.ce" showname=".... .... ...0 .... .... .... .... .... = ECNCE: Not set" size="4" pos="14" show="0" value="0" unmaskedvalue="60000000"/>
</field>
<field name="ipv6.flow" showname=".... .... .... 0000 0000 0000 0000 0000 = Flowlabel: 0
x00000000" size="4" pos="14" show="0x00000000" value="0" unmaskedvalue="60000000"/>
<field name="ipv6.plen" showname="Payload length: 76" size="2" pos="18" show="76" value="004c"/
>
<field name="ipv6.nxt" showname="Next header: IPv6 hop-by-hop option (0x00)" size="1" pos="20"
show="0x00" value="00"/>
<field name="ipv6.hlim" showname="Hop limit: 1" size="1" pos="21" show="1" value="01"/>
<field name="ipv6.src" showname="Source: :: (::)" size="16" pos="22" show="::" value="
00000000000000000000000000000000"/>
<field name="ipv6.addr" showname="Address: :: (::)" hide="yes" size="16" pos="22" show="::" value
="00000000000000000000000000000000"/>
<field name="ipv6.src_host" showname="Source Host: ::" hide="yes" size="16" pos="22" show="::"
value="00000000000000000000000000000000"/>
<field name="ipv6.host" showname="Host: ::" hide="yes" size="16" pos="22" show="::" value="
00000000000000000000000000000000"/>
<field name="ipv6.dst" showname="Destination: ff02::16 (ff02::16)" size="16" pos="38" show="
ff02::16" value="ff020000000000000000000000000016"/>
<field name="ipv6.addr" showname="Address: ff02::16 (ff02::16)" hide="yes" size="16" pos="38"
show="ff02::16" value="ff020000000000000000000000000016"/>
<field name="ipv6.dst_host" showname="Destination Host: ff02::16" hide="yes" size="16" pos="38"
show="ff02::16" value="ff020000000000000000000000000016"/>
<field name="ipv6.host" showname="Host: ff02::16" hide="yes" size="16" pos="38" show="ff02::16"
value="ff020000000000000000000000000016"/>
<field name="ipv6.hop_opt" showname="Hop-by-Hop Option" size="8" pos="54" show="" value="">
<field name="" show="Next header: ICMPv6 (0x3a)" size="1" pos="54" value="3a"/>
<field name="" show="Length: 0 (8 bytes)" size="1" pos="55" value="00"/>
<field name="" show="Router alert: MLD (4 bytes)" size="4" pos="56" value="05020000"/>
<field name="ipv6.opt.padn" showname="PadN: 2 bytes" size="2" pos="60" show="2" value="0100"/>
</field>
</proto>
<proto name="icmpv6" showname="Internet Control Message Protocol v6" size="68" pos="62">
<field name="icmpv6.type" showname="Type: Multicast Listener Report Message v2 (143)" size="1"
pos="62" show="143" value="8f"/>
<field name="icmpv6.code" showname="Code: 0" size="1" pos="63" show="0" value="00"/>
<field name="icmpv6.checksum" showname="Checksum: 0x6955 [correct]" size="2" pos="64" show="0
x6955" value="6955"/>
<field name="icmpv6.reserved" showname="Reserved: 0000" size="2" pos="66" show="00:00" value="
111
112
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
0000"/>
<field name="icmpv6.mldr.nb_mcast_records" showname="Number of Multicast Address Records: 3"
size="2" pos="68" show="3" value="0003"/>
<field name="icmpv6.mldr.mar" showname="Multicast Address Record Changed to exclude: ff02::1:
ff00:0" size="20" pos="70" show="" value="">
<field name="icmpv6.mldr.mar.record_type" showname="Record Type: Changed to exclude (4)" size=
"1" pos="70" show="4" value="04"/>
<field name="icmpv6.mldr.mar.aux_data_len" showname="Aux Data Len: 0" size="1" pos="71" show="
0" value="00"/>
<field name="icmpv6.mldr.mar.nb_sources" showname="Number of Sources: 0" size="2" pos="72"
show="0" value="0000"/>
<field name="icmpv6.mldr.mar.multicast_address" showname="Multicast Address: ff02::1:ff00:0 (
ff02::1:ff00:0)" size="16" pos="74" show="ff02::1:ff00:0" value="
ff0200000000000000000001ff000000"/>
</field>
<field name="icmpv6.mldr.mar" showname="Multicast Address Record Changed to exclude: ff02::2"
size="20" pos="90" show="" value="">
<field name="icmpv6.mldr.mar.record_type" showname="Record Type: Changed to exclude (4)" size=
"1" pos="90" show="4" value="04"/>
<field name="icmpv6.mldr.mar.aux_data_len" showname="Aux Data Len: 0" size="1" pos="91" show="
0" value="00"/>
<field name="icmpv6.mldr.mar.nb_sources" showname="Number of Sources: 0" size="2" pos="92"
show="0" value="0000"/>
<field name="icmpv6.mldr.mar.multicast_address" showname="Multicast Address: ff02::2 (ff02
::2)" size="16" pos="94" show="ff02::2" value="ff020000000000000000000000000002"/>
</field>
<field name="icmpv6.mldr.mar" showname="Multicast Address Record Changed to exclude: ff02::1:
ff00:101" size="20" pos="110" show="" value="">
<field name="icmpv6.mldr.mar.record_type" showname="Record Type: Changed to exclude (4)" size=
"1" pos="110" show="4" value="04"/>
<field name="icmpv6.mldr.mar.aux_data_len" showname="Aux Data Len: 0" size="1" pos="111" show=
"0" value="00"/>
<field name="icmpv6.mldr.mar.nb_sources" showname="Number of Sources: 0" size="2" pos="112"
show="0" value="0000"/>
<field name="icmpv6.mldr.mar.multicast_address" showname="Multicast Address: ff02::1:ff00:101
(ff02::1:ff00:101)" size="16" pos="114" show="ff02::1:ff00:101" value="
ff0200000000000000000001ff000101"/>
</field>
</proto>
</packet>
</pdml>
Código C.9: ascii.txt, fichero de salida en texto plano con la información en hexadecimal y en ascii
que devuelve TShark sobre el paquete seleccionado.
1
2
3
4
5
6
7
8
9
10
11
1 0.000000 :: −> ff02::16 ICMPv6 130 Multicast Listener Report Message v2
0000
0010
0020
0030
0040
0050
0060
0070
0080
33
00
00
00
69
00
00
00
01
33
00
00
00
55
00
00
00
01
00 00 00 16 fe fd 00 00 01 01 86 dd 60 00 33............`.
00 4c 00 01 00 00 00 00 00 00 00 00 00 00 ...L............
00 00 00 00 ff 02 00 00 00 00 00 00 00 00 ................
00 00 00 16 3a 00 05 02 00 00 01 00 8f 00 ......:.........
00 00 00 03 04 00 00 00 ff 02 00 00 00 00 iU..............
00 00 00 01 ff 00 00 00 04 00 00 00 ff 02 ................
00 00 00 00 00 00 00 00 00 00 00 02 04 00 ................
ff 02 00 00 00 00 00 00 00 00 00 01 ff 00 ................
..
112
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
113
Código C.10: io.js, se encarga de escribir, en formato HTML con los atributos necesarios, la información de los ficheros de salida de TShark.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function loadXMLDoc(dname) {
// ajax. Load XML structure in xhttp.responseXML
if (window.XMLHttpRequest)
{
xhttp = new XMLHttpRequest();
}
else
{
xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.open("GET", dname+"?nocache="+ Math.random(), false); // random() needed to avoid cache in
Firefox
xhttp.send();
return xhttp.responseXML;
}
function writeAscii()
{ // write, according to the right structure, ascci and hexadecimal info in the third table
index = 0;
var lastLine = false;
var aux = ascii;
var table = document.getElementById("tab-0");
var pre = document.createElement("pre");
while (aux != "")
{
var text = aux.substr(0, aux.indexOf(" ") + 2);
aux = aux.substr(aux.indexOf(" ") + 2);
var preText = document.createTextNode(text);
pre.appendChild(preText);
for (var i = 0; i < 16; i++)
{ // 16 hex values per file
text = aux.substr(0, aux.indexOf(" "));
aux = aux.substr(aux.indexOf(" ") + 1);
if (!(text == ""))
{
var spanText = document.createTextNode(text);
span = document.createElement("span");
span.setAttribute("class", "h");
span.setAttribute("id", "h" + (i + index)); // used to select this packets when needed
span.appendChild(spanText);
pre.appendChild(span);
text = " ";
spanText = document.createTextNode(text);
pre.appendChild(spanText);
}
else
{
lastLine = true;
break;
}
}
113
114
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
if (!lastLine)
{
text = aux.substr(0, 2); // blank spaces
aux = aux.substr(2);
var spanText = document.createTextNode(text);
pre.appendChild(spanText);
}
else
{
while ((text == "") || (text == " "))
{
text = " ";
var spanText = document.createTextNode(text);
pre.appendChild(spanText);
text = aux.substr(1, 1);
aux = aux.substr(1);
}
text = " ";
var spanText = document.createTextNode(text);
pre.appendChild(spanText);
}
for (var j = 0; j < 16; j++)
{ // after 16 hex and 2 blank spaces, 16 ascii simbols
if (aux == "") break;
text = aux.substr(0, 1);
aux = aux.substr(1);
var spanText = document.createTextNode(text);
span = document.createElement("span");
span.setAttribute("class", "d");
span.setAttribute("id", "d" + (j + index)); // used to select this packets when needed
span.appendChild(spanText);
pre.appendChild(span);
}
index = index + 16;
}
table.appendChild(pre);
}
function writePSML(branch name, xmlDOC)
// writes in html summary information of packets included in psml.xml
{ // branch_name -> branch where looking for values <packet> <section> 1 </section> </packet>
x = xmlDOC.getElementsByTagName(branch name); // x tree from <packet>
tabla = document.getElementById("SummaryTable"); // table reference
// lastPacket = x.length; // Number of packets in file
var numPackets = x.length;
if (numPackets != 0) lastPacket = x[numPackets − 1].childNodes[1].childNodes[0].nodeValue; // when file
non continuous (filters)
else globalError = "NoPackets";
if (document.getElementById('Red') == "")
{
var error = document.createElement("img");
error.setAttribute('src', 'images/error.png');
tabla.appendChild(error);
114
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
}
for (i = 0; i < x.length; i++)
{ // all <packet> from file
y = x[i].childNodes; // y tree from section
var row = document.createElement("tr");
row.setAttribute("class", "");
for (j = 1; j < y.length; j = j + 2)
{ // j + 2 because text type is in the odd positions
var cell = document.createElement("td");
if (y[j].childNodes.length != 0)
var cellText = document.createTextNode(y[j].childNodes[0].nodeValue); // Each section's value
cell.appendChild(cellText);
row.appendChild(cell);
}
row.setAttribute('onmousedown', 'packetDetails(this)');
if (i == 0) {
row.setAttribute('class', 'picked'); // pdml details from first packet by default
row.setAttribute('id','picked'); // needed to navigate packets
}
tabla.appendChild(row);
}
}
function writePDML(branch name, xmlDOC, packet)
{ /* writes in html info of the packet included in pdml.xml */
var x = xmlDOC.getElementsByTagName(branch name);
var tabla = document.getElementById("detail-div"); // details table's reference
try
{ // empty pdml.xml or no file -> error
var y = x[packet].childNodes;
for (protos = 3; protos < y.length; protos = protos + 2)
{
var divProtos = document.createElement("div");
divProtos.setAttribute('id', y[protos].getAttribute("name"));
divProtos.setAttribute('size', y[protos].getAttribute("size"));
divProtos.setAttribute('pos', y[protos].getAttribute("pos"));
divProtos.setAttribute('class', 'protocol');
//divProtos.setAttribute('onmouseup', 'selectAscii(this)');
var spanProtos = document.createElement("span");
spanProtos.setAttribute('onmousedown', 'expandClass(this.parentNode)');
spanProtos.setAttribute('class', 'protoLabel');
spanProtos.setAttribute('style', 'cursor:pointer');
var spanProtosText = document.createTextNode(y[protos].getAttribute("showname"));
spanProtos.appendChild(spanProtosText);
divProtos.appendChild(spanProtos);
var z = y[protos].childNodes;
for (fields = 1; fields < z.length; fields = fields + 2)
{
if (z[fields].childNodes.length != 0)
{
115
115
116
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
z2 = z[fields].childNodes.length;
if (z[fields].getAttribute("name") == "")
{
z[fields].setAttribute("name", "changed" + fields);
var divFields = document.createElement("div");
divFields.setAttribute('id', z[fields].getAttribute("name"));
divFields.setAttribute('size', z[fields].getAttribute("size"));
divFields.setAttribute('pos', z[fields].getAttribute("pos"));
divFields.setAttribute('class', 'parent field');
//divFields.setAttribute('onmouseup', 'selectAscii(this)');
var imgFields = document.createElement("img");
imgFields.setAttribute('src', 'images/arrow-rigth12px.png');
imgFields.setAttribute('align', 'left');
imgFields.setAttribute('class', '');
var spanFields = document.createElement("span");
spanFields.setAttribute('onmousedown', 'expandClass(this.parentNode)');
spanFields.setAttribute('class', 'fieldLabel');
spanFields.setAttribute('style', 'cursor:pointer');
var spanFieldsText = document.createTextNode(z[fields].getAttribute("show"));
divFields.appendChild(imgFields); // here, 'cause could be or not be
}
else
{
var divFields = document.createElement("div");
divFields.setAttribute('id', z[fields].getAttribute("name"));
divFields.setAttribute('size', z[fields].getAttribute("size"));
divFields.setAttribute('pos', z[fields].getAttribute("pos"));
divFields.setAttribute('class', 'parent field');
//divFields.setAttribute('onmouseup', 'selectAscii(this)');
var imgFields = document.createElement("img");
imgFields.setAttribute('src', 'images/arrow-rigth12px.png');
imgFields.setAttribute('align', 'left');
imgFields.setAttribute('class', '');
var spanFields = document.createElement("span");
spanFields.setAttribute('onmousedown', 'expandClass(this.parentNode)');
spanFields.setAttribute('class', 'fieldLabel');
spanFields.setAttribute('style', 'cursor:pointer');
var spanFieldsText = document.createTextNode(z[fields].getAttribute("showname"));
divFields.appendChild(imgFields); // here, 'cause could be or not be
}
spanFields.appendChild(spanFieldsText);
divFields.appendChild(spanFields);
for (subfields = 1; subfields < z2; subfields = subfields + 2)
{
var divSubFields = document.createElement("div");
if (z[fields].childNodes[subfields].getAttribute("name") == "") divSubFields.setAttribute('
id', "changed" + fields + "_" + subfields);
else
divSubFields.setAttribute('id', z[fields].childNodes[subfields].getAttribute("name"));
divSubFields.setAttribute('size', z[fields].childNodes[subfields].getAttribute("size"));
divSubFields.setAttribute('pos', z[fields].childNodes[subfields].getAttribute("pos"));
116
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
divSubFields.setAttribute('class', 'field');
//divSubFields.setAttribute('onmouseup', 'selectAscii(this)');
if (z[fields].childNodes[subfields].getAttribute("name") == "")
{
var spanSubFields = document.createElement("span");
spanSubFields.setAttribute('onmousedown', 'expandClass(this.parentNode)');
spanSubFields.setAttribute('class', 'fieldLabel');
var spanSubFieldsText = document.createTextNode(z[fields].childNodes[subfields].
getAttribute("show"));
}
else
{
var spanSubFields = document.createElement("span");
spanSubFields.setAttribute('onmousedown', 'expandClass(this.parentNode)');
spanSubFields.setAttribute('class', 'fieldLabel');
var spanSubFieldsText = document.createTextNode(z[fields].childNodes[subfields].
getAttribute("showname"));
}
spanSubFields.appendChild(spanSubFieldsText);
divSubFields.appendChild(spanSubFields);
divFields.appendChild(divSubFields);
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
117
}
}
else
{
if (z[fields].getAttribute("name") != 'data')
{
var divFields = document.createElement("div");
divFields.setAttribute('id', z[fields].getAttribute("name"));
divFields.setAttribute('size', z[fields].getAttribute("size"));
divFields.setAttribute('pos', z[fields].getAttribute("pos"));
divFields.setAttribute('class', 'field');
//divFields.setAttribute('onmouseup', 'selectAscii(this)');
if (z[fields].getAttribute("name") == "")
{
var spanFields = document.createElement("span");
spanFields.setAttribute('onmousedown', 'expandClass(this.parentNode)');
spanFields.setAttribute('class', 'fieldLabel');
var spanFieldsText = document.createTextNode(z[fields].getAttribute("show"));
}
else
{
var spanFields = document.createElement("span");
spanFields.setAttribute('onmousedown', 'expandClass(this.parentNode)');
spanFields.setAttribute('class', 'fieldLabel');
var spanFieldsText = document.createTextNode(z[fields].getAttribute("showname"));
}
spanFields.appendChild(spanFieldsText);
divFields.appendChild(spanFields);
}
}
divProtos.appendChild(divFields);
}
tabla.appendChild(divProtos);
}
117
118
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
C.1.2.
Simulación de captura en tiempo real
Código C.11: WebShark.js, funciones principales en javascript, que detectan cambios en los ficheros
(a través de PHP) y conectan con el server para modificar los ficheros de salida.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function simulateCaptureLive()
{ /* Show packets one by one in the summary simulating real time capture */
if (fileReady)
{
if (!Capturing)
{
Capturing = true;
xmlDocLive = loadXMLDoc("psml.xml");
}
var x = xmlDocLive.getElementsByTagName("packet"); // x is the tree from <packet>
if (currentPacket < x.length)
{
var tabla = document.getElementById("SummaryTable"); // table's beggining reference
y = x[currentPacket].childNodes; // y tree from section
var row = document.createElement("tr");
for (j = 1; j < y.length; j = j + 2)
{ // j + 2 because text type is in the odd positions
var cell = document.createElement("td");
if (y[j].childNodes.length != 0)
var cellText = document.createTextNode(y[j].childNodes[0].nodeValue); // each section's value
cell.appendChild(cellText);
row.appendChild(cell);
}
row.setAttribute('class', '');
row.setAttribute('onmousedown', 'packetDetails(this)');
tabla.appendChild(row);
currentPacket = currentPacket + 1;
setTimeout("simulateCaptureLive()", 500);
scrollDown();
}
else
{
updating = false;
Capturing = false;
if (currentPacket != 0) lastPacket = x[currentPacket − 1].childNodes[1].childNodes[0].nodeValue; //
last packet value
currentPacket = 0;
setTimeout("modifyFile(CaptureNet)", 2500);
}
}
else
{
setTimeout("simulateCaptureLive()", 500);
}
}
118
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
C.1.3.
119
Guardar ficheros
Código C.12: SaveFiles.js, gestiona las diferentes peticiones AJAX para guardar los ficheros de captura.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function saveFile() {
var url = window.location.href;
url = url.substr(0,url.lastIndexOf("/")+1); // delete the reference to current page
url = url.concat("capture" + CaptureNet + ".cap");
window.location.replace(url);
}
function saveAllFiles() {
var url = window.location.href;
url = url.substr(0,url.lastIndexOf("/")+1); // delete the reference to current page
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var zipfile = xmlhttp.responseText;
url = url.concat(zipfile);
window.location.replace(url);
//removeSaveZip(zipfile);
}
}
xmlhttp.open("GET", "php/saveAllFiles.php?nets=" + nets, true);
xmlhttp.send();
}
function saveFileFilter() {
var url = window.location.href;
url = url.substr(0,url.lastIndexOf("/")+1); // delete the reference to current page
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var name = xmlhttp.responseText;
url = url.concat(name);
119
120
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
window.location.replace(url);
removeSaveZip(zipfile);
}
}
xmlhttp.open("GET", "php/saveFileFilter.php?filter=" + CaptureFilter + "&net=" + CaptureNet,
true);
xmlhttp.send();
}
function saveAllFilesFilter() {
var url = window.location.href;
url = url.substr(0,url.lastIndexOf("/")+1); // delete the reference to current page
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var zipfile = xmlhttp.responseText;
url = url.concat(zipfile);
window.location.replace(url);
removeSaveZip(zipfile);
}
}
xmlhttp.open("GET", "php/saveAllFilesFilter.php?filter=" + CaptureFilter + "&nets=" + nets, true);
xmlhttp.send();
}
function removeSaveZip(zipfile) {
if (window.XMLHttpRequest)
{ // code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else
{ // code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
}
}
xmlhttp.open("GET", "php/removeSaveZip.php?zipfile=" + zipfile, true);
xmlhttp.send();
}
120
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
121
Código C.13: SaveAllFilesFilter.php, guarda en un zip todos los ficheros de todas las redes de captura
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$num nets = $ GET['nets'];
$filter = $ GET['filter'];
$time now = time();
$zipfile = "net_" . $filter . "_" . date('Y-m-d_G:i:s', $time now) . '.zip';
for ($i=0; $i<$num nets; $i++) {
$file = "../capture" . $i . ".cap";
$file out = "../net" . $i . "-" . $filter . ".cap";
shell exec("tshark -r " . $file . " " . $filter . " -w " . $file out);
shell exec("zip -g ../" . $zipfile . " " . $file out);
unlink($file out);
}
echo $zipfile;
?>
Código C.14: removeSaveZip.php, elimina el fichero cuyo nombre se le pasa en la variable zipfile
1
2
3
4
<?php
$file = $ GET('zipfile');
shell exec("rm ../" . $zipfile);
?>
C.1.4.
Estadı́sticas
Código C.15: Events.js, código que comprende todas las funciones necesarias para generar las estadı́sticas, tanto estáticas como dinámicas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function initDensityGraph() {
var capDuration = $("#SummaryTable tr:last td:eq(1)").html();
capDuration = Math.ceil(capDuration);
intervals = capDuration / 10;
intervals = Math.round(intervals ∗ 100) / 100;
var divStats = document.createElement("div");
divStats.setAttribute("id","graph");
divStats.setAttribute("class","graph");
$.modal(divStats);
centerModal();
options = {
chart: {
renderTo: 'graph',
type: 'column',
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false
121
122
},
title: {
text: "",
},
xAxis: {
categories: [],
title: {
text: ""
}
},
yAxis: {
min: 0,
title: {
text: ""
}
},
legend: {
enabled: false
},
credits: {
enabled: false
},
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
tooltip: {
formatter: function() {
return "<b>" + manageLanguage("Interval") +":</b> [" + this.x +"]<br/><b>" + manageLanguage(
this.series.name) + ":</b> " + this.y;
}
},
series:[]
};
}
function densityOptions(dynamic) {
var mod = document.createElement("div");
mod.setAttribute("id","simplemodal-container");
var headerNet = document.createElement("h3");
headerNet.setAttribute("style","text-align: center;");
if (dynamic) {
headerNet.appendChild(document.createTextNode(manageLanguage("DensityMod") + ":"));
}
else headerNet.appendChild(document.createTextNode(manageLanguage("DensityMod") + ":"));
var br = document.createElement("br");
headerNet.appendChild(br);
var buttonNet = document.createElement("button");
buttonNet.setAttribute("type","button");
buttonNet.setAttribute("value","Packets");
if (dynamic) {
buttonNet.setAttribute("onmousedown","$.modal.close(); dynamicDensity();");
}
else buttonNet.setAttribute("onmousedown","$.modal.close(); densityPackets();");
122
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
buttonNet.appendChild(document.createTextNode(manageLanguage("Packets")));
headerNet.appendChild(buttonNet);
buttonNet = document.createElement("button");
buttonNet.setAttribute("type","button");
buttonNet.setAttribute("value","Bytes");
if (dynamic) {
buttonNet.setAttribute("onmousedown","$.modal.close(); dynamicDensity();");
}
else buttonNet.setAttribute("onmousedown","$.modal.close(); densityBytes();");
buttonNet.appendChild(document.createTextNode(manageLanguage("Bytes")));
headerNet.appendChild(buttonNet);
mod.appendChild(headerNet);
$.modal(mod);
}
function densityPackets() {
initDensityGraph();
$.ajax({url:"php/statsDensity.php", data: { interval: intervals, path: path, net: CaptureNet},
success: function(response) {
if (response != "Session Expired") {
$.get(path+'statsDensity.txt'+'?nocache='+Math.random(), function(data) {
var lines = data.split("\n");
var series = {
name: "",
data: []
};
var lineIntervals = 7;
var symbol = " ";
$.each(lines, function(lineNo, line) {
if (lineNo == 2) {
if (line != "IO Statistics") { // new version tshark
lineIntervals = 11;
symbol = "|";
}
}
if (lineNo >= lineIntervals) { // not interesting lines before
var items = line.split(symbol);
var i=0;
$.each(items, function(itemNo, item) {
if (item != "") {
switch (i) {
case 0: item = item.replace("<>", "-"); options.xAxis.categories.push(item); break;
case 1: series.data.push(parseInt(item)); break;
}
i++;
}
})
}
123
123
124
});
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
series.name = "Packets";
options.series.push(series);
options.title.text = manageLanguage("DensityMod") + " " + manageLanguage("Packets") + " " +
CaptureNet;
options.yAxis.title.text = manageLanguage("Num") + manageLanguage("Packets");
options.xAxis.title.text = manageLanguage("Interval")+"s (s)";
var chart = new Highcharts.Chart(options);
});
}
else manageErrors("Session Expired");
}
});;
}
function densityBytes() {
initDensityGraph();
$.ajax({url:"php/statsDensity.php", data: { interval: intervals, path: path, net: CaptureNet},
success: function(response) {
if (response != "Session Expired") {
$.get(path+'statsDensity.txt'+'?nocache='+Math.random(), function(data) {
var lines = data.split("\n");
var series = {
data: []
};
var lineIntervals = 7;
var symbol = " ";
$.each(lines, function(lineNo, line) {
if (lineNo == 2) {
if (line != "IO Statistics") { // new version tshark
lineIntervals = 11;
symbol = "|";
}
}
if (lineNo >= lineIntervals) { // not interesting lines before
var items = line.split(symbol);
var i=0;
$.each(items, function(itemNo, item) {
if (item != "") {
switch (i) {
case 0: item = item.replace("<>", "-"); options.xAxis.categories.push(item); break;
case 2: series.data.push(parseInt(item)); break;
}
i++;
}
})
}
});
124
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
series.name = "Bytes";
options.series.push(series);
options.title.text = manageLanguage("DensityMod") + " " + manageLanguage("Bytes") + " " +
CaptureNet;
options.yAxis.title.text = manageLanguage("Num") + manageLanguage("Bytes");
options.xAxis.title.text = manageLanguage("Interval")+"s (s)";
var chart = new Highcharts.Chart(options);
});
}
else manageErrors("Session Expired");
}
});
}
function processLinesStats(lines) {
$.each(lines, function(lineNo, line) {
if (lineNo >= (7+offset)) { // not interesting lines before
if (line != "") {
var items = line.split(" ");
var i=0;
var x = 0, y = 0, x1 = 0, x2 = 0;
$.each(items, function(itemNo, item) {
if (item != "") {
switch (i) {
case 0: x = (offset++∗intervals∗10)/10; break;
case 2: y = parseInt(item);
break;
}
i++;
}
})
series.addPoint([x, y], false, true);
series.addPoint([(offset∗intervals−0.01),y], false, true);
series.addPoint([(offset∗intervals−0.005),0], true, true);
return false;
}
else finished = true;
}
});
}
function initDynamicDensity() {
var capDuration = $("#SummaryTable tr:last td:eq(1)").html();
capDuration = Math.ceil(capDuration);
intervals = capDuration / 10;
intervals = Math.round(intervals ∗ 100) / 100;
var divStats = document.createElement("div");
divStats.setAttribute("id","graph");
divStats.setAttribute("class","graph");
125
125
126
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
$.modal(divStats);
centerModal();
options = {
chart: {
renderTo: 'graph',
type: 'area',
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false,
events: {
load: function() {
// set up the updating of the chart each second
series = this.series[0];
finished = true;
setInterval(function() {
if (newPackets) {
$.ajax({url:"php/statsDensity.php", data:"interval=" + intervals + "&file=capture" +
CaptureNet + ".cap" + "&filter=" + lastPacketStats,
success: function(response) {
$.get('statsDensity.txt'+'?nocache='+Math.random(), function(data) {
newPackets = false;
var lines = data.split("\n");
finished = false;
linesStats = lines;
});
}
});
}
if (!finished) {
processLinesStats(linesStats);
}
else {
series.addPoint([(offset++∗intervals), 0], false, true);
series.addPoint([(offset∗intervals−0.005),0], true, true);
}
}, intervals∗1000);
}
}
},
title: {
text: "",
},
xAxis: {
//categories: [],
title: {
text: ""
}
},
yAxis: {
min: 0,
title: {
text: ""
126
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
}
},
legend: {
enabled: false
},
credits: {
enabled: false
},
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
tooltip: {
//shared: true,
formatter: function() {
var start = (Math.round(this.x∗100)/100);
if (start % intervals == 0)
return "<b>" + manageLanguage("Interval") +":</b> [" + Math.round(this.x∗10)/10 + " - " +
Math.round((this.x+intervals)∗10)/10+"]<br/><b>" + manageLanguage(this.series.name) + ":</b>
" + this.y + " ";
else return false; //"<b>" + manageLanguage("Interval") +":</b> [" + this.key + " - " + (this.
key+intervals)+"]<br/><b>" + manageLanguage(this.series.name) + ":</b> " + this.y;
}
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
127
},
series:[]
};
}
function dynamicDensity() {
initDynamicDensity();
$.ajax({url:"php/statsDensity.php", data:"interval=" + intervals + "&file=capture" + CaptureNet + ".cap
",
success: function(response) {
$.get('statsDensity.txt'+'?nocache='+Math.random(), function(data) {
newPackets = false;
lastPacketStats = lastPacket;
var lines = data.split("\n");
var series = {
data: [],
marker: {
enabled: false
}
};
$.each(lines, function(lineNo, line) {
if (lineNo >= 7) { // not interesting lines before
var items = line.split(" ");
var i=0;
var x = 0, y = 0, x1 = 0, x2 = 0;
$.each(items, function(itemNo, item) {
if (item != "") {
switch (i) {
case 0: x = (offset++∗intervals∗10)/10; break;//offset*intervals+"s - "+(offset+1)*intervals
+"s"); break;
127
128
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
case 2: y = parseInt(item);
series.data.push({
x: x,
y: y,
name: "Start"
}); break;
}
i++;
}
})
x1 = (offset∗intervals)−0.01;
series.data.push({
x: x1,
y: y,
name: x
});
x2 = (offset∗intervals)−0.005;
series.data.push({
x: x2,
y: 0,
name: x
});
}
});
series.name = "Bytes";
options.series.push(series);
options.title.text = manageLanguage("DensityMod") + " " + manageLanguage("Bytes") + " capture" +
CaptureNet + ".cap";
options.yAxis.title.text = manageLanguage("Num") + manageLanguage("Bytes");
options.xAxis.title.text = manageLanguage("Interval")+"s (s)";
var chart = new Highcharts.Chart(options);
});
}
});
}
C.1.5.
Hoja de estilo CSS
Código C.16: Webshark.css, hoja de estilo principal de wShark.
1
2
3
4
5
6
7
8
9
10
11
12
body { font: 12px Verdana;}
div.info { height: 37px; width: 100px; float: left; margin−left: 15px;}
span.info { font−size: 12px; margin: 3px 0px 0px 5px; float:left; width: 100px; }
/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ PACKETS TABLE (Summary & Details) ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
.fht table body {
position: relative;
float: left;
margin: 0;
padding: 0;
overflow−y:auto;
128
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
129
overflow−x:auto;
border−top: 1px solid #000;
background−color: #fff;
}
.fht table body table thead tr th, .fht table body table tbody tr td, .fht fixed header table thead tr th, table thead
tr th, table tbody tr td {
padding: 2px 5px;
}
.fht table body table thead tr th, .fht fixed header table thead tr th, table thead tr th {
padding: 5px;
}
.fht fixed header th { border−right: 2px inset #ddd }
.empty−cell {
overflow:hidden;
}
table { font−family: monospace; color: #000; border−top:2px solid black; border−collapse: collapse; border−
spacing: 10px !important; }
th { font−family:Helvetica; text−align:left !important; padding: 5px; font−weight: bold; vertical−align:bottom;}
th:last−child { border−right: none; }
table#summary td:last−child { white−space: nowrap; overflow: hidden; position: absolute; }
#summary { width: 100 %; }
#summary tbody td { cursor: pointer; font−size: 14px; overflow: auto !important }
tr.picked { background−color: rgb(167, 203, 253); border: 1px solid #3691FB; }
#wholeSummary { width: 100 %; height: 50 %; overflow−x: auto; overflow−y: auto; }
.pane { overflow−y: auto; font−family: monospace; min−width: 1000px;}
#filter−field { font−size: 1.2em; position: relative; top: 1px}
#header { position: absolute; top: 0px; height: 70px; left: 0; right: 0; border−bottom: 1px solid #aaa; font−size: 0.9
em; min−width: 1000px;}
#wrapper { position: absolute; top: 43px; bottom: 0; left: 0; right:0; overflow: hidden }
#detail−div {
height: 25 %; /∗ +13 % − 2 % quitado del ascii−div ∗/
border−top: 1px solid #666;
background−color: #fff;
cursor: default;
}
#ascii−div { position:relative; height: 20 %; overflow: hidden;}
#ascii−div #tab−0, #ascii−div #tab−1 {
position: absolute;
top: 21px;
right:0;
left: 0;
bottom: 0;
padding−left: 10px;
overflow−y: auto;
background−color:#fff !important;
border−top: 1px solid #666;
margin−bottom: 7px;
129
130
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
}
pre { margin:2px}
/∗ Drop−down menu indentation ∗/
div.protocol { padding−left: 25px !important; }
div.protocol div { padding−left: 25px }
div.protocol ∗ div { padding−left: 25px }
div.protocol > div { display: none; }
div.expanded > div { display: block !important;}
div.parent > div { display: none; }
#detail−div
#detail−div
#detail−div
/∗div.parent
#detail−div
div:first−child { margin−top: 2px; }
span.protoLabel { background−color: #e5e5e5; display:block; margin−bottom: 2px}
span.fieldLabel { display:block; }
{ background: url(/images/shark−right.gif) 2px 0 no−repeat}∗/
{ border−top: 2px solid black; margin: 10px; font−size: 14px }
/∗ Selected packets ∗/
tr.picked td, div.picked > span.fieldLabel, div.picked > span.protoLabel {
background: #a7cbfd !important;
color: #000;
}
span.ascii−selection { background−color: #b6d6fe; color: #000 }
/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ BUTTONS ∗∗∗∗∗∗∗∗∗∗∗∗∗/
.ui−button { display: inline−block; position: relative; padding: 0; margin−right: .05em; text−decoration: none !
important; cursor: pointer; text−align: center; zoom: 1; overflow: visible; }
.ui−button .ui−button−text { display: block; line−height: 1.4; }
.ui−button−text−icon .ui−button−text { padding: .4em 1em .4em 2.1em; }
.Capturing { margin−left: 3px; padding: 1px; font−size: 100 %; width: 100 %; color: Black; font−weight: bold;
background−color : GreenYellow; −moz−border−radius: 4px; −webkit−border−radius: 4px; border−radius: 4
px; border: 1px solid #cbc7bd; }
.stopped { margin−left: 3px; padding: 1px; font−size: 100 %; width: 100 %; color: White; font−weight: bold;
background−color : Tomato; −moz−border−radius: 4px; −webkit−border−radius: 4px; border−radius: 4px;
border: 1px solid #cbc7bd; }
.File { margin−left: 3px; padding: 1px; font−size: 100 %; width: 100 %; color: Black; font−weight: bold; background
−color : Skyblue; −moz−border−radius: 4px; −webkit−border−radius: 4px; border−radius: 4px; border: 1px
solid #cbc7bd; }
#stopCaptureTitle { font−size: 12px; margin: 3px 0px 0px 10px; float:left; width: 100px; }
.captureButtonPlay { float:left; height: 21px; width: 30px; margin: 0px 0px 0px 3px; cursor:pointer; }
.captureButtonStop { height: 21px; width: 30px; margin: 0px 0px 0px 3px; cursor:pointer;}
.infoNet { margin−left: 3px; padding: 1px; font−size: 100 %; width: 100 %; background−color: ; color: Black ; font−
weight: bold; −moz−border−radius: 4px; −webkit−border−radius: 4px; border−radius: 4px; border: 1px solid
#cbc7bd; }
.infoFilter { margin−left: 3px; padding: 1px; font−size: 100 %; width: 100 %; background−color: ; color: Black ; font
−weight: bold; −moz−border−radius: 4px; −webkit−border−radius: 4px; border−radius: 4px; border: 1px
solid #cbc7bd; }
.infoLang { margin−left: 3px; padding: 1px; font−size: 100 %; width: 100 %; background−color: ; color: Black ; font
−weight: bold; −moz−border−radius: 4px; −webkit−border−radius: 4px; border−radius: 4px; border: 1px
solid #cbc7bd; }
130
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
C.2.
131
Version Stand-Alone de wShark
En esta sección se incluyen algunos ejemplos de los cambios en los ficheros de la aplicación para
adaptarla a esta versión.
C.2.1.
Inicio de la aplicación
Código C.17: IntroWebShark.php, HTML de la página principal de esta versión de wShark, donde
se seleccionan los archivos a subir
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta http−equiv="Content-Type" content="text/html; charset=utf-8" />
<title>IntroWebShark</title>
<meta name="author" content="Agustı́n Leyenda" />
<!−− Date: 2012−02−20 −−>
<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/jquery.cookie.js"></script>
<script type="text/javascript" src="js/WebShark.js"></script>
<script type="text/javascript" src="js/Language.js"></script>
<script type="text/javascript" src="js/Events.js"></script>
<script type="text/javascript" src="js/introMenu.js"></script>
<script type="text/javascript" src="js/uploadFiles.js"></script>
<script type="text/javascript" src="js/fileuploader.js"></script>
<script type='text/javascript' src='js/jquery.simplemodal.js'></script> <!−− Modal for
filter and other things −−>
<link type="text/css" charset="utf-8" rel="Stylesheet" media="all" href="css/
IntroWebShark.css" />
<link type="text/css" charset="utf-8" rel="Stylesheet" media="all" href="css/
fileuploader.css" />
<link type="text/css" rel="stylesheet" href="css/basic.css"/>
<script type="text/javascript">
$(document).ready(function(){
var running = 0;
var uploader = new qq.FileUploader({
// pass the dom node (ex. $(selector)[0] for jQuery users)
element: document.getElementById('file-uploader'),
// path to server−side upload script
action: 'php/php.php',
allowedExtensions: ['cap', 'pcap'],
sizeLimit: 1000000, // 1 MB
maxConnections: 12,
onSubmit: function() {
running++;
},
onComplete: function() {
running−−;
if (running == 0) // only trigger the event when there is no more files to upload
window.location.replace("WebShark.php");
}
});
131
132
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
});
if ($.cookie('lang') == null )
$.cookie('lang', 'English', { expires: 7});
language = $.cookie('lang');
</script>
</head>
<body>
<div id="header">
<img src="images/entel_logo.jpg" style="float: left;" alt=""/>
<img src="images/ETSETB2.jpg" style="float: right;" alt="" />
</div>
<div id="body">
<img src="images/wSharkLogoBlack.png" id="wLogo" alt="" />
<div id="dialog">
<h1>
<script type="text/Javascript">
document.write(manageLanguage("Welcome") + "wShark! ");
</script>
</h1>
<div id="file-uploader">
</div>
</div>
</div>
<div id="foot">
<script type="text/javascript">
document.write(manageLanguage("Browse"));
</script>
</div>
<div id="default">
<span id="defaultSpan" onmousedown='$.ajax({
type: "GET",
async: false,
url: "php/defaultExample.php"
});
window.location.replace("WebShark.
php")'>
<script type="text/javascript">document.write(manageLanguage("Default"));
</script>
</span>
<span id="lang" onmousedown='modalChangeLanguage();'>
<script type="text/javascript">document.write(manageLanguage("Change") +
" " + manageLanguage("MenuLanguage"));</script>
90
91
92
93
94
95
96
97
98
99
100
</span>
</div>
<script type="text/javascript">
132
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
101
102
103
104
105
106
107
108
109
110
111
133
$.get("php/alreadyInSession.php", function(data) {
if (data == "True") { // already in Session
alert(manageLanguage("AlreadySession"));
window.location.replace("WebShark.php");
}
});
</script>
</body>
</html>
Código C.18: WebShark.php, HTML de la página de la aplicación de wShark en esta versión
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
$path = session save path(".");
session start();
$ SESSION['last_activity'] = time();
?>
<!DOCTYPE html>
<head>
<title>WebShark</title>
<meta http−equiv="content-type" content="text/html; charset=utf-8" />
<META HTTP−EQUIV="PRAGMA" CONTENT="NO-CACHE">
<META HTTP−EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<meta http−equiv="expires" content="Fri, 5 Apr 1996 23:59:59 GMT">
<link type="text/css" charset="utf-8" rel="Stylesheet" media="all" href="css/Webshark.css" />
<link type="text/css" rel="stylesheet" href="css/dcmegamenu.css" />
<link type="text/css" rel="stylesheet" href="css/skins/white.css"/>
<link type="text/css" rel="stylesheet" href="css/basic.css"/>
<script type="text/javascript" charset="utf-8" src="js/WebShark.js"></script>
<script type="text/javascript" charset="utf-8" src="js/Errors.js"></script>
<script type="text/javascript" charset="utf-8" src="js/Language.js"></script>
<script type="text/javascript" charset="utf-8" src="js/io.js"></script>
<script type="text/javascript" charset="utf-8" src="js/Events.js"></script>
<script type="text/javascript" charset="utf-8" src="js/ManageTables.js"></script>
<script type="text/javascript" charset="utf-8" src="js/SaveFiles.js"></script>
<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/jquery.cookie.js"></script>
<script type='text/javascript' src='js/jquery.hoverIntent.minified.js'></script> <!−− Menu −−>
<script type='text/javascript' src='js/jquery.dcmegamenu.1.3.2.js'></script> <!−− Menu −−>
<script type='text/javascript' src='js/Menu.js'></script> <!−− Menu −−>
<script type='text/javascript' src='js/jquery.simplemodal.js'></script> <!−− Modal for filter
and other things −−>
<script type="text/javascript" src="js/highcharts.js"></script>
<meta name="apple-mobile-web-app-capable" content="yes">
<script type="text/javascript">
if ($.cookie('lang') != null)
language = $.cookie('lang');
</script>
</head>
133
134
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
<body onload="detectBrowser(); if ('Navigator' == navigator.appName) document.forms[0].reset();
navigatePacketsKeyboard()" >
<div id='header' class='ui-widget-header' style='border:none; '>
<img src='images/wSharkSecondaryLogo.jpg' align='left' style="margin-left: 5px" />
<script type="text/javascript">
<?php // detects the uploaded files and their names
$path = session id() . "/";
$filenames = array();
// Open a known directory, and proceed to read its contents
foreach(glob($path . "*") as $filename) {
$ext = pathinfo($filename, PATHINFO EXTENSION);
if (($ext == "cap") || ($ext == "pcap"))
$filenames[] = substr($filename, strpos($filename,"/")+1);
}
?>
files = ["<?php echo join("\", \"", $filenames); ?>"];
path = "<?php echo $path; ?>";
CaptureNet = files[0];
document.write("<div id='stopCaptureTitle'>");
document.write("<span style='margin-left: 3px;'>" + manageLanguage("Status") + "</span>");
document.write('<div><input style="float:left;" type="button" id="statusBar" class="File" value="
' + manageLanguage("File") + '"></input> ');
document.write('</div></div><div id="infoNet" class="info"></div>');
document.write('<div id="infoFilter" class="info"></div>');
document.write('<div id="infoLang" class="info"></div>');
infoStatus();
</script>
<div class="white" style="float:right;">
<ul id="mega-menu-2" class="mega-menu">
<script type="text/javascript">
writeMenu();
</script>
</ul>
</div>
</div>
<!−− ”Rails” for summary −−>
<div id='wrapper' class='expanded' style='overflow:hidden'>
<div class="fht_fixed_header">
<table style="width: 100 %; height: 26px; background-color: #eee; ">
<thead>
<tr>
<script type="text/javascript">
document.write('<th class="first-cell" style="width:3.5 %"><div class="empty-cell">No.</div></
th>');
document.write('<th style="width:8 %"><div class="empty-cell">' + manageLanguage("Time") + '</div
></th>');
134
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
135
document.write('<th style="width:13 %"><div class="empty-cell">' + manageLanguage("Source") + '</
div></th>');
document.write('<th style="width:13 %"><div class="empty-cell">' + manageLanguage("Destination")
+'</div></th>');
document.write('<th style="width:8 %"><div class="empty-cell">' + manageLanguage("Protocol") + '</
div></th>');
document.write('<th style="width:6 %;"><div class="empty-cell">' + manageLanguage("Length") + '</
div></th>');
document.write('<th class="last-cell" style="width:48.5 %"><div class="empty-cell">' +
manageLanguage("Info") + '</div></th>');
</script>
</tr>
</thead></table>
</div>
<div id="wholeSummary" class="fht_table_body" >
<table id="summary" style="width: 100 %; margin-top: -30px; "> <!−− rails to write the packet data in
the right position −−>
<thead>
<tr>
<script type="text/javascript">
document.write('<th class="first-cell" style="width:3.6 %"><div class="empty-cell">No.</div></th>'
);
document.write('<th style="width:8.1 %"><div class="empty-cell">Time</div></th>');
document.write('<th style="width:13.1 %"><div class="empty-cell">Source</div></th>');
document.write('<th style="width:13.1 %"><div class="empty-cell">Destination</div></th>');
document.write('<th style="width:8.1 %"><div class="empty-cell">Protocol</div></th>');
document.write('<th style="width:5.1 %;"><div class="empty-cell">Length</div></th>');
document.write('<th class="last-cell" style="width:48.9 %"><div class="empty-cell">Info</div></th>
');
</script>
</tr>
</thead>
<tbody id="SummaryTable" tabindex="0">
<script type="text/javascript">
modifyFile(CaptureNet);
</script>
</tbody>
</table>
</div>
<div id="detail-div" class="pane">
</div>
<div id="ascii-div" class="pane ui-widget-header"><div id="tab-0" style="top:0 !important">
</div></div>
</body>
</html>
Código C.19: changeFile.php, ejecuta TShark para actualizar el contenido de los ficheros psml, pdml
y ascii al inicio o cuando se cambia de fichero a visualizar
135
136
1
2
3
4
5
6
7
8
9
10
11
<?php
$file = "../" . $ GET['path'] . $ GET['net'];
if (file exists($file)) {
if ( $ GET['filter'] != "" ) {
$filter = "&& " . $ GET['filter'] ; // add the condition of the filter
}
else $filter = ""; // if there isn't filter condition, we can't put the &&
shell exec("tshark -r " . $file . " -T psml -R 'frame.number > " . $ GET['lastPacket'] . " " . $filter .
"' > ../" . $ GET['path'] . "psml.xml");
shell exec("tshark -r " . $file . " -T pdml -R 'frame.number == " . $ GET['packet'] ."' > ../" .
$ GET['path'] . "pdml.xml");
shell exec("tshark -r " . $file . " -x -R 'frame.number == " . $ GET['packet'] ."' > ../" . $ GET['
path'] . "ascii.txt");
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
$ascii = "";
$ascii = file get contents("../" . $ GET['path'] . "ascii.txt"); // hexadecimal and ascii packet
information
$ascii = substr($ascii, strpos($ascii, "\n")); // delete first line (packet text information)
$ascii = substr($ascii, strpos($ascii, "\n")); // delete second line (line break)
$ascii = ltrim($ascii); // delete blank spaces
$varReturn = $log . " %" . $ascii;
echo $varReturn;
}
else echo "Session Expired";
?>
C.2.2.
Hoja de estilo CSS
Código C.20: IntroWebShark.css, hoja de estilo para la página principal de esta versión de wShark.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
body {
/∗font−family: Verdana, Arial, Helvetica, sans−serif; ∗/
text−align: center;
margin: 1em 0 0 0;
vertical−align: middle;
}
div#header {
position: relative;
width: 1200px;
height: 100px;
margin: 0 auto;
}
div#body#dialog {
position:relative;
width: 1200px;
margin: 0 auto;
}
div#foot {
position: relative;
136
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
width: 1200px;
margin: 40px auto;
}
div#default {
position: relative;
width: 1200px;
font−size: 0.9em;
margin: 40px auto;
}
span#defaultSpan {
color: blue;
text−decoration: underline;
cursor: pointer;
}
span#defaultSpan:hover {
color: red;
}
span#lang {
color: blue;
text−decoration: underline;
cursor: pointer;
margin−left: 50px;
}
span#lang:hover {
color: red;
}
h1 {text−align: center;}
button {width:200px; margin: 10px 5px;}
137
137
138
WSHARK APÉNDICES C. CÓDIGO FUENTE DE WSHARK
138
Apéndices D
Logos
El logo principal de wShark está formado por dos elementos que juntos representan la filosofı́a
de la aplicación. Por un lado, tenemos el escudo de HTML5 (ver figura D.1), que representa la
funcionalidad web de wShark, y por otro los colores y la aleta del logo de Wireshark (ver figura
D.2), por su función de analizador de redes basado en Wireshark. Juntos forman el logo de la figura
D.3
Figura D.1: Logo HTML5 que representa la parte web de la aplicación.
139
140
WSHARK APÉNDICES D. LOGOS
Figura D.2: Logo de Wireshark que representa la parte de analizador de redes de la aplicación.
Figura D.3: Combinación de los dos logos previos que muestran las dos caracterı́sticas principales
de wShark.
140
WSHARK APÉNDICES D. LOGOS
141
Por otro lado, el logo pequeño para la propia interfaz de captura de paquetes (que puede verse,
por ejemplo, en la figura 5.20) se trata de un rediseño del logo similar de Wireshark, como puede
apreciarse en las figuras D.4 y D.5.
Figura D.4: Segundo Logo de Wireshark.
Figura D.5: Adaptación del segundo logo de Wireshark para su uso en la interfaz gráfica de captura
de paquetes.
D.1.
Logos descartados
Diferentes modificaciones sobre el logo principal fueron contempladas como posibilidades para
el puesto. Entre ellas, se incluyen a continuación (figuras D.6 y D.7) los dos más firmes candidatos
previos de la elección final.
Figura D.6: Modificación del logo principal con la aleta en blanco.
141
142
WSHARK APÉNDICES D. LOGOS
Figura D.7: Modificación del logo principal sin bordes.
142
Apéndices E
Licencia GPL
GNU GENERAL PUBLIC LICENSE
Copyright © 2007 Free Software Foundation, Inc. http://fsf.org/
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
The GNU General Public License is a free, copyleft license for software and other kinds of works.
The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to
guarantee your freedom to share and change all versions of a program–to make sure it remains free
software for all its users. We, the Free Software Foundation, use the GNU General Public License
for most of our software; it applies also to any other work released this way by its authors. You can
apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public
Licenses are designed to make sure that you have the freedom to distribute copies of free software
(and charge for them if you wish), that you receive source code or can get it if you want it, that
you can change the software or use pieces of it in new free programs, and that you know you can
do these things.
To protect your rights, we need to prevent others from denying you these rights or asking you
to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the
software, or if you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must
pass on to the recipients the same freedoms that you received. You must make sure that they, too,
receive or can get the source code. And you must show them these terms so they know their rights.
Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on
the software, and (2) offer you this License giving you legal permission to copy, distribute and/or
modify it.
For the developers’ and authors’ protection, the GPL clearly explains that there is no warranty
for this free software. For both users’ and authors’ sake, the GPL requires that modified versions be
143
144
WSHARK APÉNDICES E. LICENCIA GPL
marked as changed, so that their problems will not be attributed erroneously to authors of previous
versions.
Some devices are designed to deny users access to install or run modified versions of the software
inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim
of protecting users’ freedom to change the software. The systematic pattern of such abuse occurs
in the area of products for individuals to use, which is precisely where it is most unacceptable.
Therefore, we have designed this version of the GPL to prohibit the practice for those products.
If such problems arise substantially in other domains, we stand ready to extend this provision to
those domains in future versions of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents. States should not allow
patents to restrict development and use of software on general-purpose computers, but in those
that do, we wish to avoid the special danger that patents applied to a free program could make it
effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the
program non-free.
The precise terms and conditions for copying, distribution and modification follow.
Terms and Conditions
0. Definitions.
“This License” refers to version 3 of the GNU General Public License.
“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
“The Program” refers to any copyrightable work licensed under this License. Each licensee is
addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring
copyright permission, other than the making of an exact copy. The resulting work is called a
“modified version” of the earlier work or a work “based on” the earlier work.
A “covered work” means either the unmodified Program or a work based on the Program.
To “propagate” a work means to do anything with it that, without permission, would make you
directly or secondarily liable for infringement under applicable copyright law, except executing
it on a computer or modifying a private copy. Propagation includes copying, distribution (with
or without modification), making available to the public, and in some countries other activities
as well.
To “convey” a work means any kind of propagation that enables other parties to make or
receive copies. Mere interaction with a user through a computer network, with no transfer of
a copy, is not conveying.
An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright
notice, and (2) tells the user that there is no warranty for the work (except to the extent that
warranties are provided), that licensees may convey the work under this License, and how to
view a copy of this License. If the interface presents a list of user commands or options, such
as a menu, a prominent item in the list meets this criterion.
1. Source Code.
144
WSHARK APÉNDICES E. LICENCIA GPL
145
The “source code” for a work means the preferred form of the work for making modifications
to it. “Object code” means any non-source form of a work.
A “Standard Interface” means an interface that either is an official standard defined by a
recognized standards body, or, in the case of interfaces specified for a particular programming
language, one that is widely used among developers working in that language.
The “System Libraries” of an executable work include anything, other than the work as a
whole, that (a) is included in the normal form of packaging a Major Component, but which
is not part of that Major Component, and (b) serves only to enable use of the work with
that Major Component, or to implement a Standard Interface for which an implementation
is available to the public in source code form. A “Major Component”, in this context, means
a major essential component (kernel, window system, and so on) of the specific operating
system (if any) on which the executable work runs, or a compiler used to produce the work,
or an object code interpreter used to run it.
The “Corresponding Source” for a work in object code form means all the source code needed
to generate, install, and (for an executable work) run the object code and to modify the
work, including scripts to control those activities. However, it does not include the work’s
System Libraries, or general-purpose tools or generally available free programs which are used
unmodified in performing those activities but which are not part of the work. For example,
Corresponding Source includes interface definition files associated with source files for the
work, and the source code for shared libraries and dynamically linked subprograms that the
work is specifically designed to require, such as by intimate data communication or control
flow between those subprograms and other parts of the work.
The Corresponding Source need not include anything that users can regenerate automatically
from other parts of the Corresponding Source.
The Corresponding Source for a work in source code form is that same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of copyright on the Program, and
are irrevocable provided the stated conditions are met. This License explicitly affirms your
unlimited permission to run the unmodified Program. The output from running a covered
work is covered by this License only if the output, given its content, constitutes a covered
work. This License acknowledges your rights of fair use or other equivalent, as provided by
copyright law.
You may make, run and propagate covered works that you do not convey, without conditions
so long as your license otherwise remains in force. You may convey covered works to others for
the sole purpose of having them make modifications exclusively for you, or provide you with
facilities for running those works, provided that you comply with the terms of this License in
conveying all material for which you do not control copyright. Those thus making or running
the covered works for you must do so exclusively on your behalf, under your direction and
control, on terms that prohibit them from making any copies of your copyrighted material
outside their relationship with you.
Conveying under any other circumstances is permitted solely under the conditions stated
below. Sublicensing is not allowed; section 10 makes it unnecessary.
3. Protecting Users’ Legal Rights From Anti-Circumvention Law.
145
146
WSHARK APÉNDICES E. LICENCIA GPL
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20
December 1996, or similar laws prohibiting or restricting circumvention of such measures.
When you convey a covered work, you waive any legal power to forbid circumvention of
technological measures to the extent such circumvention is effected by exercising rights under
this License with respect to the covered work, and you disclaim any intention to limit operation
or modification of the work as a means of enforcing, against the work’s users, your or third
parties’ legal rights to forbid circumvention of technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate
copyright notice; keep intact all notices stating that this License and any non-permissive terms
added in accord with section 7 apply to the code; keep intact all notices of the absence of any
warranty; and give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey, and you may offer support
or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to produce it from the
Program, in the form of source code under the terms of section 4, provided that you also meet
all of these conditions:
a) The work must carry prominent notices stating that you modified it, and giving a relevant
date.
b) The work must carry prominent notices stating that it is released under this License
and any conditions added under section 7. This requirement modifies the requirement in
section 4 to “keep intact all notices”.
c) You must license the entire work, as a whole, under this License to anyone who comes
into possession of a copy. This License will therefore apply, along with any applicable
section 7 additional terms, to the whole of the work, and all its parts, regardless of how
they are packaged. This License gives no permission to license the work in any other way,
but it does not invalidate such permission if you have separately received it.
d ) If the work has interactive user interfaces, each must display Appropriate Legal Notices;
however, if the Program has interactive interfaces that do not display Appropriate Legal
Notices, your work need not make them do so.
A compilation of a covered work with other separate and independent works, which are not
by their nature extensions of the covered work, and which are not combined with it such as
to form a larger program, in or on a volume of a storage or distribution medium, is called an
“aggregate” if the compilation and its resulting copyright are not used to limit the access or
legal rights of the compilation’s users beyond what the individual works permit. Inclusion of
a covered work in an aggregate does not cause this License to apply to the other parts of the
aggregate.
6. Conveying Non-Source Forms.
146
WSHARK APÉNDICES E. LICENCIA GPL
147
You may convey a covered work in object code form under the terms of sections 4 and 5,
provided that you also convey the machine-readable Corresponding Source under the terms
of this License, in one of these ways:
a) Convey the object code in, or embodied in, a physical product (including a physical
distribution medium), accompanied by the Corresponding Source fixed on a durable
physical medium customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product (including a physical
distribution medium), accompanied by a written offer, valid for at least three years and
valid for as long as you offer spare parts or customer support for that product model,
to give anyone who possesses the object code either (1) a copy of the Corresponding
Source for all the software in the product that is covered by this License, on a durable
physical medium customarily used for software interchange, for a price no more than
your reasonable cost of physically performing this conveying of source, or (2) access to
copy the Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the written offer to provide the
Corresponding Source. This alternative is allowed only occasionally and noncommercially,
and only if you received the object code with such an offer, in accord with subsection 6b.
d ) Convey the object code by offering access from a designated place (gratis or for a charge),
and offer equivalent access to the Corresponding Source in the same way through the same
place at no further charge. You need not require recipients to copy the Corresponding
Source along with the object code. If the place to copy the object code is a network server,
the Corresponding Source may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain clear directions next
to the object code saying where to find the Corresponding Source. Regardless of what
server hosts the Corresponding Source, you remain obligated to ensure that it is available
for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided you inform other peers
where the object code and Corresponding Source of the work are being offered to the
general public at no charge under subsection 6d.
A separable portion of the object code, whose source code is excluded from the Corresponding
Source as a System Library, need not be included in conveying the object code work.
A “User Product” is either (1) a “consumer product”, which means any tangible personal
property which is normally used for personal, family, or household purposes, or (2) anything
designed or sold for incorporation into a dwelling. In determining whether a product is a
consumer product, doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, “normally used” refers to a typical or common use of
that class of product, regardless of the status of the particular user or of the way in which
the particular user actually uses, or expects or is expected to use, the product. A product is a
consumer product regardless of whether the product has substantial commercial, industrial or
non-consumer uses, unless such uses represent the only significant mode of use of the product.
“Installation Information” for a User Product means any methods, procedures, authorization
keys, or other information required to install and execute modified versions of a covered work
in that User Product from a modified version of its Corresponding Source. The information
must suffice to ensure that the continued functioning of the modified object code is in no case
prevented or interfered with solely because modification has been made.
147
148
WSHARK APÉNDICES E. LICENCIA GPL
If you convey an object code work under this section in, or with, or specifically for use in, a
User Product, and the conveying occurs as part of a transaction in which the right of possession
and use of the User Product is transferred to the recipient in perpetuity or for a fixed term
(regardless of how the transaction is characterized), the Corresponding Source conveyed under
this section must be accompanied by the Installation Information. But this requirement does
not apply if neither you nor any third party retains the ability to install modified object code
on the User Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or
installed by the recipient, or for the User Product in which it has been modified or installed.
Access to a network may be denied when the modification itself materially and adversely
affects the operation of the network or violates the rules and protocols for communication
across the network.
Corresponding Source conveyed, and Installation Information provided, in accord with this
section must be in a format that is publicly documented (and with an implementation available
to the public in source code form), and must require no special password or key for unpacking,
reading or copying.
7. Additional Terms.
“Additional permissions” are terms that supplement the terms of this License by making
exceptions from one or more of its conditions. Additional permissions that are applicable to
the entire Program shall be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions apply only to part of the
Program, that part may be used separately under those permissions, but the entire Program
remains governed by this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option remove any additional
permissions from that copy, or from any part of it. (Additional permissions may be written
to require their own removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work, for which you have or
can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you add to a covered work,
you may (if authorized by the copyright holders of that material) supplement the terms of
this License with terms:
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and
16 of this License; or
b) Requiring preservation of specified reasonable legal notices or author attributions in that
material or in the Appropriate Legal Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or requiring that modified
versions of such material be marked in reasonable ways as different from the original
version; or
d ) Limiting the use for publicity purposes of names of licensors or authors of the material;
or
e) Declining to grant rights under trademark law for use of some trade names, trademarks,
or service marks; or
148
WSHARK APÉNDICES E. LICENCIA GPL
149
f ) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability
to the recipient, for any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered “further restrictions” within the
meaning of section 10. If the Program as you received it, or any part of it, contains a notice
stating that it is governed by this License along with a term that is a further restriction,
you may remove that term. If a license document contains a further restriction but permits
relicensing or conveying under this License, you may add to a covered work material governed
by the terms of that license document, provided that the further restriction does not survive
such relicensing or conveying.
If you add terms to a covered work in accord with this section, you must place, in the relevant
source files, a statement of the additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the form of a separately
written license, or stated as exceptions; the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly provided under this
License. Any attempt otherwise to propagate or modify it is void, and will automatically
terminate your rights under this License (including any patent licenses granted under the
third paragraph of section 11).
However, if you cease all violation of this License, then your license from a particular copyright
holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder fails to notify you of the
violation by some reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is reinstated permanently if the
copyright holder notifies you of the violation by some reasonable means, this is the first time
you have received notice of violation of this License (for any work) from that copyright holder,
and you cure the violation prior to 30 days after your receipt of the notice.
Termination of your rights under this section does not terminate the licenses of parties who
have received copies or rights from you under this License. If your rights have been terminated
and not permanently reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or run a copy of the Program.
Ancillary propagation of a covered work occurring solely as a consequence of using peer-topeer transmission to receive a copy likewise does not require acceptance. However, nothing
other than this License grants you permission to propagate or modify any covered work.
These actions infringe copyright if you do not accept this License. Therefore, by modifying or
propagating a covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically receives a license from the
original licensors, to run, modify and propagate that work, subject to this License. You are
not responsible for enforcing compliance by third parties with this License.
149
150
WSHARK APÉNDICES E. LICENCIA GPL
An “entity transaction” is a transaction transferring control of an organization, or substantially
all assets of one, or subdividing an organization, or merging organizations. If propagation of a
covered work results from an entity transaction, each party to that transaction who receives
a copy of the work also receives whatever licenses to the work the party’s predecessor in
interest had or could give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if the predecessor has it
or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the rights granted or affirmed
under this License. For example, you may not impose a license fee, royalty, or other charge for
exercise of rights granted under this License, and you may not initiate litigation (including a
cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making,
using, selling, offering for sale, or importing the Program or any portion of it.
11. Patents.
A “contributor” is a copyright holder who authorizes use under this License of the Program
or a work on which the Program is based. The work thus licensed is called the contributor’s
“contributor version”.
A contributor’s “essential patent claims” are all patent claims owned or controlled by the
contributor, whether already acquired or hereafter acquired, that would be infringed by some
manner, permitted by this License, of making, using, or selling its contributor version, but do
not include claims that would be infringed only as a consequence of further modification of
the contributor version. For purposes of this definition, “control” includes the right to grant
patent sublicenses in a manner consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the
contributor’s essential patent claims, to make, use, sell, offer for sale, import and otherwise
run, modify and propagate the contents of its contributor version.
In the following three paragraphs, a “patent license” is any express agreement or commitment,
however denominated, not to enforce a patent (such as an express permission to practice a
patent or covenant not to sue for patent infringement). To “grant” such a patent license to a
party means to make such an agreement or commitment not to enforce a patent against the
party.
If you convey a covered work, knowingly relying on a patent license, and the Corresponding
Source of the work is not available for anyone to copy, free of charge and under the terms of
this License, through a publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to
deprive yourself of the benefit of the patent license for this particular work, or (3) arrange,
in a manner consistent with the requirements of this License, to extend the patent license to
downstream recipients. “Knowingly relying” means you have actual knowledge that, but for
the patent license, your conveying the covered work in a country, or your recipient’s use of
the covered work in a country, would infringe one or more identifiable patents in that country
that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or arrangement, you convey, or
propagate by procuring conveyance of, a covered work, and grant a patent license to some of
the parties receiving the covered work authorizing them to use, propagate, modify or convey a
specific copy of the covered work, then the patent license you grant is automatically extended
to all recipients of the covered work and works based on it.
150
WSHARK APÉNDICES E. LICENCIA GPL
151
A patent license is “discriminatory” if it does not include within the scope of its coverage,
prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights
that are specifically granted under this License. You may not convey a covered work if you are
a party to an arrangement with a third party that is in the business of distributing software,
under which you make payment to the third party based on the extent of your activity of
conveying the work, and under which the third party grants, to any of the parties who would
receive the covered work from you, a discriminatory patent license (a) in connection with copies
of the covered work conveyed by you (or copies made from those copies), or (b) primarily for
and in connection with specific products or compilations that contain the covered work, unless
you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting any implied license or other
defenses to infringement that may otherwise be available to you under applicable patent law.
12. No Surrender of Others’ Freedom.
If conditions are imposed on you (whether by court order, agreement or otherwise) that
contradict the conditions of this License, they do not excuse you from the conditions of this
License. If you cannot convey a covered work so as to satisfy simultaneously your obligations
under this License and any other pertinent obligations, then as a consequence you may not
convey it at all. For example, if you agree to terms that obligate you to collect a royalty for
further conveying from those to whom you convey the Program, the only way you could satisfy
both those terms and this License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have permission to link or combine
any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License
will continue to apply to the part which is the covered work, but the special requirements of
the GNU Affero General Public License, section 13, concerning interaction through a network
will apply to the combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of the GNU General
Public License from time to time. Such new versions will be similar in spirit to the present
version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies that a certain
numbered version of the GNU General Public License “or any later version” applies to it,
you have the option of following the terms and conditions either of that numbered version
or of any later version published by the Free Software Foundation. If the Program does not
specify a version number of the GNU General Public License, you may choose any version
ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy’s public statement of acceptance of a version permanently
authorizes you to choose that version for the Program.
Later license versions may give you additional or different permissions. However, no additional
obligations are imposed on any author or copyright holder as a result of your choosing to follow
a later version.
151
152
WSHARK APÉNDICES E. LICENCIA GPL
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY
AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM
PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES
OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided above cannot be given local
legal effect according to their terms, reviewing courts shall apply local law that most closely
approximates an absolute waiver of all civil liability in connection with the Program, unless
a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
End of Terms and Conditions
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public,
the best way to achieve this is to make it free software which everyone can redistribute and
change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start
of each source file to most effectively state the exclusion of warranty; and each file should have
at least the “copyright” line and a pointer to where the full notice is found.
<one line to give the program’s name and a brief idea of what it does.>
Copyright (C) <textyear>
<name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
152
WSHARK APÉNDICES E. LICENCIA GPL
153
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short notice like this when it starts
in an interactive mode:
<program>
Copyright (C) <year>
<name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’.
This is free software, and you are welcome to redistribute it
under certain conditions; type ‘show c’ for details.
The hypothetical commands show w and show c should show the appropriate parts of the
General Public License. Of course, your program’s commands might be different; for a GUI
interface, you would use an “about box”.
You should also get your employer (if you work as a programmer) or school, if any, to sign a
“copyright disclaimer” for the program, if necessary. For more information on this, and how
to apply and follow the GNU GPL, see http://www.gnu.org/licenses/.
The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful
to permit linking proprietary applications with the library. If this is what you want to do,
use the GNU Lesser General Public License instead of this License. But first, please read
http://www.gnu.org/philosophy/why-not-lgpl.html.
153
154
WSHARK APÉNDICES E. LICENCIA GPL
154
Bibliografı́a
[1] Pérez Querol, Gustau. Disseny i implementació d’un laboratori de xarxes de comunicació virtual
amb accés remot i conformació de tràfic. Facultat d’Informàtica de Barcelona. Proyecto Final
de Carrera. Febrero de 2011.
[2] Muñoz, Jose L.; Alins, Juanjo; Mata, Jorge; Esparza, Óscar. Virtual Networks with Linux:
VNUML. UPC Telematics Department.
[3] VMware. Virtualization. Virtualizacion Basics. What is a Virtual Machine? [en lı́nea]. 2012.
[consulta: 25 de agosto 2012]. Disponible en http://www.vmware.com/virtualization/
virtual-machine.html.
[4] Smith, James; Nair, Ravi. The Architecture of Virtual Machines. Computer (IEEE Computer
Society) 38 (5): 32–38. 2005
[5] Dike, Jeff. User Mode Linux. Prentice Hall: first edition, April 22, 2006.
[6] Davoli, Renzo. VDE: Virtual Distributed Ethernet. Department of Computer Science, University of Bologna. Technical Report UBLCS-2004-12. Junio 2004.
[7] Departamento de Ingenierı́a de Sistemas Telemáticos de la Universidad Politécnica de Madrid
y Telefónica I+D. VNUML Project Documentation [en lı́nea]. Madrid, 3 de noviembre de 2008
[consulta: 23 de agosto de 2012]. Disponible en http://neweb.dit.upm.es/vnumlwiki/index.
php/Docintro.
[8] Sanders, Chris. Practical Packet Analysis: Using Wireshark to Solve Real-World Network Problems. No Starch Press: Second Edition, July 6, 2011.
[9] Lamping, Ulf. Wireshark’s Developer’s Guide [en lı́nea]. 2004-2012 [consulta 23 agosto de 2012].
Disponible en https://www.wireshark.org/docs/wsdg_html_chunked/.
[10] Martı́n Malo, Esteban. Creación de nuevas funcionalidades para la herramienta VNUML. Universidad Politécnica de Madrid. Proyecto Fin de Carrera, junio 2006.
155
Descargar