NorzhCTF 2020 - OSINT - Familly Business

Nouvelle édition du NorzhCTF, organisé en marge du FIC 2020, et nouveau succès pour le challenge. N’étant plus étudiant à l’ENSIBS, j’ai eu l’occasion de participer à l’évènement. Cet article traite de la résolution de “Familly Business”, un challenge d’OSINT/SOCMINT divisé en 2 parties.

Le challenge tourne principalement autour des réseaux sociaux, mais aborde également une partie plus technique. Néanmoins il est à noter que certains éléments sortent du cadre purement OSINT puisque deux intrusions sont nécessaires.

Sommaire

Énoncé

Nous avons des doutes sur le fait que M. Lukas DUMMAS, l'ancien RSSI de Norzh Nuclea ait vendu des informations protégées de l’entreprise à un membre de sa famille et représentant d’une puissance étrangère. Nous vous demandons de mener l’enquête !
Le premier flag se trouvera sur un serveur appartenant à Lukas. Le second se trouvera dans les fichiers échangés avec la puissance étrangère.

Familly Business 1

Indication sur l’emplacement du premier flag, sur un serveur appartenant à M.DUMMAS. Un peu flou.. Mais ok, c’est parti !

N’ayant que très peu d’informations sur cette personne, le premier réflexe est d’aller faire un tour sur Google. Une requête simple, en premier lieu, permet de récupérer un lien vers un profil LinkedIn.

Profil LinkedIn

Cela nous permet d’en apprendre plus sur la vie de Lukas DUMMAS, mais permet également de mettre un visage potentiel sur cette identité. D’un autre côté, on peut aussi récupérer une adresse e-mail lui appartenant. À ce stade, il n’est pas possible de savoir si cette dernière aura une utilité.

Adresse e-mail LinkedIn

Après quelques recherches sur les autres éléments donnés par Google (par exemple, un lien apollo.io), on s’oriente vers les Google Dorks, afin de filtrer les résultats. Le premier dork, tout simple, donne déjà des résultats intéressants.

Google Dorks

On récupère ainsi un profil Instagram, qui au vu de la photo, semble être le profil de M.DUMMAS. L’analyse du profil révèle deux éléments intéressants :

  • Un username, qui va pouvoir être rejoué ailleurs ;
  • La photo d’une femme, qui, si l’ont en croit la description du post, est la belle-soeur de Lukas (utile pour la suite!).
Profil Instagram

Une simple recherche sur Google à l’aide du username ressort un profil Twitter. Même pseudo, éléments visuels liés à une personne espagnole, il semble bien que ce profil lui appartienne.

Profil Twitter

Une rapide analyse du compte permet de trouver un tweet intéressant, destiné à la société OVH et contenant des logs réseaux. Parmi ces logs, un ensemble d’adresses IP peuvent être aperçues. Tenant compte du fait que M.DUMMAS est un ancien RSSI, peut être que ces adresses IP peuvent mettre sur la piste d’un serveur lui appartenant ?

Tweet logs

On extrait donc l’ensemble des adresses IP potentielles et à l’aide par exemple de Shodan, on commence à investiguer. Rien d’intéressant jusqu’à celle ci : 51.91.251.53

Shodan

Il semble en effet, que cette dernière corresponde à un serveur hébergé par OVH. De plus, 4 ports semblent être ouverts, dont les ports 80 et 443.
On file donc voir si une application web est présente et on tombe sur un certificat SSL délivré par “Let’s Encrypt”. Dans le cas de sites personnels, il n’est pas rare d’utiliser ce type de certificat car ces derniers sont facile à déployer et peu couteux. Suite à cela, l’utilisateur est redirigé sur le site Wordpress de Lukas.

Site Wordpress

Un message intéressant avertit les utilisateurs :

"And do not digging into the “secrets” folder, it you are not allowed"

Ainsi, on tente d’accéder au répertoire “/secrets”, sans succès. À partir de là, mon expérience me dit de faire de la recherche de ressource en passant par du fuzzing. C’est après quelques essais que l’ont se rend compte que la solution était bien plus simple…

Flag 1

Une simple recherche et on obtient le premier flag !

Familly Business 2

Pour le second challenge, l’énoncé indique que le flag se trouve “dans les fichiers échangés avec la puissance étrangère”. Sur le coup, je ne voyais pas bien comment nous pouvions accéder à ce type de fichier.

Bien.
En se raccrochant à l’énoncé, on part sur la piste du membre de sa famille. Nous avons précédemment identifié “Maria Gutorova”, qui semble être la belle soeur de notre cible. Au travers du compte Instagram précédemment identifié, notre cible indique que sa belle soeur devrait avoir plus d’abonnés sur Twitter, accompagné d’un username (lien).

Note : Le compte existe également sur Instagram, mais il s’agit d’une personne réelle, ce qui m’a valu quelques minutes de fausse piste lors du challenge… :(

Profil Instagram
Profil Twitter

À partir de là s’est écoulé un peu de temps avant d’avancer sur le challenge. Car en effet, les nouvelles informations semblent nous manquer. Pas de soucis, on retourne sur nos pas afin d’analyser les choses précédemment vues. En l’occurence, on s’attarde sur le compte Twitter de notre 1e cible, Lukas DUMMAS.

Après quelques recherches, on tombe sur deux tweets de ce dernier (ici et ici).

Tweet
Tweet

Le premier pointe vers un classement des mots de passe les plus utilisés, accompagné d’un message de Lukas expliquant que 290.000 personnes utilisent le même mot de passe que sa belle soeur. Le second tweet quand à lui indique que Maria aurait mis à jour son mot de passe mais que, la connaissant, cette dernière ne pourrait avoir qu’ajouté son année de naissance.

Ok, même si l’ont sort d’un contexte purement OSINT, les instructions sont plutôt claires : on doit retrouver le mot de passe du compte Twitter de Maria.

Si l’on s’en tient au classement, le mot de passe utilisé par 290.000 personnes est : FQRG7CS493

Reste une inconnue, la date de naissance de Maria. Le compte Twitter de cette dernière indique une naissance le “28 Novembre”, mais l’année n’est pas affichée..

Tweet

C’est ici que se trouve un petit trick de Twitter permettant de paramétrer le dégré d’information affiché aux différents types d’utilisateurs. Ainsi, pour une personne lambda, disposant d’un compte, ou non, seulement le jour et le mois de naissance seront affichés. Par contre, si l’on s’abonne au compte, alors la date complète s’affiche. À l’aide d’un compte lambda, on récupère donc l’année de naissance de cette seconde cible, 1980.

Tweet

Nous ne disposons pas de l’adresse e-mail de cette dernière mais Twitter propose aux utilisateurs de se connecter avec leur nom d’utilisateur. Ainsi, on peut reformer son mot de passe (FQRG7CS4931980) et se connecter au compte.

Une fois connecté, on file fouiller les “DM” (Direct Messages) afin de voir ce qu’ils contiennent.

On y trouve ainsi un échange entre Maria et Lukas, spécifiant que certaines “informations” sont situées sur le serveur privé de Lukas. De plus, un mot de passe est échangé.

Messages privés Twitter

Retour en arrière, le seul serveur identifié comme appartenant à Lukas était basé sur l’IP 51.91.251.53. Et nous avions trouvé 4 potentiels services, dont un serveur FTP !

L’une des misconfigurations courantes sur ces serveurs étant la possibilité de se connecter en anonyme, on dégaine FileZilla et on file tenter ça.

FileZilla

B00m ! Ca passe. On se retrouve en présence de dizaines de fichiers apparemment zippés. Dans le doute, on dump la totalité du serveur pour une analyse en mode offline.

On se rend rapidement compte que les archives ZIP sont chiffrées. Par conséquent, il est nécessaire de disposer du mot de passe. Compte tenu des informations précédemment recueillie, notamment dans la boite de messagerie Twitter de notre seconde cible, il semble que nous disposions de cette information.

Une rapide boucle bash permet de se rendre compte que seule une archive peut être ouverte à l’aide du mot de passe en question.

$ for i in {0..100}; do unzip -P 'BSG7,6xD?pt!37h' secret_folder.$i.zip; done
unzip:  cannot find or open secret_folder.0.zip, secret_folder.0.zip.zip or secret_folder.0.zip.ZIP.
[...]
Archive:  secret_folder.81.zip
   skipping: secret_file.81          incorrect password
Archive:  secret_folder.82.zip
  inflating: secret_file.82          
Archive:  secret_folder.83.zip
   skipping: secret_file.83          incorrect password
[...]

On récupère ainsi un fichier ASCII de 193Mo, affichant des milliers de fois la même chaine de caractères. Cette dernière, encodée en base64, laisse apparaître le second flag !

$ echo "RU5TSUJTe28waEJ1dEhvV2QxZF95b3VGaW5kbTN9" | base64 -d
ENSIBS{o0hButHoWd1d_youFindm3}%

RETEX et mot de la fin

Challenge amusant dans sa globalité, merci au concepteur ainsi qu’à l’équipe d’organisation du NorzhCTF !

La solution est présentée dans un ordre logique. Cependant, lors de l’évènements j’ai trouvé certains éléments avant d’autres qui ne me permettaient pas d’avancer directement dessus. Par exemple, le serveur FTP avait été téléchargé bien avant d’avoir le mot de passe nécessaire.

Même si certains éléments dans l’énoncé n’étaient pas vraiment précis (“sur un serveur”, “dans les échanges”) j’ai apprécié le challenge et l’ensemble de l’investigation.

o/

NorzhCTF 2019 & RedHackCTF 2019 - Windows AD - Game of Pwn OSINT/GEOINT - Investigation et Géolocalisation #1 - Vol commercial