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.

alt="Please activate Java...

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