Sie sind auf Seite 1von 8

PROYECTO FINAL

INTRODUCCIÓN A LOS LENGUAJES DE


PROGRAMACIÓN

Instituto IACC

JORGE DONOSO S

17-03-2017
Usted trabaja para una agencia gubernamental de seguridad y ha notado ataques
informáticos a sus servidores. El archivo de logs de su cortafuego tiene líneas de este
estilo:

 Desde 111.222.333.444-Conexión hacia 1.1.1.1-Web


 Desde 123.123.123.123-Conexión hacia 2.2.2.2-FTP
 Desde 5.111.123.11-Conexión hacia 1.2.1.2-SSH

Usted desea saber quiénes y a qué máquinas están atacando. Para ello, se le solicita que
desarrolle los siguientes pasos:

 Ya tiene desarrollada la función que le permite identificar, dada una línea del
archivo de logs, la IP desde donde le están haciendo el ataque, la cual puede ver a
continuación:

<?php//Inicia el programa en PHP


function conocerIpOrigenAtaque ($cadena) //Inicio función conocerIpOrigenAtaque que recibe una
cadena por parámetro

{//Inicia la función

$ipOrigen =' '; //Se declara la variable ipOrigen como una cadena vacía

$primerBlanco = stripos($cadena,' '); /*Se ubica el primer blanco de la cadena con la función stripos
de PHP, pues al analizar el archivo de logs, se observa que a partir del primer blanco empieza la IP
que realiza el ataque, justamente la que se busca para esta función*/

$primerGuion = stripos($cadena,'-'); /*Se ubica el primer guión de la cadena con la función stripos
de PHP, pues al analizar el archivo de logs, se observa que la IP que origina el ataque culmina antes
de ese primer guión*/

$ipOrigen = substr($cadena, $primerBlanco, ($primerGuion - $primerBlanco)); /*Se calcula la IP que


origina el ataque, para ello se utiliza la función substr de PHP que se encarga de extraer una porción
de una cadena, indicándole desde donde cuántos caracteres, es por ello que se utilizó que a
$cadena (variable que llega por parámetro) se le extraiga los caracteres desde el primer espacio,
hasta el guión, por lo que resulta fácil indicarle que la cantidad de caracteres a devolver se obtiene
de restar a la posición del primer guión, la posición del primer blanco, obteniendo así la IP
buscada.*/

echo 'La IP desde donde se hace el ataque es: ' . $ipOrigen . '<br>'; //se imprime la IP obtenida
}
?>

Para hacer la prueba con la primera línea del archivo de logs se ejecuta luego de la función
la siguiente instrucción:

conocerIpOrigenAtaque("Desde 5.111.123.11-Conexión hacia 1.2.1.2-SSH");


y se obtiene el siguiente resultado:

La IP desde donde se hace el ataque es: 5.111.123.11

DESARROLLO:

1.- Tomando como base la función anteriormente descrita, escriba las siguientes
funciones en PHP o pseudocódigo:

a. Función que identifique la IP que recibe el ataque:

R:
<?php
function IpReceptoraAtaque ($cadena) {
$ipReceptora = '';
$ultimoEspacio = strripos($cadena,' ');
$ultimoGuion = strripos($cadena,'-');
$ipReceptora = substr($cadena, $ultimoEspacio, ($ultimoGuion -
$ultimoEspacio));
echo '<h4> La IP Atacada es: ' . $ipReceptora . '</h4><br>';
}
IpReceptoraAtaque('Desde 111.222.333.444-Conexión hacia 1.1.1.1-Web');
IpReceptoraAtaque('Desde 123.123.123.123-Conexión hacia 2.2.2.2-FTP');
IpReceptoraAtaque('Desde 5.111.123.11-Conexión hacia 1.2.1.2-SSH');

b. Función que devuelva el servicio que está siendo atacado:

R:
<?php
function servicioAtacado($cadena) {
$servicio = '';
$ultimoGuion = strripos($cadena,'-');
$servicio = substr($cadena, $ultimoGuion + 1);
echo 'El servicio atacado es: '.$servicio.'<br>';
}
servicioAtacado('Desde 111.222.333.444-Conexión hacia 1.1.1.1-Web');
servicioAtacado('Desde 123.123.123.123-Conexión hacia 2.2.2.2-FTP');
servicioAtacado('Desde 5.111.123.11-Conexión hacia 1.2.1.2-SSH');
2.-Explique brevemente las instrucciones necesarias para trabajar con el archivo que
guarda la información de ataques informáticos.

R:

A continuación se explicará brevemente las instrucciones necesarias para trabajar con el


archivo que guarda la información de ataques informáticos: Se debe partir de la base de
que en el archivo es necesario que la estructura del mismo deba contener los registros
siempre con el mismo formato: "Desde XXX.XXX.XXX.XXX-Conexión hacia YYY.YYY.YYY.YYY-
SERV" cambiando así solamente las XXX para la ip que origina el ataque, YYY para la ip que
recibe el ataque y SERV que indicará el servicio afectado. Además, se deben utilizar
funciones de lectura de archivos como fopen para leer de forma secuencial cada línea y
luego pasar esa línea por las distintas funciones antes definidas que permitirán mostrar los
mensajes de IP’s y servicios, para así visualizar que está sucediendo en un ataque.

3.- Si se quisiera conocer las IP que más han intentado atacarlo, ¿Cómo podría llevarse a
cabo esto? ¿Qué estructuras de datos de las vistas (arreglos, pilas, colas) utilizaría? ¿Será
necesario emplear alguno de los ciclos de iteración vistos en la asignatura (for, while,
dowhile)? Justifique sus respuestas (se sugiere que se apoye en pseudocódigo o código en
PHP) y tome en cuenta que se busca obtener algo como lo que se detalla a continuación:

123.123.123.123 ha realizado 13 ataques.

5.111.123.11 ha realizado 8 ataques.

111.222.333.44 ha realizado 5 ataques.

R:

Para conocer las IP que más han intentado atacar se debe leer el archivo de log e ir
llenando un arreglo donde se va registrando la IP como la clave y la cantidad de veces que
aparece como su valor (aumentando cada vez que aparece). Para la lectura del archivo se
utiliza la estructura de iteración while, que realizará el guardado en el arreglo mientras
aún no sea el fin del archivo.

Finalmente se recorre el arreglo resultante con un ciclo for para ir mostrando el mensaje
solicitado utilizando el par clave/valor.

En código PHP:

<?php
function conocerIpOrigenAtaque ($cadena) { // Se modificó para que solamente
devuelva la IP.
$ipOrigen =' ';
$primerBlanco = stripos($cadena,' ');
$primerGuion = stripos($cadena,'-');
$ipOrigen = substr($cadena, $primerBlanco + 1, ($primerGuion -
$primerBlanco - 1));
return $ipOrigen;
}
$archivo = fopen("ataques.log", 'r'); // Lectura del archivo de logs.
$final = array();
$ip = "";
while ($linea = fgets($archivo)) {
$ip = conocerIpOrigenAtaque($linea);
If (array_key_exists($ip, $final))
$final[$ip]++;
else
$final[$ip] = 1;
}
fclose($archivo);
foreach($final as $ipAtaque => $ipCantidad) {
echo $ipAtaque . " ha realizado " . $ipCantidad . " ataques.\n";
}
?>

4.-Declare las clases que serían necesarias en caso que se quisiera trabajar en PHP pero
con Programación Orientada a Objetos (POO). Explique el porqué de las declaraciones que
realiza

R:

Se realizó la codificación en Programación Orientada a Objetos. Se utilizaron dos clases,


una llamada Archivo que tiene que ver con la apertura y cierre del archivo; la segunda
clase es la principal y hará las llamadas a los métodos de Archivo y tiene los métodos para
trabajar con el log y mostrará el mensaje.

<?php

class Archivo {

var $ubicacion;

function _construct($ubicacion) {
$this->ubicacion = $ubicacion;

public function abrirArchivo() {

return fopen($this->ubicacion, 'r');

public function cerrarArchivo($archivo) {

fclose($archivo);

class Ataque {

var $archivo;

var $final;

function _construct($ubicacion) {

$this->archivo = new Archivo;

$this->archivo->_construct($ubicacion);

$this->final = array();

$this->llenarArreglo();

public function mostrarMensajes() {

foreach($this->final as $ipAtaque => $ipCantidad) {

echo $ipAtaque . " ha realizado " . $ipCantidad . "

ataques.\n";

private function llenarArreglo() {

$archivo = $this->archivo->abrirArchivo();
while ($linea = fgets($archivo)) {

$ip = $this->conocerIpOrigenAtaque($linea);

if(array_key_exists($ip, $this->final))

$this->final[$ip]++;

else

$this->final[$ip] = 1;

$this->archivo->cerrarArchivo($archivo);

private function conocerIpOrigenAtaque ($cadena) {

$primerBlanco = stripos($cadena,' ');

$primerGuion = stripos($cadena,'-');

return substr($cadena, $primerBlanco+1, ($primerGuion -

$primerBlanco-1));

$ataque = new Ataque();

$ataque->_construct("ataques.log");

$ataque->mostrarMensajes();
Referencias:

IACC (2018). INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN Semana 1 a la 8.

Das könnte Ihnen auch gefallen