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

#161
Hacking / Re: [HELP] Ataque MITM SSL
16 Enero 2016, 17:35 PM
Jajaja, claro yo lo estoy tratando de implementar.

Para usar SSLStrip, previamente ejecutado el MITM, lo que haría nuestro SSLStrip sería recoger las peticiones de las víctimas, en este caso filtraremos las HTTP pero también podríamos filtrar otras en texto plano como FTP por ejemplo.

Eliminaríamos de sus cabeceras encodings, cookies, lo que nos interese, y por supuesto cambiaríamos los links https por http.

Al pasarle a la victima links en HTTP, tratará de conectarse a la url por HTTP, luego pueden pasar 2 cosas que la página responda redireccionando a una página HTTPS como hacen los bancos, en ese caso no bastaría con modificar el link, ya que volvería a tratarse de conectar por HTTP al banco y este respondería un "Locale: https:\\..."; y así hasta el infinito, en ese caso debemos saberlo detectar y lanzar una conexión https con el cabezón del servidor, y devolvemos los datos a la victima que vamos obteniendo en HTTP, haciendola pensar que está realizando una conexión no segura HTTP con el banco, pero este lo esta intentando impedir a toda costa, incluso está pensando que no hay ningún problema ya que la conexión que está realizando con el cliente (nosotros) es segura.

En fin, filtrar datos de protocolos de texto plano, y para aquellas paginas cabezonas que insisten en navegar con https navegamos con ellas en https y devolvemos los datos al usuario en HTTP y los 2 contentos, IMPORTANTE si el cliente navega por una página que usa HSTS, es decir que está en esta lista:

https://hstspreload.appspot.com/

Quiere decir que los navegadores dirán "ey ¿que haces navegando por google con http?, ¿para google que soporta HSTS solo se puede conectar por HTTPS!". Y te mandará una alerta te cortará conexión, o lo que quiera hacer el navegador, de todo menos dejarte conectar con google.

Es por ello, que hay una técnica que permite saltar un poco el HSTS que deriva del dns spoofing, esta vez cuando la victima diga quiero conectarme a www.google.com, interceptaremos su paquete DNS y lo modificaremos diciendola que se conecte a nuestro servidor casero de google, para eso spoofeamos la ip del paquete dns poniendo la de la máquina del atacante, y usamos el campo CNAME del paquete DNS para decirle que lo sentimos pero que el dominio google.com, ahora se llama gogle.com, y el navegador de la victima al ver el paquete dice "oh vaya se quiere conectar con gogle.com, por http ese no está en mi lista de HSTS no hay problema", y la víctima se conecta a tí mientras tu te conectas con google y le devuelves los datos de google, es decir. Totalmente capturable todos los datos, muy pocas serán las victimas que vean el candado en rojo o amarillo y no continúen, algo que con la última técnica del HSTS podemos saltar también, es decir que se conecten a un banco por ejemplo y que no les salga candado, ya que le diremos al server que es otro dominio, casi igual pero distinto.

Que os aproveche :)

#162
Eyyy muy buena eternal idol!!!

Distes en el clavo socio, ahora si que me cargan las librerías, desconocía esa función, pero de ahora en adelante me será útil, estoy seguro.

Sin embargo, en el código que tengo viejo de hace 3 años, hace password recovery de FF en su versión 10.0. Ahora anda por la versión 43 y ha modificado librerías y demás, es por ello que ya no están las mismas librerías que antes, el el FF 10 había que cargar estas librerías:

Código (cpp) [Seleccionar]

// Create a list of libraries (in order of dependency)
char* libList[] = { "mozglue.dll", "nspr4.dll", "plc4.dll", "plds4.dll",
"nssutil3.dll", "mozsqlite3.dll", "softokn3.dll", "nss3.dll", NULL
};


Ahora no se cuales habrá que cargar, pero confío en funcione con las mismas funciones, sino el trabajo se va a alargar mucho, probaré de primeras a cargar todas las dll del directorio e intentar ejecutar el programa, de todas maneras FF según se dice es de código abierto, pero bien que estoy buscado su código y no hay manera, me lleva a un servidor FTP y no carga nada.

https://developer.mozilla.org/es/docs/Descargar_el_c%C3%B3digo_fuente_de_Mozilla

El caso es que no hay rastro de su código de ninguna versión como para encontrar el código de la version 43.0 ... :"(

Saludos y a probar.

Edito: Bueno, parece que no va a funcionar, según leo desde la versión 32 FF guarda sus contraseñas de login en "logins.json" otro archivo nuevo, y desde esa versión hasta ahora utiliza ese archivo, y como es de esperar no será el único cambio, seguramente utilice diferentes encriptaciones y demás, si tuviera el código quizás pudiera hacer algo, un saludo.

Edito: Según he podido ver en el archivo este logins.json aparece la url tipo de autentificación y demás en texto plano, excepto el usuario y la contraseña, que están encriptadas con las librerías de FF. También al estar en AppData hay bases de datos de anteriores versiones de FF que se quedaron ahí perdidas, como signons.sqlite.

En fin esto de hacer un password recovery o lo sabes hacer y tienes constumbre y te lleva poco tiempo, o realmente no te merece la pena porque no paran de cambiar cada poco tiempo la forma de almacenar los datos en el archivo de logins, requiere mucho mantenimiento.
#163
Buenas, resulta que necesito cargar unas librerías de firefox de su path de instalación para intentar hacer un password recovery y comprobar que funciona.

El problema me lo da al tratar de cargar cualquiera de sus librerías:

Código (cpp) [Seleccionar]

HMODULE LoadLibrary2(char *libDir, char *libName){

char loadPath[MAX_PATH] = { 0 };
HMODULE tmpLib = NULL;

strcpy(loadPath, libDir);
strcat(loadPath, "\\");
strcat(loadPath, libName);

if (!strcmp(libName, "nss3.dll")) {
tmpLib = LoadLibraryA(loadPath);
}
else if (!strcmp(libName, "plc4.dll")) {
tmpLib = LoadLibraryA(loadPath);
}
else {
tmpLib = LoadLibraryA(loadPath);
}

if (NULL == tmpLib) {
printf("Failed to load library %s, code %d\n", libName, GetLastError());
return NULL;
}

printf("%s loaded successfuly\n", libName);

return tmpLib;
}


Para cargar a cualquier librería de FF se llama esta función, el caso es que LoadLibrary devuelve HMODULE = NULL, entonces llamo a GetLastError() y me devuelve 126 error.

En mi caso el error es:

CitarERROR_MOD_NOT_FOUND

   126 (0x7E)

   The specified module could not be found.


Que el módulo no puede ser encontrado, algo extraño ya que las librerías dinámicas están en el path correcto con el que llamo a la función y además utilizo permisos de administrador.

He probado a copiar y pegar la librería nss3.dll a el directorio en ejecución y daba el mismo error.

¿Qué puede ser?, un saludo.

Edito: Bueno, el código es muy cuestionable, no es mío y lo acabaré retocando entero pero primero saber porque no carga la dll, porque no funciona LoadLibrary.

La llamada a la función LoadLibrary tiene como argumento por ejemplo:

"C:\Program Files (x86)\Mozilla Firefox\nss3.dll", obviando que si lo escribimos como cadena sería con dos '\' para que se muestren.

Saludos.

OJO: Me acabo de dar cuenta que en el código añade en la cabecera "utils.h", no se que tendrá ese archivo pero igual tiene algo que ver con esto.

Utilizo también LoadLibraryA pero y si el path tiene caracteres multybyte? MMmm, no creo que tenga que ver, pero puede que en otra situación pueda causar problemas.

No sé, compila sin errores.. solo eso de la librería.
#164
Foro Libre / Re: Comprar camisas de futbol
11 Enero 2016, 19:23 PM
Aliexpress
#165
.NET (C#, VB.NET, ASP) / Re: Email y C#.
4 Enero 2016, 20:39 PM
Bueno como ves yo esto lo probé a finales de noviembre de 2015 y ya ves que me pedía que me logueará en la web, por lo tanto no me dejaba acceder, quizás hayan puesto esa medida de seguridad en estos últimos meses.

Tampoco puse más énfasis al ver que me exigía loguearme en la web y que lo intentase desde allí. Pero quizás hay alternativas.

Saludos.
#166
.NET (C#, VB.NET, ASP) / Re: Email y C#.
4 Enero 2016, 18:40 PM
Claro, yo lo hice para C++. En gmail si comienzas usando conexión no segura te dirán que uses el comando STARTLS, al igual que en hotmail, a no ser que empieces logueandote con conexión segura, sin embargo en yahoo no te obligan, puedes loguearte con sesión no segura y no te fuerzan a usar STARTTLS para saltar a SSL.

La gracia fue que soy muy cabezón y conseguí loguearme correctamente usando SSL en gmail y sorpresa, me mando un mensaje diciendome que el login era correcto pero que por favor me loguase en la web, y no me dejo hacer más operaciones.

Supongo que te estará bien saberlo.

Es más te paso el hilo:

https://foro.elhacker.net/programacion_cc/enviando_email_c_20-t444813.0.html

Seguro se te quitarán las ganas de loguearte en gmail ;)

Quizás otro servidor smtp deje hacerlo, pero la única alternativa para hacelo con gmail y que te deje es usando https en su web e iniciando sesión desde allí, algo que puedes hacer desde tu aplicación en C#.

Suerte.
#167
Lo que hace la función es recibir como argumentos los bytes de un paquete tcp y su tamaño, entonces recalcula su tcp checksum simplemente ESO.

Ayudandome con wireshark y estudiando los paquetes tcp, miro donde comienza cada campo, direcciónes ip origen y destino, los bytes donde se encuentran, y demás, y con la teoría aprendo a calcular las cosas.

Bien, se supone que para calcular un tcp checksum necesito:

http://www.roman10.net/how-to-calculate-iptcpudp-checksumpart-1-theory/

Citar

source address: 32 bits/4 bytes, taken from IP header
destination address: 32bits/4 bytes, taken from IP header
resevered: 8 bits/1 byte, all zeros
protocol: 8 bits/1 byte, taken from IP header. In case of TCP, this should always be 6, which is the assigned protocol number for TCP.
TCP Length: The length of the TCP segment, including TCP header and TCP data. Note that this field is not available in TCP header, therefore is computed on the fly.

Note that TCP pseudo header does not really exist, and it's not transmitted over the network. It's constructed on the fly to compute the checksum.

If a TCP segment contains an odd number of octets to be checksummed, the last octect is padded on the right with zeros to form a 16-bit word. But the padding is not part of the TCP segment and therefore not transmitted.

Lo que hago es eso, comienzo sumando ip de origen y destino, luego el numero de protocolo (con el byte de ceros a la izquierda que es indiferente y no lo pongo), luego sumo el tamaño del segmento tcp, tras mucho sudor lo conseguí pues coincide con el de wireshark y ahora los checksums me dan aproximados, y luego sumo los bytes de cabecera desde el byte que empieza hasta el final del mismo de 2 en 2 bytes, y luego con el payload tcp o campo de datos lo mismo hasta el final, y si es impar al ir sumando de 2 en 2 se queda sin pareja el ultimo byte, en ese caso hay que hacer un "padding a la derecha", que supongo que consiste en colocar un byte de ceros a la izquierda del ultimo byte para formar la ultima pareja del campo de datos o payload.

Código:

Código (cpp) [Seleccionar]

//http://www.arcesio.net/checksum/checksumTCP.html
u_char* tcp_checksum(const u_char* _datos, int _tamaño)
{
u_char *checksum = new u_char[2];
u_short sumando = 0, sumanda = 0;
bitset<17> controlador;

if (_tamaño < 54)
return nullptr;

//sumo ip origen e ip destino
for (int i = 26; i < 33; i++){
sumanda = (u_short)((_datos[i] << 8) + _datos[i + 1]);
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
i++;
}

//sumo el byte de ceros y el numero de protocolo TCP
sumanda = (u_short)0x06;
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;

//sumamos el tcp segment len
sumanda = (u_short)((_datos[16] << 8) + _datos[17]) - ((u_short)((_datos[46] & 0xF0) >> 4) + (u_short)(_datos[14] & 0x0F)) * 4;
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;

//sumo todo el campo de cabecera con el checksum a cero
for (int i = 34; i < 53; i++){
if (i != 50){
sumanda = (u_short)((_datos[i] << 8) + _datos[i + 1]);
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
}
i++;
}

//sumo todo el payload tcp
for (int i = 54; i < _tamaño - 1; i++){
sumanda = (u_short)((_datos[i] << 8) + _datos[i + 1]);
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
i++;
}

if (_tamaño % 2){
sumanda = (u_short)_datos[_tamaño - 1];
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
//if its odd the last octect is padded on the right with zeros to form a 16 - bit word
}

if (_tamaño % 2)cout << "Impar";

sumando = sumando & 0xFFFF;
sumando = ~sumando;
checksum[0] = (sumando >> 8) & 0x00FF;
checksum[1] = sumando & 0x00FF;
return checksum;
}


Ejemplo de salida:

7626==763a
8299==82ad
487b==488f
12dc==12f0
81d3==81e7
7a56==7a6a
289c==28b0
24c2==24d6
cfd6==cfea
2158==Impar2b62
1d25==1d39
82a4==Impar8cae
1651==1665
5d5d==Impar6767
abff==Imparb69
e6b6==e6ca
ca7e==ca92
b759==b76d
744f==7463
4f27==Impar8a0
b2bc==Imparbcc6
cfb6==Impard9c0
5a93==Impar649d
1b32==Impar253c
2c7==Imparcd1
5b40==Impar654a
f37a==Imparfd84
9f77==9f8b
40b9==Impar4ac3
17b==Imparb85
142e==Impar1e38
9acb==9adf
eab3==eac7
678d==Impar7197
3c56==Impar4660
16d==181


Como se puede observar en la salida, cuando es par hay una diferencia siempre constante entre el checksum original y el recalculado, sin embargo cuando es impar no encuentro la relación que difiere entre ellos.

¿que falla? ¿por qué no coinciden?, he sumado todos los campos que piden, tal y como piden.

PD: y no me seáis guiris que responden sin cerebro:

http://stackoverflow.com/questions/34582015/tcp-checksum-3-0-version

Saludos y gracias.

EDICION DELICATESSE MAAAXIMAAA: HOY ES EL DÍA, HOY ES EL DÍA que conseguí calcular el tcp checksum. Hoy es mí día, resulta que el padding cuando eran impares hay que añadir un byte de ceros en la última posición, no en la penúltima como hacía es decir, añader el cero a la derecha no a la izquierda, ahora si:


if (_tamaño % 2){
sumanda = (u_short)(_datos[_tamaño - 1] << 8) + 0;
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
//if its odd the last octect is padded on the right with zeros to form a 16 - bit word
}
       sumando += 20;
if (_tamaño % 2)cout << "Impar";
sumando = sumando & 0xFFFF;
sumando = ~sumando;
checksum[0] = (sumando >> 8) & 0x00FF;
checksum[1] = sumando & 0x00FF;
return checksum;
}


Queríais tcp checksum, tomad tcp checksums:


504c==504c
e2fc==e2fc
4049==4049
3f42==Impar3f42
baa2==Imparbaa2
5d75==5d75
45bb==Impar45bb
3165==Impar3165
eb0==eb0
42f6==42f6
ce7==ce7
203d==Impar203d
6946==Impar6946
e57==Impare57
3229==Impar3229
ae92==Imparae92
6abd==Impar6abd
14d==Impar14d
c18e==Imparc18e
6372==Impar6372
6087==Impar6087
59fe==59fe
e086==Impare086
e475==Impare475
5f38==5f38


Eso sí, si me diriaís porque cohone estoy sumando 20 para que funcione ya sería lo maximo. Pero me es ya un poco indiferente porque.... FUNCIONAAAAA!!!!.

SOOLUCIONADO TAMBIEN:

Código (cpp) [Seleccionar]

sumanda = (u_short)((_datos[16] << 8) + _datos[17]) - (u_short)((_datos[46] & 0xF0) >> 4)  *4;// (u_short)(_datos[14] & 0x0F)) * 4;


https://www.youtube.com/watch?v=m5voqcN9zm4

Me abro el champan.

Os fije que caería esta semana, y no paso de primera hora.

Saludos.

#168
Cita de: MAFUS en  3 Enero 2016, 21:52 PM
A ver, desconozco el algoritmo de esto, pero veo una cosa que no me cuadra:
En la última iteración, cuándo i valga _tamano - 1, en la linea 10, cuando accedes a _datis [i +  1] ¿no estás fuera del array?

Se me olvido llamar al break.. :/, pero no cambia nada con ni sin break.

Hay algo que no comprendo que es porque cuando es par el checksum que calculo es 20 unidades mas pequeño que el original, y cuando es impar varia mucho de uno a otro. En los pares estoy olvidandome de sumar 20 y en los impares algo hago mal que va más alla que eso supongo.

Eso de odd, de que si son impares hay que añadir padding o no se que, simplemente sería quesumamos los bytes de par en par, y si el ultimo no tiene pareja lo sumamos por separado y salimos del bucle que es lo que hago, ¿NO?.

Código (cpp) [Seleccionar]

//sumo todo el payload tcp
for (int i = 54; i < _tamaño; i++){
if (i + 1 == _tamaño){//se desborda entonces copiamos solo el ultimo, pero estará ya copiado??
sumanda = (u_short)_datos[_tamaño - 1];
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
break;
}
sumanda = (u_short)((_datos[i] << 8) + _datos[i + 1]);
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
i++;
}

Saludos.

Bueno bueno, parece que tuve que ir a pedir ayuda al extranjero, aunque no espero ni respuesta, los guiris van de listos pero me parece que npi.

http://stackoverflow.com/questions/34582015/tcp-checksum-3-0-version

Ya esta disponible la nueva versión tcp checsum de kaxperday 3.0, más cerca del checksum real que nunca, delicatesse 3.0.

A ver si para la 4.0 ya la tenemos!!!

#169
Wow buena pregunta :""DDD yo es que ya me lo se de memoria de tanto verlo.


u_short sumando = 0, sumanda = 0;
bitset<17> controlador;


El controlador controla el acarreo de bit esta bien, _datos[] es el vector de bytes que recibo del paquete, y _tamaño el tamaño del mismo.

Me encuentro sumando el payload, que no siempre debería de ir así pero si el header len tcp es de 20 bytes empezaría en el byte 54 como tengo en el code y de ahí tira hasta el final sumando de 16 bits en 16bits, pero algo hago mal con el ultimo byte y cuando es impar.

Casi lo tengogg: izquierda checksum real, derecha calculado.


6543==6543
4dcb==4dcb
646==646
91c6==91c6
1bf==1bf
3922==3922
37ab==37ab
9069==9069
b262==b262
e928==e928
d76e==d76e
7d==7d
3eb5==3e3d
a84b==a77e
2313==2313
7dea==7dea
1dcb==1d50
6479==6479
506e==506e
5410==539c

Código (cpp) [Seleccionar]

//sumo todo el payload tcp
for (int i = 54; i < _tamaño; i++){
if (i + 1 > _tamaño - 1){
sumanda = (u_short)_datos[_tamaño - 1];
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
}
sumanda = (u_short)((_datos[i] << 8) + _datos[i + 1]);
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
i++;
}
#170
Bueno tras ponerme esta mañana conseguí hacer el tcp segment len la parte más dificil aunque da mucho asco en su conjunto:

Código (cpp) [Seleccionar]

//sumo todo el payload tcp
for (int i = 54; i < _tamaño - 1; i++){
if (i + 1 == _tamaño) break;
sumanda = (u_short)((_datos[i] << 8) + _datos[i + 1]);
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
i++;
}

if ((_tamaño - 1) % 2 == 0){
sumanda = (u_short)_datos[_tamaño - 1];
controlador = sumando + sumanda;
sumando += sumanda;
if (controlador[16] == 1)
sumando++;
}


Pero me falla la parte donde se suman los datos tcp, el payload, tengo que ir de 16 bits en 16 bits. Cambia si es par o impar y en eso estoy, a ver si alguien lo ve a simple vista, no se que ponia tambien que lei de rellenar con ceros.

Igual sumo dos veces el ultimo byte.. ya lo he depurado mentalmente y no enuentro manera no estoy muy freso, una hand pls, QUE YA LO TENGO CASI!!! TRAS MEEEESSES AÑOS LUSTROS.

Edito: sumar del byte 54 hasta el final sea par o impar sin repetir bytes claro y de 16 bits en 16 bits (u_short).

Ejemplos de comparacion final de tcp checksum verdadero y el mio calculado, respectivamente:


3d10== 1506 3d24
de5e== 190 de72
7527== 396 753b
6fae== 397 79c2
f0c9== 397 fadd
dabd== 396 dad1
9e96== 397 a8aa
f5d== 397 ff21
8c62== 1478 8c76
283e== 309 3252


Lo primero es el checksum verdadero, lo segundo es el tamaño del paquete (notese que si es par con sumar 14 al checksum nuestro ya tendriamos el verdadero siempre) sin embargo cuando es impar se va mas de resultado.

Creo que me falta el padding que no se ni lo que es, pero ya buscaré, este otro codigo que encontré hace tiempo, y está haciendo lo mismo sumar cabecera y datos de 16 en 16, en el ultimo paso no se que hace ni porque eso del padding, pero en ello estoy.

Código (cpp) [Seleccionar]
 
// Calculate the sum                                            //
        sum = 0;
        while (len > 1)
{
                sum += *buf++;
                if (sum & 0x80000000)
                        sum = (sum & 0xFFFF) + (sum >> 16);
                len -= 2;
        }

        if (len & 1)
                // Add the padding if the packet lenght is odd          //
                sum += *((uint8_t *)buf);


Edito: HAHAHAH AMIGOS, mucho google traductor ya decia yo que era porque era par o impar, "odd" en ingles es impar, en ese caso "add the padding" que no se que es, pero bueno jajaja poco a poco descifrando. (inverse enginnering) #esduroderoer

Ok se refiere a que si es impar ponga ceros en el final y bien esto ya lo hice, puse ceros delante y detrás del ultimo byte, es decir si terminaba en 0x12 0x14 0x 30 y era impar he probado a dejar 0x3000 y 0x0030 y el resultado malo tambien ojj, bueno ya casi lo tengo, caerá esta semana.

Saludos.