SSTIC 2024 - J3

SSTIC 2024 - J3

Lundi des patates, mardi des patates, mercredi des pattates aussi...

Les patates et Windows, une histoire d'amour et de privesc

Lorsqu'un attaquant (ou un pentesteur, mais c'est presque pareil sauf que le pentesteur il fait ça pour l'argent, l'attaquant aussi) veut élever ses privilèges, il peut trouver plein de LPE, mais sinon ya juste les privilèges dangereux qui sont parfois dispo pour le service qu'il a pété. L'un des classiques c'est SEImpersonate. Il permet d'exec des process au nom d'un autre s'il se connecte, par exemple sur une BDD, un Sharepoint ou un Exchange. C'est une histoire de gestion des droits du filesystem n' co. MAIS c'est dangereux, et les patates c'est ça.

HotPotato, JuicyPotato, RoguePotato c'est connu, souvent patché, parfois contraignant. PrintSpoofer est un outil créé en 2020 et fonctionne à coup de named pipes via le spooler d'impression. Mais faut avoir l'interface RPC du spooler d'impression pour LPE. CoercedPotato s'inspire des travaux de Topotam, notamment PetitPotam. Il va tester toutes les fonctions RPC jusqu'a en trouver une qui fonctionne pour élever ses privilèges façon PrintSpoofer. Forcer une authentification ou on veut ça dépend d'une RPC qui prend un chemin Windows arbitraire, aka unc path.

L'outil implémente deux interfaces RPC: MS-EFSR & MS-RPRN. Ils en on testé plein d'autres... Le dev a été possible grâce à l'aide de RPCView. L'outil va tenter tout ce qu'il peut pour ouvrir le named pipe comme il faut. Et tout ça c'est sur github.

NTDISsector

Audit de password sur un AD, mais pour pouvoir avoir les infos sur les types d'utilisateurs, les droits, etc... bah les infos était pas dispo via les outils habituels d'extraction de hash. Du coup l'orateur à créé cet outil. Le NTDIS.dit est une base de donnée format ESE qui contient des tables dont la datatable avec les objets ad, la link_table avec les relations entre les objets, et la sd_table avec les descripteurs de sécurité. Ya des tools qui existent, ils sont pas tous maintenus ou ont des dépendances qui gênent les orateurs, et ils ont trouvé dissect.esedb comme lib pure-python développée par Fox-IT. L'outil gère bien entendu l'extraction des secrets notamment le déchiffrement des LAPSv2. Il permet aussi d'aller gratter les clefs Kerberos.

AD Miner

Bon auditer un AD c'est cool avec bloodhound, mais ya pas beaucoup de bons outils open source sur le sujet. Chercher des chemins de compro pour aller au domain admin, ça nécessite de parcourir un graph de l'AD & ses machines. La théorie des graph aide à gérer cette recherche de chemins d'attaque. Surtout quand l'AD est gros et que le graph éclate tout. AD Miner se base sur le collecteur bloodhound, mais avec un frontend plus adapté et des systèmes de "points de contrôle". Le collecteur bloodhound récupère les infos de l'AD, et ensuite l'ingesteur bloodhound range tout dans une base Neo4J. Une fois ce travail fait, AD Miner va gratter dans cette base Neo4J. La version community limite à un seul cpu par query cypher. Pour contourner cette limite, ADMiner éclate ses recherche sous forme de multiples petites requêtes. L'outil supporte le clustering pour aller plus vite. L'outil supporte des graph pondérés, pour éviter les chemins les plus courts, mais plutôt les plus simple à exploiter. L'outil permet d'historiser les évolutions aussi, pour voir si on va dans le bon sens niveau sécurisation de l'AD.

Once upon a time in IoT: an industry-grade OS perspective for IoT security

Une TUI c'est une interface sécurisée pour rentrer tout ce qui est PIN et machin sensibles. C'est assez clef dans les produits de Ledger. Bon par contre la résolution des produits existant c'est pas ça. Pour des grosses résolutions, faut une chip plus puissante pour gérer ça, le tout sur un os de confiance... bah ça n'existe pas. Du coup ils ont décidé de faire leur OS à eux.

Tame the (Q)emu !

Pour faire du reverse hardware, c'est pas toujours simple d'avoir le bon hard qui va bien. Unicorn ya pas d'iUART alors on ne peut pas interragir avec le firmware, et en plus ya pas de GDB. Sur étagère, ya QEMU. Du coup comment "émuler" une board custom ? On fait ça avec le Qemu Object Model pour créer des composant re-utilisables genre le SPI. Pour émuler les périphériques on va jouer avec les registre MMIO. Le code est sur github.

Enhancing spacial safety: Better array-bounds checking in C (and Linux)

Le durcissement kernel "upstream" consiste à pousser des moyens de sécurité ou des améliorations dans la codebase du noyau linux. L'orateur bosse depuis 8 ans dans la sécurité kernel, notamment au sein du Kernel Self Protection Project. On a pas le choix que d'utiliser des tableaux en programmation, et le mieux c'est de s'assurer que la taille du tableau est bien définie à la compilation pour éviter les machins dynamiques qui overflow de partout. Mais bon, parfois faut utiliser des tableaux dynamiques, et ceux là bah ils sont plus à risques. Et là ou ça devient galère c'est quand on fait des tableaux de tableaux "statiques" qu'on transforme en tableau dynamique au runtime, ça fout l'brin, comme pour le bug sur FAT. Du coup la stratégie c'est d'utiliser des structures adaptées pour gérer ces tableaux avec un mécanisme qui peut être contrôlé à la compilation pour éviter les merdes.

(C'est très technique, très low level C, et je vous invite à regarder le talk si les sujets de dev défensif kernel vous branchent)

Powershellm

Powershell c'est partout, et on s'en sert aussi bien pour scripter des horreurs chez les admins que chez les attaquants ou les red-treamers pour faire des C2 (empire anyone ? ) ou des outils (hello powerview). Les réseaux de neurones profonds sont capable de travailler sur des données textuelles, des logiques de compression/décompression, etc. L'AMSI bosse à partir de l'AST, et MS s'en est servi pour faire de l'embedding sur des features via FastText, et la détection sur un LSTM. Un LLM sert à modéliser du texte sous forme de proba de séquences. C'est comme des chaines de markov' sauf qu'il faut une tartine de données pour l'entrainer. Des LLM yen a plein, sur huggingface ou dans les API genre ChatGPT. Un LLM on peut le spécialiser ça évite de se retaper tout l'entrainement de base ultra lourd en GPU, Watt & Données.

Pour l'entrainement ils ont joué sur des séquences incomplètes à re-compléter, ou de la prédiction de suite logique de séquences. Ils ont commencé avec StarEncoder qui n'est pas fait pour de la génération, mais entrainé sur des gros volumes de code. Puis ils l'ont fine-tune sur un petit corpus de 7k documents, et voila 😄. Le truc relou, c'est de collecter toutes les données dont on peut avoir besoin pour faire ce fine-tuning. Il faut un dataset assez varié (pas que des loaders cobaltstrike hein), obfusqué ou non, encodé ou non, malveillant ou non.

Après vient la phase de validation du fonctionnement du modèle, avec des scripts plus ou moins malveillants, parfois dont le fonctionnement peut être légitime comme dans le cas d'un moyen de diagnostique système. Bref, on corrige le modèle et le dataset. La solution est limitée par le fonctionnemnet de StarEncoder qui regarde que 1024 tokens. Mais ça fait l'taff. L'outil est sur Github.

Détection de Powershell malveillant par normalisation sémantique

Pourquoi le powershell est toujours une menace ? C'est un langage d'expression interprété, ou chaque token peut être re-encodé. C'est comme avec le JavaScript et autre, ya toujours moyen de faire des trucs débiles avec les strings. Quand on bosse avec un SIEM, c'est compliqué d'aller parser un langage avec une expression régulière. Du coup faut utiliser une grammaire qui tient la route. La grammaire elle n'est pas fournie par Microsoft, du coup c'est la galère. Les orateurs ont donc choisi d'écrire une grammaire powershell compatible tree-sitter. Une fois qu'on a l'AST, on peut bosser sur la structure du code et exprimer une règle basée sur la structure de l'arbre. Par contre on peut se servir de l'AST en le simplifant et éliminer les prédicats opaques et autres gadgets syntaxiques. Du coup les orateurs en on fait un outil de standardisation. Les codes sont et

Sigma : la correlation au service de la détection

Sigma, c'est un langage d'expression de règles de détection génériques qu'on compile vers votre SIEM préféré. Une règle sigma, c'est un YAML qui exprime le contexte de la règle, les sources de données et les éléments signants de la détection. La dernière version de sigma inclue des règles de correlation. C'est pas simple la correlation. Les meta-rules sont basés sur la similarité, et sont simple à mettre en place, par contre ça nécessite de bien connaitre sa télémétrie, et la taille de la fenêtre temporelle. En Sigma v1 c'est très compliqué à exprimer, et très peu supporté. Les meta-rules sont des Sigma qui référencent des règles Sigma et des conditions/relations entre les règles: comptage, séquence, fenêtre temporelle.

Belenios: the Certification Campaign

Belenios c'est un outil de vote électronique créé par le Loria. Cet outil a fait l'objet d'une CSPN. C'est un outil de vote électronique basé sur Hélios et qui est mis à jour régulièrement par l'équipe du Loria. Le protocole de vote électronique à fait l'objet d'analyse et de travaux de recherche pour s'assurer qu'il ne puisse y avoir de fraude ormis la coercission. En suite le système de vote électronique a fait l'objet d'un bug bounty et a été suspendu le temps de corriger les bugs. En Estonie et Australie c'est moins transparent.

Du coup l'éval CSPN a pris 25j d'éval technique, et 10j d'éval crypto. L'évaluation se base sur un modèle d'attaque avec des conditions de mise en oeuvre qui font partie de la cible de sécurité. Le protocole crypto à été bien évalué, et il n'y a pas eu de vuln de ce côté là. Côté Web par contre yavait des vulns, mais hors-scope, c'est à dire n'entrant pas en ligne de compte dans la cible de sécurité.

De la complexité

La complexité ça peut s'exprimer dans les math ou l'algorithmique, mais ce n'est pas le propos. Exemple avec la Safety dont le graph du taux annuel d'accidents mortels va dans le bon sens, c'est à dire vers 0. Bon on arrive pas encore à 0, mais comment l'aéronautique en est arrivé là ? Quand on regarde l'évolution des cockpit d'avions qui se sont simplifiés au cours du temps, avec des mécanismes de sécurité de plus en plus importants. Bref l'innovation à amélioré la safety, mais au prix de la complexité.

Un système simple, genre une vis et un boulon, on peut à peu près en comprendre le fonctionnement de façon intuitive. On a les systèmes compliqués, mais qui sont analysables "par morceaux". Et enfin on a les systèmes complexes dont on ne peut prédire le comportement. Un système complexe peut être analysé par sub-division successives et par abstractions. Cette approche de l'abstractions c'est fondamental dans la conception logicielle, mais dans une certaine limite du nombre d'abstractions. Le problème en sécurité, c'est que les couches d'abstractions masquent les détails, qui émergent sous la forme de bugs ou de vulnérabilités. Quelques exemples avec des créateurs de ransomwares pas foutu de récupérer la clef ou les fichiers, ou de l'USS Yorktown qui suite à l'ajout d'un 0 dans la BDD a fait crasher tous les PC et la propulsion.

Exemple avec la vuln WHOIS qui permettait une exec de code arbitraire en local, sauf qu'il était utilisé dans des sites web type looking glass, et la bam la RCE. C'est la complexité, ou l'emploi de couches d'abstraction et le fait d'ignorer la créativité des dev' qui fausse l'analyse du risque. Autre exemple avec shellshock, omniprésent notamment dans CGI, et paf la RCE dans le referer, dans SSH ou encore dans le client DHCP.

Ya pas que le logiciel complexe, il y a aussi la complexité autour du logiciel, les dépendances comme le "left-pad incident" qui a fait effondrer un pan de l'écosystème NPM. Les réseaux de neurones sont des systèmes complexes qu'on viens gluer à du code et d'autres trucs... et là on est bien servis niveau complexité.

Comment vivre avec la complexité ? Par exemple on peut essayer de limiter la complexité, en gardant les choses simples, des modèles d'IA pas trop larges ou spécialisés, l'utilisation de langages plus "sûrs" comme RUST. L'interprétation abstraite par exemple permet de prouver des trucs en jouant sur de la sur-approximation. On peut aussi chasser du bug, des erreurs, des config pouraves. Après on peut vivre avec les bugs avec la défense en profondeur, le découplages, l'isolation, etc... les superviseurs, les chaos monkey sont des exemples de moyens de contrôle et de gestion des bugs, erreurs et autres aléas.