+-----+--------+----------+-------------------------------+
| 003 | coding | An-Mojeg | an-mojeg@mail-developpeur.com |
+-----+--------+----------+-------------------------------+

Carahack : Carapopup, c'est-y comment que a marche ?
#####################################################

Introduction
------------
	Cet article s'adresse  tout les amis codeurs qui font partie de cette grande communaut les
carahackeur. Qu'ils soient codeurs de clients chat, pop, ou analyseurs de cookie ils s'attaquent tous
 un systme extrmement interressant  attaquer j'ai nomm : Caramail. Faisant partie de cette communaut
je voudrait vous faire dcouvrir un outil propos par notre gentil service mail pour voir si on a de
nouveaux messages : Carapopup. Allez, allez, on me telecharge a let's go !

Carapopup
---------
	Notre carapopup a nous pse 85 ko, hum ... voyons voir si ya du cryptage d'exe, on lance tout 
d'abord procdump > PE Editor > notre exe carapopup et l on va regarder les sections : UPX0, UPX1, .rsrc
ok carapopup est comprss par UPX bon l la meilleur solution pour dcomprsser facilement et sans 
pertes de donnes un exe ayant subit cette compression il suffit d'utiliser UPX avec l'option -d et voil
le tour est jou on se retrouve nez a nez avec un carapopup de 280 ko rhaa est qui plus est totalement
dsassemblale avec W32ASM, c'est y pas b tout a ?
	Bon dsassemblons le monstre est trions quelques string references intrressantes :

" CaraPop version 1.1       7 Janvier 2002"
"carapop.caramail.com"
"Changement de mot de passe !!!"
"GET /cgi-bin/clogin?login1=%s&password1=%s&rand1=%d HTTP/1.0"
"GET /cgi-bin/cmail?key=%s&rand1=%d HTTP/1.0"
"GET http://%s:80/cgi-bin/clogin?login1=%s&password1=%s&rand1=%d HTTP/1.0"
"GET http://%s:80/cgi-bin/cmail?key=%s&rand1=%d HTTP/1.0"
"http://www.caramail.com"
"http://www.caramail.lycos.fr/cgi-bin/redirect?url=/bin/inscription/FormulaireNomPrenom.jsp"
"Passe"

	Voil pourquoi j'ai choisis ces str. ref. :
		*	" CaraPop version 1.1       7 Janvier 2002"
Il s'agit de la version du produit, c'est pour tre sr qu'on bosse sur le mme prog koi ! :)
		*	"carapop.caramail.com"
Le site de l'hte carapop qui va nous rediriger surement vers des trucs style carapopup2.caramail.com,... 
pour dispatcher le trafic.
		*	"GET /cgi-bin/clogin?login1=%s&password1=%s&rand1=%d HTTP/1.0"
			"GET /cgi-bin/cmail?key=%s&rand1=%d HTTP/1.0"
Les requtes effectues vers le serveur directement.
		*	"GET http://%s:80/cgi-bin/clogin?login1=%s&password1=%s&rand1=%d HTTP/1.0"
			"GET http://%s:80/cgi-bin/cmail?key=%s&rand1=%d HTTP/1.0"
Les requtes effectues vers le serveur en passant par un proxy.
		*	"http://www.caramail.com"
En fait  c'est inutile.
		* 	"http://www.caramail.lycos.fr/cgi-bin/redirect?url=/bin/inscription/FormulaireNomPrenom.jsp"
Bon a aussi mais on sait se que a fait quand t'on click sur le lien "Inscrivez vous".
		*	"Changement de mot de passe !!!"
			"Passe"
Ca a ma l'air super interressant mais je ne le traiterai pas ici donc si qqun veux s'affairer a cette tache ...
Il me semble que a pourait etre une possibilit de carahack superbe, la procedure de changement de mot de passe tant
une procdure trs  risque dans n'importe quel systme :)

	Bon ben go on va s'atthacker a ce carapopup je vais tout d'abord crer sous cara l'utilisateur
"mojegtemp" avec le mot de passe "theorie" et l pour annalyser le protocole chang j'ai deux solution.
La premire est de crer un proxy et de faire passer toutes les requtes caramail par celui l pour les 
tudier, la seconde est de changer avec un editeur hexadcimal la str ref "carapop.caramail.com" en 
"127.0.0.1", puis de faire une ptite application serveur qui ouvrira le port 80 et affichera  l'cran
ce qu'on lui envoie. Pour cause d'une soudaine monte de flemmardise je dcide d'opter pour la seconde
solution. Bon b ... let's go !

	Alors avec l'hditeur hxa on cherche dans notre b carapopup dcomprss o se trouve la chaine
de carctre carapop.caramail.com puis on la remplace par 127.0.0.1 puis un caractre nul(le zro, pour montrer
la fin de la chaine de caractre), vient maintenant la programmation du mini serveur. Bon on va pas se
faire chier on va faire a en VB. Dposez sur la feuille un contrle texte puis un contrle winsock.
Ne modifiez pas leurs noms et pastez ce code (comprenez le avant a peut servir :) :

'------------------------------------------------------------------------------------------>
Private Sub Form_Load()
    Text1.Text = ""
    Winsock1.Bind 80
    Winsock1.Listen
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    If Winsock1.State <> sckClosed Then Winsock1.Close
    Winsock1.Accept requestID
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    Winsock1.GetData strData, vbString
    Text1.Text = Text1.Text & strData
End Sub
'<------------------------------------------------------------------------------------------

	Ce code est assez simple a comprendre donc je ne fournirait pas d'expliquation.
Bon voil deux essais et leurs rsultats avec login/pass : "mojegtemp"/"theorie" :
	GET /cgi-bin/clogin?login1=mojegtemp&password1=MCLGMIOEDLEFKCPAMMPDDNMCAAHGEDNE&rand1=1030209428 HTTP/1.0
	GET /cgi-bin/clogin?login1=mojegtemp&password1=MCLGMIOEDLEFKCPAMMPDDNMCAAHGEDNE&rand1=1030209486 HTTP/1.0
Nous voyons donc le mot de passe est crypt et que l'argument pass en variable rand1 n'est pas dutout alatoire
mais qu'elle semble plus tre un truc style les secondes, ou qqchose du genre, le login lui reste en clair.

	Maintenant nous allons voir se qui se passe lorsque nous soumettons cette requete au vraie serveur.
Voil ce qu'il nous renvoi :

JGKEPBLMMLBDFKEIMAGHBAPPKDOHEJCNHJOCOJJPCBLPOOAL 1.0 1

JGKEPBLMMLBDFKEIMAGHBAPPKDOHEJCNHJOCOJJPCBLPOOAL : un hash de session ?
1.0 : un numro de version ?
1 : ??? le niveau de l'utilisateur (admin ou pas ?) -> supposition

second ssais avec la mme requete que prcdament :

HNHIAKGHHOEFAOBBDKAECJNANOPINKDMOJAIBIJIDNDOPDBM 1.0 1

Nous savons donc que la valeur de rand1 n'est absolument pas importante pour le droulement de l'identification
rand1 doit juste tre compos de 10 chiffres, que nous sommes vraiment en prsence d'un hash et pour le reste
rien est sr.

	En suivant la logique du prog je vais effectuer la requete suivante envers le serveur:

/cgi-bin/cmail?key=<LE HASH>&rand1=<LA VALEUR PSEUDOALEATOIRE> HTTP/1.0

soit :
/cgi-bin/cmail?key=HNHIAKGHHOEFAOBBDKAECJNANOPINKDMOJAIBIJIDNDOPDBM&rand1=1030209428 HTTP/1.0

et je vois un bo zero qui saffiche ... ben oui, aucun nouveaux messages. Alors je m'envois un message
a partir de mon adresse an-mojeg@caramail.com avec comme sujet "test test test", je recommence la
requete et l ... rponse du serveur :

1 141233452 An-Mojeg test test test 

hem hem hem :
1 : nombre de nouveaux messages
141233452 : numro du message ?
An-Mojeg : expditeur - moi
test test test : sujet du message.

Esske 141233452 est le numro du message ? une seul manire de le vrifier : 
http://www56.caramail.lycos.fr/cgi-bin/AfficheBody?IDMAIL=141233452

... bingo ... trs fort ... wouawouuuu !!!

	Huh un petit dtail reste choquant ... comment il nous crypte le mot de passe ?

Cryptage du mot de passe
------------------------
	Alors comment se fait-il que notre password : 
theorie se transforme subitement en MCLGMIOEDLEFKCPAMMPDDNMCAAHGEDNE ???
Que se passe-t-il si theorie se transforme en aaaa ?, abjzkelb ?
rsultats :
pour "aaaa" :
HELIHDDHEFECAANENDDPIAMEGGDNMFOF
pour "abjzkelb" :
IINGOGNFEHODDLBFKJOGPCFNNJIGHAOE

ok ok ok j'ai compris il s'agit d'un hash. ( hmmmm ouaouuuuuuuuuuuuuuuuuu ! )

Bon ben on va tracer le programme avec softice en foutant un breakpoint a l'appel de la fonction
GetDlgItemTextA donc bpx GetDlgItemTextA on fait une fois F10 (pour passez outre la prise du login)
Et puis aprs tout vous cherchez j'en ai marre.
Nan en fait a serait trop sadique puissque moi j'ai mis environ une aprs-midi pour me rendre compte
que ces ... connard ... apliquaient un algorythme MD5 puis un ptit changement tout bte.
Le code source est situ dans la partie data du zine (VC++ 6), je vous lache ici le petit changement
qu'ils effectuent au hash :

//----------------------------------------------------------------------------------
unsigned char digest[16];		// le hash
unsigned char final[50];		// le resultat

int i=0,x1=0,x2=0;			// un compteurs et des variables temporaires.

for(i=0;i<16;i++){
	x1 = x2 = digest[i];
	
	x1 >>= 4;			
	x1 += 65;

	x2 &= 15;
	x2 += 65;

	final[j] = x1;
	j++;
	final[j] = x2;						
	j++;
}
//----------------------------------------------------------------------------------

	Mattez le code source entier et analysez le bien.

Conclusion
----------
	J'espre que cet article aura bien servi au carahackeurs et qu'il aura aussi su faire de futurs
carahackeur parmis les lecteurs. Bon ben voil maintenant vous pouvez me coder un ptit client POP ou un
bruteforcer de comptes cara ( foutez moi dans les greetz, a coute rien ! j'ai pass du temps a faire 
cette article ) et sendez moi les sources de vos progr ! ;)
	Bon ben rendez vous au prochain zine pour un autre article du mme style.

An-Mojeg		[ an-mojeg@mail-developpeur.com ]