Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the wp-plugin-bluehost domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home1/spotsail/public_html/martra/wp-includes/functions.php on line 6114

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893

Warning: Cannot modify header information - headers already sent by (output started at /home1/spotsail/public_html/martra/wp-includes/functions.php:6114) in /home1/spotsail/public_html/martra/wp-includes/rest-api/class-wp-rest-server.php on line 1893
{"id":236,"date":"2016-11-08T21:01:35","date_gmt":"2016-11-08T21:01:35","guid":{"rendered":"http:\/\/martra.uadla.com\/?p=236"},"modified":"2017-05-06T13:13:18","modified_gmt":"2017-05-06T13:13:18","slug":"buffer-overflow-para-negados-i-parte","status":"publish","type":"post","link":"https:\/\/martra.uadla.com\/buffer-overflow-para-negados-i-parte\/","title":{"rendered":"Buffer Overflow para negados. I-Parte."},"content":{"rendered":"

Cl\u00e1sico de los cl\u00e1sicos donde los haya, y todav\u00eda totalmente en vigencia.<\/p>\n

Mediante esta vulnerabilidad alguien puede llegar a ejecutar el c\u00f3digo que quiera insertando en ciertas partes de la memoria. Vaaaleeee, esto es complicado! \u00bfQui\u00e9n narices va a hacer esto? \u00bfMr. Robot? Pues no. Dejando la teor\u00eda aparte vamos a ver un ejemplo que nos va a poner los pelos de punta, porque vamos empezar a pensar que no tenemos ni idea de cu\u00e1ntos de estos agujeros podemos tener.<\/p>\n

[code language=”c”]
\n#include <stdio.h>
\n#include <strings.h><\/p>\n

int main(int argc, char *argv[]){
\nint puede_pasar = 0;
\nchar password[12];
\nchar passwordGuardado[12] = "SIoNOoES";
\ngets (password);
\nif (strncmp(password, passwordGuardado, 6) == 0){
\npuede_pasar = 1;
\n}
\nif (puede_pasar == 0){
\nprintf("Ehhhh!! \u00bfque haces tu aqui?");
\n} else {
\nprintf("Yeah!!! Hola megasuperUsuario!");
\n}
\n[\/code]<\/p>\n

Estudiemos un poco el c\u00f3digo muy simple, escrito en C. Se trata de una funci\u00f3n, t\u00edpica que recibe par\u00e1metros, compara el password recibido con el password que tiene guardado en el codigo, si coinciden saluda al usuario.<\/p>\n

Nos puede parece que el mayor error es el guardar el password a hierro en el codigo, y la verdad es que no es muy elegante, pero no es el mayor problema. El problema m\u00e1s grande y el agujero que se usa para ejecutar c\u00f3digo malicioso en el sistema es que NO COMPROBAMOS LA LONGITUD DE LA VARIABLE INTRODUCIDA.<\/p>\n

Ahora vamos a ver porque: <\/strong><\/p>\n

Para empezar, diremos que el valor de todas las variables que aparecen se guardan en una zona de la memoria llamada Stack.<\/p>\n

Lo primero que hacemos es guardar el valor “SIoNOoES”<\/em> en la variable passwordGuardado<\/em>, es decir, en el Stack.<\/p>\n

La funci\u00f3n gets<\/em>, lee una cadena que entra el usuario y guarda el valor en la variable password<\/em>, tamb\u00eden en el Stack.<\/p>\n

la funci\u00f3n strncmp<\/em> compara dos strings, en un principio el password que tenemos guardado con el password que ha entrado el usuario, pero realmente compara el contenido de las dos zonas de memoria del stack que ocupan las variables password<\/em> y passwordGuardado<\/em>. Si el contenido es el mismo nos devolver\u00e1 un 0.<\/p>\n

Si las variables son iguales, asignamos un 1 a la variables que nos indica que podemos pasar y saludamos el usuario. Como no pod\u00eda ser de otra manera la variable puede_pasar<\/em>, tambi\u00e9n est\u00e1 en el stack.<\/p>\n

\u00bfQue problema hay?<\/strong><\/p>\n

Bueno, dejando de lado los obvios, como guardar el password (que no se hace nunca) y encima en el codigo, (que eso si que no se hace nunca), hay otro problema un poco mas escondido (aunque tampoco demasiado) un problema de Overflow:<\/p>\n

Casi cualquier password que demos con una longitud mayor de 12 ser\u00e1 v\u00e1lido. El programa intenta guardar el valor de lo introducido en el usuario en la variable password<\/em>, pero en esta variable no cabe todo lo que ponemos, as\u00ed que ni corto ni perezoso contin\u00faa ocupando memoria que no le pertenece, y en este caso la memoria de la variable puede_pasar<\/em>. Es decir, la variable puede_pasar<\/em> tiene asignada una direcci\u00f3n de memoria en el stack, a la que le hemos puesto un 0 al inicio del programa. Pero este valor es sustituido por los caracteres que le sobran a password<\/em>. Como el valor de puede_pasar<\/em> ya no ser\u00e1 un 0, el programa le da la bienvenida al megaSuperUsuario.<\/p>\n

\"representacion <\/picture>
Los Overflow puede ser muy pero que muy elegantes.<\/figcaption><\/figure>\n

Resumiendo. <\/strong><\/p>\n

Los ataques de este tipo, que son los m\u00e1s simples de overflow, solo pueden producirse en alg\u00fan programa que permita ser llamado, es decir nos ofrece un API, y que encima no este muy b\u00eden codificado, ya que comprobando la longitud de todas las entradas este problema no tendr\u00eda que darse. Pero nadie nos dice que sea un descuido.<\/p>\n

Muchas de las puertas traseras tienen una forma parecida a este error, el programador las puede introducir sin levantar demasiadas sospechas y seguramente pasen desapercibidas. No hace falta guardar passwords secretos, ni ocultar funciones que nadie conoce. Tan solo codificas mal cualquier funci\u00f3n que pueda ser llamada externamente y ya tienes una bonita puerta trasera.<\/p>\n

En el ejemplo hemos visto que se puede modificar el contenido de una variable, pero eso no es todo, no es ni tan solo lo m\u00e1s peligroso. En el stack se almacena tambien la direcci\u00f3n de memoria que contiene el codigo a ejecutar al volver de la funci\u00f3n llamada…. y si! Lo pueden cambiar, y eso ya es m\u00e1s peligroso.<\/p>\n

Ahora solo tenemos que pensar en la cantidad de c\u00f3digo de terceros que tenemos en nuestros sistemas, cualquiera de ellos puede haber sido v\u00edctima de un programador que ha dejado una puerta trasera que mediante un Buffer Overflow puede ejecutar cualquier c\u00f3digo.<\/p>\n

\u00bfComo? Pues lo vemos en otro post, que es tarde y este ya es bastante largo.<\/p>\n

\r\n
\r\n\r\n
\r\n \r\n \r\n Jugando con los SQL Injection. <\/a>\r\n\r\n
\r\n \r\n\r\n \"\" <\/picture>\r\n\r\n <\/a>\r\n <\/div>\r\n

\r\n Lo primero, por si encontr\u00e1is este post sin haber seguido todo el tutorial de Hacking B\u00e1sico, es que las pruebas Read more<\/a> <\/p>\r\n <\/div>\r\n

\r\n \r\n \r\n Como hacer un Man In The Middle con SSLStrip (As\u00ed se roban las contrase\u00f1as) <\/a>\r\n\r\n
\r\n \r\n\r\n \"Man <\/picture>\r\n\r\n <\/a>\r\n <\/div>\r\n

\r\n Es uno de los ataques m\u00e1s m\u00edticos, el ponernos entre un cliente y un servidor sin que ninguno de los Read more<\/a> <\/p>\r\n <\/div>\r\n

\r\n \r\n \r\n As\u00ed toman el control de nuestros servidores. <\/a>\r\n\r\n
\r\n \r\n\r\n \"Un <\/picture>\r\n\r\n <\/a>\r\n <\/div>\r\n

\r\n \u00bfRecord\u00e1is unos abogados de Panam\u00e1 que perdieron unos papeles? \u00bfRecord\u00e1is que ten\u00edan wordpress? \u00bfRecord\u00e1is que no ten\u00edan wordpress actualizado? Supongo Read more<\/a> <\/p>\r\n <\/div>\r\n

\r\n \r\n \r\n Buffer Overflow Para Negados. II-Parte. Ejecutando c\u00f3digo del chungo. <\/a>\r\n\r\n
\r\n \r\n\r\n \"Meme <\/picture>\r\n\r\n <\/a>\r\n <\/div>\r\n

\r\n En esta segunda parte vamos a ver como se puede usar un stack overflow para ejecutar c\u00f3digo malicioso. No quiere Read more<\/a> <\/p>\r\n <\/div>\r\n \r\n <\/div>\r\n\r\n