
Générer une liste de domaines potentiels de typosquattage avec un moteur de permutation de noms de domaine pour alimenter AIL et d'autres systèmes.
ail-typo-squatting est une bibliothèque Python permettant de générer une liste de domaines potentiels de typosquatting avec un moteur de permutation de noms de domaine pour alimenter AIL et d'autres systèmes.
L'outil peut être utilisé de manière autonome ou pour alimenter d'autres systèmes.
Si vous ne souhaitez pas utiliser la bibliothèque Python, https://typosquatting-finder.circl.lu/ est un service en ligne qui utilise cette bibliothèque.
Python 3.6+
bibliothèque inflect
ail-typo-squatting peut être installé avec poetry. Si vous n'avez pas poetry installé, vous pouvez faire la commande suivante curl -sSL https://install.python-poetry.org | python3 -.
$ poetry install
$ poetry shell
$ cd ail-typo-squatting
$ python typo.py -h
$ pip3 install ail-typo-squatting
dacru@dacru:~/git/ail-typo-squatting/bin$ python3 typo.py --help
usage: typo.py [-h] [-v] [-dn DOMAINNAME [DOMAINNAME ...]] [-fdn FILEDOMAINNAME] [-o OUTPUT] [-fo FORMATOUTPUT] [-br] [-dnsr] [-dnsl] [-l LIMIT] [-var] [-ko] [-a] [-om] [-repe] [-repl] [-drepl] [-cho]
[-add] [-md] [-sd] [-vs] [-ada] [-hg] [-ahg] [-cm] [-hp] [-wt] [-wsld] [-at] [-sub] [-sp] [-cdd] [-addns] [-uddns] [-ns] [-combo] [-ca]
optional arguments:
-h, --help show this help message and exit
-v verbose, more display
-dn DOMAINNAME [DOMAINNAME ...], --domainName DOMAINNAME [DOMAINNAME ...]
list of domain name
-fdn FILEDOMAINNAME, --filedomainName FILEDOMAINNAME
file containing list of domain name
-o OUTPUT, --output OUTPUT
path to ouput location
-fo FORMATOUTPUT, --formatoutput FORMATOUTPUT
format for the output file, yara - regex - yaml - text. Default: text
-br, --betterregex Use retrie for faster regex
-dnsr, --dnsresolving
resolve all variation of domain name to see if it's up or not
-dnsl, --dnslimited resolve all variation of domain name but keep only up domain in final result json
-l LIMIT, --limit LIMIT
limit of variations for a domain name
-var, --givevariations
give the algo that generate variations
-ko, --keeporiginal Keep in the result list the original domain name
-a, --all Use all algo
-om, --omission Leave out a letter of the domain name
-repe, --repetition Character Repeat
-repl, --replacement Character replacement
-drepl, --doublereplacement
Double Character Replacement
-cho, --changeorder Change the order of letters in word
-add, --addition Add a character in the domain name
-md, --missingdot Delete a dot from the domain name
-sd, --stripdash Delete of a dash from the domain name
-vs, --vowelswap Swap vowels within the domain name
-ada, --adddash Add a dash between the first and last character in a string
-hg, --homoglyph One or more characters that look similar to another character but are different are called homogylphs
-ahg, --all_homoglyph
generate all possible homoglyph permutations. Ex: circl.lu, e1rc1.lu
-cm, --commonmisspelling
Change a word by is misspellings
-hp, --homophones Change word by an other who sound the same when spoken
-wt, --wrongtld Change the original top level domain to another
-wsld, --wrongsld Change the original second level domain to another
-at, --addtld Adding a tld before the original tld
-sub, --subdomain Insert a dot at varying positions to create subdomain
-sp, --singularpluralize
Create by making a singular domain plural and vice versa
-cdd, --changedotdash
Change dot to dash
-addns, --adddynamicdns
Add dynamic dns at the end of the domain
-uddns, --updatedynamicdns
Update dynamic dns warning list
-ns, --numeralswap Change a numbers to words and vice versa. Ex: circlone.lu, circl1.lu
-combo Combine multiple algo on a domain name
-ca, --catchall Combine with -dnsr. Generate a random string in front of the domain.
ail-project.org et circl.lu, en utilisant tous les algorithmes.dacru@dacru:~/git/ail-typo-squatting/bin$ python3 typo.py -dn ail-project.org circl.lu -a -o .
dacru@dacru:~/git/ail-typo-squatting/bin$ python3 typo.py -fdn domain.txt -co -sub -hyp -o . -fo yara
ail-project.org et circl.lu, en utilisant tous les algorithmes et la résolution DNS.dacru@dacru:~/git/ail-typo-squatting/bin$ python3 typo.py -dn ail-project.org circl.lu -a -dnsr -o .
ail-project.org et affichage de l'algorithme qui génère la variation (uniquement pour le format texte).dacru@dacru:~/git/ail-typo-squatting/bin$ python3 typo.py -dn ail-project.org -a -o - -var
from ail_typo_squatting import runAll
import math
resultList = list()
domainList = ["google.com"]
formatoutput = "yara"
pathOutput = "."
for domain in domainList:
resultList = runAll(
domain=domain,
limit=math.inf,
formatoutput=formatoutput,
pathOutput=pathOutput,
verbose=False,
givevariations=False,
keeporiginal=False
)
print(resultList)
resultList = list()
from ail_typo_squatting import formatOutput, omission, subdomain, addDash
import math
resultList = list()
domainList = ["google.com"]
limit = math.inf
formatoutput = "yara"
pathOutput = "."
for domain in domainList:
resultList = omission(domain=domain, resultList=resultList, verbose=False, limit=limit, givevariations=False, keeporiginal=False)
resultList = subdomain(domain=domain, resultList=resultList, verbose=False, limit=limit, givevariations=False, keeporiginal=False)
resultList = addDash(domain=domain, resultList=resultList, verbose=False, limit=limit, givevariations=False, keeporiginal=False)
print(resultList)
formatOutput(format=formatoutput, resultList=resultList, domain=domain, pathOutput=pathOutput, givevariations=False)
resultList = list()
Il y a 4 formats possibles pour le fichier de sortie :
Pour le fichier Text, chaque ligne est une variation.
ail-project.org
il-project.org
al-project.org
ai-project.org
ailproject.org
ail-roject.org
ail-poject.org
ail-prject.org
ail-proect.org
ail-projct.org
ail-projet.org
ail-projec.org
aail-project.org
aiil-project.org
...
Pour le fichier Yara, chaque règle est une variation.
rule ail-project_org {
meta:
domain = "ail-project.org"
strings:
$s0 = "ail-project.org"
$s1 = "il-project.org"
$s2 = "al-project.org"
$s3 = "ai-project.org"
$s4 = "ailproject.org"
$s5 = "ail-roject.org"
$s6 = "ail-poject.org"
$s7 = "ail-prject.org"
$s8 = "ail-proect.org"
$s9 = "ail-projct.org"
$s10 = "ail-projet.org"
$s11 = "ail-projec.org"
condition:
any of ($s*)
}
Pour le fichier Regex, chaque variation est transformée en regex et concaténée avec les autres pour ne former qu'une seule grande regex.
ail\-project\.org|il\-project\.org|al\-project\.org|ai\-project\.org|ailproject\.org|ail\-roject\.org|ail\-poject\.org|ail\-prject\.org|ail\-proect\.org|ail\-projct\.org|ail\-projet\.org|ail\-projec\.org
Pour le fichier Sigma, chaque variation est listée sous la clé variations.
title: ail-project.org
variations:
- ail-project.org
- il-project.org
- al-project.org
- ai-project.org
- ailproject.org
- ail-roject.org
- ail-poject.org
- ail-prject.org
- ail-proect.org
- ail-projct.org
- ail-projet.org
- ail-projec.org
Si la résolution DNS est sélectionnée, un fichier supplémentaire sera créé au format JSON.
Chaque clé correspond à une variation et peut avoir un champ "ip" si le nom de domaine a été résolu. Le champ "NotExist" sera présent à chaque fois avec une valeur booléenne pour déterminer si le domaine existe ou non.
{
"circl.lu": {
"NotExist": false,
"ip": [
"185.194.93.14"
]
},
"ircl.lu": {
"NotExist": true
},
"crcl.lu": {
"NotExist": true
},
"cicl.lu": {
"NotExist": true
},
"cirl.lu": {
"NotExist": true
},
"circ.lu": {
"NotExist": true
},
"ccircl.lu": {
"NotExist": true
},
"ciircl.lu": {
"NotExist": true
},
...
}

Le projet a été cofinancé par CEF-TC-2020-2 - 2020-EU-IA-0260 - JTAN - Joint Threat Analysis Network.
| Algo | Description |
|---|
| AddDash | Ces typos sont créées en ajoutant un trait d'union entre le premier et le dernier caractère d'une chaîne. |
| Addition | Ces typos sont créées en ajoutant un caractère au nom de domaine. |
| AddDynamicDns | Ces typos sont créées en ajoutant un DNS dynamique à la fin du domaine d'origine. |
| AddTld | Ces typos sont créées en ajoutant un TLD avant le TLD correct. Exemple : google.com devient google.com.it |
| ChangeDotDash | Ces typos sont créées en remplaçant un point par un trait d'union. |
| ChangeOrder | Ces typos sont créées en changeant l'ordre des lettres dans chaque partie du domaine. |
| Combo | Ces typos sont créées en combinant plusieurs algorithmes. Par exemple, circl.lu devient cirl6.lu |
| CommonMisspelling | Ces typos sont créées en remplaçant un mot par sa faute d'orthographe. Plus de 8000 fautes d'orthographe courantes issues de Wikipédia. Par exemple, www.youtube.com devient www.youtub.com et www.abseil.com devient www.absail.com. |
| Double Replacement | Ces typos sont créées en remplaçant des lettres identiques et consécutives du nom de domaine. |
| Homoglyph | Ces typos sont créées en remplaçant des caractères par d'autres caractères qui se ressemblent mais sont différents. Par exemple, le l minuscule ressemble au chiffre un, c'est-à-dire l vs 1. Par exemple, google.com devient goog1e.com. |
| Homophones | Ces typos sont créées en remplaçant un mot par un autre qui se prononce de la même façon. Plus de 450 ensembles de mots qui se prononcent de la même façon. Par exemple, www.base.com devient www.bass.com. |
| MissingDot | Ces typos sont créées en supprimant un point du nom de domaine. |
| NumeralSwap | Ces typos sont créées en remplaçant un nombre par des mots et vice versa. Par exemple, circlone.lu devient circl1.lu. |
| Omission | Ces typos sont créées en omettant une lettre du nom de domaine, une lettre à la fois. |
| Repetition | Ces typos sont créées en répétant une lettre du nom de domaine. |
| Replacement | Ces typos sont créées en remplaçant chaque lettre du nom de domaine. |
| StripDash | Ces typos sont créées en supprimant un trait d'union du nom de domaine. |
| SingularPluralize | Ces typos sont créées en transformant un domaine singulier en pluriel et vice versa. |
| Subdomain | Ces typos sont créées en plaçant un point dans le nom de domaine afin de créer un sous-domaine. Exemple : google.com devient goo.gle.com |
| VowelSwap | Ces typos sont créées en échangeant les voyelles du nom de domaine, sauf pour la première lettre. Par exemple, www.google.com devient www.gaagle.com. |
| WrongTld | Ces typos sont créées en changeant le domaine de premier niveau d'origine par un autre. Par exemple, www.trademe.co.nz devient www.trademe.co.mz et www.google.com devient www.google.org. Utilise les 19 domaines de premier niveau les plus courants. |
| WrongSld | Ces typos sont créées en changeant le domaine de deuxième niveau d'origine par un autre. Par exemple, www.trademe.co.uk devient www.trademe.ac.uk et www.google.com restera www.google.com. |