Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Kaxperday

#481
Simplemente la duda era esa que no sabía como pasar ese const u_char* a char*, pero no me di cuenta que con un simple if se hacía fácilmente:

c = data[i]; // u_char
a = (c >= 32 && c <= 128) ? (unsigned char)c : '.';


Y para poder hacer esto había que hacer antes una conversión de const u_char* a u_char* con (u_char*) o un const_cast. Aquí la llamada a la función:

PrintData((u_char*)pkt_data, header->len);

Ahora estoy trasteando con el HTTPS, el contenido del paquete HTTPS al igual que el de HTTP comienza desde el byte 52, la diferencia que en HTTP estaba en texto plano y se podía ver todo con mostrar los caracteres alfanuméricos como hacía con el if, sin embargo en el HTTPS aparecen caracteres fuera de ese rango porque está cifrado, ahora tendré que intentar romperlo, haciendo de proxy, implementar un sslstrip vaya.

Edito: Y ya si es con DNS2PROXY ni te cuento, una máquina de hacking en la red.

Saludos.

Edito:

void lista_usuarios::insertar_host(u_char* ip, u_char* mac)
{
int salida;
printf("CONTENIDO LISTA************\n");
for (int i = 0; i < usuarios.size(); i++)
{
for (int j = 0; j < 4; j++)
{
printf("%x", usuarios[i].ip[j]);
}
printf("     ");
for (int j = 0; j < 6; j++)
{
printf("%x", usuarios[i].mac[j]);
}
printf("\n");
}
printf("CONTENIDO IPS Y MAC***********\n");
for (int j = 0; j < 4; j++)
{
printf("%x", ip[j]);
}
printf("     ");
for (int j = 0; j < 6; j++)
{
printf("%x", mac[j]);
}
printf("\n");
for (int i = 0; i < usuarios.size(); i++)
{
salida = 0;
for (int j = 0; j < 4; j++)
{
if (ip[j] != usuarios[i].ip[j])
{
salida++;
break;
}
}

for (int j = 0; j < 6; j++)
{
if (mac[j] != usuarios[i].mac[j])
{
salida++;
break;
}
}

//printf("cont %d cant %d\n", cont, cant);

if (salida >= 2)
{
printf(" ENTRA \n");
host usuario;
for (int j = 0; j < 4; j++)
{
usuario.ip[j] = ip[j];
}
for (int j = 0; j < 6; j++)
{
usuario.mac[j] = mac[j];
}
usuarios.push_back(usuario);
break;
}
}

if (usuarios.size() == 0)
{
host usuario;
for (int j = 0; j < 4; j++)
{
usuario.ip[j] = ip[j];
}
for (int j = 0; j < 6; j++)
{
usuario.mac[j] = mac[j];
}
usuarios.push_back(usuario);
}


¿Alguien sabe que falla en este código que hace que se almacenen mismos ip/mac en la lista de hosts (usuarios)?

Salida:

CONTENIDO IPS Y MAC***********
ac1a063     0f664d3eec
CONTENIDO LISTA************
ac1a063     0f664d3eec
CONTENIDO IPS Y MAC***********
ac1a066     1867b08d6fb6
ENTRA
CONTENIDO LISTA************
ac1a063     0f664d3eec
ac1a066     1867b08d6fb6
CONTENIDO IPS Y MAC***********
ac1a072     8086f299043
ENTRA
CONTENIDO LISTA************
ac1a063     0f664d3eec
ac1a066     1867b08d6fb6
ac1a072     8086f299043
CONTENIDO IPS Y MAC***********
ac1a0ab     026733da20
ENTRA
CONTENIDO LISTA************
ac1a063     0f664d3eec
ac1a066     1867b08d6fb6
ac1a072     8086f299043
ac1a0ab     026733da20
CONTENIDO IPS Y MAC***********
ac1a063     0f664d3eec
ENTRA
CONTENIDO LISTA************
ac1a063     0f664d3eec
ac1a066     1867b08d6fb6
ac1a072     8086f299043
ac1a0ab     026733da20
ac1a063     0f664d3eec
CONTENIDO IPS Y MAC***********
ac1a066     1867b08d6fb6
ENTRA


Como se puede observar a pesar de que las cadenas de ip/mac son iguales entra en la lista.

Saludos.
#482
Mi código es parecido a el de ese link, obtengo los datos del paquete con pcap_next_ex().

Mira esto es la salida que quiero conseguir:

DATA Dump
IP Header
45 00 01 a2 2e 22 40 00 80 06 05 5a c0 a8 00 65          E...."@.€..Z...e
60 11 a4 bb                                              `...

TCP Header
04 bb 00 50 27 39 09 9e df e8 1c 7b 50 18 44 70          ...P'9.....{P.Dp
c7 6e 00 00                                              .n..

Data Payload
47 45 54 20 2f 31 2f 3f 42 57 31 33 6a 67 25 32          GET /1/?BW13jg%2
42 56 52 48 35 6c 52 6c 55 25 32 42 37 71 63 4a          BVRH5lRlU%2B7qcJ
30 44 78 6d 53 62 45 44 32 46 4d 43 76 59 74 43          0DxmSbED2FMCvYtC
6b 58 6c 48 25 32 46 59 38 4a 41 41 41 41 41 41          kXlH%2FY8JAAAAAA
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41          AAAAAAAAAAAAAAAA
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41          AAAAAAAAAAAAAAAA
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41          AAAAAAAAAAAAAAAA
41 41 41 47 4e 74 5a 43 35 6c 65 47 55 41 56 32          AAAGNtZC5leGUAV2
6c 75 5a 47 39 33 63 79 42 44 62 32 31 74 59 57          luZG93cyBDb21tYW
35 6b 49 46 42 79 62 32 4e 6c 63 33 4e 76 63 67          5kIFByb2Nlc3Nvcg
41 31 4c 6a 45 75 4d 6a 59 77 4d 43 34 31 4e 54          A1LjEuMjYwMC41NT
45 79 41 45 31 70 59 33 4a 76 63 32 39 6d 64 43          EyAE1pY3Jvc29mdC
42 44 62 33 4a 77 62 33 4a 68 64 47 6c 76 62 67          BDb3Jwb3JhdGlvbg
41 41 41 41 25 33 44 25 33 44 20 48 54 54 50 2f          AAAA%3D%3D HTTP/
31 2e 31 0d 0a 48 6f 73 74 3a 20 70 61 32 2e 7a          1.1..Host: pa2.z
6f 6e 65 6c 61 62 73 2e 63 6f 6d 0d 0a 41 63 63          onelabs.com..Acc
65 70 74 2d 45 6e 63 6f 64 69 6e 67 3a 20 67 7a          ept-Encoding: gz
69 70 0d 0a 41 63 63 65 70 74 3a 20 2a 2f 2a 0d          ip..Accept: */*.
0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74          .Content-Type: t
65 78 74 2f 70 6c 61 69 6e 0d 0a 55 73 65 72 2d          ext/plain..User-
41 67 65 6e 74 3a 20 5a 6f 6e 65 41 6c 61 72 6d          Agent: ZoneAlarm
2f 39 2e 31 2e 30 30 38 2e 30 30 30 20 28 6f 65          /9.1.008.000 (oe
6d 2d 31 30 34 33 3b 20 65 6e 2d 55 53 29 20 5a          m-1043; en-US) Z
53 50 2f 32 2e 32 0d 0a 0d 0a                            SP/2.2....



Yo lo que tengo ahora mismo es lo de la izquierda, los valores en hexadecimal.

Quiero pasarlo a texto plano como en la derecha, ¿como?

Esto lo he sacado de aquí:

http://www.binarytides.com/code-packet-sniffer-c-winpcap/

Vamos que son pktdata como ya dije es un const u_char*, luego sería pasarlo a char*, ¿o no?

Saludos.

Edito: Bueno bueno bueno, me estuve estudiando la página del link y he conseguido mostrarlo:

Ejemplo que muestro:

00 1c 25 e5 bd 8b 70 18 8b c3 27 db 08 00 45 00          ..%...p...'...E.
00 46 61 bd 00 00 80 11 12 52 ac 1a 0a 6e 08 08          .Fa...Ç..R...n..
08 08 e9 28 00 35 00 32 b4 d8 e9 33 01 00 00 01          ...(.5.2...3....
00 00 00 00 00 00 03 77 77 77 10 67 6f 6f 67 6c          .......www.googl
65 2d 61 6e 61 6c 79 74 69 63 73 03 63 6f 6d 00          e-analytics.com.
00 01 00 01          ....


Aunque se corta, pero creo que es debido al strlen que en cpp no acepta u_char como hace C.

El código es este:

Código (cpp) [Seleccionar]
void PrintData(u_char* data, int Size)
{
unsigned char a, line[17], c;
int j;

//loop over each character and print
for (int i = 0; i < Size; i++)
{
c = data[i];

//Print the hex value for every character , with a space
printf( " %.2x", (unsigned int)c);

//Add the character to data line
a = (c >= 32 && c <= 128) ? (unsigned char)c : '.';

line[i % 16] = a;

//if last character of a line , then print the line - 16 characters in 1 line
if ((i != 0 && (i + 1) % 16 == 0) || i == Size - 1)
{
line[i % 16 + 1] = '\0';

//print a big gap of 10 characters between hex and characters
printf("          ");

//Print additional spaces for last lines which might be less than 16 characters in length
for (j = strlen(reinterpret_cast<char*>(line)); j < 16; j++)
{
printf("   ");
}

printf("%s \n", line);
}
}

printf("\n");
}


Aun así tiene que mejorar mucho.

Edito: Bueno yo creo que el tema está solucionado, aunque no entiendo la solucion que ya intentaré ver como funciona, pues quiero la salida del paquete HTTP en texto plano, de esta manera tendré un sniffercillo XDD.

Gracias ivancea como siempre :), pues fuiste la llave a mi solución gracias a el link de wireshark.

Saludos.
#483
Así es además la página que utilicé no lo soporta, era un simple HTTP GET.

Quiero hacer como wireshark, prueba a abrirlo y filtra los HTTP. Verás que te aparece abajo a la izquierda en hexadecimal los valores del paquete y a su derecha aparecen esos valores en texto plano, pasa de hexadecimal a texto plano el contenido del paquete ¿como?

Lo que busco es hacer eso, tengo el contenido del paquete en const u_char* (pkt_data), y quiero pasarlo a texto plano, o al menos unas subcadenas para poder mostrar las IPs del paquete.

Ya te he dicho todo lo que he probado y no lo conseguí, ¿propones alguna idea para pasar a texto plano ese const u_char*?

Saludos.
#484
No hay ninguna mac, como he puesto solo he reutilizado el codigo del anterior post, que ya fue solucionado. Como ya he dicho pkt_data es un const u_char* y quiero mostrar su contenido en texto plano, como una cadena. El paquete capturado era un HTTP, debetia aparecer en texto plano algo como "GET /forum.php ..." sin embargo la salida no es esa, quiero saber que debo hacer para obtenerlo en texto plano, y ahi esta todo lo que he probado sin exito.

Por el tema de errores no hay ninguno en la compilacion y el programa no casca en ningun momento, si lo hace ya lo se corregir. Simplemente no estoy obteniendo los datos en el formato que busco.

Saludos.
#485
Esa es la gracia, que no había errores. Bueno gracias ivancea por esta aquí para ayudarme, odio esto de los tipos.

La verdad que lo conseguí solucionar de esta manera finalmente:

Código (cpp) [Seleccionar]
mac_adaptador = (u_char*)malloc(sizeof(u_char)* 6);
for (int i = 0; i < 6; i++)
mac_adaptador[i] = (u_char)(*adaptador)->Address[i];


Aunque tengo otra duda ahora, que es ¿como pasar de const u_char* a char*? he probado con prácticamente de todo, y he buscado lo que he podido y sigue sin dar resultado. He probado con:

pkt_data es un const char*, quiero pasarlo a cadena o mostrarlo caracter a caracter:

1: printf("%c", (char)(const_cast<u_char*>(pkt_data)[i]));
2: long a = (long)pkt_data[i];
//printf("%c", (char)a);
3: char* cadena=reinterpret_cast<char*>(const_cast<u_char*>(pkt_data))


Todas muestran basura, se supone que la tercera debería funcionar, pues const_cast pasa las variables de "const X" a "X", y luego una vez la tengo en u_char* sería pasarla a char* pero muestra basura y no funciona, eso sí todas las opciones compilan.

Edito: Aquí en una respuesta explica lo de el const_cast:

http://stackoverflow.com/questions/658913/c-style-cast-from-unsigned-char-to-const-char

Edito: Más intentos fallidos:

printf("%s", (char*)const_cast<u_char*>(pkt_data));
//printf("%s", reinterpret_cast<char*>(const_cast<u_char*>(pkt_data)));


Salida:

Citarp↑ï├'♠

Esto creo que funciona pero no obtengo en ASCII:

u_long MacAddr = (u_long)pkt_data;
BYTE *bMacAddr = (BYTE*)&MacAddr;
string res;
stringstream ss;
for (int i = 0; i < header->caplen; i++)
{
ss << hex << (int)bMacAddr[i];
res += ss.str();
ss.str("");
}
cout << res;


Reutilicé código del mismo proyecto XD, lo que pasa obtengo salidas como esta:

TAMAÐO : 1283
c2ee2cccccccccccccccc1000ccccccccccccccccc2ee2cccccccccccccccc6c12461ccccccccea4
745c10e4fd0b9881b010006cdffd0d07b1905810461c82ee16ce0fd034e2fd0060e77ecccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccacd1d1cccccccc6ce0
fd03551190000000004ce1fd034e2fd0060e77ecccccccccccccc0cccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccac
d1d1cccccccc4ce1fd025c1902ce2fd034e2fd0060e77ecccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccccccccccacd1d1cccccccc2ce2fd02e701a0ce3fd034e2fd00
60e77ecccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccca8
d1d1ccccccccce3fd0809f170ce4fd0c4e6fd0060e77eccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccccccccc1072f1cccccccc1ce4fd0a84c1a0727d45cfce4fd0c
4e6fd0060e77eccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc


Ese mismo paquete, un HTTP con el wireshark (comprobe tamaños y los recogí a la vez) me sale en hexadecimal y en ASCII, yo aquí ¿estoy mostrando bytes? No entiendo, ¿como puedo hacer para obtenerlo en cadena decimal?

Saludos.
#486
Modifico el post, la anterior duda fue solucionada. La nueva duda esta en mi siguiente post.

Saludos.
#487
Hola a todos, miren estoy buscando escanear los host de la red pero no sé si el sistema trabajará como yo creo, es por eso por lo que creo el hilo.

Se supone que haciendo un ping a la broadcast obtendré la respuesta de todos los hosts de la red conectados al router.

Entonces tendré que mandar un ICMP a la dirección de broadcast ¿pasando mi IP?, y luego el router mandará una peticion a todos los host, pasandole un ICMP con mi dirección IP sino me equivoco un PING vamos, y responderán con su dirección IP a la mi IP que fue la que lanzó la broadcast. ¿funciona así no?

La idea es implementarlo, mandaría un ICMP a la broadcast, y escucharía los paquetes tipo ICMP response entrantes almacenando las ips conectadas a la red, ¿podéis confirmarme que esto funcionara?.

Antes tomé un camino fácil, hacer ping a todo el rango de IPs y la propia funcion me decía si había respondido sin necesidad de escuchar el tráfico, iba de una en una. Mal método escanear host haciendo ping uno a uno para todo el rango de ips.

Si conocéis algún método mejor para hacerlo decidme, luego ya lo implementaría en C++, nada más solo eso.

Saludos.

Edito: He estado informandome y no es buena idea escanear la red usando un ping a la broadcast, pues muchos equipos cancelan los paquetes ICMP, y no responden, usando wireshark, he visto que solo me ha respondido un equipo al ping de broadcast, mientras que 3 lo han ignorado, es por ello que buscaré otros métodos, saludos.

Edito 2: He estado probando como funciona Fing de mi móvil, ya que obtiene los host de la red con su MAC muy rápidamente, y aquí os lo cuento.

Simplemente manda paquetes ARP a todo el rango de hosts y usa threads para mandarlos. Luego la solución más efectiva pasa por mandar mensajes ARP, además de esta manera cuando respondan ya tendré su MAC, y no tendré que hacer 2 llamadas, saludos.
#488
Cita de: beholdthe en  1 Julio 2015, 02:47 AM
No se me ocurre mejor forma de mostrar la estupidez de esta noticia.
Completamente de acuerdo contigo engel lex.

No se trata de enseñar conocimientos, sino de mostrar una forma de hacer "perder dinero".

De todas formas, habría que hacer algo el control está aumentando a pasos agigantados, hace poco leí en el foro que querían poner cajas negras en los ordenadores, en una entrevista a Chema Alonso me enteré de que un gobierno en guerra con el tuyo puede matarte aunque seas civil si tienes conocimientos de hacking.

Están haciendo un ataque totalmente desmedido contra los hackers y la gente que usa internet, solo se me ocurren 2 maneras de frenarlo una con leyes (para la cual necesitaríamos un gobierno con forma muy distinta de pensar a los actuales, como podría ser podemos), y otra reivindicándonos contra estas medidas, pero realmente dudo de la última medida, pues en el siglo 21 está comprobado que las manifestaciones y reivindicaciones de derechos son cada vez más débiles y mejor paliadas, mucha gente sale a la calle a manifestarse y nada cambia, sigue igual, y otra vez lo mismo, llegan al punto en que tiran la toalla, ya no es igual que antes, somos ignorados, solo las urnas pueden cambiarlo, y esperemos que lo hagan pronto.

Luego la NSA espiando a todo el mundo, los bancos robando como siempre, los políticos que siguen pidiendo más préstamos que nos siguen endeudando cuando deberían estar prohibidos pues nos endeudan a toda la sociedad y luego mirad a Grecia.

El mundo se desploma a pasos agigantados, los poderes cada vez nos quieren controlar más, quieren tener más poder y más dinero, queriendo lo contrario para nosotros, nos recortan más, nos hacen ganar menos y hacen nuestras manifestaciones y reclamo de derechos insignificantes, nuestra democracia esta muerta, esto es España.

Hace ya tiempo que los gobiernos trabajan para los bancos y grades empresas, no nos dejemos engañar, necesitamos referéndums, necesitamos volver a estar los primeros en su lista de preocupaciones, necesitamos gobiernos que den vida a la democracia, gobiernos que piensen en el pueblo y no en las grandes empresas ni bancos, y no por ello deben de ser comunistas, ni populistas.

Simplemente necesitamos un gobierno que ponga primero a los ciudadanos, porque todos lo dicen pero casi ninguno lo hace.

Saludos.


#489
Bien, no sabría que estaba en decimal. Estoy codeando a ver si lo consigo de una vez.

Edito: ¡Por finnnn!, ya puedo irme a dormir contento. He aquí la JODIDA solución:

Código (cpp) [Seleccionar]
BYTE *bMacAddr = (BYTE*)&MacAddr;
string res;
stringstream ss;
for (int i = 0; i < PhyAddrLen; i++)
{
ss << hex << (int)bMacAddr[i];
res += ss.str();
ss.str("");
}
*mac = _strdup(res.c_str());


Gracias ivancea96 por la ayuda. It works like a charm.

Saludos.
#490
Con espacios:

60 71 17 54 152 29

La Mac empezaba por 3C. Así hemos pasado los 6 bloques hexadecimales de la Mac a enteros. Si ahora lo que buscabas era pasarlos a chars no creo que funcione.

Esto sí muestra la Mac, pero no obtengo la cadena, no se como llegar a ella:

BYTE *bMacAddr = (BYTE*)&MacAddr;
for (int i = 0; i < (int)PhyAddrLen; i++)
printf("%x", bMacAddr[i]);


Saludos.