Nos outils internes : Chashell-ng

Nos outils internes : Chashell-ng
By Laboratoire TNP / on 01 Jul, 2021

L’histoire de Chashell

Chashell-ng est une évolution de notre projet open-source initial, Chashell.

Chashell est initialement un outil multiplateforme (Windows, Linux, OS X), développé en Golang, permettant d’obtenir un shell (accès en ligne de commande) à distance, en faisant transiter les communications au travers de communications DNS.

Pourquoi avoir choisi le DNS ? Ce protocole est l’un des rares à offrir l’opportunité d’exfiltrer des informations, sans même que le serveur ne dispose d’accès à Internet. Il suffit qu’un serveur DNS soit configuré sur la machine compromise, et que ce serveur relaye les requêtes DNS pour un domaine externe sous le contrôle de l’attaquant (quel que soit le nombre de serveurs DNS intermédiaires avant que la requête ne parvienne sur Internet).

Malheureusement, cet outil dispose de nombreuses lacunes :

  • Un seul shell ouvert à la fois ;
  • Chiffrement symétrique ;
  • Difficilement modulable.

Devant le succès de cet outil, nous avons souhaité développer une nouvelle version, plus stable, plus rapide et avec plus de fonctionnalités.

C’est ainsi qu’est né le projet Chashell-ng, un outil visant à remplacer Chashell, tout en intégrant des fonctionnalités similaires aux outils les plus avancés du marché (Meterpreter, Sliver, Cobalt Strike, …).

Évolution des protocoles de communications

La première évolution concerne les protocoles de communication. Initialement prévu pour communiquer exclusivement en DNS, Chashell-ng communique maintenant sur différents protocoles:

  • TLS : permet une communication sécurisée, chiffrée et stable, tout en authentifiant le serveur de contrôle.
  • mTLS : comme TLS, mais établit une authentification mutuelle TLS, c’est-à-dire en authentifiant le serveur et le client.
  • DNS : embarque notre protocole maison, utilisant une combinaison de chiffrement asymétrique et symétrique (Curve25519, XSalsa20 et Poly1305) ; plus lent et bruyant que TLS, mais contournant de nombreuses politiques de filtrages restrictives.
  • DoH : DNS au travers d’une connexion HTTPS, aussi lent mais permet de contourner d’autres types de filtrages.

Intégration d’un système RPC

Afin de rendre Chashell-ng très modulable, nous avons fait le choix d’utiliser gRPC, un cadriciel (framework) open source, permettant de définir des services et de communiquer facilement avec.

Voici un exemple de définition de service gRPC :

package system;

service System {
    rpc GetSystemInformation (Empty) returns (SystemInformationReply) {}
    rpc GetUID (Empty) returns (GetUIDreply) {}
}

message SystemInformationReply {
    string username = 1;
    string uid = 2;
    string gid = 3;
    string hostname = 4;
    string os = 5;
    string os_arch = 6;
    string binpath = 7;
}

message GetUIDreply {
    string username = 1;
    string uid = 2;
    string gidname = 3;
    string gid = 4;
    string homepath = 5;
    repeated GroupInfo group = 6;
}

message GroupInfo {
    string groupid = 1;
    string groupname = 2;
}

Ici, deux services sont déclarés : GetSystemInformation et GetUID, permettant respectivement d’obtenir des informations sur le système d’exploitation et sur l’utilisateur.

Côté Client (la cible), la fonction est déclarée telle quelle dans le code :

func (s *SystemServer) GetSystemInformation(context.Context, *system.Empty) (*system.SystemInformationReply, error) {
   /*
   Tronqué
   */

   return &system.SystemInformationReply{
      Username: userinfo.Username,
      Uid:      userinfo.Uid,
      Gid:      userinfo.Gid,
      Hostname: hostname,
      Os:       runtime.GOOS,
      OsArch:   runtime.GOARCH,
      Binpath:  binpath,
   }, err
}

Côté Controller, la fonction peut être appelée et exécutée à distance de cette manière :

systemClient := system.NewSystemClient(ActiveSession.GRPCSession)
getSysInfo, err := systemClient.GetSystemInformation(ActiveSession.Context, &system.Empty{})
if err != nil {
    return err
}

// getSysInfo.Username = root

Ce mécanisme RPC permet donc de créer des fonctions simplement et d’en obtenir les résultats sans prendre en compte l’aspect réseau. Il est également possible de créer des streams, c’est-à-dire d’envoyer des informations en flux.

Une fois intégré à Chashell-ng, le programme retourne les informations demandées.

Les commandes getuid et systeminfo

Mode multijoueur

Lors de larges campagnes de phishing ou de RedTeam, il n’est ni réaliste, ni efficace, de se concentrer sur une seule et unique machine.

C’est pour cette raison que nous avons intégré un mode multi-utilisateur, permettant à plusieurs de nos auditeurs de se connecter sur le serveur de contrôle de Chashell-ng et d’interagir, à plusieurs ou non, sur les machines connectées.

Mode multijoueur, avec opérations exécutées en parallèle

Système de génération simplifiée

Nous avons souhaité simplifier la génération de charges Chashell-ng, en mettant en place un système de compilation dynamique effectué par le serveur de contrôle.

Ainsi, aucune dépendance n’est requise pour les utilisateurs de Chashell-ng et les charges utilisent uniquement les bibliothèques nécessaires, en fonction des besoins spécifiés par l’utilisateur.

Génération de charge dynamique

Modules intégrés

De nombreux modules sont présents de base :

  • discretos : similaire à Incognito, permet d’effectuer de pivoting et manipuler les jetons d’utilisateur en mémoire ;
  • file : manipulation du système de fichier, téléchargement, envoi de fichier, … ;
  • network : permets d’établir des tunnels et d’obtenir des informations sur les interfaces réseau ;
  • privileges : Permets de manipuler les privilèges du processus et d’élever automatiquement les privilèges en conséquence ;
  • secretsdump : télécharge les jetons de mot de passe présents sur le système ;
  • shell : ouvre des invites de commandes interactives (PTY) ;
  • system : permets d’obtenir les informations sur le système d’exploitation.

Élévation de privilèges et récupération des condensats d'utilisateurs

Exfiltration de la mémoire du processus lsass.exe

Création d'un utilisateur et accès à PowerShell

Et l’open-source ?

Nous souhaitions initialement rendre Chashell-ng open-source, mais malheureusement de nombreux projets de ce genre sont utilisés par des personnes mal intentionnées. Le problème ne vient pas des outils développés pour les tests d’intrusion ou pour la simulation d’attaque, mais bien des acteurs (malveillants) qui les utilisent.

Récemment, un article provenant de l’équipe BlackBerry Research and Intelligence Team, a dévoilé des informations techniques sur un nouveau rançongiciel (ransomware), utilisant Chashell comme bibliothèque de communication DNS.

Nous avons ainsi décidé de ne pas publier Chashell-ng pour le moment, et d’en restreindre l’accès à notre équipe interne et aux développeurs initiaux du projet.

Ce choix nous permet également de diminuer la détection de Chashell-ng par les antivirus et les autres solutions de sécurité rencontrées lors de nos audits. Nous pouvons ainsi simuler de manière plus réaliste des attaques avancées, provenant d’acteurs expérimentés.