Masscanned (nombre inspirado, por supuesto, en masscan) es un respondedor de red. Su propósito es proporcionar respuestas genéricas a tantos protocolos como sea posible y con la menor cantidad de suposiciones posibles sobre las intenciones del cliente.
Déjalos hablar primero.
Al igual que Masscan, Masscanned implementa su propia pila de red en el área de usuario, de manera similar a Honeyd. Está diseñado para interactuar con escáneres y robots oportunistas en la medida de lo posible y para admitir tantos protocolos como sea posible.
Por ejemplo, cuando recibe paquetes de red:
ARP who is-at
con ARP is-at
(para sus direcciones IP),ICMP Echo Request
con ICMP Echo Reply
,TCP SYN
(cualquier puerto) con TCP SYN/ACK
en cualquier puerto,HTTP
(cualquier verbo) a través de TCP/UDP
(cualquier puerto) con una página web HTTP 401
. Masscanned actualmente admite los protocolos más comunes en las capas 2-3-4 y algunos protocolos de aplicación.
$ 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
...
Un buen uso de Masscanned es implementarlo en un VPS con una o más direcciones IP públicas.
Para utilizar los resultados, la mejor manera es capturar todo el tráfico de red en la interfaz en la que el escaneo masivo está escuchando/respondiendo. Luego, los pcaps se pueden analizar usando zeek y los archivos de salida generalmente se pueden enviar a una instancia de IVRE .
Próximamente habrá documentación sobre cómo implementar una instancia de escaneo masivo en un VPS (consulte el número 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
respuestas masscanned
a solicitudes ARP
, para solicitudes que apuntan a una dirección IPv4
manejada por masscanned
( es decir , una dirección que está en el archivo de direcciones IP proporcionado con la opción -f
).
La respuesta contiene la primera de las siguientes direcciones MAC
posibles:
MAC
especificada con -a
en la línea de comando, si corresponde,MAC
de la interfaz especificada con -i
en la línea de comando, si corresponde,MAC
predeterminada masscanned
, es decir , c0:ff:ee:c0:ff:ee
. respuestas masscanned
a tramas Ethernet
, si y solo si se cumplen los siguientes requisitos:
la dirección de destino de la trama debe ser manejada por masscanned
, lo que significa:
MAC
masscanned
,MAC
ff:ff:ff:ff:ff:ff
MAC
de multidifusión correspondiente a una de las direcciones IPv4
manejadas por masscanned
(RFC 1112),MAC
de multidifusión correspondiente a una de las direcciones IPv6
manejadas por masscanned
; El campo EtherType
es uno de ARP
, IPv4
o IPv6
.
Nota: incluso para una dirección IP que no sea de multidifusión, masscanned
responderá a las tramas L2 dirigidas a la dirección MAC
de multidifusión correspondiente. Por ejemplo, si masscanned
maneja 10.11.12.13
, responderá a las tramas dirigidas a 01:00:5e:0b:0c:0d
.
respuestas masscanned
a paquetes IPv4
e IPv6
, solo si:
IP
en un archivo ( es decir , no se especifica ninguna opción -f
o el archivo está vacío),o
masscanned
.Un requisito adicional es que se admita el protocolo de la siguiente capa; consulte a continuación.
Los siguientes protocolos L3+/4 son compatibles con un paquete IPv4
:
ICMPv4
UDP
TCP
Si el protocolo de la siguiente capa no es uno de ellos, el paquete se descarta.
Los siguientes protocolos L3+/4 son compatibles con un paquete IPv6
:
ICMPv6
UDP
TCP
Si el protocolo de la siguiente capa no es uno de ellos, el paquete se descarta.
respuestas masscanned
a paquetes ICMPv4
si y solo si:
ICMP
del paquete entrante es EchoRequest
( 8
),ICMP
del paquete entrante es 0
. Si se cumplen estas condiciones, las respuestas masscanned
con un paquete ICMP
de tipo EchoReply
( 0
), código 0
y la misma carga útil que el paquete entrante, como lo especifica RFC 792.
respuestas masscanned
a paquetes ICMPv6
si y solo si:
ICMP
es NeighborSol
( 135
) y :masscanned
masscanned
En ese caso, la respuesta es un paquete Neighbor Advertisement
( 136
) con una dirección MAC
masscanned
.
o
ICMP
es EchoRequest
( 128
) En ese caso, la respuesta es un paquete EchoReply
( 129
).
Respuestas masscanned
a los siguientes paquetes TCP
:
PSH
y ACK
, masscanned
verifica la cookie SYNACK , y si es válida responde al menos un ACK
, o un PSH-ACK
si se ha detectado un protocolo compatible (Capa 5/6/7),ACK
, se ignora,RST
o FIN-ACK
, se ignora,SYN
, masscanned
intenta imitar el comportamiento de una pila de Linux estándar, que es:PSH
, URG
, CWR
, ECE
, entonces se ignora SYN
,CWR
y ECE
se configuran simultáneamente, entonces se ignora SYN
,masscanned
las respuestas con un paquete SYN-ACK
, configurando una cookie SYNACK en el número de secuencia. respuestas masscanned
a un paquete UDP
si y sólo si el protocolo de capa superior se maneja y proporciona una respuesta.
Respuestas masscanned
a cualquier solicitud HTTP
(cualquier verbo válido ) con una 401 Authorization Required
. Tenga en cuenta que las solicitudes HTTP
con un verbo no válido no serán respondidas.
Ejemplo:
$ 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]
Ejemplo:
$ stun 10.11.10.129
STUN client version 0.97
Primary: Open
Return value is 0x000001
respuestas masscanned
al Cliente SSH
Client: Protocol
con el siguiente Server: Protocol
:
SSH-2.0-1rn
Respuestas masscanned
a los paquetes Negotiate Protocol Request
para que el cliente envíe un NTLMSSP_NEGOTIATE
, al que masscanned
las respuestas con un desafío.
Ejemplo:
##$ smbclient -U user \\10.11.10.129\shared
Enter WORKGROUPuser's password:
Respuestas masscanned
a consultas DNS
de clase IN
y tipo A
(por ahora). La respuesta que proporciona siempre contiene la dirección IP a la que se envió la consulta.
Ejemplo:
$ 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
También puede elegir qué pruebas ejecutar utilizando la variable de entorno 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
Verbos :
init
recv
send
drop
$ts arp $verb $operation $client_mac $client_ip $masscanned_mac $masscanned_ip
$ts eth $verb $ethertype $client_mac $masscanned_mac