Archivo por meses: Enero 2011

MiniShell en C

Hola, este es un programa que me dejaron en una clase que estoy tomando que se llama Sistemas Operativos, se trata de crear procesos hijos (con fork) para emular una pequeña shell de sistema.

El programa recibe los comandos y parámetros como argumento, por ejemplo:

./shell cat /etc/passwd | grep home | cut -d: -f1,1,5

Para obtener los logins y nombres de todos los usuarios del sistema donde su directorio personal este en el home.
[code]]czoxMDg1OlwiDQo8cHJlIGNsYXNzPVwiYnJ1c2g6Y1wiPg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKntbJiomXX0qKioqKioqDQogKiBJbnRlcnByZXRlIGRlIGNvbWFuZG9zIGVuIEMgYnkgQWxldnNrCSAqDQogKioqKioqKioqKioqKioqKioqKioqe1smKiZdfSoqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpbmNsdWRlPHN5cy90eXBlcy5oPiAgIC8vIGZvcmsNCiNpbmNsdWRlPHV7WyYqJl19bmlzdGQuaD4gICAgICAvLyBnZXRwaWQsIGdldHBwaWQNCiNpbmNsdWRlPHN0ZGlvLmg+ICAgICAgIC8vIHByaW50Zg0KI2luY2x1ZHtbJiomXX1lPHN5cy93YWl0Lmg+CS8vIHdhaXQNCiNpbmNsdWRlPHN0cmluZy5oPgkvLyBzdHJjYXQNCg0KaW50IG1haW4oaW50IGFyZ2MsIGNoe1smKiZdfWFyICphcmd2W10pDQp7DQogICAgCWludCBuLG0sIGkgPSAxOw0KCWNoYXIgY29tYW5kb1syNTZdOw0KCWNoYXIgKnB1bnRlcm87DQp7WyYqJl19DQogICAgCWlmKGFyZ2MgPCAyKQ0KICAgIAl7DQogICAgICAgIAlwcmludGYoXCJEZWJlcyB0ZWNsZWFyIGFsbWVub3MgMSBjb21hbmR7WyYqJl19bywgZWouIGxzXFxuXCIpOw0KICAgICAgICAJZXhpdCgxKTsNCiAgICAJfQ0KDQogICAJc3RyY3B5KGNvbWFuZG8sYXJndltpXSk7DQoge1smKiZdfSAgDQogICAJZG8NCiAgIAl7DQoJCWlmKGFyZ3ZbaV0gJiYgYXJndltpKzFdKQ0KCQl7DQoJCQkvL3N0cmNhdChhcmd2WzFdLFwiIFwiKXtbJiomXX07DQoJCQkvL3N0cmNhdChhcmd2WzFdLGFyZ3ZbaSsxXSk7DQoJCQlzdHJjYXQoY29tYW5kbyxcIiBcIik7DQoJCQlwdW50ZXJvID0gc3R7WyYqJl19cmNhdChjb21hbmRvLGFyZ3ZbaSsxXSk7CQkNCgkJCWkrKzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXB1bnRlcm8gPSBjb21hbmRvO3tbJiomXX0NCgkJCWJyZWFrOw0KCQl9CQ0KICAgCX13aGlsZSgxKTsNCg0KDQoJaWYobiA9ICFmb3JrKCkpDQoJew0KCQ0KCQkvL2V4ZWNscChcIntbJiomXX1iYXNoXCIsXCJiYXNoXCIsXCItY1wiLGFyZ3ZbMV0sMCk7DQoJCWV4ZWNscChcImJhc2hcIixcImJhc2hcIixcIi1jXCIscHVudGVybywwKTsNCgkJcHJ7WyYqJl19aW50ZihcIlxcblwiKTsNCgkJZXhpdCgxKTsNCgl9DQoJd2FpdCgmbik7IC8vRXNwZXJhciBhIHF1ZSBlbCBwcm9jZXNvIGhpam8gdGVybXtbJiomXX1pbmUNCglyZXR1cm4gLTE7DQp9DQo8L3ByZT4NClwiO3tbJiomXX0=[[/code]

Descargar SHell

http://www.alevsk.com/proyectos/programacion/shell.c

salu2

Irrumpen en la página de Facebook de Mark Zuckerberg


Un pirata informático irrumpió en la página de seguidores del fundador de Facebook Mark Zuckerberg, y no desperdició la oportunidad de proponer al multimillonario de 26 años una forma manejar su negocio de una forma más caritativa.

“Que comience el hackeo: Si Facebook necesita dinero, en vez de ir a los bancos, ¿por qué no deja que sus usuarios inviertan en él de una forma más social?, sugirió el intruso. “¿Por qué no transformar Facebook en una ‘empresa social’ como la descrita por el ganador del Nobel Muhammad Yunus?”, agregó.

El pirata incluyó un enlace a un artículo de Wikipedia en inglés de una edición específica que explica el concepto de ‘empresa social’. Por último, el pirata preguntó a los lectores “¿Qué opinan?”.

Más de 1.800 personas tuvieron tiempo de opinar que “les gustaba” el comentario del hacker antes de que los verdaderos administradores de la página lo eliminaran.

No se sabe con certeza qué hizo el atacante para penetrar en la cuenta de Zuckerberg. Algunos creen que el pirata había conseguido sus datos de acceso mediante ingeniería social o un programa malicioso, pero la explicación de Facebook es mucho más simple: “Un error de programación hizo que personas desautorizadas puedan publicar mensajes de estado en unas cuantas páginas”, dijo la empresa.

“Sin importar cómo haya pasado, Facebook quedó en ridículo justo cuando intenta convencer a sus usuarios de que toma en serio su seguridad y privacidad”, opinó el experto en seguridad Graham Cluley.
Fuentes:
Facebook blames bug for Zuckerberg ‘hacking’ BBC News

Zuckerberg’s Facebook page hacked LA Times

Facebook Founder’s Fan Page Hacked
InformationWeek

C++ TDA memoria dinamica y templates


Hola este no es un tutorial, solo es un programa en C++ que estoy haciendo para una clase donde tenemos que crear un tipo de dato abstracto Matriz, sobrecargar algunos operadores y métodos, usar algo de manejo de memoria dinámica y templates.

Dejo el código por si a alguien le sirve 🙂 …

Menu del programa

Mostrar las matrices

Sumar las Matrices

La transpuesta de la matriz

Implementacion

#include
#include "Matriz.h"
//#include  //descomentar esta linea en windows
using namespace std;

int main(){

    int opc = 0;
    Matriz a(1),b(1),c,d;

    a.llenaMatriz();
    b.llenaMatriz(1);
    do
    {
        cout<<"[0] Sumar matrices"<<<"[1] Multiplicar matrices"<<<"[2] Mostrar matrices"<<<"[3] Transpuesta (los resultados de suma/multiplicacion)"<<<"[4] Las diagonales (los resultados de suma/multiplicacion)"<<<"[5] Numero menor de la matriz (los resultados de suma/multiplicacion)"<<<"[6] Salir del programa"<<<<"Elije una opcion: "; cin>>opc;

        switch(opc)
        {
            case 0:
                c=a+b;
                cout<<<<"Matriz A"<<<<"Matriz B"<<<<<<"El numero menor de la Matriz: "<<<<<"Es: "<<<<<<"Gracias por usar el programa";
                break;
            default:
                cout<<"Opcion invalida, elije un numero del menu";
        }
    }while(opc != 6);

    //getch(); //descomentar esta linea en windows
    return 0;
}

Diseño

#include <iostream>
#include <cstdlib>
#include <stdlib.h>
#include <time.h>
using namespace std;
        const int ren = 5;
        const int col = 5;

template <class T> class Matriz
{
    public:
        //constructores
        Matriz();
        Matriz(T);
        Matriz(Matriz<T> &);
        ~Matriz();

        //metodos
        void operator = (const Matriz<T> &);
        T getDato(int, int);
        void setDato(int, int, T);
        void transpuesta (Matriz<T> &);
        void muestradiagonales();
        void llenaMatriz();
        void llenaMatriz(int);
        T menor();

    private:
        //puntero a punteros
        T **datos;
        //T datos[ren][col];
};

template<class T>Matriz<T>::~Matriz()
{
    //liberar localidades de memoria
    for (int i=0; i<ren; i++)
    {
        free (datos[i]);
    }
    //free (datos);
    delete datos;
    datos = 0;
}
template<class T>Matriz<T>::Matriz()
{
    //datos = new T[ren*col];

    datos = (T **)malloc (sizeof(int *)*col); /*Reservas tantos punteros como filas*/
for (int i=0; i<col; i++) /* En cada fila ... */
datos[i] = (T *)malloc (sizeof(int)*ren); /* ... reservas tantos int como columnas*/

    float n = 0;
    for(int i = 0; i<ren; i++)
    {
        for(int j = 0; j<col; j++)
        {
            setDato(i,j,n);
        }
    }
}

template<class T>Matriz<T>::Matriz(T valorinicial)
{
    //datos = new T[ren*col];

        datos = (T **)malloc (sizeof(int *)*col); /*Reservas tantos punteros como filas*/
for (int i=0; i<col; i++) /* En cada fila ... */
datos[i] = (T *)malloc (sizeof(int)*ren); /* ... reservas tantos int como columnas*/

    float n = 0;
    for(int i = 0; i<ren; i++)
    {
        for(int j = 0; j<col; j++)
        {
            setDato(i,j,valorinicial);
        }
    }
}
//Matriz con numeros aleatorios si se le manda un parametro
template<class T> void Matriz<T>::llenaMatriz()
{
    int n = 0;
    srand(time(NULL));
    for(int i = 0; i<ren; i++)
    {
        for(int j = 0; j<col; j++)
        {
            if((n = rand() % 100) % 2 == 0) n = n*-1;
            this->setDato(i,j,n);
        }
    }
}
template<class T> void Matriz<T>::llenaMatriz(int sal)
{
    int n = 0;
    srand(time(NULL));
    for(int i = 0; i<ren; i++)
    {
        for(int j = 0; j<col; j++)
        {
            sal = rand() % 5;
            if((n = rand() % 100) % 2 == 0) n = n*-1;

            if(n+sal > 100) {setDato(i,j,100);}else{

            setDato(i,j,n+sal);}
        }
    }
}
template<class T>Matriz<T>::Matriz( Matriz<T> &M)
{
    //datos = new T[ren*col];

        datos = (T **)malloc (sizeof(int *)*col); /*Reservas tantos punteros como filas*/
for (int i=0; i<col; i++) /* En cada fila ... */
datos[i] = (T *)malloc (sizeof(int)*ren); /* ... reservas tantos int como columnas*/
    for(int i = 0; i<ren; i++)
    {
        for(int j = 0; j<col; j++)
        {
            setDato(i,j,M.getDato(i,j));
        }
    }
}
template<class T>T Matriz<T>::getDato(int c, int r)
{
    //c = columna
    //r = renglon

    return datos[c][r];
    //return datos[col*c+r];
}

template <class T>T Matriz<T>::menor()
{
    int menor = this->getDato(0,0);
    for(int i = 0; i<ren; i++)
    {
        for(int j = 0; j<col; j++)
        {
            if(this->getDato(i,j) < menor) menor = this->getDato(i,j);
        }
    }

    return menor;
}

template<class T>void Matriz<T>::muestradiagonales()
{
    int renglon = ren-1;
    cout<<endl;
    for(int i = 0; i<ren; i++)
    {
            cout<<"["<<this->getDato(i,i)<<"]";
    }
    cout<<endl;
    for(int i = 0; i<ren;i++)
    {
        cout<<"["<<this->getDato(renglon,i)<<"]";
        renglon = renglon - 1;
    }
    cout<<endl;
}

template <class T> void Matriz<T>::setDato(int c, int r, T dato)
{
    datos[c][r] = dato;
    //datos[col*r+c] = dato;
    //datos[col*c+r] = dato;
}
template <class T> void Matriz<T>::transpuesta (Matriz<T> & M)
{
    float tmp = 0;
    if(ren != col)
    {
        cout<<"Solo se aceptan matrices cuadradas";
    }
    else
    {
        for(int i = 0; i<col; i++)
        {
            for(int j = 0; j<ren; j++)
            {
                tmp = M.getDato(i,j);
                this->setDato(i,j,M.getDato(j,i));
                this->setDato(j,i,tmp);
            }
        }
    }

}
template <class T> void Matriz<T>::operator = (const Matriz<T> &igualar)
{
    int i = 0, j = 0;
     for(i = 0; i<col; i++)
     {
         for(j = 0; j<ren; j++)
         {
             //this->setDato(i,j,igualar.datos[i*j]);
             //this->setDato(i,j,igualar.datos[i*j]);

             this->setDato(i,j,igualar.datos[i][j]);
             this->setDato(i,j,igualar.datos[i][j]);
         }
     }
}
template <class T> Matriz<T> operator + (Matriz<T> &uno, Matriz<T> &dos)
{

     Matriz<T> temp;
     for(int i = 0; i<col; i++)
     {
         for(int j = 0; j<ren; j++)
         {
             temp.setDato(i,j,(uno.getDato(i,j)+dos.getDato(i,j)));
         }
     }
     return temp;
}

template <class T> Matriz<T> operator * (Matriz<T> &uno, Matriz<T> &dos)
{

    int i = 0, j = 0, k = 0;
     Matriz<T> objTemp;
     for(i = 0; i<col; i++)
     {
         for(j = 0; j<ren; j++)
         {

             for(k = 0; k <col; k++)
             {
                 //temporal.setDato(j,i,(T.getDato(j,i)+uno.getDato(j,k)*dos.getDato(k,i)));
                  objTemp.setDato(j,i,(objTemp.getDato(j,i)+uno.getDato(j,k)*dos.getDato(k,i)));
             }
         }
     }
     return objTemp;
}
//Sobrecargando el operador de asignacion para que maneje nuestro nuevo objeto abstracto Matriz
template <class T> std::ostream& operator<< (std::ostream &salida, Matriz<T> &objeto)
{
     for(int i = 0; i<col; i++)
     {
         for(int j = 0; j<ren; j++)
         {
             cout<<"\t"<<objeto.getDato(i,j);
         }
         cout<<endl;
     }

    //salida<<a;
    return salida;
}

Descargar los archivos

practica3.cpp
Matriz.h

salu2

PD: El banner del post no tiene nada que ver xD, lo que pasa que en ese momento estaba jugando Super Meat Boy :p

Teoria de un source code disclousure

En un post anterior vimos la teoría que hay detras de un Local File Inclusion, que es una técnica de intrusión que ya casi no se usa hoy en dia, un lector me recomendó hacer un post donde intervenga la parte del upload de la shell (como subir una php shell), buscando entre mis curiosidad encontré un video que hice hace mucho (pero mucho jeje) tiempo y que creo que es un buen ejemplo.

Esta vez he escrito un post sobre seguridad, particularmente seguridad web sobre http, donde se explota una vulnerabilidad muy conocida llamada SCD (source code disclosure), antes de comenzar aclaro que este tipo de técnicas no requieren grandes conocimientos sobre seguridad informática, tal vez conocimientos básicos de php y de la estructura de directorios, pero no es algo que se tenga que considerar de extrema dificultad, es decir cualquiera podría vulnerar usando este bug de programación.

El SCD es una vulnerabilidad que nos permite ver el código fuente de archivos del servidor por un manejo incorrecto del comando $GET[] y readfile(), solo basta con ver la estructura de directorios y comenzar a escalar los niveles para leer otros archivos.

¿Que cosas importantes podemos obtener?

Los ejemplos mas comunes son leer el archivo /etc/passwd que utiliza Linux para la gestión de usuarios (que a mi en lo particular nunca me ha servido para nada), sin embargo yo prefería (tiempo pasado jeje) apuntar a siempre a los archivos de conexion de las bases de datos por ejemplo wp-config.php (wordpress), configuration.php (joomla), config.inc.php de phpmyadmin, por dar solo algunos ejemplos.

Para aprender mas sobre esta vulnerabilidad pueden leer este paper donde abordan a fondo el tema http://www.secureyes.net/downloads/Source_Code_Disclosure_over_HTTP.pdf

ya comprendida la naturaleza de la vulnerabilidad pueden checar este codigo que es vulnerable a SCD

$filename = $_GET['file'];

if(ini_get('zlib.output_compression'))
  ini_set('zlib.output_compression', 'Off');

$file_extension = strtolower(substr(strrchr($filename,"."),1));

if( $filename == "" )
{
  echo "ERROR: download file NOT SPECIFIED.";
  exit;
} elseif ( ! file_exists( $filename ) )
{
  echo "ERROR: File not found.";
  exit;
};
switch( $file_extension )
{
  case "pdf": $ctype="application/pdf"; break;
  case "exe": $ctype="application/octet-stream"; break;
  case "zip": $ctype="application/zip"; break;
  case "doc": $ctype="application/msword"; break;
  case "xls": $ctype="application/vnd.ms-excel"; break;
  case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  case "gif": $ctype="image/gif"; break;
  case "png": $ctype="image/png"; break;
  case "jpeg":
  case "jpg": $ctype="image/jpg"; break;
  default: $ctype="application/force-download";
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");

header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
exit();

Como podemos ver el problema es que los parámetros que le pasan por GET son incluidos sin realizarle una limpieza antes (por decir asi, quitarlo las posibles /.. etc), para corregir ese problema es bastante sencillo, se me ocurre utilizar str_replace para eliminar las / o algo asi.

Bueno este es el video que mencionaba al inicio para que vean la practica.

Tutorial de formulario PHP-JQUERY-AJAX-XHTML-CSS

Hola, estoy creando un tutorial explicativo para que los mas nuevos aprendan a crear algo que hoy en dia es muy utilizado en las aplicaciones online, un formulario de contacto, después veremos como crear cosas mas complejas partiendo de esto.

Es el mismo principio para crear formularios que inserten información en bases de datos o que hagan determinada acción, etc.
Lo que intento realizar aquí es combinar distintos lenguajes de los que he venido publicando tutoriales, entre ellos, php, y javascript, he dividido el tutorial en 6 partes para que sea mas facil y comprensible su lectura.

El orden de los tutoriales es el siguiente (por si alguien anda medio despistado):

Hola, debido a que el servidor donde estaba almacenado el código del tutorial ya no esta X.X (RIP megaupload) he subido el proyecto a otro servicio para compartir archivos, tienen 2 opciones:

Dropbox
Descargar formulario bonito hecho con php-jquery-ajax-xhtml-css (Descargan tutorial.zip)

Skydrive
Descargar formulario bonito hecho con php-jquery-ajax-xhtml-css (pueden ver la estructura del proyecto y ahi mismo descargar tutorial.zip)

salu2