|
161
|
Seguridad Informática / Hacking / Re: [HELP] Ataque MITM SSL
|
en: 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
|
Programación / Programación C/C++ / Re: Error 126: LoadLibrary falla C++
|
en: 16 Enero 2016, 13:06 pm
|
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: // 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_MozillaEl 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
|
Programación / Programación C/C++ / Error 126: LoadLibrary falla C++
|
en: 15 Enero 2016, 15:57 pm
|
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: 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: ERROR_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.
|
|
|
165
|
Programación / .NET (C#, VB.NET, ASP) / Re: Email y C#.
|
en: 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
|
Programación / .NET (C#, VB.NET, ASP) / Re: Email y C#.
|
en: 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.htmlSeguro 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
|
Programación / Programación C/C++ / ¿Por qué FUNCIONA TAN BIEN este TCP checksum? 4.0
|
en: 4 Enero 2016, 09:23 am
|
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/ 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: //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-versionSaludos 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: 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=m5voqcN9zm4Me abro el champan. Os fije que caería esta semana, y no paso de primera hora. Saludos.
|
|
|
168
|
Programación / Programación C/C++ / Re: La estocada final al TCP checksum
|
en: 3 Enero 2016, 21:56 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?. //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-versionYa 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
|
Programación / Programación C/C++ / Re: La estocada final al TCP checksum
|
en: 3 Enero 2016, 19:37 pm
|
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
//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
|
Programación / Programación C/C++ / La estocada final al TCP checksum
|
en: 3 Enero 2016, 19:17 pm
|
Bueno tras ponerme esta mañana conseguí hacer el tcp segment len la parte más dificil aunque da mucho asco en su conjunto: //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. // 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.
|
|
|
|
|
|
|