amon.so (hijacking libc6 for fun and profit)

Cos'è Amon

amon.so è una libreria che si integra con l'interprete php ed intercetta e manipola le chiamate di sistema fornite dalla libc6. E' utile per impedire che sfruttando errori logici presenti nelle applicazioni web-based (script php,perl, ecc.), un utente remoto possa eseguire codice arbitrario sul server.

Installazione

Potrete installare amon in due modi, compilando il sorgente oppure scaricando direttamente la libreria precompilata per la vostra distribuzione ed architettura.
Il codice sorgente si trova qui:

http://www.lucaercoli.it/amon/amon.c

Per compilarlo bastera' eseguire il comando "gcc -fPIC -shared -ldl -o amon.so amon.c"

Le librerie precompilate sono invece queste (al momento e' disponibile solamente il pacchetto per Debian Lenny a 64bit):

http://www.lucaercoli.it/amon/DebianLennyx86_64/amon.so

La libreria dovra' essere copiata all'interno della directory /lib del sistema

Per abilitare il caricamento di amon.so da parte di apache ci sono diversi metodi, da utilizzare in base al tipo di configurazione del php attiva sul server. Se avete configurato il web server per eseguire il php sia come modulo di apache che in modalita' cgi, amon.so potra' essere attivato solamente per i siti per cui l'interprete PHP e' abilitato come cgi, non e' ammessa la configurazione per entrambe le soluzioni oppure solamente per il modulo:

1) PHP eseguito come modulo di apache2

Se il php viene eseguito come modulo di apache2, allora dovrete inserire all'interno di questo file:

/etc/apache2/envvars (Debian GNU Linux)
/etc/sysconfig/httpd (Centos GNU Linux)

l'istruzione "export LD_PRELOAD=amon.so"

2) PHP con mod_fcgid

Se il php e' in esecuzione in modalita' cgi con il modulo fcgid, allora dovrete esportare amon.so direttamente dal wrapper che richiama il php (anche in questo caso con "export LD_PRELOAD=amon.so"). Nella guida "Installare la suexec e mod_fcgid con apache2 in Debian Lenny" e' stata gia' illustrata la tecnica del wrapper.

3) PHP con la suexec

Se state utilizzando la suexec 'standard' di apache2, potrete creare un wrapper con la direttiva Action presente nella configurazione del sito/server:

Action php-script wrapper-del-php

Nel file "wrapper-del-php" dovrete memorizzare questo (e renderlo eseguibile con "chmod 755"):

#!/bin/sh
export LD_PRELOAD=amon.so
exec /path/del/vero/php5-cgi "$@"

Configurazione

Questi sono i comandi che l'utente web puo' eseguire:

"/usr/sbin/sendmail"
"/usr/lib/sendmail"
"/etc/alternatives/lib.sendmail"
"/usr/lib/sm.bin/sendmail"
"/usr/bin/mail"
"/bin/mv"
"/bin/rm"
"/usr/bin/unlink"
"/bin/rmdir"
"/bin/cp"
"/bin/date"
"/bin/bzip2"
"/bin/gunzip"
"/bin/gzip"
"/usr/bin/unzip"
"/bin/tar"
"/usr/bin/host"
"/usr/bin/file"
"/usr/bin/uptime"
"/bin/grep"
"/usr/bin/diff3"
"/bin/pwd"

Queste applicazioni gli consentarro di inviare email dal web e di eseguire operazioni che non saranno "pericolose" per il sistema.

Due parole sul perl/python

Se nei siti state utilizzando script in perl/python allora e' indispensabile abilitare anche questi comandi.
Per fare cio' bastera decommentare il #define WITH_PERL_AND_PYTHON nel codice della libreria (riga 15).
In questo modo, anche consentendo agli utenti di utilizzare script in perl/python, i relativi interpreti non potranno essere richiamati direttamente dal php.
Quando il sistema blocchera' il comando perl o python, potrebbe venire memorizzato nel /var/log/syslog questo messaggio di errore:
sh[27910]: segfault at 0 ip 00007f248e0b6e34 sp 00007fff7fed2350 error 4 in libc-2.11.1.so[7f248e02b000+17a000]
Non ci sono problemi di sicurezza ne di altro tipo.
Se un attacker pubblicasse uno script interamente in perl allora potra' eseguirlo, ma fortunatamente non potra' accedere a /bin/bash o ad altri comandi che gli serviranno successivamente per prendere il controllo della macchina.

Logging

Quando un utente tenta di eseguire un comando non concesso, nell'error log di apache verra' memorizzata questa entry:

sh: nome_comando: command not found

Quando un utente esegue un comando suid (come ad esempio /usr/sbin/sendmail) nel file di errore del web server verra' memorizzato questo messaggio:

ERROR: ld.so: object 'amon.so' from LD_PRELOAD cannot be preloaded: ignored.

Cio' accade perchè per motivi di sicurezza i file suid ignorano il preload di variabili ambiente, pur potendola configurare ed esportare ai propri processi child.
L'avviso puo' essere tranquillamente ignorato.