Steg - Tea Party

Steganographie Jun 3, 2023

📜Scenario

Jacqueline, la charmante dame de l'accueil se comporte bizarrement depuis plusieurs jours.
Vous la suspectez de confier des informations top secrète à un hacker anonyme qui l'a contacté. Inquiet, en bon expert cyber vous essayer d'en savoir plus !
En fouillant dans ces mail vous découvrez qu'elle a reçu une invitation pour une tasse de thé dans un salon non loin.
Essayer de retrouver le nom de code et la phrase de reconnaissance que le hacker a transmise à Jacqueline pour essayer de là devancer au rendez-vous !

Les espaces sont remplacés par des underscores
Flag : interiut{Sesame_ouvre_toi:Freddy_Krueger}
Auteur : Shaym

🔎Solve

Il existe plusieurs outils permettant de retrouver des informations cacher dans des fichiers PDF, je vous propose ici deux outils au choix, un en ligne de commande (PEEPDF) et un autre avec une interface, disponible sur Windows (PDF Stream Dumper) A l'aide de ces outils, on remarque deux objects contenant des scripts JS qui n'ont rien à faire dans des PDFs classiques.

PEEPDF :

On peut utiliser le mode intéractif de PEEPDF avec l’option -i

$ python2 peepdf.py -i ../pdf_test/pdf_test/invitation_party.pdf

Puis avec la commande object on peut voir le contenu de l’objet voulu en indiquant sont numéro :

$ python2 peepdf.py -i ../pdf_test/pdf_test/invitation_party.pdf

PDF Stream Dumper :

Deobfuscate part :

Peu importe la manière dont on récupère les scripts JS maintenant il faut les déobfusquer. Pour cela on peut utiliser des outils en ligne comme deobfuscate.io ce qui nous donne cela pour le premier script :

function _0x2878(_0x4d53b8,_0x256195){const _0x1a4e2=_0x1a4e();return _0x2878=function(_0x287838,_0x2cfc51){_0x287838=_0x287838-0x16c;let _0x5daa36=_0x1a4e2[_0x287838];return _0x5daa36;},_0x2878(_0x4d53b8,_0x256195);}const _0x2cd28a=_0x2878;(function(_0x43b50b,_0x3b14b4){const _0x2dd43f=_0x2878,_0x175ce5=_0x43b50b();while(!![]){try{const _0x32818b=parseInt(_0x2dd43f(0x174))/0x1+parseInt(_0x2dd43f(0x177))/0x2+-parseInt(_0x2dd43f(0x170))/0x3*(-parseInt(_0x2dd43f(0x16e))/0x4)+parseInt(_0x2dd43f(0x178))/0x5+-parseInt(_0x2dd43f(0x179))/0x6+-parseInt(_0x2dd43f(0x176))/0x7*(parseInt(_0x2dd43f(0x16d))/0x8)+parseInt(_0x2dd43f(0x173))/0x9;if(_0x32818b===_0x3b14b4)break;else _0x175ce5['push'](_0x175ce5['shift']());}catch(_0x49ea31){_0x175ce5['push'](_0x175ce5['shift']());}}}(_0x1a4e,0xcf931));const {exec}=require(_0x2cd28a(0x16f)),command=_0x2cd28a(0x171);function _0x1a4e(){const _0x4cffa3=['error','32256027WytINb','4561roOcpE','message','25676NiWCTx','204296wtYDjt','25740igFHyW','10179996JDdbXw','Erreur\x20lors\x20de\x20l\x27exécution\x20de\x20la\x20commande\x20:\x20','3568QvCMDQ','1947836uvPpRC','child_process','3AnStfT','powershell\x20-Command\x20\x22(new-object\x20System.Net.WebClient).DownloadFile(\x27http://personnages-disney.com/Images/Vignettes%20perso%20V3/Chapelier%20Toqu%C3%A9.png\x27,\x20\x27Mad_Hat.jpg\x27)\x22'];_0x1a4e=function(){return _0x4cffa3;};return _0x1a4e();}exec(command,(_0x33e9d7,_0x55df4d,_0x190f85)=>{const _0x577177=_0x2cd28a;if(_0x33e9d7){console[_0x577177(0x172)]('Erreur\x20lors\x20de\x20l\x27exécution\x20de\x20la\x20commande\x20:\x20'+_0x33e9d7[_0x577177(0x175)]);return;}if(_0x190f85){console[_0x577177(0x172)](_0x577177(0x16c)+_0x190f85);return;}});

function _0x2878(_0x4d53b8, _0x256195) {
  const _0x1a4e2 = _0x1a4e();
  return _0x2878 = function (_0x287838, _0x2cfc51) {
    _0x287838 = _0x287838 - 364;
    let _0x5daa36 = _0x1a4e2[_0x287838];
    return _0x5daa36;
  }, _0x2878(_0x4d53b8, _0x256195);
}
const _0x2cd28a = _0x2878;
(function (_0x43b50b, _0x3b14b4) {
  const _0x2dd43f = _0x2878, _0x175ce5 = _0x43b50b();
  while (true) {
    try {
      const _0x32818b = parseInt(_0x2dd43f(372)) / 1 + parseInt(_0x2dd43f(375)) / 2 + -parseInt(_0x2dd43f(368)) / 3 * (-parseInt(_0x2dd43f(366)) / 4) + parseInt(_0x2dd43f(376)) / 5 + -parseInt(_0x2dd43f(377)) / 6 + -parseInt(_0x2dd43f(374)) / 7 * (parseInt(_0x2dd43f(365)) / 8) + parseInt(_0x2dd43f(371)) / 9;
      if (_0x32818b === _0x3b14b4) break; else _0x175ce5.push(_0x175ce5.shift());
    } catch (_0x49ea31) {
      _0x175ce5.push(_0x175ce5.shift());
    }
  }
}(_0x1a4e, 850225));
const {exec} = require(_0x2cd28a(367)), command = _0x2cd28a(369);
function _0x1a4e() {
  const _0x4cffa3 = ["error", "32256027WytINb", "4561roOcpE", "message", "25676NiWCTx", "204296wtYDjt", "25740igFHyW", "10179996JDdbXw", "Erreur lors de l'exécution de la commande : ", "3568QvCMDQ", "1947836uvPpRC", "child_process", "3AnStfT", "powershell -Command \"(new-object System.Net.WebClient).DownloadFile('http://personnages-disney.com/Images/Vignettes%20perso%20V3/Chapelier%20Toqu%C3%A9.png', 'Mad_Hat.jpg')\""];
  _0x1a4e = function () {
    return _0x4cffa3;
  };
  return _0x1a4e();
}
exec(command, (_0x33e9d7, _0x55df4d, _0x190f85) => {
  const _0x577177 = _0x2cd28a;
  if (_0x33e9d7) {
    console[_0x577177(370)]("Erreur lors de l'exécution de la commande : " + _0x33e9d7[_0x577177(373)]);
    return;
  }
  if (_0x190f85) {
    console[_0x577177(370)](_0x577177(364) + _0x190f85);
    return;
  }
});

Le script JS exécute une commande Powershell qui télécharge une image du chapelier toqué et qui la renomme Mad_Hat.jpg.
On récupère donc une première partie du flag, le nom du hacker : Mad_Hat !

Pour le deuxième script JS on a ceci :

function _0x4a27(_0x1ffee6,_0xafe9e3){const _0x34c97f=_0x34c9();return _0x4a27=function(_0x4a27d1,_0x40f653){_0x4a27d1=_0x4a27d1-0x104;let _0x531bda=_0x34c97f[_0x4a27d1];return _0x531bda;},_0x4a27(_0x1ffee6,_0xafe9e3);}const _0x3eccd1=_0x4a27;(function(_0x158743,_0x374ef6){const _0x5cb565=_0x4a27,_0x3a39f1=_0x158743();while(!![]){try{const _0x2951f0=parseInt(_0x5cb565(0x104))/0x1+parseInt(_0x5cb565(0x105))/0x2*(-parseInt(_0x5cb565(0x110))/0x3)+-parseInt(_0x5cb565(0x10b))/0x4*(-parseInt(_0x5cb565(0x114))/0x5)+-parseInt(_0x5cb565(0x10d))/0x6*(parseInt(_0x5cb565(0x109))/0x7)+-parseInt(_0x5cb565(0x107))/0x8*(parseInt(_0x5cb565(0x10a))/0x9)+parseInt(_0x5cb565(0x108))/0xa*(-parseInt(_0x5cb565(0x10c))/0xb)+parseInt(_0x5cb565(0x10f))/0xc;if(_0x2951f0===_0x374ef6)break;else _0x3a39f1['push'](_0x3a39f1['shift']());}catch(_0x38d0ca){_0x3a39f1['push'](_0x3a39f1['shift']());}}}(_0x34c9,0x6fc89));const CryptoJS=require(_0x3eccd1(0x113)),key='McQfTjWnZr4u7w3z',ciphertext=CryptoJS[_0x3eccd1(0x106)][_0x3eccd1(0x111)](message,key)[_0x3eccd1(0x112)](),cipher=_0x3eccd1(0x10e);function _0x34c9(){const _0x4751e3=['1616mMzimd','99506AcUMTn','257934qOIyvL','af7oHcApZgNenmxcl80L34ZOVqaaqUZ8Cfs4rR/Xd33GJCdWuzw0PX4ra826Opcl','21020304uvgJmi','24Cexmjc','encrypt','toString','crypto-js','110cOEvEv','390118jBLXsE','127178VsTpfu','AES','16QaLysU','270JOudsF','7ABnjqk','4036005qKTlKb'];_0x34c9=function(){return _0x4751e3;};return _0x34c9();}

function _0x4a27(_0x1ffee6, _0xafe9e3) {
  const _0x34c97f = _0x34c9();
  return _0x4a27 = function (_0x4a27d1, _0x40f653) {
    _0x4a27d1 = _0x4a27d1 - 260;
    let _0x531bda = _0x34c97f[_0x4a27d1];
    return _0x531bda;
  }, _0x4a27(_0x1ffee6, _0xafe9e3);
}
const _0x3eccd1 = _0x4a27;
(function (_0x158743, _0x374ef6) {
  const _0x5cb565 = _0x4a27, _0x3a39f1 = _0x158743();
  while (true) {
    try {
      const _0x2951f0 = parseInt(_0x5cb565(260)) / 1 + parseInt(_0x5cb565(261)) / 2 * (-parseInt(_0x5cb565(272)) / 3) + -parseInt(_0x5cb565(267)) / 4 * (-parseInt(_0x5cb565(276)) / 5) + -parseInt(_0x5cb565(269)) / 6 * (parseInt(_0x5cb565(265)) / 7) + -parseInt(_0x5cb565(263)) / 8 * (parseInt(_0x5cb565(266)) / 9) + parseInt(_0x5cb565(264)) / 10 * (-parseInt(_0x5cb565(268)) / 11) + parseInt(_0x5cb565(271)) / 12;
      if (_0x2951f0 === _0x374ef6) break; else _0x3a39f1.push(_0x3a39f1.shift());
    } catch (_0x38d0ca) {
      _0x3a39f1.push(_0x3a39f1.shift());
    }
  }
}(_0x34c9, 457865));
const CryptoJS = require(_0x3eccd1(275)), key = "McQfTjWnZr4u7w3z", ciphertext = CryptoJS[_0x3eccd1(262)][_0x3eccd1(273)](message, key)[_0x3eccd1(274)](), cipher = _0x3eccd1(270);
function _0x34c9() {
  const _0x4751e3 = ["1616mMzimd", "99506AcUMTn", "257934qOIyvL", "af7oHcApZgNenmxcl80L34ZOVqaaqUZ8Cfs4rR/Xd33GJCdWuzw0PX4ra826Opcl", "21020304uvgJmi", "24Cexmjc", "encrypt", "toString", "crypto-js", "110cOEvEv", "390118jBLXsE", "127178VsTpfu", "AES", "16QaLysU", "270JOudsF", "7ABnjqk", "4036005qKTlKb"];
  _0x34c9 = function () {
    return _0x4751e3;
  };
  return _0x34c9();
}

Dans ce deuxième script JS on trouve le fameux mot de passe permettant d’ouvrir la porte, il est chiffré avec de l’AES !
Le cypertext : af7oHcApZgNenmxcl80L34ZOVqaaqUZ8Cfs4rR/Xd33GJCdWuzw0PX4ra826Opcl
La clé : McQfTjWnZr4u7w3z

Pour le déchiffrer on peut utiliser devglan.com qui est un outil en ligne très utile

On récupère ainsi la deuxième partie du flag qui est "Un tres joyeux non-anniversaire a toi !"

On a donc les deux parties de notre flag qui donnent avec les spécifications de format indiquer dans l’énoncé le flag suivant :

interiut{Un_tres_joyeux_non-anniversaire_a_toi_!:Mad_Hat}

WriteUp and Chall made by Shaym

Tags