Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Harald — Un CPU minimal en mémoire pour la création de protocoles à la volée et agnostiques | Kitploit
Outils/GitHubGitHub/gmh5225/harald
ExploitationÉvasion IDS/IPSScripting et AutomatisationSécurité RéseauTests d'IntrusionCommandement et ContrôleUtilitaires et FrameworksRed TeamingDéveloppement de Charges Utiles
GitHubgmh5225/harald

Harald

Un CPU minimal en mémoire pour la création de protocoles à la volée et agnostiques

il y a 1 anPas encore vérifié
Voir le dépôt

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Harald CPU

Harald est un minuscule CPU de haut niveau en mémoire, capable de traiter un ensemble d'instructions pour générer des protocoles de couche applicative à utiliser sur un protocole réseau donné (TCP/UDP).

Harald consomme un flux d'OPCODES et applique différentes transformations à la charge utile pour qu'elle soit adaptée au protocole de couche applicative défini.

[!TIP] Pourquoi Harald ? Vous connaissez peut-être Harald Gormsson, roi du Danemark, pour son surnom : Blátǫnn, ou comme on le prononce aujourd'hui, Bluetooth. La technologie a été nommée d'après le surnom de Harald car il connectait les royaumes danois et viking à l'époque. J'ai donc nommé ceci d'après son prénom.

Diagramme

Harald se comporte comme un CPU. Il suit un ensemble d'OPCODES qui définissent des actions. Un PROTOCOLE. Harald exécute les opérations requises pour créer le protocole requis à la volée.

Une fois le PROTOCOLE fourni, Harald itère sur la PAYLOAD à envoyer en parcourant l'intégralité du PROTOCOLE une fois pour chaque fragment. C'est-à-dire : si la payload devait être découpée en plusieurs fragments, Harald utilisera le même protocole pour chaque fragment, en exécutant chaque action définie dans le protocole contre le fragment de payload courant.

Harald maintient un certain nombre de registres à utiliser par le protocole pour stocker des valeurs. Ces registres peuvent être utilisés pour effectuer de multiples opérations, telles que l'addition, la soustraction, l'encodage et le décodage... etc.

Harald alloue dynamiquement un tableau de résultats où le protocole peut stocker les réponses à chaque requête effectuée lors de l'envoi d'un fragment de payload.

Diagramme de haut niveau de Harald

Opcodes

Harald prend en charge une variété d'Opcodes à fournir en tant que protocole. Harald effectue un ensemble d'opérations de haut niveau à la réception d'un Opcode donné. Chaque Opcode attend un ensemble prédéfini d'arguments avec une longueur prédéfinie.

OPCODE::NºDescriptionARGS::Size
H_F_APPEND::0x01Ajoute les N octets suivants à la fin de la payloadSize::4, NBytes::N
H_F_PREPEND::0x02Ajoute les N octets suivants au début de la payloadSize::4, NBytes::N
H_F_SPLIT::0x03Découpe la Payload en fragments de la taille donnéeSize::4
H_F_PAYLOAD_INJECT::0x04Injecte le fragment de Payload dans la End Payload-
H_F_SOCK_INIT::0x05Initialise la connexion socketIsIPAddress:1, SSL_Enabled::1, TCP/UDP::1, [(HostLen::4,HostName:N)/IPAddress::4], Port::2
H_F_SEND::0x06Envoie la End Payload construite-
H_F_RECV::0x07Reçoit jusqu'à N octetsSize::4
H_F_CLOSE::0x08Ferme le socket et nettoie-
H_F_INJECT::0x09Injecte le registre demandé dans la End PayloadReg::1
H_F_ENCODE_STR::0x0AEncode un champ de Payload en sa représentation chaîneIsReg::1, [(Payload::1, Field::1)/Reg::1], Format::1
H_F_DECODE_STR::0xA0Décode le contenu d'un registre en sa représentation numériqueReg::1
H_F_ENCODE_STRB64::0x0BEncode un champ de Payload en sa représentation chaîne B64Payload::1, Field::1
H_F_COMPUTE_FRAG_LENGTH::0x0DCalcule la longueur du prochain fragment à envoyer-
H_F_SEARCH::0x0ERecherche un motif d'octets donné de taille N donnée dans un registre donnéReg::1, Size::4, NBytes::N
H_F_SEEK::0x0FDéplace le curseur dans une payload donnée d'un nombre d'octets donnéPayload::1, Offset::4
H_F_PUSH::0x10Pousse un nombre d'octets ou le contenu d'un registre dans un autre registreIsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2
H_F_ADD::0x12Additionne deux registres ou un nombre à un registreIsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2

Exemple HTTP

Le flux d'Opcodes suivant générera les données requises à envoyer pour qu'une communication soit comprise comme du HTTP. Il initiera, modifiera la payload pour qu'elle ressemble à du trafic HTTP, l'enverra sur une connexion SSL/TLS, et fermera la connexion à la fin.

root@kitploit:~
H_F_SPLIT, 0x00, 0x00, 0x00, 0xFF,                         // Splits the Payload
H_F_APPEND, 0x00, 0x00, 0x00, 0x46,                           // Appends...
  'P', 'O', 'S', 'T', ' ', '/', ' ',                              // POST / 
  'H', 'T', 'T', 'P', '/', '1', '.', '1', '\r', '\n',             // HTTP/1.1
  'H', 'o', 's', 't', ':', ' ',                                   // Host: 
    'd', 'o', 'm', 'a', 'i', 'n', '.', 'c', 'o', 'm', '\r', '\n', // domain.com
  'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', ':', ' ',     // Connection: 
    'c', 'l', 'o', 's', 'e', '\r', '\n',                          // close
  'C', 'o', 'n', 't', 'e', 'n', 't', '-',                         // Content-
    'L', 'e', 'n', 'g', 't', 'h', ':', ' ',                       // Length: 
H_F_COMPUTE_FRAG_LENGTH,                                 // Next Fragment's size
H_F_ENCODE_STR, H_PAY_END_PAYLOAD, H_PAY_FRAGMENT_SIZE, 'u',  // FragSize encode
H_F_INJECT, H_REG_RET,                   // Inject the Fragment Size encoded str
H_F_APPEND, 0x00, 0x00, 0x00, 0x04, '\r', '\n', '\r', '\n', // Append Body begin
H_F_PAYLOAD_INJECT,                                        // Inject the Payload
H_F_SOCK_INIT, 0x01, 0x01, 0x7F, 0x00, 0x00, 0x01, 0x04, 0xD2,    // Init Socket
H_F_SEND,                                    // Send the Payload over the socket
H_F_CLOSE                                        // Close the socket and cleanup 
  1. Split (0x03) la payload en blocs allant jusqu'à 0x000000FF octets.
  2. Append (0x01) les 0x00000046 octets suivants. (POST / HTTP/1.1\r\nHost: domain...)
  3. Calcule la longueur du fragment (0x0D).
  4. Encode (0x0A) l'information de taille du fragment (uint) depuis la payload en chaîne.
  5. Injecte (0x09) l'information dans le registre de retour (H_REG_RET).
  6. Append (0x01) les 0x00000004 octets suivants. (\r\n\r\n)
  7. Injecte la payload (0x04)
  8. Initialise le Socket (0x05) en utilisant SSL/TLS, pour se connecter à un socket TCP à l'adresse IP définie dans les 4 octets suivants (0x7F000001), et au port défini dans les 2 octets suivants (0x04D2).
  9. Envoie (0x06) la payload.
  10. Ferme (0x08) la connexion.

Exemple HTTPS utilisant l'API GitHub

L'exemple suivant suit les mêmes procédures que le précédent. Cependant, au lieu d'envoyer simplement la payload comme corps, le Protocole demandera à Harald de configurer certains en-têtes et de structurer le corps pour qu'il puisse communiquer avec l'API GitHub afin de publier des commentaires dans l'issue d'un dépôt privé.

Ce type de communication peut aider un attaquant à créer un canal de communication avec le serveur C2 en utilisant un domaine de confiance, comme *.github.com. Ce même exemple pourrait être extrapolé pour utiliser des ressources AWS (comme des files SQS sous sqs..amazonaws.com), des ressources Azure (comme des blobs sous <storage_account_name>.blob.core.windows.net) et ainsi de suite.

Cet exemple est une bonne référence pour les communications qui nécessitent un STRUCTURED_FORMAT (JSON) + APPLICATION-LAYER_PROTOL (HTTPS) + PROTOCOL (TCP).

root@kitploit:~
H_F_SPLIT, 0x00, 0x00, 0x00, 0xFF,
H_F_APPEND, 0x00, 0x00, 0x01, 0x85, 'P','O','S','T',' ',
'/','r','e','p','o','s','/','YOUR_GH_USER','/','YOUR_GH_REPO',
'/','i','s','s','u','e','s','/','ISSUE_NUMBER',
'/','c','o','m','m','e','n','t','s',' ',
'H','T','T','P','/','1','.','1','\r','\n', 'H','o','s','t',':','
','a','p','i','.','g','i','t','h','u','b','.','c','o','m','\r','\n',
'A','u','t','h','o','r','i','z','a','t','i','o','n',':',' '
,'B','e','a','r','e','r',' ','g','i','t','h','u','b','_','p','a','t','_',
'YOUR_GH_PAT','\r','\n',
'X','-','G','i','t','H','u','b','-',
'A','p','i','-','V','e','r','s','i','o','n',':','
', '2','0','2','2','-','1','1','-','2','8','\r','\n',
'U','s','e','r','-','A','g','e','n','t',':','
','H','a','r','a','l','d','/','0','.','1','b','\r','\n',
'A','c','c','e','p','t',':','
','a','p','p','l','i','c','a','t','i','o','n','/',
'v','n','d','.','g','i','t','h','u','b','+','j','s','o','n','\r','\n',
'C','o','n','t','e','n','t','-','T','y','p','e',':',' ',
'a','p','p','l','i','c','a','t','i','o','n','/',
'x','-','w','w','w','-','f','o','r','m','-',
'u','r','l','e','n','c','o','d','e','d','\r','\n',
'C','o','n','n','e','c','t','i','o','n',':','
','c','l','o','s','e','\r','\n',
'C','o','n','t','e','n','t','-','L','e','n','g','t','h',':',' ',
H_F_COMPUTE_FRAG_LENGTH,
H_F_ADD, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0B, H_REG_RET,
H_F_ENCODE_STR, 0x01, H_REG_RET, 'u',
H_F_INJECT, H_REG_RET,
H_F_APPEND, 0x00, 0x00, 0x00, 0x0D, '\r', '\n', '\r', '\n', '{', '"', 'b',
'o', 'd', 'y', '"', ':', '"',
H_F_PAYLOAD_INJECT,
H_F_APPEND, 0x00, 0x00, 0x00, 0x02, '"', '}',
H_F_SOCK_INIT, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0F, 
'a', 'p', 'i', '.',
'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '\0', 0x01, 0xBB,
H_F_SEND,
H_F_CLOSE
  1. Split (0x03) la payload en blocs allant jusqu'à 0x000000FF octets.
  2. Append (0x01) les 0x00000185 octets suivants. (POST /repos/... HTTP/1.1\r\n Host: domain...) Cela inclura les en-têtes pour l'API GH, comme Authorization, X-GitHubApi-Version, et ainsi de suite.
  3. Calcule la longueur du fragment (0x0D). Le résultat est stocké dans le registre H_REG_RET.
  4. Add (0x12) une valeur de longueur 0x00000001 0x0B au registre H_REG_RET. Cela prendra en compte les caractères '{"body":""}' dans l'en-tête Content-Length.
  5. Encode (0x0A) le registre H_REG_RET en chaîne.
  6. Injecte (0x09) l'information dans le registre de retour (H_REG_RET) dans la End Payload.
  7. Append (0x01) les 0x0000000D octets suivants. (\r\n\r\n{"body":")
  8. Injecte la payload (0x04).
  9. Append (0x01) les 0x00000002 octets suivants. ("})
  10. Initialise le Socket (0x05) pour se connecter à un domaine en utilisant SSL/TLS sur un socket TCP vers le domaine défini dans les 16 octets suivants (0x0000000F) et au port défini dans les 2 octets suivants (0x01BB).
  11. Envoie (0x06) la payload.
  12. Ferme (0x08) la connexion.

Prérequis

Vous aurez besoin d'un compilateur pour le construire. Tel que GCC, Clang, ou le CL de Microsoft. De plus, il y a quelques dépendances de bibliothèques :

Linux

Installez LibSSL et pkg-config :

root@kitploit:~
sudo apt install libssl-dev pkg-config

OSX

Installez OpenSSL via brew ou construisez-le et configurez-le vous-même.

root@kitploit:~
brew install openssl

Windows

Obtenez OpenSSL auprès de l'un de leurs distributeurs liés ou construisez-le et configurez-le vous-même.

BUILD

Le dépôt contient un Makefile pour construire la bibliothèque et quelques binaires de test.

Pour construire la bibliothèque Harald, exécutez :

root@kitploit:~
make lib

Cela créera une bibliothèque partagée libharald.so, libharald.dll, ou libharald.dylib selon votre plateforme.

Pour construire les binaires de test, exécutez :

root@kitploit:~
make test

Cela créera deux binaires : test_harald et test_harald_gh (avec leurs extensions respectives, selon votre plateforme).

TEST

Pour tester les fonctionnalités de Harald, exécutez les serveurs provisionnés socket_server_test.py et https_server_test.py. Ceux-ci créeront respectivement un socket et un serveur HTTPS à utiliser par les binaires de test.

Note : Vous devrez peut-être définir votre LD_LIBRARY_PATH sur le dossier courant : LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./test_harald

Vous devrez créer un certificat SSL/TLS pour la communication HTTPS (auto-signé est acceptable). Vous pouvez en créer un en utilisant OpenSSL avec la commande suivante :

root@kitploit:~
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

Une fois les serveurs démarrés et en cours d'exécution, exécutez le binaire test_harald :

root@kitploit:~
./test_harald

Le binaire devrait se connecter aux serveurs provisionnés et envoyer les payloads de données prédéfinies comme spécifié dans le protocole.

Test de l'API GitHub

Pour tester les fonctionnalités de l'API GitHub, quelques préparatifs doivent être effectués avant d'exécuter le binaire test_harald_gh.

Créez un dépôt et une issue.

Le fichier test_harald_gh.c contient un exemple simple de la façon d'utiliser Harald pour interagir avec l'API GitHub afin de créer des commentaires dans des issues. Il nécessite que vous ayez un jeton d'accès pour GitHub, qui peut être obtenu depuis les paramètres de votre compte GitHub sous Developer settings -> Personal access tokens -> Fine-grained tokens. Il est recommandé de restreindre le jeton pour n'obtenir l'accès qu'au dépôt nouvellement créé et aux permissions Read access to metadata et Read and Write access to issues and pull requests.

Pour fonctionner correctement, vous devrez modifier les valeurs de remplacement pour :

  • YOUR_GH_USER : Votre nom d'utilisateur GitHub.
  • ISSUE_NUMBER : Le numéro d'issue sur le dépôt avec lequel vous voulez interagir (par exemple, "1" pour la première issue d'un dépôt).
  • YOUR_GH_REPO : Le nom du dépôt avec lequel vous voulez interagir (par exemple, "harald").
  • YOUR_GH_PAT : Votre jeton d'accès GitHub.

Une fois fait, assurez-vous de mettre à jour la taille de la payload envoyée pour correspondre à vos besoins !

À test_harald_gh.c#L9, le 4ème paramètre de l'opcode H_F_APPEND représente la taille de la payload. Vous devrez mettre à jour cette valeur en conséquence lorsque vous modifiez la structure de la payload.

Construisez les binaires de test et exécutez celui-ci :

root@kitploit:~
./test_harald_gh

Cela créera un commentaire dans l'issue fournie.

Avertissement d'utilisation acceptable

Le code source contenu dans ce dépôt peut être utilisé pour contourner le filtrage réseau et réduire le risque de détection par les appliances de sécurité. Avant d'utiliser ce code source, veuillez vous assurer que votre utilisation est conforme à toutes les lois applicables dans votre juridiction.

Télécharger l’outil
H_F_SUBSTRACT::0x13Soustrait deux registres ou un nombre à un registreIsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2
H_F_READ::0x14Lit depuis un registre donné jusqu'à la longueur stockée dans un autre registreFromReg::1, SizeReg::1
H_F_STORE::0x15Stocke une valeur de registre dans le Storage de HaraldReg::1