
Masscanned (nom inspiré, bien sûr, de masscan) est un répondeur réseau. Son objectif est d'apporter des réponses génériques au plus grand nombre de protocoles possible, et avec le moins d'hypothèses possible sur les intentions du client.
Laissez-les parler en premier.
Tout comme masscan, masscanned implémente sa propre pile réseau utilisateur, de la même manière que honeyd. Il est conçu pour interagir autant que possible avec les scanners et les robots opportunistes et pour prendre en charge autant de protocoles que possible.
Par exemple, lorsqu'il reçoit des paquets réseau :
ARP who is-at avec ARP is-at (pour ses adresses IP),ICMP Echo Request avec ICMP Echo Reply ,TCP SYN (n'importe quel port) avec TCP SYN/ACK sur n'importe quel port,HTTP (n'importe quel verbe) sur TCP/UDP (n'importe quel port) avec une page Web HTTP 401 . 
Masscanned prend actuellement en charge les protocoles les plus courants aux couches 2-3-4 et quelques protocoles d'application.
$ cargo build
# ip netns add masscanned
# ip link add vethmasscanned type veth peer veth netns masscanned
# ip link set vethmasscanned up
# ip -n masscanned link set veth up
# ip addr add dev vethmasscanned 192.168.0.0/31
# ip netns exec masscanned ./target/debug/masscanned --iface veth -v[vv]
# arping 192.168.0.1
# ping 192.168.0.1
# nc -n -v 192.168.0.1 80
# nc -n -v -u 192.168.0.1 80
...
# apt install docker.io
$ cd masscanned/docker && docker build -t masscanned:test .
$ docker run --cap-add=NET_ADMIN masscanned:test
# arping 172.17.0.2
# ping 172.17.0.2
# nc -n -v 172.17.0.2 80
# nc -n -v -u 172.17.0.2 80
...
Une bonne utilisation de masscanned consiste à le déployer sur un VPS avec une ou plusieurs adresses IP publiques.
Pour utiliser les résultats, le meilleur moyen est de capturer tout le trafic réseau sur l'interface sur laquelle Masscanned écoute/répond. Les pcaps peuvent ensuite être analysés à l'aide de zeek et les fichiers de sortie peuvent généralement être poussés dans une instance de IVRE .
Une documentation sur la façon de déployer une instance de masscanned sur un VPS est à venir (voir numéro 2).
Network answering machine for various network protocols (L2-L3-L4 + applications)
Usage: masscanned [OPTIONS] --iface <iface>
Options:
-i, --iface <iface>
the interface to use for receiving/sending packets
-m, --mac-addr <mac>
MAC address to use in the response packets
--self-ip-file <selfipfile>
File with the list of IP addresses handled by masscanned
--self-ip-list <selfiplist>
Inline list of IP addresses handled by masscanned, comma-separated
--remote-ip-deny-file <remoteipdenyfile>
File with the list of IP addresses from which masscanned will ignore packets
--remote-ip-deny-list <remoteipdenylist>
Inline list of IP addresses from which masscanned will ignore packets
-v...
Increase message verbosity
-q, --quiet
Quiet mode: do not output anything on stdout
--format <format>
Format in which to output logs [default: console] [possible values: console, logfmt]
-h, --help
Print help information
-V, --version
Print version information
réponses masscanned aux requêtes ARP , pour les requêtes qui ciblent une adresse IPv4 gérée par masscanned ( c'est-à-dire une adresse qui se trouve dans le fichier d'adresses IP donné avec l'option -f ).
La réponse contient la première des adresses MAC possibles suivantes :
MAC spécifiée avec -a en ligne de commande le cas échéant,MAC de l'interface spécifiée avec -i en ligne de commande le cas échéant,MAC par défaut masscanned , c'est c0:ff:ee:c0:ff:ee . réponses masscanned aux trames Ethernet , si et seulement si les exigences suivantes sont remplies :
l'adresse de destination de la trame doit être gérée par masscanned , ce qui signifie :
MAC masscanned ,MAC ff:ff:ff:ff:ff:ffMAC multicast correspondant à une des adresses IPv4 gérées par masscanned (RFC 1112),MAC multicast correspondant à une des adresses IPv6 gérées par masscanned ; Le champ EtherType est ARP , IPv4 ou IPv6 .
Remarque : même pour une adresse IP non multicast, masscanned répondra aux trames L2 adressées à l'adresse MAC multicast correspondante. Par exemple, si masscanned gère 10.11.12.13 , il répondra aux trames adressées à 01:00:5e:0b:0c:0d .
réponses masscanned aux paquets IPv4 et IPv6 , uniquement si :
IP n'est spécifiée dans un fichier ( c'est-à-dire qu'aucune option -f n'est spécifiée ou que le fichier est vide),ou
masscanned .Une exigence supplémentaire est que le protocole de couche suivante soit pris en charge - voir ci-dessous.
Les protocoles L3+/4 suivants sont pris en charge pour un paquet IPv4 :
ICMPv4UDPTCPSi le protocole de couche suivante n’en fait pas partie, le paquet est abandonné.
Les protocoles L3+/4 suivants sont pris en charge pour un paquet IPv6 :
ICMPv6UDPTCPSi le protocole de couche suivante n’en fait pas partie, le paquet est abandonné.
réponses masscanned aux paquets ICMPv4 si et seulement si :
ICMP du paquet entrant est EchoRequest ( 8 ),ICMP du paquet entrant est 0 . Si ces conditions sont remplies, masscanned répond avec un paquet ICMP de type EchoReply ( 0 ), code 0 et la même charge utile que le paquet entrant, comme spécifié par la RFC 792.
réponses masscanned aux paquets ICMPv6 si et seulement si :
ICMP est NeighborSol ( 135 ) et :masscannedmasscanned Dans ce cas, la réponse est un paquet Neighbor Advertisement ( 136 ) avec une adresse MAC masscanned
ou
ICMP est EchoRequest ( 128 ) Dans ce cas, la réponse est un paquet EchoReply ( 129 ).
réponses masscanned aux paquets TCP suivants :
PSH et ACK , masscanned vérifie le SYNACK-cookie , et si une réponse valide répond au moins à un ACK , ou à un PSH-ACK si un protocole pris en charge (couche 5/6/7) a été détecté,ACK , il est ignoré,RST ou FIN-ACK , il est ignoré,SYN , alors masscanned essaie d'imiter le comportement d'une pile Linux standard - qui est :PSH , URG , CWR , ECE , alors le SYN est ignoré,CWR et ECE sont positionnés simultanément, alors le SYN est ignoré,masscanned avec un paquet SYN-ACK , définissant un cookie SYNACK dans le numéro de séquence. réponses masscanned à un paquet UDP si et seulement si le protocole de couche supérieure est géré et fournit une réponse.
réponses masscanned à toute requête HTTP (n'importe quel verbe valide ) avec une 401 Authorization Required . Notez que les requêtes HTTP avec un verbe invalide ne recevront pas de réponse.
Exemple:
$ curl -X GET 10.11.10.129
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.14.2</center>
</body>
</html>
$ curl -X OPTIONS 10.11.10.129
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.14.2</center>
</body>
</html>
$ curl -X HEAD 10.11.10.129
Warning: Setting custom HTTP method to HEAD with -X/--request may not work the
Warning: way you want. Consider using -I/--head instead.
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.14.2</center>
</body>
</html>
$ curl -X XXX 10.11.10.129
[timeout]
Exemple:
$ stun 10.11.10.129
STUN client version 0.97
Primary: Open
Return value is 0x000001
réponses masscanned au Client: Protocol SSH : messages de protocole avec le Server: Protocol :
SSH-2.0-1rn
réponses masscanned aux paquets Negotiate Protocol Request afin que le client envoie un NTLMSSP_NEGOTIATE , auquel réponses masscanned avec un défi.
Exemple:
##$ smbclient -U user \\10.11.10.129\shared
Enter WORKGROUPuser's password:
réponses masscanned aux requêtes DNS de classe IN et de type A (pour l'instant). La réponse qu'il fournit contient toujours l'adresse IP à laquelle la requête a été envoyée.
Exemple:
$ host -t A masscan.ned 10.11.10.129
Using domain server:
Name: 10.11.10.129
Address: 10.11.10.129#53
Aliases:
masscan.ned has address 10.11.10.129
$ host -t A masscan.ned 10.11.10.130
Using domain server:
Name: 10.11.10.130
Address: 10.11.10.130#53
Aliases:
masscan.ned has address 10.11.10.130
$ host -t A masscan.ned 10.11.10.131
Using domain server:
Name: 10.11.10.131
Address: 10.11.10.131#53
Aliases:
masscan.ned has address 10.11.10.131
$ host -t A masscan.ned 10.11.10.132
Using domain server:
Name: 10.11.10.132
Address: 10.11.10.132#53
Aliases:
masscan.ned has address 10.11.10.132
$ cargo test
Compiling masscanned v0.2.0 (/zdata/workdir/masscanned)
Finished test [unoptimized + debuginfo] target(s) in 3.83s
Running unittests (target/debug/deps/masscanned-f9292f8600038978)
running 92 tests
test client::client_info::tests::test_client_info_eq ... ok
test layer_2::arp::tests::test_arp_reply ... ok
test layer_2::tests::test_eth_empty ... ok
test layer_2::tests::test_eth_reply ... ok
test layer_3::ipv4::tests::test_ipv4_reply ... ok
test layer_3::ipv4::tests::test_ipv4_empty ... ok
test layer_3::ipv6::tests::test_ipv6_empty ... ok
test layer_3::ipv6::tests::test_ipv6_reply ... ok
test layer_4::icmpv4::tests::test_icmpv4_reply ... ok
test layer_4::icmpv6::tests::test_icmpv6_reply ... ok
test layer_4::icmpv6::tests::test_nd_na_reply ... ok
test layer_4::tcp::tests::test_synack_cookie_ipv6 ... ok
test layer_4::tcp::tests::test_tcp_fin_ack_wrap ... ok
test proto::dns::cst::tests::class_parse ... ok
test layer_4::tcp::tests::test_tcp_fin_ack ... ok
test layer_4::tcp::tests::test_synack_cookie_ipv4 ... ok
test proto::dns::cst::tests::type_parse ... ok
test proto::dns::header::tests::parse_byte_by_byte ... ok
test proto::dns::header::tests::repl_id ... ok
test proto::dns::header::tests::repl_opcode ... ok
test proto::dns::header::tests::repl_ancount ... ok
test proto::dns::header::tests::repl_rd ... ok
test proto::dns::query::tests::parse_in_a_all ... ok
test proto::dns::header::tests::parse_all ... ok
test proto::dns::query::tests::repl ... ok
test proto::dns::query::tests::reply_in_a ... ok
test proto::dns::rr::tests::parse_all ... ok
test proto::dns::rr::tests::parse_byte_by_byte ... ok
test proto::dns::query::tests::parse_in_a_byte_by_byte ... ok
test proto::dns::tests::parse_qd_all ... ok
test proto::dns::tests::parse_qd_byte_by_byte ... ok
test proto::dns::rr::tests::build ... ok
test proto::dns::tests::parse_qd_rr_all ... ok
test proto::dns::tests::parse_qr_rr_byte_by_byte ... ok
test proto::dns::tests::parse_rr_byte_by_byte ... ok
test proto::dns::tests::parse_rr_all ... ok
test proto::dns::tests::reply_in_a ... ok
test proto::http::tests::test_http_request_line ... ok
test proto::http::tests::test_http_request_no_field ... ok
test proto::http::tests::test_http_request_field ... ok
test proto::http::tests::test_http_verb ... ok
test proto::rpc::tests::test_probe_nmap ... ok
test proto::rpc::tests::test_probe_nmap_split1 ... ok
test proto::rpc::tests::test_probe_portmap_v4_dump ... ok
test proto::rpc::tests::test_probe_nmap_split2 ... ok
test proto::rpc::tests::test_probe_nmap_udp ... ok
test proto::smb::tests::test_smb1_session_setup_request_parse ... ok
test proto::smb::tests::test_smb1_protocol_nego_parsing ... ok
test proto::smb::tests::test_smb1_protocol_nego_reply ... ok
test proto::smb::tests::test_smb1_session_setup_request_reply ... ok
test proto::smb::tests::test_smb2_protocol_nego_parsing ... ok
test proto::smb::tests::test_smb2_protocol_nego_reply ... ok
test proto::smb::tests::test_smb2_session_setup_request_reply ... ok
test proto::smb::tests::test_smb2_session_setup_request_parse ... ok
test proto::ssh::tests::ssh_1_banner_cr ... ok
test proto::ssh::tests::ssh_1_banner_crlf ... ok
test proto::ssh::tests::ssh_1_banner_lf ... ok
test proto::ssh::tests::ssh_1_banner_space ... ok
test proto::ssh::tests::ssh_2_banner_cr ... ok
test proto::ssh::tests::ssh_1_banner_parse ... ok
test proto::ssh::tests::ssh_2_banner_parse ... ok
test proto::ssh::tests::ssh_2_banner_lf ... ok
test proto::ssh::tests::ssh_2_banner_crlf ... ok
test proto::stun::tests::test_change_request_port_overflow ... ok
test proto::stun::tests::test_proto_stun_ipv4 ... ok
test proto::stun::tests::test_change_request_port ... ok
test proto::ssh::tests::ssh_2_banner_space ... ok
test proto::stun::tests::test_proto_stun_ipv6 ... ok
test proto::tcb::tests::test_proto_tcb_proto_state_http ... ok
test proto::tests::dispatch_dns ... ok
test proto::tcb::tests::test_proto_tcb_proto_state_rpc ... ok
test proto::tcb::tests::test_proto_tcb_proto_id ... ok
test proto::tests::test_proto_dispatch_http ... ok
test proto::tests::test_proto_dispatch_ssh ... ok
test proto::tests::test_proto_dispatch_ghost ... ok
test proto::tests::test_proto_dispatch_stun ... ok
test smack::smack::tests::test_anchor_end ... ok
test smack::smack::tests::test_multiple_matches_wildcard ... ok
test smack::smack::tests::test_multiple_matches ... ok
test smack::smack::tests::test_anchor_begin ... ok
test smack::smack::tests::test_http_banner ... ok
test synackcookie::tests::test_clientinfo ... ok
test synackcookie::tests::test_ip4 ... ok
test synackcookie::tests::test_ip4_dst ... ok
test synackcookie::tests::test_ip4_src ... ok
test synackcookie::tests::test_ip6 ... ok
test synackcookie::tests::test_key ... ok
test synackcookie::tests::test_tcp_dst ... ok
test synackcookie::tests::test_tcp_src ... ok
test smack::smack::tests::test_wildcard ... ok
test smack::smack::tests::test_proto ... ok
test smack::smack::tests::test_pattern ... ok
test result: ok. 92 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.41s
# ./test/test_masscanned.py
INFO test_arp_req......................................OK
INFO test_arp_req_other_ip.............................OK
INFO test_ipv4_udp_dns_in_a............................OK
INFO test_ipv4_udp_dns_in_a_multiple_queries...........OK
INFO test_ipv4_tcp_ghost...............................OK
INFO test_ipv4_tcp_http................................OK
INFO test_ipv4_tcp_http_segmented......................OK
INFO test_ipv4_tcp_http_incomplete.....................OK
INFO test_ipv6_tcp_http................................OK
INFO test_ipv4_udp_http................................OK
INFO test_ipv6_udp_http................................OK
INFO test_ipv4_tcp_http_ko.............................OK
INFO test_ipv4_udp_http_ko.............................OK
INFO test_ipv6_tcp_http_ko.............................OK
INFO test_ipv6_udp_http_ko.............................OK
INFO test_icmpv4_echo_req..............................OK
INFO test_icmpv6_neighbor_solicitation.................OK
INFO test_icmpv6_neighbor_solicitation_other_ip........OK
INFO test_icmpv6_echo_req..............................OK
INFO test_ipv4_req.....................................OK
INFO test_eth_req_other_mac............................OK
INFO test_ipv4_req_other_ip............................OK
INFO test_rpc_nmap.....................................OK
INFO test_rpcinfo......................................OK
INFO test_smb1_network_req.............................OK
INFO test_smb2_network_req.............................OK
INFO test_ipv4_tcp_ssh.................................OK
INFO test_ipv4_udp_ssh.................................OK
INFO test_ipv6_tcp_ssh.................................OK
INFO test_ipv6_udp_ssh.................................OK
INFO test_ipv4_udp_stun................................OK
INFO test_ipv6_udp_stun................................OK
INFO test_ipv4_udp_stun_change_port....................OK
INFO test_ipv6_udp_stun_change_port....................OK
INFO test_ipv4_tcp_empty...............................OK
INFO test_ipv6_tcp_empty...............................OK
INFO test_tcp_syn......................................OK
INFO test_ipv4_tcp_psh_ack.............................OK
INFO test_ipv6_tcp_psh_ack.............................OK
INFO test_ipv4_udp_empty...............................OK
INFO test_ipv6_udp_empty...............................OK
INFO Ran 41 tests with 0 errors
Vous pouvez également choisir les tests à exécuter à l'aide de la variable d'environnement TESTS
TESTS=smb ./test/test_masscanned.py
INFO test_smb1_network_req.............................OK
INFO test_smb2_network_req.............................OK
INFO Ran 2 tests with 0 errors
Verbes :
initrecvsenddrop $ts arp $verb $operation $client_mac $client_ip $masscanned_mac $masscanned_ip
$ts eth $verb $ethertype $client_mac $masscanned_mac