
Outil actif d'empreinte numérique de serveur TLS qui envoie des paquets Client Hello conçus pour générer des hachages JARM uniques afin d'identifier les configurations de serveurs, de regrouper l'infrastructure et de détecter les serveurs malveillants.
Veuillez lire l'article de blog initial sur JARM pour plus d'informations.
JARM est un outil actif d'empreinte numérique (fingerprinting) de serveur TLS (Transport Layer Security).
Les empreintes JARM peuvent être utilisées pour :
La prise en charge de JARM a été ou est ajoutée à :
SecurityTrails
Shodan
BinaryEdge
RiskIQ
Palo Alto Networks
Censys
360
python3 jarm.py [-h] [-i INPUT] [-p PORT] [-v] [-V] [-o OUTPUT] [-j] [-P PROXY] [domain/IP]
Exemple :
% python3 jarm.py www.salesforce.com
Domain: www.salesforce.com
Resolved IP: 23.50.225.123
JARM: 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5
Pour l'utiliser avec Python 2, vous aurez besoin du module ipaddress :
pip install -r requirements.txt
./jarm.sh <list> <output_file>
Exemple :
% ./jarm.sh alexa500.txt jarm_alexa_500.csv
Avant d'apprendre comment JARM fonctionne, il est important de comprendre comment TLS fonctionne. TLS et son prédécesseur, SSL, sont utilisés pour chiffrer les communications à la fois pour des applications courantes comme les navigateurs Internet, afin de sécuriser vos données, et pour les malwares, afin qu'ils puissent se cacher dans le bruit. Pour initier une session TLS, un client envoie un message TLS Client Hello après la poignée de main TCP à trois voies. Ce paquet et la manière dont il est généré dépendent des paquetages et des méthodes utilisés lors de la construction de l'application cliente. Le serveur, s'il accepte les connexions TLS, répondra avec un paquet TLS Server Hello.
Les serveurs TLS formulent leur paquet Server Hello en fonction des détails reçus dans le paquet TLS Client Hello. La manière dont le Server Hello est formulé pour un Client Hello donné peut varier en fonction de la façon dont l'application ou le serveur a été construit, notamment :
Tous ces facteurs amènent chaque serveur TLS à répondre de manière unique. Les combinaisons de facteurs rendent peu probable que des serveurs déployés par différentes organisations aient la même réponse.
JARM fonctionne en envoyant activement 10 paquets TLS Client Hello à un serveur TLS cible et en capturant des attributs spécifiques des réponses TLS Server Hello. Les réponses agrégées du serveur TLS sont ensuite hachées d'une manière spécifique pour produire l'empreinte JARM.
Ce n'est pas la première fois que nous travaillons sur l'empreinte numérique TLS. En 2017, nous avons développé JA3/S, une méthode passive d'empreinte numérique client/serveur TLS que l'on retrouve désormais dans la plupart des outils de sécurité réseau. Mais là où JA3/S est passif, en prenant l'empreinte des clients et serveurs en écoutant le trafic réseau, JARM est un scanner actif d'empreinte de serveur. Vous pouvez en savoir plus sur la négociation TLS et l'empreinte passive JA3/S ici.
Les 10 paquets TLS Client Hello dans JARM ont été spécialement conçus pour extraire des réponses uniques des serveurs TLS. JARM envoie différentes versions TLS, chiffrements et extensions dans des ordres variés pour rassembler des réponses uniques. Le serveur prend-il en charge TLS 1.3 ? Négociera-t-il TLS 1.3 avec des chiffrements 1.2 ? Si nous ordonnnons les chiffrements du plus faible au plus fort, quel chiffrement choisira-t-il ? Ce sont le genre de questions inhabituelles que JARM pose essentiellement au serveur pour obtenir les réponses les plus uniques. Les 10 réponses sont ensuite hachées pour produire l'empreinte JARM.
Le hachage de l'empreinte JARM est un hachage flou hybride, il utilise la combinaison d'un algorithme de hachage réversible et non réversible pour produire une empreinte de 62 caractères. Les 30 premiers caractères sont composés du chiffrement et de la version TLS choisis par le serveur pour chacun des 10 client hello envoyés. Un « 000 » indique que le serveur a refusé de négocier avec ce client hello. Les 32 caractères restants sont un hachage SHA256 tronqué des extensions cumulatives envoyées par le serveur, en ignorant les données du certificat x509. Lors de la comparaison des empreintes JARM, si les 30 premiers caractères sont identiques mais les 32 derniers différents, cela signifierait que les serveurs ont des configurations très similaires, acceptant les mêmes versions et chiffrements, bien que pas exactement les mêmes étant donné que les extensions sont différentes.
Après avoir reçu chaque message TLS server hello, JARM ferme la connexion proprement avec un FIN afin de ne pas laisser les sockets ouverts.
Il est important de noter que JARM est une fonction d'empreinte haute performance et ne doit pas être considérée, ou confondue, avec une fonction cryptographique sécurisée. Nous avons conçu l'empreinte JARM pour être aussi consommable par l'homme que par la machine. Cela signifie qu'elle est suffisamment petite pour être examinée, partagée, et tweetée avec suffisamment de place pour des détails contextuels.
Les serveurs de commande et de contrôle (C2) de malwares et les serveurs malveillants sont configurés par leurs créateurs comme tout autre serveur, puis déployés sur leur flotte. Ceux-ci ont donc tendance à produire des empreintes JARM uniques. Voici des exemples de malwares courants et d'outils offensifs ainsi que le chevauchement JARM avec les sites Alexa Top 1M (en date d'octobre 2020) :
Avec un chevauchement faible ou nul avec les sites Alexa Top 1M, il est peu probable qu'un hôte au sein d'une organisation se connecte à un serveur avec ces empreintes JARM.
John Althouse - Idée originale, concept et chef de projet
Andrew Smart - Concept et tests
RJ Nunnally - Programmation et tests
Mike Brady - Programmation et tests
Réécrit en Python pour une utilisation opérationnelle par Caleb Yu
| Domain | JARM |
|---|
| salesforce.com | 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5 |
| force.com | 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5 |
| google.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| youtube.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| gmail.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| facebook.com | 27d27d27d29d27d1dc41d43d00041d741011a7be03d7498e0df05581db08a9 |
| instagram.com | 27d27d27d29d27d1dc41d43d00041d741011a7be03d7498e0df05581db08a9 |
| oculus.com | 29d29d20d29d29d21c41d43d00041d741011a7be03d7498e0df05581db08a9 |
| Serveur C2 malveillant | Empreinte JARM | Chevauchement avec Alexa Top 1M |
|---|
| Trickbot | 22b22b09b22b22b22b22b22b22b22b352842cd5d6b0278445702035e06875c | 0 |
| AsyncRAT | 1dd40d40d00040d1dc1dd40d1dd40d3df2d6a0c2caaa0dc59908f0d3602943 | 0 |
| Metasploit | 07d14d16d21d21d00042d43d000000aa99ce74e2c6d013c745aa52b5cc042d | 0 |
| Cobalt Strike | 07d14d16d21d21d07c42d41d00041d24a458a375eef0c576d23a7bab9a9fb1 | 0 |
| Merlin C2 | 29d21b20d29d29d21c41d21b21b41d494e0df9532e75299f15ba73156cee38 | 303 |