Java Applet Cracking
par sirius_black
And now ladies & gentlemen... The moment
you all have been waiting for : Komment ke cé ki fo faire pour kraker
ces putains d'applets Java.
Tout d'abord une applet est bien différente d'une application Java
indépendante. Par indépendante je veux parler d'une application
qui a son propre point d'entrée et qui n'a pas besoin d'un autre programme
pour fonctionner. Les applets ne sont pas indépendantes car elles sont
exécutées par le navigateur. C'est ce dernier qui exécute
(en relation avec la JVM), l'applet. Bien évidemment les droits aux
niveaux des applets sont très restreints : impossible de créer
un fichier, d'exécuter un programme, de se connecter à une base
de donnée...
C'est koi une applet ?
Avant d'entrer plus en détail dans le code d'une applet
il faut savoir à quoi ressemble une applet. Applet est la contraction
de Application et de Internet. Une applet est une petite application
graphique qui est capable d'interagir avec l'utilisateur. Vous ne trouverez
pas de petites animations en applet Java. Java reste de la programmation pûre
et il est impossible de faire des anims du style de Flash avec Java. En revanche
vous trouverez Java pour les chats, des applets pour faire de l'IRC, des applets
qui affichent des infos avec un style 'prompteur', des jeux... Il y a tout
de même des applications graphiques évoluées qui font
par exemple faire une torsion d'une image jpeg etc.
On peut trouver quelques Applets utilisés
afin de protéger des documents. Par exemple une applet Java qui vous
demande un mot de passe et si le pass est bon vous redirige sur la zone membres.
Le problème c'est qu'une applet Java est avant tout un fichier .class
donc du bytecode et par conséquent décompilable.
Comment savoir si on a affaire à une applet Java ? Si une page contient
une applet Java vous verrez une espèce de cadre gris qui signifie que
l'applet est en train de se charger. La taille de ce cadre est variable car
c'est la taille de l'applet (minimum 1 pixel X 1pixel je pense). Ensuite il
y a souvent une petite icone (une tasse de café) qui s'affiche dans
la barre des taches (près de l'heure) pour signaler que la console
Java est active.
Comment une applet s'intègre dans le Hache Te Meuh
Le ?
Au niveau du code HTML, la basile est la balise <applet>
incroyable non ? Voici ses arguments :
codebase=" l'url où aller chercher
les classes (un répertoire) "
archive=" l'url d'une archive jar qui contient
plusieurs classes à charger "
code=" l'url de la classe de l'applet "
alt=" texte qui s'affiche lors du téléchargement
"
name=" nom de l'applet "
width=" largeur de l'applet "
height= "hauteur de l'applet "
hspace= " espacement horizontal avec les
autres éléments de la page html "
vscapce=" pareil que précédemment
mais en vertical "
L'applet est aussi capable de recevoir des arguments
(sous-balide <param>). Ceci nous permet de configurer l'applet sans
avoir à modifier son code. Souvent on retrouve la couleur de l'applet...
Passons à un exemple : le chat de caramail est fait en Java... On lance
la page avec le chat, passé la pub (font chier !) et l'affichage du
chat terminé, on fait un click droit en dessous de l'applet et on affiche
la source de la page HTML, on trouve :
<applet codebase="http://213.193.12.176:80"
archive="normal-3-1-1-b49.jar" code="net.spray.chat.normal.CaraNewChat.class"
height="99%" width="100%">
<param name="port" value="6657">
<param name="httpport" value="80">
<param name="res" value="800">
<param name="room0" value="Musique">
<param name="mode" value="0">
<param name="tempid" value="N056R30O...yen a énormément
de caractères...GJ0LQYH25DVZ">
<param name="a" value="01981FR3730030023101001001010104004">
<param name="language" value="client_fr0.properties">
<param name="prefs" value="524288">
<param name="font" value="Helvetica">
<param name="color" value="211,223,203">
<table width="100%" border=1 cellspacing=0 cellpadding=4 bgcolor="#ffffff">
<tr><td>
Your browser is unable to support Java. Please enable Java and reload.
</td></tr>
</table>
</applet>
Bon je vous laisse brainstormer sur les paramêtres
comme 'tempid' et 'a' ou encore 'pref'. Sinon on voit que le chat caramail
tourne sur le port 6657 ; room0 c'est le forum sur lequel vous atterissez
à la connexion et color sans aucun doute les coordonnées RVB.
Donc si vous voulez télécharger le chat caramail vous faites
http://213.193.12.176/normal-3-1-1-b49.jar. C'était vachement compliqué
dis donc !!
Cette archive contient entre autre la classe principale qui est tout de même
appelé par le paramêtre code="net.spray.chat.normal.CaraNewClat.class".
Ca vous rappelle rien ces points ? Ca veut dire que CaraNewClat.class est
dans le package net.spray... et donc à http://www.caramail.com/net/stray/chat/normal/CaraNewChat.class
Si vous voulez étudier le chat Caramail je vous souhaite bien du plaisir
(ya de quoi faire). Mais si vous avez le courage commencez par lire l'article
de An-Mojeg sur le cracking de Carapopup que vous trouverez dans le Seven
SYnKoP Mag #01 dispo à http://sevensc.suidzer0.org, ça vous
donnera déjà quelques infos.
Pour décompiler un programme Java il faut
un décompilateur Java (affolant non ?) Moi j'ai JAD, ça fait
4 ans que je dit qu'il faudra que je télécharge la dernière
version, malgrès ça, ça marche toujours très bien.
Nous on va PAS déplomber le chat Caramail (faudrait faire un mag en
entier) mais on va tout de même déplomber des solutions commerciales.
Pourquoi ? Pour vous démontrer que la vérification par applet
Java vaut celle des Scripts et tout autre vérification côté
client : que dalle !!!
Premier crackage !
On va commencer par une solution de EasyAppletBuilder. Que fait ce soft ?
En fait il dispose d'une bibliothèque d'Applet Java. Le soft en lui
même ne fait que générer les fichiers html en fonction
des paramêtres que l'on veut et met le résultat dans un répertoire
pour que les liens fonctionnent comme il faut. Bref le soft en lui même
n'est pas super évolué mais les applets Java qui sont fournis
sont pas mal.
Vous avez intérêt à avoir la JVM (téléchargez le JRE) pour les applets car les applets sont mis dans la page (mais vous avez du vous en rendre compte dès l'ouverture). Faites un reload si vous voulez relancer l'applet (dans le cas où vous l'avez fermé). Voici l'applet de EasyAppletBuilder qui fait un test login/password et en fonction de ce que vous avez entré vas vous diriger ou non vers une page secrète.
Là l'applet est un peu spéciale
car elle ouvre une fenêtre Java mais on voit toujours le petit cadre
gris. Pour chopper l'applet c'est pas difficile : on affiche la source et
on cherche la balise <applet> (parfois <object>) :
<applet code="LoginBox.class"
WIDTH="5" HEIGHT="5"> Cela signifie que le fichier
LoginBox.class est dans le même répertoire que la page que vous
lisez (si vous avez rien modifié).
Avant d'ouvrir le ventre de ce fichier comme
le font les biologistes... on va faire un tout petit peut de programmation
Applet.
Une applet est avant tout une classe qui hérite de la classe Applet
qui dérive elle même de java.awt.Panel. Ce dernier est un composant
graphique qui permet d'ordonner les différents objets graphiques entre
eux.
Avec une applet on a plusieurs pseudo-point d'entrée
que l'on doit redéfinir. On trouve :
- public void init() : appelé par le navigateur en premier lieu et
exécutée une seule fois. On y met les instructions qui doivent
être faites en premier (instanciation et autre chargements).
- public void start() : appelée pour lancer l'applet (une fois quelle
est chargée avec init()) Cette méthode est applée à
chaque fois que le navigateur reprend le focus (sa fenêtre est active).
- public void stop() : appelé chaque fois que la page html perd le
focus.
- public void destroy() : appelée par le browser juste avant de fermer.
On libère l'espace mémoire.
A cela il faut rajouter les méthodes des classes mères
:
- public void repaint() : rafraichi l'applet (doit être appelée
après toute modification de l'interface)
- public void update() : appelée par le navigateur
- public void paint() : initialisation graphique. Ne doit être appelée
que par le navigateur.
Etudier une applet alors que vous ne savez pas forcément pas programmer en Java n'est pas vraiment un problème : la plupart des classes et des méthodes sont suffisemment parlantes. Sinon il existe une documentation INDISPENSABLE lorsque l'on programme en Java : La documentation des API Java de Sun. On va s'en servir à chaque fois que l'on aura un problème. Vous la trouverez vers java.sun.com
Reprenons : on ouvre LoginBox.class avec le JAD et on a
un beau fichier Java :)
On étudie vite fait.. getColor pas besoin, le constructeur de la classe
n'est pas bien intéressant, getAppletInfo on s'en bat les couilles
(ou la chatte pour les lectrices), giveURL ça peut être intéressant,
register c'est un truc commercial...
En fait on trouve pas de truc avec la vérification mais... si on regarde
dans la fonction putComponents() on a LoginFrame loginframe
= new LoginFrame(title, this);
Vous connaissez une classe Java qui s'appelle LoginFrame vous ? Moi
non ! Si on regarde dans la doc de Sun elle n'existe effectivement pas. Cela
veut dire que la classe Loginframe doit se trouver dans le même répertoire
que LoginBox. Bingo ! Ca marche.
On regarde un peu... apparemment tout se trouve dans cette
classe (héhé on nous la fait pas à nous).
Inutile de faire une étude détaillée : on relève
les trucs intéressant. "OK" et "Cancel" se sont
les textes dans les boutons. On voit que LoginFrame impémente la classe
ActionListenner. Comprenez par là que elle récupére les
événements tels que le cliquage etc.
Il y a une ligne très intéressante : inputstream
= (new URL(lb.getCodeBase(), "pass.txt")).openStream();
getCodeBase() est une méthode de Applet qui revient très souvent.
Elle donne l'URL du repertoire où se trouve l'applet. On en déduit
que la classe LoginFrame ouvre un fichier pass.txt qui se trouve toujours
dans le même répertoire. Les instructions qui suivent sont juste
l'analyse de ce fichier pass.txt
Pour connaître la solution on ouvre le fichier pass.txt :
lotfree java ultrasecret.htm
google google http://www.google.fr
Si on entre lotfree/java on va sur ultrasecret.htm et si on entre google/google
on va vers google.fr. Dans les autre cas on a juste un "Wrong!"
Second crackage
La suite n'est pas de moi, c'est plutôt une traduction d'un article
de Vlad dans l'ezine numéro 12 de la Raza Mexicana Hackers Team (on
dit La Raza). En cadeau j'ai rajouté l'applet modifié puisque
l'on va faire du reversing d'applet :)
Identité de la victime
THE APPLET PASSWORD WIZARD est un produit de www.cofeecup.com qui nous donne
la possibilité de "protéger" certaines pages afin
que seul certains utilisateurs y ai accès (par exemple partager avec
tes connaissances certains fichiers). Voici à peut près à
quoi ressemble l'applet :
Regardons le code source de la page
Les paramêtres qui sont passés ne signifient pas grand chose
pour nous, tout est chiffré. Comme on peut le voir le code de l'applet
est dans le même répertoire. Ici nous aurons seulement besoin
de ce fichier. Une astuce pour avoir tout les fichiers est d'enregistrer la
première classe et la page web sur son ordinateur, de la lire avec
le navigateur et de regarder les erreurs signalées par Java (classe
Bidule manquante).
Là encore on sort le JAD et dans le code de l'applet
on trouve :
final void decript(String s, int i, int j, int k, int l, int i1, boolean flag)
Cette gentille fonction va tout déchiffrer pour nous :) Pour l'instant
le problème c'est quelle décrypte les paramêtre mais elle
ne nous dit pas le résultat. L'applet dispose de deux TextField (login
et password) et d'un TextArea. On va utilser ce TextArea (qui s'appelle textArea)
pour afficher les données décryptées. On modifie donc
légérement la fonction d'affiche 'bad guy' :
et quand on relance on a droit à l'adresse de la page
cachée :
Franchement c'est pas sympa ça !?!?
Bon j'ai pas tout traduit sur le APPLET PASSWORD WIZARD car
on a déjà vu pas mal de trucs avec le précédent
applet. Si je peux ajouter un peu de mon expérience sachez que j'ai
trouvé une bonne dizaine de pages qui utilisent cet applet. Elles sont
pas difficiles à trouver car en général elles ont pour
titre (texto) : Applet Password Wizard Samples
Par exemple j'ai pu avoir accès au bilan d'une société
pour leur année 2000 ou encore aux stratégies d'attaques d'une
équipe de basket qui s'appelle les '88 Flames'. Mais cela peut être
intéressant si la page protège une zone administration :)
Je vous ai mis dans le répertoire HTML, le fichier joylock.class soigneusement
compilé par mes soins. Attention il est possible qu'une page ai plusieurs
login/password possible... dans ce cas l'applet modifiée ne gère
pas l'affichage.
Maintenant vous n'avez plus d'excuses si vous êtes bloqués au Level4 de Try2hack.nl :p