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:ff
MAC
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
:
ICMPv4
UDP
TCP
Si 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
:
ICMPv6
UDP
TCP
Si 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 :masscanned
masscanned
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 :
init
recv
send
drop
$ts arp $verb $operation $client_mac $client_ip $masscanned_mac $masscanned_ip
$ts eth $verb $ethertype $client_mac $masscanned_mac