Tâches
Une tâche (job) est le moyen qu'utilise Red Kite pour trouver de nouvelles informations. Elle est lancée par Red Kite et s'exécute dans un environnement isolé. Des tâches différentes produisent des findings différents. Il est possible d'utiliser une variable de sortie d'un finding comme paramètre de tâche. Un paramètre de tâche est l'une des variables d'entrée d'une tâche.
Lorsque vous faites référence à une variable de sortie d'un finding par son nom (ex. : ${domainName}), le nom de la variable n'est pas
sensible à la casse.
Une tâche peut produire plusieurs findings, d'un ou de plusieurs types.
Types de tâches
Red Kite prend en charge plusieurs types de tâches.
Les types de tâches sont :
Pour plus d'information sur l'implémentation des tâches, consultez le guide Implémenter une tâche.
Tâche Python
| Type | Langage |
|---|---|
| Code | Python |
Une tâche Python est la façon standard de créer une tâche. Elle offre une flexibilité totale, mais vous devez l'implémenter vous-même.
Les tâches Python incluent un SDK intégré qui vous aide à produire correctement des findings et des journaux.
Tâche Nuclei
| Type | Langage |
|---|---|
| Nuclei | Yaml |
Une tâche Nuclei utilise Nuclei de Project Discovery pour exécuter des modèles Nuclei et produire des findings que Red Kite comprend. Elle inclut un analyseur intégré, mais s'il ne répond pas à vos besoins, vous pouvez préciser un gestionnaire de findings personnalisé. Ce gestionnaire personnalisé se charge d'analyser les findings Nuclei et de produire des findings compatibles avec Red Kite. Il est écrit en Python. Rassurez-vous : un modèle, une classe personnalisée et le SDK Python sont disponibles pour vous aider.
Pour lancer une tâche Nuclei à partir du lanceur, vous devez préciser les paramètres suivants :
| Nom | Exemple de valeur | Identifie une ressource | Description |
|---|---|---|---|
| targetIp | 1.1.1.1 | x | L'adresse IP du serveur cible. |
| port | 443 | x | Le port auquel se connecter pour joindre le serveur. |
| domainName | example.com | x | Le nom de domaine à cibler ou, pour les sites web, le nom utilisé pour accéder à l'hôte virtuel. |
| path | / | x | Le chemin du serveur où se trouve le site web. Sert à identifier le site web. |
| ssl | true | Précise si le protocole à utiliser est HTTP ou HTTPS. | |
| endpoint | /example.php | Permet de cibler un site web à un point de terminaison précis sans changer le site web ciblé. | |
| stalkerOutputType | domain | Le type de ressource auquel associer les findings émis. Valeurs possibles : "domain", "host", "port" et "website". | |
| outputFindingName | MyExampleFinding | Le nom du finding émis. C'est cette valeur à laquelle un abonnement sur événement réagirait, dans le tableau des findings de l'abonnement. |
Cibler un site web identifié par l'IP 1.1.1.1, le port 443, le domaine example.com et le chemin /, au point de terminaison
/example.txt, revient à cibler l'URL https://example.com/example.txt. Dans ce cas, l'IP et le chemin servent uniquement à rattacher les
findings au bon site web.
Voici les combinaisons de paramètres possibles pour cibler les différents types de ressources :
| Ressource | Paramètres requis | Paramètres facultatifs |
|---|---|---|
| Domaine | domainName | |
| Hôte | targetIp | |
| Port | targetIp, port | |
| Site web | domainName, targetIp, port, path, ssl | endpoint |
Peu importe le type de ressource ciblé, si aucun gestionnaire personnalisé n'est fourni, les deux paramètres suivants sont aussi requis :
| Nom | Exemple de valeur | Description |
|---|---|---|
| stalkerOutputType | domain | Le type de ressource auquel associer les findings émis. Valeurs possibles : "domain", "host", "port" et "website". |
| outputFindingName | MyExampleFinding | Le nom du finding émis. C'est cette valeur à laquelle un abonnement sur événement réagirait, dans le tableau des findings de l'abonnement. |
Si un gestionnaire personnalisé est fourni, vous pouvez omettre les valeurs
stalkerOutputTypeetoutputFindingName.
Voici à quoi ressemblerait le lancement manuel de la tâche pour un website à https://example.com/, en ciblant le point de terminaison
https://example.com/example.txt, sans gestionnaire personnalisé :
parameters:
- name: stalkerOutputType
value: website
- name: outputFindingName
value: MyWebsiteFinding
- name: targetIp
value: "1.1.1.1"
- name: port
value: 443
- name: domainName
value: example.com
- name: path
value: "/"
- name: ssl
value: true
- name: endpoint
value: "/example.txt"
Tâches intégrées
Red Kite inclut d'emblée une solide sélection de tâches intégrées, maintenues par Red Kite.
Les tâches intégrées sont gérées par Red Kite et ne peuvent donc pas être modifiées. Pour adapter l'une de nos tâches, dupliquez-la et modifiez la copie. Lorsque vous êtes prêt, utilisez la copie et désactivez l'originale.
| Nom | Description | Type | Langage |
|---|---|---|---|
| DomainNameResolvingJob | Résout un nom de domaine en adresse IP | Code | Python |
| TcpPortScanningJob | Analyse les ports TCP d'une adresse IP | Code | Python |
| TcpIpRangeScanningJob | Analyse une plage d'adresses IP à la recherche de ports ouverts | Code | Python |
| BannerGrabbingJob | Identifie le service qui s'exécute sur un port | Code | Python |
| WebsiteCrawlingJob | Explore un site web pour trouver ses points de terminaison valides | Code | Python |
| WebsiteScreenshotJob | Prend une capture d'écran d'une page web. | Code | Python |
| AmassDomainDiscoveryJob | Utilise Amass pour trouver des informations liées à un domaine | Code | Python |
| CertificateValidationJob | Analyse un certificat pour le valider | Code | Python |
| DomainSecurityScannerJob | Valide la configuration courriel d'un domaine, comme DKIM, DMARC, etc. | Code | Python |
| IpGeolocationJob | Géolocalise une adresse IP. | Code | Python |
| SubdomainBruteforceJob | Trouve par force brute les sous-domaines d'un domaine pour découvrir de nouveaux domaines. | Code | Python |
| WafIdentificationJob | Détermine si un WAF protège un site web, et lequel. | Code | Python |
DomainNameResolvingJob
Une tâche DomainNameResolvingJob prend un nom de domaine et le résout en une ou plusieurs adresses IP.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| domainName | string | Un FQDN à résoudre en adresse IP |
Findings pouvant être produits :
- HostnameIpFinding
TcpPortScanningJob
Analyse les ports TCP d'un hôte.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| targetIp | string | L'adresse IPv4 de l'hôte à analyser. |
| threads | number | Le nombre de fils d'exécution actifs pour l'analyse. 1 <= t <= 1000 |
| socketTimeoutSeconds | number | Le temps d'attente, en secondes, avant que l'analyseur considère un port comme fermé et abandonne. Un nombre à virgule flottante. 0 < t <= 3 |
| portMin | number | Le premier port à analyser. 1 <= portMin < portMax |
| portMax | number | Le dernier port à analyser. portMin < portMax <= 65535 |
| ports | number[] | Un tableau JSON. Chaque port qu'il contient sera analysé. Ex. : [3389, 8000, 8080, 8443] |
Findings pouvant être produits :
- PortFinding
TcpIpRangeScanningJob
Analyse une plage d'adresses IP (ex. : 1.2.3.4/24) à la recherche de ports ouverts. Elle découvre ainsi des hôtes et signale les ports
ouverts.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| targetIp | string | L'IP de la plage à analyser |
| targetMask | number | Le masque de la plage, par exemple 16 pour /16 |
| rate | number | La vitesse d'analyse de Masscan (paquets/seconde) |
| portMin | number | Le premier port à analyser. 1 <= portMin < portMax |
| portMax | number | Le dernier port à analyser. portMin < portMax <= 65535 |
| ports | number[] | Un tableau JSON. Chaque port qu'il contient sera analysé. Ex. : [3389, 8000, 8080, 8443] |
Findings pouvant être produits :
- HostFinding
- PortFinding
BannerGrabbingJob
Identifie le service qui s'exécute sur un port et récupère sa bannière. Elle peut parfois trouver le système d'exploitation de l'hôte, et parfois aussi d'autres noms de domaine.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| targetIp | string | L'adresse IP à vérifier |
| ports | number[] | Les ports sur lesquels chercher un service |
| nmapOptions | string | Une longue chaîne contenant les options passées à nmap |
Findings pouvant être produits :
- PortServiceFinding
- HostnameIpFinding
- OperatingSystemFinding
WebsiteCrawlingJob
Explore un site web pour trouver ses différents points de terminaison valides. Elle peut aussi trouver des informations sur les technologies du site web.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| targetIp | string | L'adresse IP du site web |
| port | number | Le port du site web |
| domainName | string | Le nom de domaine du site web |
| path | string | Le chemin de base du site web |
| ssl | bool | Si le site web utilise HTTPS |
| maxDepth | number | La profondeur d'exploration |
| crawlDurationSeconds | number | La durée maximale d'exploration, en secondes |
| fetcherConcurrency | number | Le nombre de récupérateurs simultanés pour obtenir les données |
| inputParallelism | number | Le nombre d'entrées traitées simultanément |
| extraOptions | string | Options supplémentaires de Katana pour adapter l'exécution |
Findings pouvant être produits :
- WebsitePathFinding
- WebsiteTechnologyFinding
WebsiteScreenshotJob
Prend une capture d'écran d'une page web.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| targetIp | string | L'adresse IP du site web |
| port | number | Le port du site web |
| domainName | string | Le nom de domaine du site web |
| path | string | Le chemin de base du site web |
| ssl | bool | Si le site web utilise HTTPS |
| endpoint | string | Le point de terminaison du site web à cibler |
| finding | string | (Facultatif, par défaut : WebsiteScreenshotFinding) Le nom du finding émis |
| findingTitle | string | (Facultatif, par défaut : Website screenshot) Le titre du finding émis |
Findings pouvant être produits :
- WebsiteScreenshotFinding
AmassDomainDiscoveryJob
Utilise Amass, de l'OWASP, pour trouver des relations entre domaines, des sous-domaines, des adresses IP, des organisations, etc.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| domainNames | string[] | Un tableau de FQDN à résoudre en adresses IP |
| timeoutMinutes | number | Un délai d'expiration pour Amass, en minutes |
Findings pouvant être produits :
- HostnameFinding
- HostnameIpFinding
- IpFinding
- AmassDomainReportFinding
- AmassHostReportFinding
- RirOrgFinding
De plus, Amass utilise le fichier datasources.yaml pour stocker les clés d'API de plusieurs sources de données possibles. Pour utiliser
cette fonctionnalité dans la tâche de Red Kite, vous pouvez fournir dynamiquement les valeurs de datasources.yaml comme paramètres, à
partir des secrets de Red Kite, en respectant la syntaxe prévue.
Définir la clé d'API d'une source de données pour Amass
Pour définir une clé d'API dans le contenu de datasources.yaml à partir d'un paramètre Red Kite, respectez simplement la convention de
nommage s_NAME_path_to_key : le préfixe s_, le nom de la source de données ciblée à la place de NAME, un trait de soulignement _,
puis le chemin yaml complet vers la clé d'API à définir. La tâche cherche les paramètres nommés de cette façon pour remplir dynamiquement le
fichier yaml.
Dans l'exemple suivant, nous définissons la clé d'API de la source de données Shodan.
D'abord, créez un secret contenant la clé d'API de Shodan. Donnez-lui un nom parlant, comme ShodanApiKey.
Ensuite, utilisez le secret ShodanApiKey dans un paramètre de tâche. Pour ce faire, il faut repérer l'emplacement de la clé dans la
structure du fichier datasources.yaml.
Voici, pour référence, une partie du fichier datasources.yaml où nous voulons définir la clé d'API de Shodan :
datasources:
- name: 360PassiveDNS
ttl: 3600
creds:
account:
apikey: null
# [...]
- name: Shodan # Le nom de la source de données ciblée
ttl: 10080
creds:
account:
apikey: null # L'endroit où la clé d'API est définie
- name: Spamhaus
ttl: 1440
creds:
account:
username: null
password: null
# [...]
global_options:
minimum_ttl: 1440
La structure complète du fichier est disponible dans le dépôt.
Ici, pour définir la clé d'API de Shodan, vous devez nommer votre paramètre de tâche s_Shodan_creds_account_apikey et lui donner la valeur
du secret créé, ShodanApiKey.
Pour un lancement ponctuel de la tâche, vos paramètres ressembleraient donc à ceci :
parameters:
- name: domainNames
value:
- example.com
- www.example.com
- name: timeoutMinutes
value: 120
- name: s_Shodan_creds_account_apikey # Le nom de variable qui indique l'emplacement dans datasources.yaml
value: ${ secrets.ShodanApiKey } # L'injection de la valeur du secret
Pour inclure votre secret ShodanApiKey dans l'abonnement qui lance cette tâche (nommé Extended discovery for domain names), ajoutez-le
de la même façon à ses paramètres.
CertificateValidationJob
Analyse un certificat pour le valider.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| targetIp | string | L'adresse IP du site web |
| port | number | Le port du site web |
| domainName | string | Le nom de domaine du site web |
| path | string | Le chemin de base du site web |
| ssl | bool | Si le site web utilise HTTPS |
Findings pouvant être produits :
- CertificateFinding
DomainSecurityScannerJob
Valide la configuration courriel d'un domaine, comme DKIM, DMARC, etc.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| domainNames | string[] | Les domaines à valider |
Findings pouvant être produits :
- DomainSecurityReportFinding
IpGeolocationJob
Géolocalise une adresse IP.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| targetIp | string | L'adresse IP à géolocaliser |
Findings pouvant être produits :
- IpGeolocationFinding
SubdomainBruteforceJob
Trouve par force brute les sous-domaines d'un domaine pour découvrir de nouveaux domaines inconnus.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| domainName | string | Le domaine à analyser par force brute |
Findings pouvant être produits :
- HostnameFinding
- HostnameIpFinding
- WildcardDomainFinding
WafIdentificationJob
Détermine si un WAF protège un site web, et lequel.
Variables d'entrée :
| Nom de la variable | Type | Description de la valeur |
|---|---|---|
| targetIp | string | L'adresse IP du site web |
| port | number | Le port du site web |
| domainName | string | Le nom de domaine du site web |
| path | string | Le chemin de base du site web |
| ssl | bool | Si le site web utilise HTTPS |
Findings pouvant être produits :
- WafFinding