ToRat est un RAT (Remote Administration tool) open source développé en go. Il est trouvable sur github. Ce malware est largement utilisé dans le monde du piratage car il présente l’énorme avan- tage de passer par un onion service TOR. Il n’y a donc pas besoin d’installer (ou de pirater) un serveur pour installer un C2 car on bénéficie des capacités de NAT traversal et de l’anonymat fourni par TOR (T1090.003). En une seule ligne de commande, l’implant est prêt à être installé et le serveur est déjà en écoute grâce à l’utilisation de container docker !
Ce type de RAT présente donc énormément d’avantages à la fois de simplicité et de sécurité, ses capacités sont les suivantes: persistance, destruction de données, exécution de commande, en- voi/récupération de fichiers, test de la connexion internet, capture d’écran, affichage de fichier, récupération des informations du système d’exploitation, scan réseau.
Que fait concrètement TEHTRIS face à cette menace pressante?
Desobfuscation: L’implant qui sera installé sur la machine victime est offusquée à l’aide de l’utilitaire Go Garble, puis packé T1027.002 avec l’utilitaire UPX. Il passe donc inaperçu pour de nombreux systèmes de sécurité et récupérer sa configuration de manière statique est une tâche extrêmement fastidieuse. Pour ce faire, les capacités d’introspection mémoire de la Sandbox TEHTRIS permet d’intercepter la configuration du malware directement dans la mémoire du processus au moment où celui-ci est déchiffré. Cette technique permet ainsi de s’affranchir des taches d’unpacking et de désoffuscation en exploitant pleinement les mécanismes de la Sand- box TEHTRIS.
Quelle utilité pour l’analyste?: Les analystes des SOCs peuvent ainsi accéder à la configuration qui leur permettra efficacement de récupérer les informations spécifiques à l’attaque en cours: certificat, clé publique, adresse onion, domaine. Le fait de récupérer la configuration permet d’être certain de la menace en question et éviter les faux positifs.
Description technique (public averti)
Le malware est d’abord obfusqué avec go garble, puis packé comme dans le schéma suivant:
Le code responsable de la configuration dans l’implant est le suivant, nous cherchons à récupérer le contenu de la structure server :
package client
import (
"crypto/rsa"
"crypto/x509"
_ "embed" // used for embedding the cert
"encoding/pem"
"log"
)
const (
serverPort string = ":1337"
)
type server struct {
cert *x509.Certificate
pubKey *rsa.PublicKey
addr string
domain string
}
var s server
//go:embed cert.pem
var serverCert []byte
// initServer returns a struct with the cert, domain, pubkey, and address
// for dialing the source server's tor address
func initServer() {
serverBlock, _ := pem.Decode(serverCert)
cert, err := x509.ParseCertificate(serverBlock.Bytes)
if err != nil {
panic(err)
}
domain := cert.DNSNames[0]
log.Println("[initServer] Initialized server cert")
s = server{
cert: cert,
addr: domain + serverPort,
pubKey: cert.PublicKey.(*rsa.PublicKey),
domain: domain,
}
}
Les string en go sont équivalentes à des structures C comme suit:
Garble obfusque la Structure de Contrôle mais pas les structures. L’utilisation de docker pour com- piler le code donne beaucoup d’avantage pour l’attaquant mais en contrepartie le résultat est très déterministe, l’architecture attendue étant x86_64 on peut reconnaître en vert la structure des strings en go tels qu’on peut les attendre dans cette architecture ave le pointeur vers la string et la taille.
structstring{
const char *buffer;
size_t length;
}
Les pointeurs redirigent vers une autre zone mémoire. Ce motif est très caractéristique et permet moyennant quelques optimisations notamment des heuristiques portant sur les caractéristiques des zones mémoires de retrouver rapidement la configuration.