---
# System prepended metadata

title: '**Challenge Brigitte Friang - Partie Algo**'

---


# **Challenge Brigitte Friang - Partie Algo**
---

# 1- Le texte de chimie

On à 2 fichiers: original.txt et intercepte.txt

Exemple d'orginal.txt:
```
HEALTH ASPECTS

OF
CHEMICAL AND BIOLOGICAL
WEAPONS
Report of a WHO Group of Consultants

WORLD HEALTH ORGANiZATION
GENEVA
1970
```
Exemple d'intercepte.txt:
```
HbEALTH ASPECTS

aOF
CsHEMIeCAL6 AND4 BIOLOGICAL:
W/EAPONS
Rep9ortj of a /WHO Group4 of CoAnsultants

WORLAD HEALTQH SORGANiZkATZIONJ
GENEVA
R19g70
```
On remarque que intercepte comporte des caractères en plus. On fait un programme qui récupère les caractères supplémentaires et les stocke dans un autre fichier.

Résultat.txt
```
base64:/9j/4AAQSkZJRg...gWEzgm5XecTe40MDANmAgdhsYalyLi8zi97aDYR2DG9rf7T//Z
```

Comme l'indique les premiers caractères, il s'agit d'un message encodé en [base64](https://fr.wikipedia.org/wiki/Base64).

Lorsqu'on essaye de décoder avec des outils comme [Base64 decode](https://https://www.base64decode.org/). On s'apperçoit qu'on obtient une image JPEG erronée. Avec photoshop, en cochant une option pour forcer l'ouverture des fichiers erronés on voit une image assez pixellisée avec un /XXXXXX (illisible) en bas.
En effet, dans le code en base64 il y 3 caractères qui ne font partis des caractères autorisés en base64. Un "-", un "linefeed" et un autre (oublié).

En essayant un peu par hasard des caractères à la place de ces 3 là, j'arrive à améliorer la qualité de l'image, jusqu'à pouvoir lire le code.

![](https://i.imgur.com/5Ik1bKZ.jpg)




**/22caeee05cb8b2a49133be134a5e9432**

# 2-Les tailles d'objets dans les entrepots

Sur https://www.challengecybersec.fr/22caeee05cb8b2a49133be134a5e9432, on peut télécharger une archive, dedans il y a une explication:
> Stockage dans nos entrepôts
Bonjour citoyen d’Evil Country, pour un nouveau projet nous avons
besoin de stocker en lieu sûr des objets de différentes valeurs.
Cependant nous ne voulons pas stocker trop de valeur totale dans
chaque entrepôt.
Nous avons un objectif de valeur totale par entrepôt mais nous n’avons
pas réussi à l’atteindre exactement. Si vous y arrivez, nous vous
donnerons accès à d’autres projets où votre aide nous sera vitale.
Données fournies
Vous trouverez plusieurs fichiers de différentes tailles avec plusieurs
informations dedans.
Dans la première ligne vous trouverez :
*Un entier M , la valeur totale à atteindre.
*Un entier N , le nombre total d’objets en notre possession
Dans la seconde ligne, vous trouverez N entiers représentant la valeur
des objets.

Un exemple de résultat est fourni avec:
```
40 4
20 10 11 8

```

Après pas mal de changements de code (et d'énervement), je me lance sur un algo "force brute" qui va essayer toutes les combinaisons possibles, et garder celles qui vallent le résultat (ou qui sont les plus proches).

Exemple avec le fichier a:
```
200 20
92 86 16 20 48 85 49 73 94 10 39 51 85 68 54 83 10 92 60 49

```
J'essaye toutes les sommes de 1 éléments, puis toutes les sommes de 2 éléments, puis 3 etc jusqu'à toutes les sommes de 20 éléments.

Pour ne pas commencer par n'importe quel nombre d'éléments (1 puis 2 puis 3 etc) pour la somme, j'essaye de calculer la moyenne des éléments et de diviser le nombre à atteindre par la moyenne. Cela donnera le nombre d'élements à additionner en moyenne pour obtenir le nombre à atteindre.


Ca marche bien pour le premier fichier (20 éléments), pour le 2eme fichier (75 éléments) mais beaucoup moins bien pour le 3eme (15000 éléments) et le 4eme (3000 éléments). 

Les combinaisons de ~10000 éléments parmis 15000 sont trop longues à toutes tester.

En affichant la meilleure somme que j'obtiens (somme la plus élévée mais qui ne dépasse pas le nombre à atteindre), je remarque qu'elle converge assez vite vers un nombre pouis ne bouge plus.
Par exemple pour le fichier "c" elle se stabilise vers 938 000 000.
Je décide d'augmenter manuellement le nombre d'éléments de la somme pour qu'elle converge vers 1 000 000 000. J'arrive vers 999 991 563 puis je laisse tourner 2 min le programme, et hop la combinaison idéale est trouvée.

Idem pour fichier d.

Une fois correct cela donne:
**/9bcb53d26eab7e9e08cc9ffae4396b48**


# 3-Le blog
Sur https://www.challengecybersec.fr/9bcb53d26eab7e9e08cc9ffae4396b48
On tombe sur un blog qui contient 1000 articles. Il faut extraire une chaine de caractères présente dans chacun, la concaténer et donner le hash md5 de cette concaténation.
J'ai fait avec un script php qui va récupérer la chaine dans la page.

```
for ($i = 0; $i <= 100; $i++)
{
	$url="https://www.challengecybersec.fr/9bcb53d26eab7e9e08cc9ffae4396b48/blog/post/".$i;
        $page = file_get_contents($url);
	echo $url."<br />";
	echo "position de la string:".strpos ( $page , "<span id=\"partial-proof\">")."<br />";
	$pos=strpos ( $page , "<span id=\"partial-proof\">");
	$len=strlen("<span id=\"partial-proof\">"); //25
	echo "longueur de la string".$len."<br />";
	$debut=$pos+$len;
	echo "code:".substr($page,$debut,32)."<br />";
	$concat=$concat.substr($page,$debut,32);
}
```

Vu que l'extraction des 1000 pages dépasse le timeout j'ai du faire 100 pages par 100 pages et récupérer dans un .txt les 10 chaines obtenues.
A la fin un petit:
```
$concat="60b45d6ad9bf9...8d6b2677f18dccd2159c1ee716bf858b578fddc08742b3e";
echo "<br />".md5($concat)."<br />";
```

On obtient un message de félicitation: et **/1410e53b7550c466c76fc7268a8160ae**


# 4-Le login perdu
Sur https://www.challengecybersec.fr/1410e53b7550c466c76fc7268a8160ae
Une page login et mot de passe. Dans le code source on trouve que la vérification se fait via un fichier Javascript (page7c.js résultat indenté):
```
<input type="text" class="form-control" id="inText" placeholder="Nom d'utilisateur" required>`

...
<button id="submit" class="w-100 btn btn-custom mt-4" value="Se connecter" onclick="DisplayValidity('inText')">Se connecter</button>
...

function DisplayValidity(strIn) {
     var str = document.getElementById(strIn).value;
     if(_0x10dbec(str) == 0){
     document.getElementById("out").innerHTML = '<div class="alert alert-danger">Identifiants invalides</div>';
     }
     else{
     document.getElementById("out").innerHTML = '<div class="alert alert-success">Identifiants valides !</div>';
     document.location.href = window.location.href + "/" + str;
    }
}
```
On voit que le login est également l'adresse de la prochainne page. Quand on fait le cheminement inverse à partir de la clé demandée, on voit qu'il faut 40 caractères, dont 2 sont écrassés par un autre lors d'une fonction de hashage "maison". En essayant avec des caractères au pif, les message "login correct" s'affiche mais la redirection se fait sur une page 404 error.
Chaine obtenue en passant le login à l'envers:

```
3f3939527e73ad93b73b070bb12cde1292bbcde5
2101211111101111111111111111111111111111
```
La deuxième ligne indique combien de fois sont écrits les caractères.
Les caractères avec un 2 en dessous sont écrasés par un autre, donc inconnus. Le caractère avec un 0 en dessous n'est pas utilisé, on peut mettre n'importe quoi à la place.

J'ai essayé toutes les combinaisons pour les 2 caractères inconnus dans l'url. (abce->yz et 0 1 2-> 8 9) soit 36*36=~1300 combinaisons.
Avec une modification du fichier de l'étape 3 (le blog) qui teste toutes les URL par lots de 144, et qui récupére la longueur du contenu de la page.

```
$concat="";
$urlbase="https://www.challengecybersec.fr/1410e53b7550c466c76fc7268a8160ae/3f3939527e73ad93b73b070bb12cde1292bbcde5";
$pagebase = file_get_contents($url);
echo $url."DEBASE <br />";
$lenbase=strlen($pagebase);
echo $lenbase."<= TAILLE DE BASE <br />";
$tab=array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9');
$bestUrl="ww";
$start=32;
for ($i = $start; $i < $start+4; $i++)
{
	$c=$tab[$i];
	for ($j = 0; $j < 36; $j++)
	{
		$b=$tab[$j];
		$url="https://www.challengecybersec.fr/1410e53b7550c466c76fc7268a8160ae/".$c."f39".$b."9527e73ad93b73b070bb12cde1292bbcde5";
		$page = file_get_contents($url);
		echo $url."<br />";
		$l=strlen($page);
		echo "taille page =>".$l."<br />";
		if($l != $lenbase)
		{
			$bestUrl=$url;
		}
	}

}
echo "<br />BEST URL ====".$bestUrl."<br />";
```

On remarque qu'une page a plus de contenu que les autres.
Resultat:
```
https://www.challengecybersec.fr/1410e53b7550c466c76fc7268a8160ae/5f3949527e73ad93b73b070bb12cde1292bbcde5
taille page =>7520
```
**/5f3949527e73ad93b73b070bb12cde1292bbcde5**

# 5-Classified archives

8C- https://www.challengecybersec.f/5f3949527e73ad93b73b070bb12cde1292bbcde5
Pas d'énique sur cette page. Juste un lien dans un message: **/7a144cdc500b28e80cf760d60aca2ed3**

# 6-Le CTF# 
9C- https://www.challengecybersec.fr/7a144cdc500b28e80cf760d60aca2ed3 
On arrive à la fin de la branche Algo, sur COROS Ctf ou il faut creer un login.

Shurex/CTP