Niveau 25
Level Goal
A daemon is listening on port 30002 and will give you the password for bandit25 if given the password for bandit24 and a secret numeric 4-digit pincode. There is no way to retrieve the pincode except by going through all of the 10000 combinations, called brute-forcing.
Ce niveau est particulièrement ludique et peut être résolu de nombreuses manières, ici nous irons au plus simple en utilisant les outils vus dans les niveaux précédents.
Tout d'abord commençons par envoyer un message sur le port 30002
pour voir une réponse type :
bandit24@bandit:~$ echo 1234 | nc localhost 30002
I am the pincode checker for user bandit25. Please enter the password for user bandit24 and the secret pincode on a single line, separated by a space.
Fail! You did not supply enough data. Try again.
Le programme nous répond qu'il faut également envoyer le mot de passe du niveau en cours, recommençons :
bandit24@bandit:~$ echo UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ 1234 | nc localhost 30002
I am the pincode checker for user bandit25. Please enter the password for user bandit24 and the secret pincode on a single line, separated by a space.
Wrong! Please enter the correct pincode. Try again.
Un point de détail important : netcat n'arrête pas la connexion automatiquement après avoir reçu le message, ce qui fait qu'il faut interrompre netcat manuellement avec Ctrl + C
. Cela va avoir de l'importance pour la solution de brute force que l'on va implémenter car l'on veut passer directement à l'étape suivant si l'on envoie le mauvais code.
De base netcat offre la possibilité de spécifier un intervalle de temps avant de couper la connexion mais cette méthode présente l'inconvénient majeur de ne pas pouvoir proposer un temps inférieure à 1 seconde. Dans la situation actuelle, cela voudrait dire que dans le pire des cas cela prendrait environ 10000 secondes pour tester tous les codes potentiels, ce qui est beaucoup trop long.
Trois solutions s'offre à nous :
- utiliser
timeout
, un outil qui permet de mettre fin à un programme dans un délai spécifié (extimeout 0.4 nc localhost 30002
). L'inconvénient majeur est que l'on ne sait pas compbien de temps mettra le serveur pour répondre ; si notre timeout est trop bas on risque de rater des réponses, si il est trop élevé on va perdre du temps inutilement - utiliser
grep
pour détecter la présence d'une chaine de caractères et mettre fin à la connexion. Cette solution a l'avantage d'être plus élégante que la précédente en évitant et de nous faire perdre le moins de temps possible. - ne pas utiliser
netcat
de manière itérative mais lancer autant de commande que nécessaire à la fois
Cette dernière solution pourrait être illustrée de la manière suivante :
echo "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ 0001
UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ 0002
UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ 0003" | nc localhost 30002
Cette commande va gérer le lancement de 3 instances netcat en parallèle, réduisant au maximum le temps d'attente pour un résultat.
Il ne reste donc plus qu'à créer un script qui va générer une chaine de caractères concaténant toutes les hypothèses :
list=""
for i in {0000..9999}
do
list=$"$list\n UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ $i"
done
echo -e "$list" | nc localhost 30002 | grep -a -o -E '=*[A-Za-z0-9]{32}'
On peut créer le script sur le serveur en via la commande touch /tmp/solution24.sh
, en éditant le contenu de ce fichier avec vim
, puis en rajoutant un flag d'exécutable avec chmod +x /tmp/solution24.sh
.
Au bout de quelques secondes on obtient :
bandit24@bandit:~$ /tmp/solution24.sh
uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG