title: CVE-2023-4760 : Do a RCE or be a whore
date: May 30, 2024
tags: cve
Pour repréciser le contexte, mon équipe faisait un pentest pour un client où on ne trouvait rien d'intéressant. Ce client paraissait important pour l'un des membres de mon équipe que j'apprécie énormément et on voulait vraiment reporter quelque chose d'un peu sexy. Cependant l'application avait déjà beaucoup été testée donc difficile de trouver quelque chose de cool.
Pour ne rien arranger, la technologie derrière l'application était Remote Application Plateform de Eclipse
Pour la faire simple c'est un framework qui utilise essentiellement les coordonnées de la souris pour fonctionner.
Le mercredi (la mission se terminait le vendredi) on n'avait absolument rien donc je lui ai promis que je serai la reine des putes si je n'avais pas RCE avant vendredi.
Le vendredi nous avions un shell sur les machines exécutant l'application sous windows.
Pour résumer voici les points-clés qui m'ont permis d'atteindre mon objectif
Détaillons maintenant cette attaque.
Bien évidemment je ne citerai pas l'entreprise que nous attaquions initialement ni je ne détaillerai aucune attaque faite à son encontre. Vous devez juste savoir que nous avions eu accès à son "application" et que nous avons pu la reverse.
J'avais repéré une feature de file upload et j'avais décidé que je passerai par là et que je me concentrerai uniquement sur cette feature.
En effet on pouvait upload presque n'importe quel type de fichier et je voulais profiter de cette liberté pour RCE.
Après avoir passé une journée à désobfuquer et analyser les features de file upload j'ai décidé de rentrer dans les fonctions utilisées par le framework RAP.
J'avais remarqué que le nom de notre fichier n'était pas modifié mais que son chemin était supprimé uniquement pour garder uniquement le nom de fichier.
Voici le code responsable de ce comportement :
private static String stripFileName( String name ) {
String result = name;
int lastSlash = result.lastIndexOf( '/' );
if( lastSlash != -1 ) {
result = result.substring( lastSlash + 1 );
} else {
int lastBackslash = result.lastIndexOf( '\\' );
if( lastBackslash != -1 ) {
result = result.substring( lastBackslash + 1 );
}
}
return result;
}
Si quelqu'un essaie de remonter l'arborescence sous linux alors tout ce qui après le dernier "/" va être utilisé comme nom de fichier. De la même manière sous windows on va récupérer le dernier "\" pour considérer la suite comme le nom de fichier.
Pour résumer voici ce que ça fait.
../../../../../../etc/passwd => passwd
../../../var/www/html/reverse.php => reverse.php
..\..\..\..\C:\Windows\System32\drivers\etc\hosts => hosts
Le problème ici c'est qu'on est dans un IF ELSE. Donc si un cas est rencontré le deuxième ne sera pas traité. De cette manière on peut remonter l'arborescence sous Windows et uploader n'importe quel fichier n'importe où.
Dans notre cas on a pu avoir un reverse shell en générant un war
avec msfvenom et avec le path suivant :
../..\..\..\webapps\reverse-shell.war