Scanner de ports TCP, envoie des paquets SYN de manière asynchrone, scannant l'ensemble d'Internet en moins de 5 minutes.
Ceci est un scanner de ports à l'échelle d'Internet. Il peut scanner l'ensemble d'Internet en moins de 5 minutes, en transmettant 10 millions de paquets par seconde, à partir d'une seule machine.
Son utilisation (paramètres, sortie) est similaire à nmap, le scanner de ports le plus célèbre.
En cas de doute, essayez l'une de ces fonctionnalités – les fonctionnalités qui prennent en charge le balayage généralisé de nombreuses machines sont supportées, tandis que le balayage approfondi de machines individuelles ne l'est pas.
En interne, il utilise une transmission asynchrone, similaire aux scanners de ports comme scanrand, unicornscan et ZMap. Il est plus flexible, permettant des plages de ports et d'adresses arbitraires.
NOTE : masscan utilise sa propre pile TCP/IP ad hoc. Toute autre chose qu'un simple scan de ports peut causer un conflit avec la pile TCP/IP locale. Cela signifie que vous devez utiliser soit l'option --src-ip pour exécuter à partir d'une adresse IP différente, soit utiliser pour configurer les ports source que masscan utilise, puis également configurer le pare-feu interne (comme ou ) pour protéger ces ports du reste du système d'exploitation.
--src-portpfiptablesCet outil est gratuit, mais envisagez de contribuer financièrement à son développement : Adresse du portefeuille Bitcoin : 1MASSCANaHUiyTtR3bJ2sLGuMw5kDBaj4T
Sur Debian/Ubuntu, cela se passe à peu près comme suit. Il n'a vraiment aucune dépendance autre qu'un compilateur C (comme gcc ou clang).
sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
Cela place le programme dans le sous-répertoire masscan/bin.
Pour l'installer (sur Linux) exécutez :
make install
Le code source se compose de nombreux petits fichiers, donc la compilation est beaucoup plus rapide en utilisant la compilation multi-thread. Cela nécessite plus de 2 Go sur un Raspberry Pi (et plante), donc vous pouvez utiliser un nombre plus petit, comme -j4 plutôt que tous les threads possibles.
make -j
Bien que Linux soit la plateforme cible principale, le code fonctionne bien sur de nombreux autres systèmes (Windows, macOS, etc.). Voici quelques informations de compilation supplémentaires :
makemakegmakecc src/*.c -o bin/masscanSur macOS, les binaires x86 semblent fonctionner aussi rapidement sous émulation ARM.
L'utilisation est similaire à nmap. Pour scanner un segment réseau pour certains ports :
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
Cela va :
10.x.x.x et les sous-réseaux 2603:3001:2d00:da00::x<stdout> qui peut être redirigée vers un fichierPour voir la liste complète des options, utilisez la fonction --echo. Cela vide la configuration actuelle et quitte. Cette sortie peut être utilisée comme entrée dans le programme :
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf
# masscan -c xxx.conf --rate 1000
Masscan peut faire plus que simplement détecter si les ports sont ouverts. Il peut également compléter la connexion TCP et l'interaction avec l'application sur ce port pour récupérer de simples informations de « bannière ».
Masscan prend en charge la vérification des bannières sur les protocoles suivants :
Le problème est que masscan contient sa propre pile TCP/IP distincte du système sur lequel vous l'exécutez. Lorsque le système local reçoit un SYN-ACK de la cible sondée, il répond avec un paquet RST qui tue la connexion avant que masscan ne puisse récupérer la bannière.
Le moyen le plus simple d'éviter cela est d'attribuer à masscan une adresse IP séparée. Cela ressemblerait à l'un des exemples suivants :
# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
# masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d
L'adresse que vous choisissez doit se trouver sur le sous-réseau local et ne pas être utilisée par un autre système. Masscan vous avertira que vous avez fait une erreur, mais vous pourriez avoir perturbé les communications de l'autre machine pendant plusieurs minutes, alors soyez prudent.
Dans certains cas, comme le WiFi, ce n'est pas possible. Dans ces cas, vous pouvez configurer un pare-feu sur le port que masscan utilise. Cela empêche la pile TCP/IP locale de voir le paquet, mais masscan le voit toujours car il contourne la pile locale. Pour Linux, cela ressemblerait à :
# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000
Vous voudrez probablement choisir des ports qui n'entrent pas en conflit avec les ports que Linux pourrait autrement choisir comme ports source. Vous pouvez voir la plage utilisée par Linux et reconfigurer cette plage en consultant le fichier :
/proc/sys/net/ipv4/ip_local_port_range
Sur la dernière version de Kali Linux (août 2018), cette plage est de 32768 à 60999, vous devriez donc choisir des ports soit en dessous de 32768, soit 61000 et au-dessus.
La définition d'une règle iptables ne dure que jusqu'au prochain redémarrage. Vous devez rechercher comment sauvegarder la configuration en fonction de votre distribution, par exemple en utilisant iptables-save et/ou iptables-persistent.
Sur Mac OS X et BSD, il y a des étapes similaires. Pour connaître les plages à éviter, utilisez une commande comme celle-ci :
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
Sur FreeBSD et les anciennes versions de MacOS, utilisez une commande ipfw :
# sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000
Sur les nouvelles versions de MacOS et OpenBSD, utilisez l'utilitaire de filtrage de paquets pf.
Modifiez le fichier /etc/pf.conf pour ajouter une ligne comme celle-ci :
block in proto tcp from any to any port 40000:40015
Ensuite, pour activer le pare-feu, exécutez la commande :
# pfctl -E
Si le pare-feu est déjà en cours d'exécution, redémarrez ou rechargez les règles avec la commande suivante :
# pfctl -f /etc/pf.conf
Windows ne répond pas avec des paquets RST, donc aucune de ces techniques n'est nécessaire. Cependant, masscan est toujours conçu pour fonctionner au mieux en utilisant sa propre adresse IP, vous devriez donc l'exécuter de cette façon lorsque c'est possible, même si ce n'est pas strictement nécessaire.
La même chose est nécessaire pour d'autres vérifications, comme la vérification --heartbleed, qui n'est qu'une forme de vérification de bannière.
Bien qu'utile pour des réseaux internes plus petits, le programme est vraiment conçu pour l'ensemble d'Internet. Cela pourrait ressembler à ceci :
# masscan 0.0.0.0/0 -p0-65535
Scanner l'ensemble d'Internet est mauvais. D'une part, certaines parties d'Internet réagissent mal au scan. D'autre part, certains sites suivent les scans et vous ajoutent à une liste de bannissement, ce qui vous fera être bloqué par le pare-feu de parties utiles d'Internet. Par conséquent, vous voulez exclure beaucoup de plages. Pour mettre sur liste noire ou exclure des plages, vous voulez utiliser la syntaxe suivante :
# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
Cela imprime simplement les résultats sur la ligne de commande. Vous voulez probablement les enregistrer dans un fichier à la place. Par conséquent, vous voulez quelque chose comme :
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
Cela enregistre les résultats dans un fichier XML, vous permettant de vider facilement les résultats dans une base de données ou autre.
Mais cela ne va qu'au taux par défaut de 100 paquets/seconde, ce qui prendra une éternité pour scanner Internet. Vous devez l'accélérer comme ceci :
# masscan 0.0.0.0/0 -p0-65535 --max-rate 100000
Cela augmente le taux à 100 000 paquets/seconde, ce qui scannera l'ensemble d'Internet (moins les exclusions) en environ 10 heures par port (ou 655 360 heures si on scanne tous les ports).
Ce qu'il faut remarquer dans cette ligne de commande, c'est que ce sont toutes des options compatibles avec nmap. De plus, des options « invisibles » compatibles avec nmap sont également définies pour vous : -sS -Pn -n --randomize-hosts --send-eth. De même, le format du fichier XML est inspiré de nmap. Il y a bien sûr beaucoup de différences, car la nature asynchrone du programme conduit à une approche fondamentalement différente du problème.
La ligne de commande ci-dessus est un peu lourde. Au lieu de tout mettre sur la ligne de commande, cela peut être stocké dans un fichier. Les paramètres ci-dessus ressembleraient à ceci :
# Mon scan
rate = 100000.00
output-format = xml
output-status = all
output-filename = scan.xml
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt
Pour utiliser ce fichier de configuration, utilisez -c :
# masscan -c myscan.conf
Cela facilite également les choses lorsque vous répétez un scan.
Par défaut, masscan charge d'abord le fichier de configuration /etc/masscan/masscan.conf. Tout paramètre de configuration ultérieur remplace ce qui se trouve dans ce fichier de configuration par défaut. C'est là que je mets mon paramètre "excludefile" pour ne jamais l'oublier. Cela fonctionne automatiquement.
Par défaut, masscan produit des fichiers texte assez volumineux, mais il est facile de les convertir dans n'importe quel autre format. Cinq formats de sortie sont pris en charge :
xml : Utilisez simplement le paramètre -oX <filename>.
Ou, utilisez les paramètres --output-format xml et --output-filename <filename>.
binary : C'est le format natif de masscan. Il produit des fichiers beaucoup plus petits, de sorte que lorsque je scanne Internet, mon disque ne se remplit pas. Ils doivent cependant être analysés. L'option de ligne de commande --readscan lira les fichiers de scan binaires. Utiliser --readscan avec l'option -oX produira une version XML du fichier de résultats.
grepable : C'est une implémentation de la sortie Nmap -oG qui peut être facilement analysée par les outils en ligne de commande. Utilisez simplement le paramètre -oG <filename>. Ou, utilisez les paramètres --output-format grepable et --output-filename <filename>.
json : Cela enregistre les résultats au format JSON. Utilisez simplement le paramètre -oJ <filename>. Ou, utilisez les paramètres --output-format json et --output-filename <filename>.
list : C'est une simple liste avec un hôte et une paire de ports par ligne. Utilisez simplement le paramètre -oL <filename>. Ou, utilisez les paramètres --output-format list et --output-filename <filename>. Le format est :
<port state> <protocol> <port number> <IP address> <POSIX timestamp>
open tcp 80 XXX.XXX.XXX.XXX 1390380064
Là où c'est raisonnable, tous les efforts ont été faits pour que le programme soit familier aux utilisateurs de nmap, même s'il est fondamentalement différent. Masscan est optimisé pour le balayage à grande échelle de nombreuses machines, tandis que nmap est conçu pour le balayage intensif d'une seule machine ou d'une petite plage.
Deux différences importantes sont :
-p <ports>nmap peut utiliser (comme 10.0.0-255.0-255).Vous pouvez considérer que masscan a les paramètres suivants activés en permanence :
-sS : effectue uniquement un scan SYN (actuellement, changera à l'avenir)-Pn : ne ping pas les hôtes en premier, ce qui est fondamental pour le fonctionnement asynchrone-n : aucune résolution DNS n'a lieu--randomize-hosts : scan complètement randomisé, toujours, vous ne pouvez pas changer cela--send-eth : envoie en utilisant libpcap brutSi vous voulez une liste de paramètres supplémentaires compatibles avec nmap, utilisez la commande suivante :
# masscan --nmap
Ce programme émet des paquets très rapidement. Sous Windows ou depuis des machines virtuelles, il peut atteindre 300 000 paquets/seconde. Sous Linux (sans virtualisation), il fera 1,6 million de paquets par seconde. C'est assez rapide pour faire fondre la plupart des réseaux.
Notez qu'il ne fera fondre que votre propre réseau. Il randomise les adresses IP cibles afin qu'il ne devrait pas submerger un réseau distant.
Par défaut, le débit est réglé à 100 paquets/seconde. Pour augmenter le débit à un million, utilisez quelque chose comme --rate 1000000.
Lors du scan d'Internet IPv4, vous scannerez de nombreux sous-réseaux, donc même s'il y a un débit élevé de paquets sortants, chaque sous-réseau cible recevra un faible débit de paquets entrants.
Cependant, avec le scan IPv6, vous aurez tendance à vous concentrer sur un seul sous-réseau cible avec des milliards d'adresses. Ainsi, votre comportement par défaut submergera le réseau cible. Les réseaux plantent souvent sous la charge que masscan peut générer.
Cette section décrit les principaux problèmes de conception du programme.
Le fichier main.c contient la fonction main(), comme vous vous y attendez. Il contient également les fonctions transmit_thread() et receive_thread(). Ces fonctions ont été délibérément aplaties et fortement commentées afin que vous puissiez lire la conception du programme simplement en parcourant ligne par ligne chacune d'elles.
Il s'agit d'une conception asynchrone. En d'autres termes, c'est à nmap ce que le serveur web nginx est à Apache. Il a des threads d'émission et de réception séparés qui sont largement indépendants les uns des autres. C'est le même type de conception que celui trouvé dans scanrand, unicornscan et ZMap.
Parce qu'il est asynchrone, il fonctionne aussi vite que la transmission de paquets sous-jacente le permet.
Une différence clé entre Masscan et les autres scanners est la façon dont il randomise les cibles.
Le principe fondamental est d'avoir une seule variable d'index qui commence à zéro et est incrémentée de un pour chaque sonde. En code C, cela s'exprime comme :
for (i = 0; i < range; i++) {
scan(i);
}
Nous devons traduire l'index en une adresse IP. Disons que vous voulez scanner toutes les adresses IP « privées ». Ce serait la table des plages comme :
192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
Dans cet exemple, les 64k premiers index sont ajoutés à 192.168.x.x pour former l'adresse cible. Ensuite, les 16 millions suivants sont ajoutés à 10.x.x.x. Les index restants de la plage sont appliqués à 172.16.x.x.
Dans cet exemple, nous n'avons que trois plages. Lors du scan de l'ensemble d'Internet, nous avons en pratique plus de 100 plages. C'est parce que vous devez mettre sur liste noire ou exclure de nombreuses sous-plages. Cela découpe la plage souhaitée en centaines de plages plus petites.
Cela conduit à l'une des parties les plus lentes du code. Nous transmettons 10 millions de paquets par seconde et devons convertir une variable d'index en une adresse IP pour chaque sonde. Nous résolvons cela en effectuant une « recherche binaire » dans une petite quantité de mémoire. À ce débit de paquets, les efficacités de cache commencent à dominer les efficacités d'algorithme. Il existe beaucoup de techniques plus efficaces en théorie, mais elles nécessitent toutes tellement de mémoire qu'elles deviennent plus lentes en pratique.
Nous appelons la fonction qui traduit un index en une adresse IP la fonction pick(). En utilisation, cela ressemble à :
for (i = 0; i < range; i++) {
ip = pick(addresses, i);
scan(ip);
}
Masscan prend en charge non seulement les plages d'adresses IP, mais aussi les plages de ports. Cela signifie que nous devons sélectionner à partir de la variable d'index à la fois une adresse IP et un port. C'est assez simple :
range = ip_count * port_count;
for (i = 0; i < range; i++) {
ip = pick(addresses, i / port_count);
port = pick(ports, i % port_count);
scan(ip, port);
}
Cela conduit à une autre partie coûteuse du code. Les instructions de division/modulo sont d'environ 90 cycles d'horloge, soit 30 nanosecondes, sur les CPU x86. Lors de la transmission à un débit de 10 millions de paquets/seconde, nous n'avons que 100 nanosecondes par paquet. Je ne vois aucun moyen d'optimiser cela mieux. Heureusement, deux de ces opérations peuvent être exécutées simultanément, donc en faire deux, comme montré ci-dessus, n'est pas plus coûteux que d'en faire une.
Il existe en fait quelques optimisations faciles pour les problèmes de performance ci-dessus, mais elles reposent toutes sur i++, le fait que la variable d'index augmente une par une tout au long du scan. En réalité, nous devons randomiser cette variable. Nous devons randomiser l'ordre des adresses IP que nous scannons, sinon nous allons dévaster les réseaux cibles qui ne sont pas conçus pour ce niveau de vitesse. Nous devons répartir notre trafic uniformément sur la cible.
La façon dont nous randomisons est simplement en chiffrant la variable d'index. Par définition, le chiffrement est aléatoire et crée une correspondance biunivoque entre la variable d'index d'origine et la sortie. Cela signifie que pendant que nous parcourons linéairement la plage, les adresses IP de sortie sont complètement aléatoires. En code, cela ressemble à :
range = ip_count * port_count;
for (i = 0; i < range; i++) {
x = encrypt(i);
ip = pick(addresses, x / port_count);
port = pick(ports, x % port_count);
scan(ip, port);
}
Cela a également un coût majeur. Comme la plage est d'une taille imprévisible au lieu d'une puissance de 2 bien nette, nous ne pouvons pas utiliser de techniques binaires bon marché comme AND (&) et XOR (^). Au lieu de cela, nous devons utiliser des opérations coûteuses comme MODULO (%). Dans mes benchmarks actuels, il faut 40 nanosecondes pour chiffrer la variable.
Cette architecture permet de nombreuses fonctionnalités intéressantes. Par exemple, elle prend en charge les « fragments » (shards). Vous pouvez configurer 5 machines effectuant chacune un cinquième du scan ou range / shard_count. Les fragments peuvent être plusieurs machines, ou simplement plusieurs adaptateurs réseau sur la même machine, ou même (si vous le souhaitez) plusieurs adresses IP source sur le même adaptateur réseau.
Ou, vous pouvez utiliser une « graine » ou une « clé » pour la fonction de chiffrement, afin d'obtenir un ordre différent à chaque scan, comme x = encrypt(seed, i).
Nous pouvons également mettre le scan en pause en quittant le programme, et simplement mémoriser la valeur actuelle de i, puis le redémarrer plus tard. Je fais cela souvent pendant le développement. Je vois quelque chose qui ne va pas avec mon scan Internet, alors j'appuie sur pour arrêter le scan, puis je le redémarre après avoir corrigé le bug.
Une autre fonctionnalité est les retransmissions/réessais. Les paquets sont parfois perdus sur Internet, vous pouvez donc envoyer deux paquets dos à dos. Cependant, quelque chose qui perd un paquet peut perdre le paquet suivant immédiatement. Par conséquent, vous voulez envoyer la copie à environ 1 seconde d'intervalle. C'est simple. Nous avons déjà une variable 'rate', qui est le nombre de paquets par seconde auquel nous transmettons, donc la fonction de retransmission est simplement d'utiliser i + rate comme index. Un de ces jours, je vais faire une étude d'Internet et différencier les retransmissions « dos à dos », « 1 seconde », « 10 secondes » et « 1 minute » de cette manière pour voir s'il y a une différence dans ce qui est perdu.
La technique asynchrone est connue comme une solution au « problème c10k ». Masscan est conçu pour le niveau suivant de scalabilité, le « problème C10M ».
La solution C10M consiste à contourner le noyau. Il y a trois contournements de noyau principaux dans Masscan :
Masscan peut utiliser le pilote PF_RING DNA. Ce pilote transfère les paquets par DMA directement de la mémoire en mode utilisateur au pilote réseau sans aucune intervention du noyau. Cela permet au logiciel, même avec un CPU lent, de transmettre des paquets au taux maximal autorisé par le matériel. Si vous mettez 8 cartes réseau 10 Gbps dans un ordinateur, cela signifie qu'il pourrait transmettre à 100 millions de paquets/seconde.
Masscan a sa propre pile TCP intégrée pour récupérer les bannières des connexions TCP. Cela signifie qu'il peut facilement supporter 10 millions de connexions TCP simultanées, en supposant bien sûr que l'ordinateur dispose de suffisamment de mémoire.
Masscan n'a pas de « mutex ». Les mutex modernes (alias futexes) sont principalement en mode utilisateur, mais ils ont deux problèmes. Le premier problème est qu'ils provoquent un va-et-vient rapide des lignes de cache entre les CPU. Le second est qu'en cas de contention, ils effectuent un appel système dans le noyau, ce qui tue les performances. Un mutex sur le chemin rapide d'un programme limite sévèrement la scalabilité. Au lieu de cela, Masscan utilise des « anneaux » pour synchroniser les choses, par exemple lorsque la pile TCP en mode utilisateur dans le thread de réception doit transmettre un paquet sans interférer avec le thread d'émission.
Windows et Mac ne sont pas optimisés pour la transmission de paquets et n'atteignent qu'environ 300 000 paquets par seconde, alors que Linux peut en traiter 1 500 000 par seconde. C'est probablement plus rapide que ce dont vous avez besoin de toute façon.
Une prime est offerte pour les vulnérabilités, voir le fichier VULNINFO.md pour plus d'informations.
Ce projet utilise des fonctions sûres comme safe_strcpy() au lieu de fonctions non sécurisées comme strcpy().
Ce projet dispose de tests de régression unitaires automatisés (make regress).
Beaucoup d'efforts ont été dédiés à rendre les entrées/sorties similaires à nmap, que toute personne effectuant des scans de ports connaît (ou devrait connaître).
Masscan prend en charge IPv6, mais il n'y a pas de mode spécial, les deux sont supportés simultanément. (Il n'y a pas d'option -6 -- elle est toujours disponible).
Dans tout exemple d'utilisation de masscan, il suffit de mettre une adresse IPv6 là où vous voyez une adresse IPv4. Vous pouvez inclure des adresses IPv4 et IPv6 simultanément dans le même scan. La sortie inclut l'adresse appropriée au même endroit, sans marquage spécial.
N'oubliez pas que l'espace d'adressage IPv6 est vraiment vaste. Vous ne voudrez probablement pas scanner de grandes plages, sauf peut-être les 64 000 premières adresses d'un sous-réseau attribuées via DHCPv6.
Au lieu de cela, vous voudrez probablement scanner de grandes listes d'adresses stockées dans un fichier (--include-file filename.txt) que vous avez obtenues d'autres sources. Comme partout ailleurs, ce fichier peut contenir des listes d'adresses IPv4 et IPv6. Le fichier de test que j'utilise contient 8 millions d'adresses. Les fichiers de cette taille nécessitent quelques secondes supplémentaires pour être lus au démarrage (masscan trie les adresses et supprime les doublons avant le scan).
Rappelez-vous que masscan contient sa propre pile réseau. Ainsi, la machine locale à partir de laquelle vous exécutez masscan n'a pas besoin d'être configurée pour IPv6 -- bien que le réseau local doive pouvoir router les paquets IPv6.
Pour dépasser 2 millions de paquets par seconde, vous avez besoin d'un adaptateur Ethernet Intel 10 Gbps et d'un pilote spécial appelé "PF_RING ZC" de ntop. Masscan n'a pas besoin d'être reconstruit pour utiliser PF_RING. Pour utiliser PF_RING, vous devez construire les composants suivants :
libpfring.so (installé dans /usr/lib/libpfring.so)pf_ring.ko (leur pilote noyau)ixgbe.ko (leur version du pilote Ethernet Intel 10 Gbps)Vous n'avez pas besoin de construire leur version de libpcap.so.
Lorsque Masscan détecte qu'un adaptateur est nommé comme zc:enp1s0 au lieu de enp1s0, il bascule automatiquement en mode PF_RING ZC.
Une discussion plus détaillée peut être trouvée dans PoC||GTFO 0x15.
Le projet contient un test unitaire intégré :
$ make test
bin/masscan --selftest
selftest: success!
Cela teste de nombreux aspects délicats du code. Vous devriez le faire après la construction.
Pour tester les performances, exécutez quelque chose comme suit vers une adresse jetable, pour éviter de surcharger votre routeur local :
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11
Le faux --router-mac maintient les paquets sur les segments du réseau local afin qu'ils ne sortent pas sur Internet.
Vous pouvez également tester en mode « hors ligne », qui indique la vitesse à laquelle le programme s'exécute sans la surcharge de transmission :
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --offline
Ce deuxième benchmark montre approximativement la vitesse à laquelle le programme fonctionnerait s'il utilisait PF_RING, qui a une surcharge quasi nulle.
Au fait, l'algorithme de randomisation utilise massivement « l'arithmétique entière », une opération chroniquement lente sur les CPU. Les CPU modernes ont doublé la vitesse à laquelle ils effectuent ce calcul, rendant masscan beaucoup plus rapide.
Cet outil créé par Robert Graham : email: [email protected] twitter: @ErrataRob
Copyright (c) 2013 Robert David Graham
Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la GNU Affero General Public License telle que publiée par la Free Software Foundation, version 3 de la Licence.
Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans même la garantie implicite de QUALITÉ MARCHANDE ou d'ADÉQUATION À UN USAGE PARTICULIER. Voir la GNU Affero General Public License pour plus de détails.
Vous devriez avoir reçu une copie de la GNU Affero General Public License avec ce programme. Sinon, consultez https://www.gnu.org/licenses/.