elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Temas
Páginas: [1]
1  Seguridad Informática / Abril negro / Abril Negro 2020 - phpRecon en: 7 Mayo 2020, 23:56 pm

Autor: medi.
Nombre de la herramienta: phpRecon
Categoría: Hacking web.
Lenguajes usados: php y js.


A continuación les dejo el enlace a github con el proyecto:
Github : phpRecon



Definiendo la idea:
La idea de este programa es recolectar información dado un dominio para planificar un vector de ataque.
Los tipos de informacion a mostrar son los siguientes:

- Comentarios HTML para obtener posibles funcionalidades ocultas, información adicional sobre algún componente del backend.
- Formularios HTML con todos sus input para hacernos una idea de si implementa algún tipo de mecanismo para defenderse de ataques tipo CSRF y derivados.
- Cabeceras HTTP, de este modo podemos fijarnos como hace uso del cache, manejo de cookies...



Funcionamiento:
Lo primero es introducir una URL, con este dato el backend hará una solicitud GET para obtener todos los enlaces que pertenecen al mismo dominio, para cada enlace obtenido hará otra solicitud GET para obtener los enlaces del mismo dominio y guardarlos en un array, por otro lado solo obtiene los enlaces de la URL introducida hasta un nivel de dos capas.

Tomemos un ejemplo:

Introducimos la url "http://mypage.com". Esta url tiene un enlace: "http://mypage.com/login". A su vez, la página de inicio de sesión tiene el enlace "http://mypage.com/register" que se guardará correctamente en nuestro array, pero si esta URL contiene "http://mypage.com/forgot-password" no la guardaremos en el array ya que han pasado más de dos capas desde la URL introducida.

Finalmente, iteramos a través de cada URL en el array generado y guardamos todos los comentarios HTML, formularios, cabeceras HTTP de cada página y mostramos el archivo robots.txt en caso de que exista.

Interfaz:


Este es el resultado de introducir alguna pagina:
El ejemplo que muestro a continuación es de una pagina miá en local.

Pongamos la url 'http://hatnet.com:81':





En este caso solo he mostrado la información de un enlace para que os hagáis una idea del funcionamiento, también en la parte de la arriba podemos filtrar lo que queremos mostrar en función de nuestras necesidades.
2  Programación / PHP / Duda curl y buffer php en: 1 Marzo 2020, 21:28 pm
Muy buenas, he conseguido mediante la librería de curl en php pintar los directorios encontrados dado un dominio de forma dinámica mediante el buffer de php, ya que sino lo haces así tienes que esperar a que se procesen todas las peticiones para que te pinte los resultados.

El código que muestro a continuación funciona a la perfección pero lo he estado intentando pasar a programación POO y no los pinta de forma dinámica, ¿alguien sabe a que se debe?

Buffer php => https://www.php.net/manual/en/function.ob-start.php


Código en programacion estructurada como prueba de concepto
Código
  1. <?php
  2. $lista = file_get_contents('lista.txt');
  3. $directorios = explode("\n" , $lista);
  4.  
  5. foreach($directorios as $dir)
  6.        $list[] = trim("http://www.google.com/".$dir);
  7.  
  8. echo "<pre>";
  9. echo "Loading ...";
  10. $directorios = array();
  11. $rolling_window = 100;
  12. $rolling_window = (count($list) < $rolling_window) ? count($list) : $rolling_window;
  13. $master = curl_multi_init();
  14. $curl_arr = array();
  15. $std_options = array
  16. (
  17.    CURLOPT_RETURNTRANSFER => true,
  18.   CURLOPT_FOLLOWLOCATION => true,
  19.    CURLOPT_USERAGENT => 'DHunter');
  20. $options = $std_options;
  21. for ($i = 0; $i < $rolling_window; $i++)
  22. {
  23.    $ch = curl_init();
  24.    $options[CURLOPT_URL] = $list[$i];
  25.    curl_setopt($ch, CURLOPT_HEADER, 0);
  26.    curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,'progress');
  27.    curl_setopt($ch, CURLOPT_NOPROGRESS, false);
  28.    curl_setopt_array($ch,$options);
  29.    curl_multi_add_handle($master, $ch);
  30. }
  31. $i = 0;
  32. do
  33. {
  34.  while(($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);
  35.  if($execrun != CURLM_OK)
  36.      break;
  37.  while($done = curl_multi_info_read($master))
  38.  {
  39.      $info = curl_getinfo($done['handle']);
  40.      if ($info['http_code'] == 200)
  41.      {
  42.          $directorios[] = $info['url'];
  43.          $i++;
  44.          echo  $info['url']."<br>";
  45.       }
  46.      $output = curl_multi_getcontent($done['handle']);
  47.      $ch = curl_init();
  48.      curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,'progress');
  49.      curl_setopt($ch, CURLOPT_HEADER, 0);
  50.      curl_setopt($ch, CURLOPT_NOPROGRESS, false);
  51.      curl_setopt_array($ch,$options);
  52.      curl_multi_add_handle($master, $ch);
  53.      curl_multi_remove_handle($master, $done['handle']);
  54.      $options[CURLOPT_URL] = $list[$i++];
  55.  }
  56. }while ($running);
  57. echo "<br>Done";
  58.  
  59. function progress()
  60. {
  61.    ob_flush();
  62.    flush();
  63. }
  64.  


Esta es la version de POO que no pinta los resultados de forma dinamica:
Clase BruterDirectory
Código
  1. <?php
  2.    class BruterDirectory extends Bruter
  3.    {
  4.        private $directories;
  5.        private $domain;
  6.        public $handle;
  7.  
  8.        public function __construct($domain,$list)
  9.        {
  10.            parent::__construct($list);
  11.            $this -> domain = $domain;
  12.            $this -> directories = array();
  13.        }
  14.  
  15.       public function doSearch()
  16.       {
  17.           ob_implicit_flush(true);
  18.           ob_end_flush();
  19.           ob_start();
  20.           echo "<pre>";
  21.           echo "Loading ...";
  22.           ob_flush();
  23.           flush();
  24.             $directorios = array();
  25.             $rolling_window = 100;
  26.             $rolling_window = (count($this -> list) < $rolling_window) ? count($this -> list) : $rolling_window;
  27.             $master = curl_multi_init();
  28.             $curl_arr = array();
  29.             $std_options = array
  30.             (
  31.                 CURLOPT_RETURNTRANSFER => true,
  32.                 CURLOPT_FOLLOWLOCATION => true,
  33.                 //CURLOPT_MAXREDIRS => 2,
  34.                 CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Windows; Windows10_64bits; rv:72.0) Gecko/20100101 Firefox/72.0');
  35.             $options = $std_options;
  36.             for ($i = 0; $i < $rolling_window; $i++)
  37.             {
  38.               $ch = curl_init();
  39.               $options[CURLOPT_URL] = $this -> list[$i];
  40.               curl_setopt($ch, CURLOPT_HEADER, 0);
  41.               curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,array($this, 'progress'));
  42.               curl_setopt($ch, CURLOPT_NOPROGRESS, false);
  43.               curl_setopt_array($ch,$options);
  44.               curl_multi_add_handle($master, $ch);
  45.             }
  46.             $i = 0;
  47.             do
  48.             {
  49.               while(($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);
  50.               if($execrun != CURLM_OK)
  51.                   break;
  52.               while($done = curl_multi_info_read($master))
  53.               {
  54.                   $info = curl_getinfo($done['handle']);
  55.                   if ($info['http_code'] == 200)
  56.                   {
  57.                       $directorios[] = $info['url'];
  58.                       $i++;
  59.                       echo  $info['http_code']."<br>";
  60.                    }
  61.                   $output = curl_multi_getcontent($done['handle']);
  62.                   $ch = curl_init();
  63.                   curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, array($this, 'progress'));
  64.                   curl_setopt($ch, CURLOPT_HEADER, 0);
  65.                   curl_setopt($ch, CURLOPT_NOPROGRESS, false);
  66.                   curl_setopt_array($ch,$options);
  67.                   curl_multi_add_handle($master, $ch);
  68.                   curl_multi_remove_handle($master, $done['handle']);
  69.                   $options[CURLOPT_URL] = $this -> list[$i++];
  70.               }
  71.           }while ($running);
  72.         curl_multi_close($master);
  73.         echo "<br>Done";
  74.         return $directorios;
  75.       }
  76.  
  77.       public function progress()
  78.       {
  79.           ob_flush();
  80.           flush();
  81.       }
  82.  

Y la llamada al metodo "doSearch" en el fichero main.php
Código
  1. $domain="http://www.google.com";
  2. $list = file_get_contents('lista.txt');
  3. $directorios = explode("\n" , $list);
  4. foreach($directorios as $dir)
  5.        $urls[] = trim($domain.$dir);
  6. $bruterDir = new BruterDirectory($domain,$urls);
  7. dirs = $bruterDir -> doSearch();
  8.  

Cualquier sugerencia es bienvenida.
3  Programación / PHP / Duda clase Route en Laravel en: 16 Enero 2020, 22:22 pm
Estoy empezando a aprender Laravel y  modificando el fichero web.php que es donde se encuentran las rutas me encuentro con lo siguiente:

web.php
Código
  1. Route::get('/', function ()
  2. {
  3.    return view('welcome');
  4. });
  5.  

Según ese código yo entiendo que la pagina solicitada solo va a permitir el método GET pero si por ejemplo envio una petición a esa url con TRACE u OPTIONS me devuelve el código 200, en cambio si lo envió con POST me devuelve el código 403.
No se supone que debería devolver el código 403 en todos los métodos que no sean GET?
Saludos
4  Programación / PHP / Pintar respuesta de peticiones simultaneas dinamicamente con curl en: 15 Enero 2020, 23:36 pm
Buenas, tengo un metodo en el que uso curl para comprobar si existen unos directorios dados para un dominio.
Esto funciona bien pero la duda viene al intentar implementar que el programa haga varias peticiones simultaneas y el resultado de estas se vayan mostrando de forma dinámica. Es decir, que si el programa ha encontrado un directorio lo pinte y siga buscando los directorios restantes para que no tenga que acabar para pintarlos todos.
Os dejo el codigo para ilustrarlo mejor.

Clase BruterDirectory:
Código
  1. class BruterDirectory extends Bruter
  2. {
  3.        private $directories;
  4.        private $domain;
  5.  
  6.        public function __construct($domain,$list)
  7.        {
  8.            parent::__construct($list);
  9.            $this -> domain = $domain;
  10.            $this -> directories = array();
  11.        }
  12.  
  13.        public function doSearch($callback)
  14.       {
  15.  
  16.             $directorios = array();
  17.             $rolling_window = 100;
  18.             $rolling_window = (count($this -> list) < $rolling_window) ? count($this -> list) : $rolling_window;
  19.             $master = curl_multi_init();
  20.             $curl_arr = array();
  21.             $std_options = array(CURLOPT_RETURNTRANSFER => true,
  22.             CURLOPT_FOLLOWLOCATION => true,
  23.             CURLOPT_MAXREDIRS => 2,
  24.             CURLOPT_USERAGENT => 'Buenas tardes');
  25.             $options = $std_options;
  26.             for ($i = 0; $i < $rolling_window; $i++)
  27.             {
  28.               $ch = curl_init();
  29.               $options[CURLOPT_URL] = $this -> list[$i];
  30.               curl_setopt_array($ch,$options);
  31.               curl_multi_add_handle($master, $ch);
  32.             }
  33.             do
  34.             {
  35.               while(($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM);
  36.               if($execrun != CURLM_OK)
  37.                   break;
  38.               while($done = curl_multi_info_read($master))
  39.               {
  40.                   $info = curl_getinfo($done['handle']);
  41.                   if ($info['http_code'] == 200)
  42.                   {
  43.                       $directorios[] = $info['url'];
  44.                       $i++;
  45.                   }
  46.                   $output = curl_multi_getcontent($done['handle']);
  47.                   $callback($output, $info);
  48.                   $ch = curl_init();
  49.                   curl_setopt_array($ch,$options);
  50.                   curl_multi_add_handle($master, $ch);
  51.                   curl_multi_remove_handle($master, $done['handle']);
  52.                   $options[CURLOPT_URL] = $this -> list[$i++];
  53.               }
  54.           }while ($running);
  55.         curl_multi_close($master);
  56.         return $directorios;
  57. }
  58.  
Lo que hace el metodo doSearch es lo comentado antes, dada una lista generada en otro fichero php va comprobando si existe ese directorio o no, si el status code es 200 lo guarda en un array y cuando acaba lo muestra. Hasta ahi funciona pero si os fijais meto una funcion callback para que cuando una de esas peticiones simultaneas finalice me pinte un "Hola" como prueba de concepto pero solo lo ejecuta cuando la funcion doSearch ha finalizado

En este fichero php es donde llamo a ese metodo:
main.php
Código
  1. $bruterDir = new BruterDirectory($domains,$urls);
  2. $callback = function($data, $info)
  3. {
  4.        print "Hola";
  5. };
  6. echo "<strong style='color:green;'><h1>Seeking dirs </strong></h1><br>";
  7. $dirs = $bruterDir -> doSearch($callback);
  8.  

Otra cosa curiosa es que en el main.php el echo de "Seeking dirs" tambien lo pinta despues de la llamada a doSearch y no entiendo muy bien a que se debe.

Cualquier sugerencia es bienvenida o si sabéis de otra forma para hacerlo tambien, saludos.
5  Seguridad Informática / Seguridad / Duda - Simular entorno vulnerable en: 16 Diciembre 2019, 20:58 pm
Buenas, estoy llevando a cabo un proyecto que consiste en hacer una especie de battlefield online de hackers  :xD.

La idea es subir al servidor una pagina como puede ser una agencia de viajes totalmente funcional pero con vulnerabilidades para que los usuarios las exploten y aprendan, pero antes de implementar el componente online me gustaría asegurarme de desarrollar bien la seguridad del sistema. La cosa es que cuando ese proyecto vulnerable es subido a un servidor ¿como se podría simular una especie de entorno seguro dentro del proyecto para no comprometer la seguridad del servidor y de los usuarios que se encuentren en esa misma partida?

Saludos.
6  Programación / Scripting / Python ayuda hilos para hacer ping a todas las ips en: 24 Noviembre 2019, 22:08 pm
Buenas, he creado un pequeño script en python para hacer ping a todas las ips del mundo.El problema es que esta tarea lleva mucho tiempo y he estado pensado en utilizar hilos pero no estoy muy seguro de cuando iniciar uno nuevo para optimizar mi script, ¿podríais aconsejarme?
Seria interesante saber en cuanto tiempo se pueden escanear todas las ips  :laugh:
Código:
Código:
import os
import socket

byte1 = 1
byte2 = 1
byte3 = 1
byte4 = 1
ip = str(byte1)+"."+str(byte2)+"."+str(byte3)+"."+str(byte4)

while ip!="223.254.254.254":
byte4+=1
if byte4 == 255:
   byte4 = 0
   byte3+=1

if byte3 == 255:
   byte3 = 0
   byte2+=1

if byte2 == 255:
   byte2 = 0
   byte1+=1

ip = str(byte1)+"."+str(byte2)+"."+str(byte3)+"."+str(byte4)
response = os.system("ping -c 3 " + ip + " > /dev/null 2>&1")

if response == 0:
   print ("%s responde" % ip)

Saludos
7  Seguridad Informática / Hacking / Elevar privilegios router en: 6 Noviembre 2019, 21:39 pm
Buenas, resulta que escaneando los puertos de mi IP publica me encuentro con el puerto 22 abierto e indagando un poco más veo que se trata del router ya que los suele usar el ISP para la administración remota.
Es entonces cuando decido conectarme por shh al router y comprobar que realmente funciona, la cosa es que la salida de los comandos están limitados y me gustaría poder ver todas las funcionalidades y sobre todo entender como consiguen que los usuarios tengamos una version limitada y ellos puedan hacer lo que quieran, se trata de una cuestión de asignar permisos o tal vez que haya que iniciar sesión como root en el router?. Cabe decir que los comandos funcionan, si haces un "reboot" se reinicia el router pero al no tener  la salida no sabes si lo estas haciendo bien o mal.
Muchas gracias y un saludo
8  Programación / Java / Duda - Java ver servicio en un puerto en: 4 Septiembre 2019, 16:23 pm
Buenas a todos, estoy haciendo un programa en Java para recopilar todos los host conectados a mi red y sondear los puertos de cada uno de ellos para despues ver los servicios y su correspondiente version. El problema es que no se como ver los servicios tras cada puerto, he intentado mirar informacion sobre "get service by port java"  pero no encuentro mucho. Un saludo.
PD: Se que el escaner se puede refactorizar mediante el uso de hilos pero primero me gustaria que funcione, cualquier sugerencia es bienvenida.

Clase Main:
Código:

package javaescanerpuertosredloca;

import java.util.List;

public class Main
{         
    public static void main(String[] args)
    {               
        RedLocal red = new RedLocal();
        List hosts = red.getHosts();
        for (Object ip : hosts)
        {
            System.out.println(ip.toString());
        }
    }
}
Clase red local:
Código:

package javaescanerpuertosredlocal;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;

public class RedLocal
{
    private List<Host> hosts;

    public RedLocal()
    {
        this.hosts = new ArrayList<>();
    }

    public List<Host> getHosts()
    {
        byte[] ip = {(byte)192, (byte)168, 1, 0}; //Valido para 192.168.1.x   
        for (int i = 1; i <= 254; i++) 
        {             
            try
            {
                ip[3] = (byte) i; 
                InetAddress address; 
                address = InetAddress.getByAddress(ip);
                if(address.isReachable(1000))
                {
                    this.hosts.add(new Host(address));                     
                }
            }
            catch (UnknownHostException ex)
            {
               
            }
            catch (IOException ex)
            {
               
            }
           
        }
        return hosts;
    }

    public void setHosts(List<Host> hosts)
    {
        this.hosts = hosts;
    }
   

    @Override
    public String toString()
    {
        return "RedLocal{" + "hosts=" + hosts + '}';
    }
}


Clase Puerto:
Código:

package javaescanerpuertosredloca;

public class Puerto
{
    private int puerto;
    private Servicio servicio;

    public Puerto(int puerto)
    {
        this.puerto = puerto;
    }

    public int getPuerto()
    {
        return puerto;
    }

    public void setPuerto(int puerto)
    {
        this.puerto = puerto;
    }

    @Override
    public String toString()
    {
        return "Puerto{" + "puerto=" + puerto + '}';
    }                   
}
Clase host:
Código:

package javaescanerpuertosredlocal;

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Host
{
    private List<Puerto> puertos;
    private InetAddress ip;

    public Host(InetAddress ip)
    {
        this.puertos = new ArrayList<>();       
        this.ip = ip;
        getPuertos();
    }
   
    public List<Puerto> getPuertos()
    {
       
        for(int i=0;i<65500;i++)
        {
            try
            {
                Socket socket = new Socket();
                socket.connect(new InetSocketAddress(ip, i), 200);             
                this.puertos.add(new Puerto(i));
                socket.close();
            }
            catch (IOException ex)
            {
               
            }
        }
        return puertos;
    }

    public void setPuertos(List<Puerto> puertos)
    {
        this.puertos = puertos;
    }

    @Override
    public String toString()
    {
        return ip+"{" + "puertos=" + puertos + '}';
    } 
}

Y faltaria la clase Servicio que no se como hacerla
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines