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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking (Moderador: toxeek)
| | |-+  [Serio] Implementar ataque MITM + SSLstrip para windows con C# y winpcap
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Serio] Implementar ataque MITM + SSLstrip para windows con C# y winpcap  (Leído 6,345 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
[Serio] Implementar ataque MITM + SSLstrip para windows con C# y winpcap
« en: 15 Mayo 2015, 21:27 pm »

Hola a todos, quizas me podáis guiar un poco con todo esto. Mis propósitos son educacionales, si quisiera usar SSLstrip con malas intenciones, no sería necesario crear este tema.

Me gustaría poderlo emular en windows, para ello usaré C#, el comando netsh para pasar los datos al puerto donde escuchará el sslstrip, y me he descargado el winpcap, lo que quiero es redirigir los paquetes a el puerto donde escucha el sslstrip, ¿como puedo hacerlo? También tenia pensado usar py2exe para pasar el programa de Moxie a .exe, y no complicarme la vida intentandolo emular en C#, ¿nadie lo ha intentado antes? ¿alguna idea?

Según me ponga a ello iré subiendo actualizaciones y mis avances.

Si alguien quiere ayudarme a alcanzar este objetivo y poderlo compilar, le invito a comentar en este tema, a ver si entre todos podemos hacer algo, yo cuando me ponga a ello actualizaré mis avances en este tema.

Saludos.

« Última modificación: 18 Mayo 2015, 01:43 am por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
kub0x
Enlightenment Seeker
Colaborador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: [Serio] Emular SSLstrip para windows
« Respuesta #1 en: 15 Mayo 2015, 22:52 pm »

Supongo que la herramienta del capitán marlinspike utiliza libpcap en GNU/Linux. ¿Has probado si con Cygwin funciona? Lo más sabio sería no utilizar Windows para estas cosas, de hecho no conozco software en Win$ con el fin que propones. Supongo que utilizarás la variante ssltrip2 para hacerse cargo de HSTS.

Recomiendo las charlas de moxie a todo el mundo, uno de los titanes, porque romper PKI es de TITANES.

Saludos.
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: [Serio] Emular SSLstrip para windows
« Respuesta #2 en: 16 Mayo 2015, 17:29 pm »

Hola Kub0x, mira he estado probando primero a recibir los paquetes con el programa C#:

Me estoy ayudando con este link: winpcap C#

Utiliza la librería winpcap de /system32/ para extraer las funciones que permiten extraer los paquetes de la red con facilidad, como usa más adelante en el código que está en el link.

Simplemente hay que importarlas así:

Código
  1. const int PCAP_ERRBUF_SIZE = 256;
  2.        const int PCAP_OPENFLAG_PROMISCUOUS = 1;
  3.        const string PCAP_SRC_IF_STRING = "rpcap://";
  4.  
  5.        [DllImport("wpcap.dll")]
  6.        static extern IntPtr pcap_open(string source, int snaplen, int flags, int read_timeout, IntPtr auth, ref IntPtr errbuff);
  7.        [DllImport("wpcap.dll")]
  8.        static extern void pcap_freealldevs(IntPtr alldevs);
  9.        //auth is a managed pointer to a structure of type pcap_rmtauth
  10.        [DllImport("wpcap.dll")]
  11.        static extern int pcap_findalldevs_ex(string source, IntPtr auth, ref IntPtr alldevs, ref IntPtr errbuff);
  12.        [DllImport("wpcap.dll")]
  13.        static extern int pcap_next_ex(IntPtr conn, ref IntPtr header, ref IntPtr packetdata);
  14.        [DllImport("wpcap.dll")]
  15.        static extern void pcap_close(IntPtr conn);

No da error, en caso de que no estaría en ese directorio bastaría con incluirla al proyecto, que no es el caso ya que es la librería estándar "para ver paquetes de red" de windows.

Tras leer y buscar, se recomienda usar esta librería antes que tratar de crear un programa que obtenga los paquetes, básicamente por el filtrado que hacen ya sus funciones de los mismos.

Por lo que creo que es recomendable usarla, al código le faltan algunas funciones que "nos deja como tarea".

Sin embargo, el problema de como conseguir los paquetes de red queda resuelto con la librería wpcap, y en el código ya podemos hacer uso de sus funciones. (queda saberlas llamar con los datos necesarios).

Entonces tendremos acceso a los paquetes de la red, si realizamos un MITM inyectando paquetes dhcp a los usuarios de la red, winpcap nos debería de devolver sus paquetes es allí donde los modificariamos y conectariamos con el servidor (puerta de enlace).

Pasaríamos los paquetes por el sslstrip, pasandolos a su puerto de escucha con la ejecución del comando para windows netsh.

Poco a poco, saludos.

Edito: estaría bien mirar esto ante de usar winpcap.

Os dejo el código que debería mostrarme las interfaces de red, los drivers:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Diagnostics;
  5. using System.Runtime.InteropServices;
  6. using System.Windows.Forms;
  7. using System.Drawing;
  8. using System.IO;
  9. using System.ComponentModel;
  10.  
  11. [StructLayout(LayoutKind.Sequential)]
  12.        struct pcap_if
  13.        {
  14.            public IntPtr next;
  15.            public string name; //name of device
  16.            public string description; //description of device
  17.            public pcap_addr addresses;
  18.            public int flags;
  19.        }
  20.  
  21.        [StructLayout(LayoutKind.Sequential)]
  22.        struct pcap_addr
  23.        {
  24.            public IntPtr next;
  25.            public IntPtr addr;
  26.            public IntPtr netmask;
  27.            public IntPtr broadaddr;
  28.            public IntPtr dstaddr;
  29.        }
  30.  
  31.        [StructLayout(LayoutKind.Sequential)]
  32.        struct sockaddr
  33.        {
  34.            public Int16 sa_family;
  35.            public string sa_data;
  36.        }
  37.  
  38.        [StructLayout(LayoutKind.Sequential)]
  39.        struct pcap_pkthdr
  40.        {
  41.            public timeval ts;
  42.            public int caplen; //captured length
  43.            public int len; //packet length
  44.        }
  45.  
  46.        [StructLayout(LayoutKind.Sequential)]
  47.        struct timeval
  48.        {
  49.            public int tv_sec;
  50.            public int tv_usec;
  51.        }
  52.  
  53.        //some credentials if we want to capture packets remotely
  54.        //CAN BE VERY USEFUL!!
  55.        [StructLayout(LayoutKind.Sequential)]
  56.        struct pcap_rmtauth
  57.        {
  58.            public int type;
  59.            public string username;
  60.            public string password;
  61.        };
  62.  
  63.  
  64.  
  65.        static class Program
  66.        {
  67.            const int PCAP_ERRBUF_SIZE = 256;
  68.            const int PCAP_OPENFLAG_PROMISCUOUS = 1;
  69.            const string PCAP_SRC_IF_STRING = "rpcap://";
  70.  
  71.            [DllImport("wpcap.dll")]
  72.            static extern IntPtr pcap_open(string source, int snaplen, int flags, int read_timeout, IntPtr auth, ref IntPtr errbuff);
  73.            [DllImport("wpcap.dll")]
  74.            static extern void pcap_freealldevs(IntPtr alldevs);
  75.            //auth is a managed pointer to a structure of type pcap_rmtauth
  76.            [DllImport("wpcap.dll")]
  77.            static extern int pcap_findalldevs_ex(string source, IntPtr auth, ref IntPtr alldevs, ref IntPtr errbuff);
  78.            [DllImport("wpcap.dll")]
  79.            static extern int pcap_next_ex(IntPtr conn, ref IntPtr header, ref IntPtr packetdata);
  80.            [DllImport("wpcap.dll")]
  81.            static extern void pcap_close(IntPtr conn);
  82.            static void Main()
  83.            {
  84.                MessageBox.Show("hola");
  85.                pcap_if d;
  86.                IntPtr alldevs=IntPtr.Zero;
  87.                //IntPtr d;
  88.                int i=0;
  89.                //char errbuf[PCAP_ERRBUF_SIZE];
  90.                IntPtr errbuf = IntPtr.Zero;
  91.  
  92.                /* Retrieve the device list from the local machine */
  93.                if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, IntPtr.Zero /* IntPtr.Zero auth is not needed */, ref alldevs, ref errbuf) == -1)
  94.                {
  95.                    Console.WriteLine("Error in pcap_findalldevs_ex: {0}\n", errbuf);
  96.                    Application.Exit();
  97.                }
  98.                /* Print the list */
  99.  
  100.                while(alldevs!=IntPtr.Zero)
  101.                {
  102.                    d=(pcap_if)Marshal.PtrToStructure(alldevs, typeof(pcap_if));
  103.                    MessageBox.Show(d.name + d.description);
  104.                    Console.WriteLine("%d. %s", ++i, d.name);
  105.                    if (d.description!="")
  106.                        Console.WriteLine(" (%s)\n", d.description);
  107.                    else
  108.                        Console.WriteLine(" (No description available)\n");
  109.                    alldevs=d.next;
  110.                }
  111.  
  112.                if (i == 0)
  113.                {
  114.                    MessageBox.Show("\nNo interfaces found! Make sure WinPcap is installed.\n");
  115.                    return;
  116.                }
  117.  
  118.                /* We don't need any more the device list. Free it */
  119.                //pcap_freealldevs(alldevs);
  120.            }
  121.        }

Sin embargo no sale nada, ¿alguien sabe porque? Me dice que no encuentra ninguna interfaz que me asegure de que tengo winpcap instalado??, vamos a ver yo uso wpcap.dll de windows para cargar esas funciones, porque necesitaria el winpacap? y no viene intalado?, raro.

Edito:Olvidad lo anterior, FUNCIONA!!!! necesitaba permisos de admin claro!!!!

Ya he listado los "devices", ahora a seguir con lo demás, aunque despues de esto haré un descanso, no estuvo mal por hoy.



Hola de nuevo, he conseguido listar las interfaces de red en mi caso son 4, una es la de realtek (la del wifi), es en ella donde quiero escuchar y obtener el trafico.

Pero no obtengo los paquetes con éxito, ¿qué puede fallar? Lo corrí como admin y tampoco funcionaba.

Código
  1. public IntPtr openDevice(pcap_if dev)
  2.        {
  3.            IntPtr fp = IntPtr.Zero;
  4.            IntPtr referrbuff = IntPtr.Zero;
  5.            fp = pcap_open(dev.name, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, IntPtr.Zero, ref referrbuff);
  6.            if (fp == IntPtr.Zero)
  7.            {
  8.                return IntPtr.Zero;
  9.            }
  10.            return fp;
  11.        }
  12.  
  13.        public void startCapture(IntPtr fp, AsyncOperation async)
  14.        {
  15.            try
  16.            {
  17.                IntPtr hdr = IntPtr.Zero;
  18.                IntPtr data = IntPtr.Zero;
  19.                int res;
  20.                pcap_pkthdr header = new pcap_pkthdr();
  21.                while ((res = pcap_next_ex(fp, ref hdr, ref data)) >= 0)
  22.                {
  23.                    if (res == 0)
  24.                        continue;
  25.                    header = (pcap_pkthdr)Marshal.PtrToStructure(hdr, typeof(pcap_pkthdr));
  26.                    Console.WriteLine(data.ToString());
  27.                    //asynchronously calls the function OnPacketCaptured with the arguments: data (the captured data) and header.caplen (the length of the data).
  28.                    async.Post(
  29.                        delegate(object e)
  30.                        {
  31.                            object[] inputdata = (object[])e;
  32.                            //OnPacketCapturedEvent((int)inputdata[0], PtrToString((IntPtr)inputdata[1], (int)inputdata[0]));
  33.                        },
  34.                        (object)(new object[] { header.caplen, data }
  35.                    ));
  36.                    hdr = IntPtr.Zero;
  37.                    data = IntPtr.Zero;
  38.                }
  39.            }
  40.            catch (Exception ex)
  41.            {
  42.                pcap_close(fp);
  43.            }
  44.        }

pcap_next_ex(fp, ref hdr, ref data)) siempre devuelve 0, porque no recojo paquetes?

SI FUNCIONA!!!!!! TENGO LOS PAQUETES! ERA OTRA INTERFAZ!!



Hola de nuevo, ya tengo los paquetes, abri wireshark y vi que el wifi correspondia al primer servicio de windows y no al de realtek como pensaba (donde no pasaban paquetes).

Este es la funcion que muestra los paquetes:

Código
  1. public void startCapture(IntPtr fp, AsyncOperation async)
  2.        {
  3.            try
  4.            {
  5.                String paquete;
  6.                IntPtr hdr = IntPtr.Zero;
  7.                IntPtr data = IntPtr.Zero;
  8.                int res;
  9.                pcap_pkthdr header = new pcap_pkthdr();
  10.                pcap_addr datos = new pcap_addr();
  11.                while ((res = pcap_next_ex(fp, ref hdr, ref data)) >= 0)
  12.                {
  13.                    paquete = "";
  14.                    if (res == 0)
  15.                        continue;
  16.                    header = (pcap_pkthdr)Marshal.PtrToStructure(hdr, typeof(pcap_pkthdr));
  17.                    paquete += "tamaño paquete teorico: " + header.len + Environment.NewLine;
  18.                    paquete += "tamaño paquete practico: " + header.caplen + Environment.NewLine;
  19.                    paquete += "tiempo recojer paquete (s): " + header.ts.tv_sec + Environment.NewLine;
  20.                    paquete += "tiempo recojer paquete (us): " + header.ts.tv_usec + Environment.NewLine;
  21.                    string merda = (string)Marshal.PtrToStringAnsi(data, header.caplen);
  22.                    paquete += "datos del paquete: " + merda + Environment.NewLine + Environment.NewLine;
  23.                    Console.WriteLine(paquete);
  24.                    hdr = IntPtr.Zero;
  25.                    data = IntPtr.Zero;
  26.                }
  27.            }
  28.            catch { }
  29.            /*try
  30.             {
  31.                 IntPtr hdr = IntPtr.Zero;
  32.                 IntPtr data = IntPtr.Zero;
  33.                 int res;
  34.                 pcap_pkthdr header = new pcap_pkthdr();
  35.                 pcap_addr datos = new pcap_addr();
  36.                 while ((res = pcap_next_ex(fp, ref hdr, ref data)) >= 0)
  37.                 {
  38.                     if (res == 0)
  39.                         continue;
  40.  
  41.                     header = (pcap_pkthdr)Marshal.PtrToStructure(hdr, typeof(pcap_pkthdr));
  42.                     datos = (pcap_addr)Marshal.PtrToStructure(data, typeof(pcap_addr));
  43.                     Console.WriteLine(datos.addr.ToString());
  44.                     Console.WriteLine(datos.broadaddr.ToString());
  45.                     Console.WriteLine(datos.netmask.ToString());
  46.                     //asynchronously calls the function OnPacketCaptured with the arguments: data (the captured data) and header.caplen (the length of the data).
  47.                     async.Post(
  48.                         delegate(object e)
  49.                         {
  50.                             object[] inputdata = (object[])e;
  51.                             //OnPacketCapturedEvent((int)inputdata[0], PtrToString((IntPtr)inputdata[1], (int)inputdata[0]));
  52.                         },
  53.                         (object)(new object[] { header.caplen, data }
  54.                     ));
  55.                     hdr = IntPtr.Zero;
  56.                     data = IntPtr.Zero;
  57.                 }
  58.             }
  59.             catch (Exception ex)
  60.             {
  61.                 pcap_close(fp);
  62.             }*/
  63.        }

Ahora debería de filtrarlos ... el programa parece mostrarme todos los paquetes de la interfaz, alguien sabe como obtener solo los de un puerto?? de todas formas voy progresando gracias a los tutoriales de winpcap y un poco de google (para pasar de c++ a c#).

Esto es un ejemplo de los paquetes que recojo, como estos aparecen decenas diría por segundo si produzco el trafico:

Citar
tamaño paquete teorico: 85
tamaño paquete practico: 85
tiempo recojer paquete (s): 1431904982
tiempo recojer paquete (us): 800752
datos del paquete: <G◄6~↔p↑<Ã' E  G♫*  ?◄¾´À¨☺♥Ø:ÓáÍ«☺» 3µ+♀Ó∟wôóT,Þ♂Ü∟♫õuðTûSFÊ
B7wë6;~▼s8◄eò ♦àæ¦Í↨­É


tamaño paquete teorico: 1392
tamaño paquete practico: 1392
tiempo recojer paquete (s): 1431904982
tiempo recojer paquete (us): 883303
b}òü╬×Q024♣­AÖL½TÛG<G◄6~↔p↑<Ã' E ♣b.¸  ?◄~þÀ¨☺♥Ø:ÓîÍ$☺»♣NCã
ÈÓ☻  ☺ ♦CHLO↨   PAD '☺  SNI ¤☺  STK Þ☺  VER â☺  CCS ò☺  NONC↕☻  MSPC▬☻  AEAD→☻
UAID0☻  SCID@☻  TCIDD☻  PDMDH☻  ICSLL☻  PUBSl☻  SCLSp☻  KEXSt☻  COPTt☻  CCRTO☻
CGST?☻  IRTT"☻  CETV8♥  CFCW<♥  SFCW@♥  ----------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-----------------------------------------clients1.google.com<G♥ÇD↔å¾♣¥¶u♂´?ì↕½¢3
ÁÈ.CDJ1L<þ^ÒÖjQ0249YùS@÷þÉ{&éçä\qÿUY"ÖQZ¤ï,-7ªÚ
<a°?«®§hBFÊ☻XÃ{L►bd   AESGm Chrome/42.0.2311.1529'%/?ß¿[ãmª¥÷P\£    X509▲   DIæ♥
¡bu¶ßÀèsë♂-äªå"çltBgÚÄ?H☺   C255'N^»8ò☺²↕GýMB'@♂{?©®yëQBIC?õ  B╬éOÈ?╬-r'¶'Ü->¾2½
J?c½,'Õ↔âo~µåç'O/N♠K·▼@Ç'Oò÷Òsd©¸ƒRÈj×ùplaÓ%à}Ã/ní¥♀cÀ/♀å¤-tXË↔¥TIø6♠íu±ÍL6Þh"¨"
Q<kBÚ\~$e♀w"ö'³¡",±°↕`-}♦º▼Å%<s©ÙÍÛé½Ql¬¸§Ds½1⌂?i*>á→TT?Êûä%
hXO_X      

 ::) ::) ::)

Ahora a ver si alguien me ayuda me gustaría filtrarlos, luego quiero hacer ARP POISONING para obtener los paquetes de los demas ordenadores de la red, tengo que saber cuales filtrar y cuales enciar al sslstrip y hacer la inet.

Poco a poco, pero con mas ayuda y codigo sería mas facil (aunque bien que aprendo asi..) no hay mal que por bien no venga, compartir es vivir!!

Saludos!!
« Última modificación: 18 Mayo 2015, 01:36 am por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
shargon

Desconectado Desconectado

Mensajes: 121



Ver Perfil
Re: [Serio] Implementar ataque MITM + SSLstrip para windows con C# y winpcap
« Respuesta #3 en: 20 Agosto 2015, 08:54 am »

Para leerlos entiendo que primero tendrás que leer la cabecera TCP

https://en.wikipedia.org/wiki/Transmission_Control_Protocol

en el caso de que sean TCP, ahi tienes los puertos de origen y de destino
En línea

shargon

Desconectado Desconectado

Mensajes: 121



Ver Perfil
Re: [Serio] Implementar ataque MITM + SSLstrip para windows con C# y winpcap
« Respuesta #4 en: 20 Agosto 2015, 09:00 am »

De todas maneras creo que no vas a poder editarlos, solo verlos, corregirme si me equivoco, pero  con winpcap solo podrás recibir, "si no estoy equivocado"

Ceo que winpcap solo permite ver el paquete, no interceptarlo y esperar una respuesta

De todas maneras me gusta la idea de crear un sniffer que altere los paquetes en Windows, mediante plugins en c#, quizá deberías crear un proyecto en GitHub
« Última modificación: 20 Agosto 2015, 09:02 am por shargon » En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: [Serio] Implementar ataque MITM + SSLstrip para windows con C# y winpcap
« Respuesta #5 en: 11 Octubre 2015, 17:57 pm »

Hola, así es con winpcap los paquetes no se pueden modificar pero si leer. Pero cuando estas haciendo un MITM al controlar el ip fordwarding de los hosts lees los paquetes que te envían los modificas y mandas al server lo que quieras.

De esta manera se podría implementar el sslstrip facilmente, pero la idea es implementar el sslstrip2, y para eso necesitaré hacer dns spoofing, llevando a las victimas del mitm a un servidor http levantado en la maquina de atacante que haga conexion https con paginas que lo soporten y http con las demas.

De esta manera evadimos todo lo que quieran poner de seguridad XD.

Aunque lo jodido es como extraer el tamaño de los campos y el contenido de los dns responses, algo que me da muchos errores de momento, luego es jugar con subprocesos clientes y servidores.

Saludos.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Dudas mitm y sslstrip
Hacking
dani__ 6 7,209 Último mensaje 2 Julio 2010, 17:31 pm
por dani__
mitm con sslstrip y arpspoof. ayuda
Hacking
zit0 0 4,495 Último mensaje 29 Diciembre 2012, 22:33 pm
por zit0
Mitm con ettercap + sslstrip en VM Backtrack sobre Mac OS X
Hacking
astcorp 0 2,281 Último mensaje 13 Febrero 2014, 00:24 am
por astcorp
se puede hacer un ataque mitm desde windows 7 ?
Hacking
Zeta1337 5 5,444 Último mensaje 11 Febrero 2015, 15:29 pm
por exploiterstack
Winpcap mitm&proxy vs Sockets mitm&proxy
Redes
Kaxperday 0 2,229 Último mensaje 17 Enero 2016, 17:02 pm
por Kaxperday
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines