Accueil / Piratage / PowerMemory, l’outil qui contre les faiblesses de Windows Active Directory

PowerMemory, l’outil qui contre les faiblesses de Windows Active Directory

Un jeune Belge, aujourd’hui basé au Canada, a inventé PowerMemory, un outil qui a pour mission d’empêcher que Windows Active Directory diffuse vos identifiants de connexion aussi simplement qu’un clic de souris.

Pierre-Alexandre Braeken

Pierre-Alexandre Braeken travaille dans l’ingénierie des systèmes depuis plus de 11 ans. Il est aujourd’hui architecte technologique. Cet informaticien  certifié MCITP SA, MCSA 2008/2012 ou encore MCSE 2012 a comme domaine de spécialité l’architecture des systèmes et les domaines d’entreprise Active Directory. A noter qu’il est open cfp pour la conférence infiltrate de Miami. Il a développé une expertise particulière autour de la sécurité de ces systèmes et développe des outils pour prouver les idées qu’il avance. J’ai rencontré l’auteur de PowerMemory lors du HackFest Canada 2015, l’outil qui a pour mission d’empêcher que Windows Active Directory diffuse vos identifiants de connexion. Interview !

DataSecurityBreach. Qu’est ce que PowerMemory ?  

Pierre-Alexandre Braeken. PowerMemory est un outil utilisé dans des audits de sécurité de domaine Windows Active Directory. PowerMemory permet de vérifier les faiblesses de ces domaines pour les corriger. Une de ses fonctionnalités phares est la révélation des mots de passe Windows directement depuis la mémoire. Son fonctionnement est totalement nouveau puisqu’il est indépendant de l’architecture ciblé et qu’il ne fait pas appels aux fonctions de Windows pour trouver les mots de passe et pour les déchiffrer. De plus il utilise le langage de script PowerShell qui fait partie intégrante du noyau de base depuis Windows 7. [Lire l’interview du chercheur enseignant Français Jérôme Ridet au sujet de la faille PowerShell capable de faire tomber la sécurité d’un système en 5 secondes]

DataSecurityBreach. Type de failles ?

Pierre-Alexandre Braeken. PowerMemory démontre à quel point il est désormais simple de récupérer les mots de passe de n’importe quel système Windows. Il peut récupérer les mots de passe stockés dans la mémoire locale d’un système, mais également à distance. La faille met en évidence que PowerMemory est capable de révéler des mots de passe sans être administrateur d’une machine. En effet, il peut révéler les mots de passe de machine virtuelle depuis le crash d’une machine (Blue Screen Of Death = BSOD) mais également à partir d’un snapshot de machine virtuelle. Ce qui veut dire qu’un simple opérateur d’un environnement virtualisé pourrait avoir plus de droit que l’administrateur même du domaine.

Ce type de faille pourrait mener à des scénarios d’attaque d’un domaine qui permettrait à une personne mal intentionnée, depuis l’extérieur, de récupérer d’abord des accès de plus faible niveau pour ensuite remonter toute la hiérarchie des systèmes et atteindre en bout de course le Saint-Graal représenté par un contrôleur de domaine. Dès ce moment, tout le système d’entreprise s’effondre en termes de sécurité et le réseau entier n’appartient plus aux administrateurs de l’entreprise mais bien au pirate informatique.

DataSecurityBreach. Comment est-ce possible qu’une telle possibilité n’ait pas été « pensée » par Microsoft ?  
Pierre-Alexandre Braeken. J’ai prévenu Microsoft du résultat de mes recherches. Ils ne considèrent pas ceci comme une faille de sécurité. Néanmoins, quelques jours après le report complet de mes travaux, l’outil RWMC (qui révèle les mots de passe) faisant partie de la suite d’audit PowerMemory a été catégorisé officiellement par Microsoft comme un « hacktool » de niveau d’alerte « medium ».

Le problème pour Microsoft est que la façon dont ils ont conçu leur système les empêche de donner une solution applicable pour les entreprises pour tous les systèmes d’exploitation jusqu’à windows 2012R2 compris. Pour Windows 10 (seulement dans sa version professionnelle) et 2016, les choses changent puisque Microsoft a créé un nouveau système pour protéger les mots de passe stockés en mémoire. On parle de Trustlets tournant dans un environnement isolé. Pourquoi Microsoft ne protège pas ses clients tournant sur des systèmes d’exploitation non supporté ? Je pense que ceci demande des changements si majeurs au système de fonctionnement du noyau que Microsoft n’est pas prêt à apporter de changements sur des systèmes qui risquent encore d’être présent dans 15 ans…

DataSecurityBreach. Comment s’en protéger ? 

Pierre-Alexandre Braeken. Il est nécessaire d’adopter de bonnes pratiques en matière de gestion de parc informatique. Le sujet est vaste et il n’est pas évident de se protéger de ce genre d’attaque. Des gens comme Sean Metcalf (Master Active Directory, moins de 100 dans le monde) abordent le sujet de façon régulière (dont Black Hat 2015). J’ai également rédigé plusieurs documents que je compte bientôt publier sur mon blog.  J’ai également créé l’outil PowerMemory dans le but de faciliter le travail de la sécurité. L’objectif est de détecter les failles afin d’apporter des solutions qu’une entreprise peut mettre en place.  De plus, j’ai également développé un outil qui détecte la méthode utilisée par PowerMemory pour révéler des mots de passe.

DataSecurityBreach. Vous présentez votre solution aux entreprises, comment réagissent-elles ?
Pierre-Alexandre Braeken. Elles ont d’abord beaucoup de mal à comprendre les implications. En effet, les enjeux sont extrêmement importants et les réactions en conséquence. Les mots ahurissant et impressionnant ressortent souvent.  Même avec l’évidence, il est difficile pour les grandes entreprises de modifier leurs processus afin de se protéger de ce genre d’attaque.  Mon rôle consiste à les avertir et à les aider à trouver des solutions pour se protéger sans pour cela casser son modèle.

Étiquetté :

Nos partenaires




Actualités du mois

mars 2026
L M M J V S D
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

Articles en UNE

Actus zataz



Réseaux sociaux


Liste des sujets


<!-- Cyber'Émission ZATAZ — badge volant (déplaçable) + réduire/fermer -->
<div class="zataz-yt-float" id="zatazYtFloat" role="region" aria-label="Cyber'Émission ZATAZ">
  <div class="zataz-yt-float__bar" id="zatazYtBar">
    <span class="zataz-yt-float__title">Cyber'Émission ZATAZ</span>

    <div class="zataz-yt-float__actions">
      <button type="button" class="zataz-yt-float__btn" id="zatazYtMin" aria-label="Réduire">—</button>
      <button type="button" class="zataz-yt-float__btn zataz-yt-float__btn--close" id="zatazYtClose" aria-label="Fermer">×</button>
    </div>
  </div>

  <a class="zataz-yt-badge" href="https://www.youtube.com/@ZATAZCOM" target="_blank" rel="noopener noreferrer"
     aria-label="Regarder Cyber'Émission ZATAZ sur YouTube (nouvel onglet)">
    <span class="zataz-yt-badge__thumb" aria-hidden="true">
      <span class="zataz-yt-badge__play" aria-hidden="true"></span>
    </span>
  </a>
</div>

<style>
  .zataz-yt-float{
    position:fixed;
    right:18px;
    bottom:18px;
    z-index:99999;
    width:320px;
    max-width:calc(100vw - 36px);
    border-radius:14px;
    overflow:hidden;
    background:linear-gradient(135deg,#111827,#0b1220 55%,#111827);
    border:1px solid rgba(255,255,255,.12);
    box-shadow:0 14px 40px rgba(0,0,0,.35);
    transform:translateZ(0);
    user-select:none;
    touch-action:none; /* drag mobile */
  }

  /* Barre de drag + boutons */
  .zataz-yt-float__bar{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:10px;
    padding:10px 10px 10px 12px;
    font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;
    color:#fff;
    background:rgba(0,0,0,.18);
    border-bottom:1px solid rgba(255,255,255,.10);
    cursor:grab;
  }
  .zataz-yt-float__bar:active{ cursor:grabbing; }
  .zataz-yt-float__title{
    font-weight:800;
    letter-spacing:.2px;
    font-size:15px;
    line-height:1;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
  }
  .zataz-yt-float__actions{ display:flex; gap:8px; }
  .zataz-yt-float__btn{
    appearance:none;
    border:1px solid rgba(255,255,255,.18);
    background:rgba(0,0,0,.28);
    color:#fff;
    width:32px;
    height:28px;
    border-radius:10px;
    font-weight:900;
    line-height:1;
    cursor:pointer;
    display:grid;
    place-items:center;
  }
  .zataz-yt-float__btn:hover{ background:rgba(255,255,255,.08); border-color:rgba(255,255,255,.28); }
  .zataz-yt-float__btn--close:hover{ background:rgba(239,68,68,.22); border-color:rgba(239,68,68,.45); }

  /* Contenu (votre vignette) */
  .zataz-yt-badge{
    display:block;
    text-decoration:none;
    color:#fff;
  }
  .zataz-yt-badge__thumb{
    display:block;
    height:180px;
    background:#0f172a url("https://i.ytimg.com/vi/HUo8dnD6Swk/hqdefault.jpg") center/cover no-repeat;
    position:relative;
  }
  .zataz-yt-badge__play{
    position:absolute;
    left:50%;
    top:50%;
    width:54px;
    height:54px;
    margin:-27px 0 0 -27px;
    border-radius:999px;
    background:rgba(0,0,0,.55);
    border:1px solid rgba(255,255,255,.25);
    box-shadow:0 10px 22px rgba(0,0,0,.35);
  }
  .zataz-yt-badge__play:before{
    content:"";
    position:absolute;
    left:22px;
    top:16px;
    width:0;height:0;
    border-top:11px solid transparent;
    border-bottom:11px solid transparent;
    border-left:16px solid #fff;
  }

  .zataz-yt-float:hover{
    box-shadow:0 18px 55px rgba(0,0,0,.45);
    border-color:rgba(255,255,255,.18);
  }
  .zataz-yt-badge:active{ transform:scale(.99); }

  /* Etat réduit */
  .zataz-yt-float.is-min .zataz-yt-badge{ display:none; }
  .zataz-yt-float.is-min{ width:260px; }

  /* Mobile : plus compact */
  @media (max-width:480px){
    .zataz-yt-float{ width:280px; right:12px; bottom:12px; }
    .zataz-yt-badge__thumb{ height:158px; }
    .zataz-yt-float.is-min{ width:220px; }
  }
</style>

<script>
(() => {
  const box = document.getElementById('zatazYtFloat');
  const bar = document.getElementById('zatazYtBar');
  const btnMin = document.getElementById('zatazYtMin');
  const btnClose = document.getElementById('zatazYtClose');

  if (!box || !bar || !btnMin || !btnClose) return;

  // Réduire / restaurer
  btnMin.addEventListener('click', (e) => {
    e.stopPropagation();
    box.classList.toggle('is-min');
    btnMin.textContent = box.classList.contains('is-min') ? '▢' : '—';
    btnMin.setAttribute('aria-label', box.classList.contains('is-min') ? 'Restaurer' : 'Réduire');
  });

  // Fermer
  btnClose.addEventListener('click', (e) => {
    e.stopPropagation();
    box.remove();
  });

  // Drag (souris + tactile) via Pointer Events
  let dragging = false;
  let startX = 0, startY = 0;
  let startLeft = 0, startTop = 0;

  // Position initiale: on convertit right/bottom en left/top pour le drag
  const init = () => {
    const r = box.getBoundingClientRect();
    box.style.left = r.left + 'px';
    box.style.top  = r.top  + 'px';
    box.style.right = 'auto';
    box.style.bottom = 'auto';
  };
  init();

  const clamp = (v, min, max) => Math.min(Math.max(v, min), max);

  bar.addEventListener('pointerdown', (e) => {
    // pas de drag quand on clique sur les boutons
    if (e.target === btnMin || e.target === btnClose) return;

    dragging = true;
    bar.setPointerCapture(e.pointerId);

    const r = box.getBoundingClientRect();
    startX = e.clientX;
    startY = e.clientY;
    startLeft = r.left;
    startTop = r.top;

    e.preventDefault();
  });

  bar.addEventListener('pointermove', (e) => {
    if (!dragging) return;

    const dx = e.clientX - startX;
    const dy = e.clientY - startY;

    const r = box.getBoundingClientRect();
    const w = r.width;
    const h = r.height;

    const maxLeft = window.innerWidth - w - 8;
    const maxTop  = window.innerHeight - h - 8;

    box.style.left = clamp(startLeft + dx, 8, maxLeft) + 'px';
    box.style.top  = clamp(startTop + dy, 8, maxTop) + 'px';
  });

  const endDrag = () => { dragging = false; };
  bar.addEventListener('pointerup', endDrag);
  bar.addEventListener('pointercancel', endDrag);

  // Re-clamp au resize
  window.addEventListener('resize', () => {
    const r = box.getBoundingClientRect();
    const maxLeft = window.innerWidth - r.width - 8;
    const maxTop  = window.innerHeight - r.height - 8;
    box.style.left = clamp(r.left, 8, maxLeft) + 'px';
    box.style.top  = clamp(r.top, 8, maxTop) + 'px';
  });
})();
</script>