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]


  Mostrar Temas
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19
61  Programación / Programación C/C++ / ¿Dónde está el problema? TCP checksum en: 13 Noviembre 2015, 20:23 pm
He buscado funciones, he intentado hacerla paso a paso y no funciona, ¿alguien puede decirme como calcular el tcp checksum a partir de el array de bytes del paquete y otra variable con su tamaño?, estaría muy bien, mientras habrá que buscar.  :-* :-*

Código con el que traté de implementarlo por mi cuenta:

Código
  1. //http://www.arcesio.net/checksum/checksumTCP.html
  2. u_char* tcp_checksum(u_char* datos, int tamaño)
  3. {
  4. u_char checksum[2];
  5. uint16_t sumando = 0, sumanda = 0;
  6. bitset<17> total;
  7. for (int i = 26; i < 33; i++)//del 26 al 33 ip origen y destino se suman
  8. {
  9. sumanda = (uint16_t)((datos[i] << 8) + datos[i + 1]);
  10. total = sumando + sumanda;
  11. sumando += sumanda;
  12. if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
  13. sumando++;
  14. i++;
  15. }
  16. sumanda = (uint16_t)(0x06);//sumamos el tipo paquete tcp
  17. total = sumando + sumanda;
  18. sumando += sumanda;
  19. if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
  20. sumando++;
  21. sumanda = (uint16_t)(tamaño - 34);// ((datos[38] << 8) + datos[39]);//sumamos el tamaño del paquete.
  22. //sumanda = (uint16_t)((datos[38] << 8) + datos[39]);//sumamos el tamaño del paquete.
  23. total = sumando + sumanda;
  24. sumando += sumanda;
  25. if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
  26. sumando++;
  27. //YA TENEMOS CALCULADO EL PSEUDO HEADER.
  28. for (int i = 34; i < 40; i++)//del 34 al 41, 3 campos tcp header.
  29. {
  30. sumanda = (uint16_t)((datos[i] << 8) + datos[i + 1]);
  31. total = sumando + sumanda;
  32. sumando += sumanda;
  33. if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
  34. sumando++;
  35. i++;
  36. }
  37. for (int i = 42; i < tamaño; i++)//sumamos resto.
  38. {
  39. sumanda = (uint16_t)((datos[i] << 8) + datos[i + 1]);
  40. total = sumando + sumanda;
  41. sumando += sumanda;
  42. if (total[16] == 1)//al sumar sumanda a sumando acarrea bit.
  43. sumando++;
  44. i++;
  45. }
  46. sumando = sumando & 0xFFFF;
  47. sumando = ~sumando;
  48. checksum[0] = (sumando >> 8) & 0x00FF;
  49. checksum[1] = sumando & 0x00FF;
  50. return checksum;
  51. }

Lo saqué de aqui como hacerlo:

http://www.arcesio.net/checksum/checksumTCP.html

Pero no funciona, pues al comparar mis tcp checksums con los de wireshark no coinciden, ¿alguna ayuda?. ¿que tengo mal?.

Gracias.

He estado mirando y tengo mal en la linea que hago la suma del tamaño del paquete, ese no es su tamaño. Pero aun asi sigue fallando.

¿en la línea 20 que habría que poner?.

Edito: Haber sumo primero la ip origen y destino, el numero de protocolo 0x06 (pasandolo a u_short como todos los sumandos), y luego le sumo la linea en duda del tamaño del tcp header y sus datos.

Luego a eso le tengo que sumarla suma del campo tcp header de u_short en u_short e igual con el payload, ¿pero porque no funciona?.

Ejemplo salida:

Código
  1. if (pkt_data[23] == 0x06){
  2. u_char origen[4];
  3. u_char destino[4];
  4. memcpy(origen, const_cast<u_char*>(pkt_data + 26), sizeof(u_char)* 4);
  5. memcpy(destino, const_cast<u_char*>(pkt_data + 30), sizeof(u_char)* 4);
  6.  
  7. in_addr a;
  8. in_addr b;
  9. a.S_un.S_addr = inet_addr((char*)origen);
  10. b.S_un.S_addr = inet_addr((char*)destino);
  11. printf("%x%x==", pkt_data[50], pkt_data[51]);
  12. printf("%x%x==", tcp_check(const_cast<u_char*>(pkt_data), header->caplen, inet_addr((char*)origen), inet_addr((char*)destino))[0],
  13. tcp_check(const_cast<u_char*>(pkt_data), header->caplen, inet_addr((char*)origen), inet_addr((char*)destino))[1]);
  14. printf("%x%x", tcp_checksum(const_cast<u_char*>(pkt_data), header->caplen)[0],
  15. tcp_checksum(const_cast<u_char*>(pkt_data), header->caplen)[1]);
  16. cout << endl;
  17. }

Citar
bee==d4f9==014
4eb4==d4f9==014
675a==d4f9==014

Me sale el checksum siempre 014 ???

Por cierto la otra funcion que pruebo, que no es mía tampoco funciona es:

Código
  1. u_char* tcp_check(u_char *buff, size_t len, u_long src_addr, u_long dest_addr)
  2. {
  3. uint16_t *buf = (uint16_t*)buff;
  4. uint16_t ip_src = (uint16_t)src_addr, ip_dst = (uint16_t)dest_addr;
  5.         uint32_t sum;
  6.         size_t length = len;
  7.         // Calculate the sum                                            //
  8.         sum = 0;
  9.         while (len > 1)
  10.         {
  11.                 sum += *buf++;
  12.                 if (sum & 0x80000000)
  13.                         sum = (sum & 0xFFFF) + (sum >> 16);
  14.                len -= 2;
  15.        }
  16.  
  17.        if (len & 1)
  18.                // Add the padding if the packet lenght is odd          //
  19.                 sum += *((uint8_t *)buf);
  20.  
  21.        // Add the pseudo-header                                        //
  22.         sum += (ip_src++);
  23.        sum += ip_src;
  24.         sum += (ip_dst++);
  25.         sum += ip_dst;
  26.         sum += htons(IPPROTO_TCP);
  27.        sum += htons(length);
  28.  
  29.         // Add the carries                                              //
  30.         while (sum >> 16)
  31.                 sum = (sum & 0xFFFF) + (sum >> 16);
  32.  
  33. u_char ret[2];
  34.        // Return the one's complement of sum  
  35. ret[0] = ((uint16_t)(~sum) >> 8) & 0x00FF;
  36. ret[1] = (uint16_t)(~sum) & 0x00FF;//
  37.        // return ((uint16_t)(~sum));
  38. return ret;
  39. }
  40. //http://minirighi.sourceforge.net/html/tcp_8c-source.html
62  Programación / Programación C/C++ / La magia del string.find() en: 13 Noviembre 2015, 15:07 pm
Se solucionó, tenía que ver con esa igualdad que haces dentro de una condicion a la que hay que meter entre parentesis...

fue algo mágico de todas maneras:

Código que funciona:

Código
  1. void filtrar_pregunta_http(u_char* _datos, int _tamaño)
  2. {
  3. string paquete = string(reinterpret_cast<char*>(_datos), _tamaño);
  4. int tamaño = _tamaño;
  5. int pos = 0;
  6. while ((pos = paquete.find("https://", pos)) != string::npos){
  7. paquete.replace(pos, 5, "http");
  8. tamaño--;
  9. }
  10. cout << "pos: " << pos << endl;
  11. if ((pos = paquete.find("Accept-Encoding: ")) != string::npos){
  12. int pas = pos;
  13. while (paquete[pas] != '\n'){
  14. printf("%c", paquete[pas]);
  15. pas++;
  16. }
  17. paquete.erase(pos, pas - pos + 1);
  18. }
  19. cout << paquete.c_str() << endl;
  20. }
63  Programación / Programación C/C++ / Conexión HTTPS con openssl C++ en: 10 Noviembre 2015, 10:03 am
Hola, estaba probando con openssl a realizar una conexión https visto que no conseguí curl, de hecho no me hace falta si se usar openssl que de momento no es el caso.

Lo primero una duda, cuando me conecto con google.com de la forma:

Código
  1. int sd;
  2. struct hostent *host;
  3. struct sockaddr_in addr;
  4.  
  5. host = gethostbyname("google.com"); /* convert hostname ‡ IP addr */
  6. sd = socket(PF_INET, SOCK_STREAM, 0);  /* create TCP socket */
  7. memset(&addr, 0, sizeof(addr));
  8. addr.sin_family = AF_INET;
  9. addr.sin_port = htons(80);     /* set the desired port */
  10. addr.sin_addr.s_addr = *(long*)(host->h_addr); /* and address */
  11. connect(sd, (struct sockaddr*)&addr, sizeof(addr));/* connect */
  12. //send .. recv..

Los datos que obtengo son descifrados, esto es porque me conecto a el puerto 80 que usa HTTP ¿verdad?, ¿pero google no forzaba a usar https?, no entiendo porque una conexión normal no me la cifra, ¿será que es la primera interacción?.

Me he puesto a probar una conexión https siguiendo un tutorial, que encontré aquí:

http://www.informit.com/articles/article.aspx?p=22078&seqNum=3

Muy bueno por cierto, porque hay poca documentación sobre openssl y ejemplos.

Código
  1. SSL_METHOD *method;
  2. SSL_CTX *ctx;
  3. OpenSSL_add_all_algorithms();   /* load & register cryptos */
  4. SSL_load_error_strings();     /* load all error messages */
  5. method = (SSL_METHOD*)SSLv2_client_method();   /* create client instance */
  6. ctx = SSL_CTX_new(method);         /* create context */
  7. int sd;
  8. struct hostent *host;
  9. struct sockaddr_in addr;
  10.  
  11. host = gethostbyname("google.com"); /* convert hostname ‡ IP addr */
  12. sd = socket(PF_INET, SOCK_STREAM, 0);  /* create TCP socket */
  13. memset(&addr, 0, sizeof(addr));
  14. addr.sin_family = AF_INET;
  15. addr.sin_port = htons(80);     /* set the desired port */
  16. addr.sin_addr.s_addr = inet_addr("216.58.211.238"); /* and address */
  17. connect(sd, (struct sockaddr*)&addr, sizeof(addr));/* connect */
  18. SSL *ssl;
  19. ssl = SSL_new(ctx);    /* create new SSL connection state */
  20. SSL_set_fd(ssl, sd);   /* attach the socket descriptor */
  21. SSL_connect(ssl);          /* perform the connection */
  22. SSL_write(ssl, "ola que ase", 0);
  23. char rec[1000];
  24. SSL_read(ssl, rec, 0);
  25. cout << rec;

Me salta un error en ejecución en SSL_set_fd(ssl, sd);, donde he pasado de segundo argumento un socket, ¿que se supone que tengo que pasar ahí?.

¿Se supone que hago una conexión http y luego paso a https? ¿o como va?.

Seguiré probando, un saludo.

Edito: Bueno he estado probando y resulta que le pasaba el primer argumento null, el segundo argumento creo que es lo que devuelve connect, fui probando porque devolvia null y probando variable a variable hasta que ví que me faltaba una función de inicializar la librería tal que:

SSL_library_init();

Tras ponerlo no dio error, pero devolvió basura, seguiré probando a ver. Creo que es porque nunca he usado write() a ver de que va..

Código
  1. char *post = "POST / HTTP/1.1\r\ncontent-type:application/x-www-form-urlencoded;charset=utf-8\r\nhost: google.com\r\n";
  2.  
  3. SSL_METHOD *method;
  4. SSL_CTX *ctx;
  5. SSL_library_init();
  6. OpenSSL_add_all_algorithms();   /* load & register cryptos */
  7. SSL_load_error_strings();     /* load all error messages */
  8. method = const_cast<SSL_METHOD*>(SSLv2_client_method());   /* create client instance */
  9. ctx = SSL_CTX_new(method);         /* create context */
  10. int sd, server;
  11. sockaddr_in addr;
  12. WSADATA wsa;
  13. WSAStartup(MAKEWORD(2, 0), &wsa);
  14. if (sd = socket(AF_INET, SOCK_STREAM, 0) == SOCKET_ERROR)
  15. cout << "error crear socket";/* create TCP socket */
  16. memset(&addr, 0, sizeof(addr));
  17. addr.sin_family = AF_INET;
  18. addr.sin_port = htons(80);     /* set the desired port */
  19. addr.sin_addr.s_addr = inet_addr("216.58.211.238"); /* and address */
  20. if (server = connect(sd, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR){
  21. cout << "error conectar: " << WSAGetLastError();/* connect */
  22. }
  23. cout << "conectado";
  24. SSL *ssl;
  25. ssl = SSL_new(ctx);    /* create new SSL connection state */
  26. SSL_set_fd(ssl, server);   /* attach the socket descriptor */
  27. SSL_connect(ssl);          /* perform the connection */
  28. SSL_write(ssl, post, strlen(post));
  29. char rec[1000];
  30. SSL_read(ssl, rec, 0);
  31. cout << rec;
  32. /*...*/
  33. SSL_free(ssl);              /* release SSL state */
64  Programación / Programación General / ¿como conseguir librería estática de curl? en: 8 Noviembre 2015, 17:22 pm
Pues eso, he tratado de compilarlo para VS13 pero necesito otras 3 librerías para compilarlo, traté de compilarlas y tuve errores, y pase de hacerlo era mucho lío por una jodida librería y es que no sabía hacerlo.

¿Como puedo conseguir una librería estática de curl descargandola?, y sino se puede ¿que pasos he de seguir para compilarla con sus dependencias?.

Un saludo.
65  Programación / Programación C/C++ / Pasar de char* a string pérdida de datos en: 6 Noviembre 2015, 11:01 am
Si char* tiene un caracter nulo en mitad de la secuencia al construir la string se corta allí:

Código
  1. char *e = "aisjiajisfj\0buenas";
  2. cout << string(e);

Y pierdo el poder convertir el char* en string, ¿no hay alguna solución para poderlo hacer?.

Saludos.

Bueno, quizás si nos aseguramos de lo que vamos a leer no contiene caracteres nulos hasta el final.
66  Seguridad Informática / Seguridad / Dudilla SSLStrip en: 5 Noviembre 2015, 18:28 pm
¿SSLStrip utiliza en algún momento SSL?

¿Como funciona?, el servidor recibe peticiones https en ese caso sslstrip lanza una peticion https a la página en cuestion y devuelve la página en texto plano a la victima, O ¿recibe las peticiones https de las victimas y las manda como http al servidor y el servidor las devuelve en texto plano?.

Cual de las 2 cosas utiliza, para no https es simplemente webscrapear y reenviar mensajes, pero cuando la victima se conecta a https o tiene un link que va a https, el link lo cambiamos a http, si se conecta a http y es redirigido a https la peticion entrará en nuestro server sslstrip en ese caso hacemos conexión con el atacante, y devolvemos datos cifrados a la victima, ¿así funciona?.

Otra cosa, nosotros podríamos descifrar una página con https con su clave pública o certificado que no dan no?, como hacen los navegadores cuando navegamos por https, los datos nos llegan cifrados pero los vemos ya en texto plano, para ello que utilizaron para desencriptarlo ¿algo predefinido en el navegador que programando no tendríamos acceso o simplemente con la clave pública y el certificado que nos dan bastaría para descifrar los datos?. Porque según leí, la clave pública no puede descifrar datos, entonces ¿como desciframos los datos en las conexiones https?.

Edito: Bueno he estado analizando código y según parece cuando lanzan peticion https se conecta con https y devuelve la respuesta en http, y remueve los links https por http.

Lo que me hace pensar que el HSTS sea algo que tienen los navegadores que dice "estos dominios siempre https y sino alerta", entonces sslstrip2 para bypassear es lo que hace ¿es?..

¿Falsificar dominios?, en plan si preguntamos por facebook.com nos redirige a webfacebook.com por ejemplo y entonces bypasea la lista de dominios con HSTS en el navegador y no sale alerta, ¿es eso lo que hace?, ¿o no es necesario cambiar el dominio?.

Saludos.
67  Seguridad Informática / Hacking / Inyección de DLL con permisos administrador en: 4 Noviembre 2015, 20:20 pm
Buenas, tengo una duda y es la siguiente:

Si creo una dll que muestra un mensaje, y la inyecto a un proceso ¿necesito solo el pid del proceso no?, en plan creo una dll que dice "hola mundo", la inyecto en svchost.exe ¿y listo?, ¿o tengo que hacer ingeniería inversa de svchost.exe?.

Si svchost.exe corre como system, el programa que ejecuto en mi dll correría como system?, puedo conseguir que lo haga a través del token de svchost.exe? ya que se supone lo ejecuta ese proceso si la inyecto a el.

La idea es saber si con este proceso podré tener permisos de administrador (o system que son como los de administrador pero con más opciones aún  si no me equivoco) siempre para mi dll, pues mi dll necesita permisos de administrador siempre.

¿Con inyección de dll puedo conseguir permisos de administrador sin que salga el uac para siempre?, es decir windows se reiniciaría y el programa de mi dll correría en system sin mensajes ni nada, ¿no?.

Un saludo.
68  Programación / Programación C/C++ / Mostrar mensaje en ventana C++ en: 2 Noviembre 2015, 11:29 am
Código
  1. void enseñar_mensaje(string ventana, string mensaje, u_int icono)
  2. {
  3. wchar_t *caca = L"iaifhidhifhdi";
  4. MessageBox(NULL, caca,(LPCWSTR)ventana.c_str(), icono | MB_OK);
  5. }

El problema es que no hay manera de pasar de string wchar_t* o a wstring, ¿alguna idea?.

Saludos y gracias.

Bueno parece que hay muchos codes por stackoverflow cuando lo solucione pasaré la respuesta, de todas formas estaría bien meterle una scrollbar, un saludo.

Edito: solucionado, que aproveche:

Código
  1. void enseñar_mensaje(string ventana, string mensaje, u_int icono)
  2. {
  3. int len;
  4. int slength = (int)ventana.length() + 1;
  5. len = MultiByteToWideChar(CP_ACP, 0, ventana.c_str(), slength, 0, 0);
  6. wstring ven(len, L'\0');
  7. MultiByteToWideChar(CP_ACP, 0, ventana.c_str(), slength, &ven[0], len);
  8. slength = (int)mensaje.length() + 1;
  9. len = MultiByteToWideChar(CP_ACP, 0, mensaje.c_str(), slength, 0, 0);
  10. wstring men(len, L'\0');
  11. MultiByteToWideChar(CP_ACP, 0, mensaje.c_str(), slength, &men[0], len);
  12. MessageBox(NULL, men.c_str(), ven.c_str(), icono | MB_OK);
  13. }
69  Programación / Programación C/C++ / Ofstream escribe bytes corruptos o Ifstream los lee en: 31 Octubre 2015, 11:39 am
Hola a todos, ya me aproximo al problema con el cifrado/descifrado AES.

El cifrado y descifrado está bien, el problema es lo que escribe en el archivo, pues aparecen bytes que no deberían estar.

Aquí muestro el contenido 2 cadenas que voy a escribir en el archivo una detrás de la otra, las 2 contienen lo mismo por ello son iguales. Son dos bloques de 48 bytes.
En total el archivo tiene 96 bytes perfecto.

Bytes primer bloque a escribir en el archivo en modo binario / append:
Citar
94 249 51 202 90 217 244 156 231 225 66 150 255 32 117 186 176 251 152 112 108 145 21 73 191 125 236 214 142 28 241 168 189 174 119 131 212 52 158 203 78 199 245 64 206 37 113 36

Bytes segundo bloque a escribir en el archivo en modo binario / append:
Citar
94 249 51 202 90 217 244 156 231 225 66 150 255 32 117 186 176 251 152 112 108 145 21 73 191 125 236 214 142 28 241 168 189 174 119 131 212 52 158 203 78 199 245 64 206 37 113 36

Ahora bien, tras escribir una, y escribir la otra encima de la una, aparecen unos bytes de por medio que no deberían de salir:

Bytes de los dos bloques que aparecen al leer el archivo de nuevo en modo in / binary:
Citar
94 249 51 202 90 217 244 156 231 225 66 150 255 32 117 186 176 251 152 112 108 145 21 73 191 125 236 214 142 28 241 168 189 174 119 131 212 52 158 203 78 199 245 64 206 37 113 36 205 253 253 253 253 173 0 0 54 208 248 159 44 173 0 0 128 183 93 0 144 92 93 0 8 236 93 0 192 0 93 0 32 208 249 136 35 173 0 8 184 182 93 0 64 98 93 0

Luego al descifrar, salen cosas corruptas normal, además descifra todo correctamente menos los bytes corruptos, pero ¿porque salen?, os dejo el código donde hago la prueba:

Código
  1. void almacen::escribir_cifrado(bytes _datos)
  2. {
  3. ofstream archivo;
  4. archivo.open(directorio, ofstream::app | ofstream::binary);
  5. _datos = cifrador.encriptar_AES(get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
  6. for (int i = 0; i < get<TAMAÑO>(_datos); i++)
  7. {
  8. cout << (int)get<CONTENIDO>(_datos)[i] << " ";
  9. }
  10. cout << endl << endl;
  11. archivo.write((char*)get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
  12. archivo.close();
  13.  
  14. ifstream archivo2;
  15. archivo2.open(directorio, ifstream::in | ifstream::binary);
  16. archivo2.seekg(0, ifstream::end);
  17. int man = archivo2.tellg();
  18. archivo2.seekg(0, ifstream::beg);
  19. cout << man;
  20. char *contenido = new char[man]();
  21. archivo2.read(contenido, man);
  22.  
  23. archivo2.close();
  24. for (int i = 0; i < man; i++)
  25. {
  26. cout << (int)get<CONTENIDO>(_datos)[i] << " ";
  27. }
  28. system("pause");
  29. }

Las cadenas encriptadas están bien, pero al obtenerlas ya bien sea causa de porque fueron escritas en el fichero de forma errónea, o porque al leer se corrompieron lo que recibo no concuerda con lo que dije que escribiera.

¿Qué podrá pasar?, un saludo.

Edito: Descartamos que escribe mal en el archivo porque esto es o que tine al abrir con el bloc de notas:

Citar
^ù3ÊZÙôœçáB–ÿ uº°û˜pl‘I¿}ìÖŽñ¨½®wƒÔ4žËNÇõ@Î%q$^ù3ÊZÙôœçáB–ÿ uº°û˜pl‘I¿}ìÖŽñ¨½®wƒÔ4žËNÇõ@Î%q$

Como se puede observar, los 2 bloques son iguales, y empiezan por "^ù3ÊZ", luego parece que escribe bien, el problema está en la lectura y la carga en un buffer.
70  Programación / Programación C/C++ / basura al final de cadena en: 30 Octubre 2015, 18:41 pm
Código
  1. void escribe()
  2. {
  3. FILE *a = NULL;
  4. a = fopen("C:\\Users\\Usuario\\Desktop\\PRUEBA.txt", "ab");
  5. u_char *o = (u_char*)"BUENOS DIASSS";
  6. fwrite(o, sizeof(u_char), strlen("BUENOS DIASSS"), a);
  7. fclose(a);
  8. a = fopen("C:\\Users\\Usuario\\Desktop\\PRUEBA.txt", "rb");
  9. fseek(a, 0, SEEK_END);
  10. int c = ftell(a);
  11. cout << c;
  12. fseek(a, 0, SEEK_SET);
  13. u_char *d = new u_char[c]();
  14. fread(d, sizeof(u_char), c, a);
  15. cout << (char*)d;
  16. fclose(a);
  17. }

Llamo a esta funcion 6 veces, salida:

Citar
BUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSS²²²²-¿B-óÙc
Porque hay basura?

Y cada vez va saliendo más.
Páginas: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16 17 18 19
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines