Masscanned (ชื่อที่ได้รับแรงบันดาลใจจาก Masscan) เป็นผู้ตอบกลับเครือข่าย วัตถุประสงค์คือเพื่อให้คำตอบทั่วไปสำหรับโปรโตคอลต่างๆ มากที่สุดเท่าที่จะเป็นไปได้ และมีการสันนิษฐานเกี่ยวกับความตั้งใจของลูกค้าให้น้อยที่สุดเท่าที่จะเป็นไปได้
ให้พวกเขาคุยกันก่อน
เช่นเดียวกับ Masscan, Masscanned ใช้สแต็กเครือข่ายพื้นที่ผู้ใช้ของตัวเอง คล้ายกับ honeyd ได้รับการออกแบบมาเพื่อโต้ตอบกับเครื่องสแกนและบอทฉวยโอกาสให้มากที่สุดเท่าที่จะเป็นไปได้ และเพื่อรองรับโปรโตคอลให้ได้มากที่สุด
ตัวอย่างเช่น เมื่อได้รับแพ็กเก็ตเครือข่าย:
ARP who is-at
ARP is-at
(สำหรับที่อยู่ IP)ICMP Echo Request
พร้อม ICMP Echo Reply
TCP SYN
(พอร์ตใด ๆ ) ด้วย TCP SYN/ACK
บนพอร์ตใด ๆHTTP
(กริยาใด ๆ ) ผ่าน TCP/UDP
(พอร์ตใด ๆ ) ด้วยหน้าเว็บ HTTP 401
ปัจจุบัน Masscanned รองรับโปรโตคอลทั่วไปส่วนใหญ่ที่เลเยอร์ 2-3-4 และโปรโตคอลแอปพลิเคชันบางตัว
$ 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
...
การใช้งาน Masscanned ที่ดีคือการปรับใช้บน VPS ด้วยที่อยู่ IP สาธารณะตั้งแต่หนึ่งรายการขึ้นไป
หากต้องการใช้ผลลัพธ์ วิธีที่ดีที่สุดคือการจับภาพการรับส่งข้อมูลเครือข่ายทั้งหมดบนอินเทอร์เฟซที่ สแกนจำนวนมาก กำลังฟัง/ตอบสนอง จากนั้นสามารถวิเคราะห์ pcaps ได้โดยใช้ zeek และโดยทั่วไปแล้วไฟล์เอาต์พุตจะถูกพุชในอินสแตนซ์ของ IVRE
เอกสารเกี่ยวกับวิธีการปรับใช้อินสแตนซ์ของ Masscanned บน VPS กำลังจะมา (ดูฉบับที่ #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
คำตอบ masscanned
สำหรับคำขอ ARP
สำหรับคำขอที่กำหนดเป้าหมายที่อยู่ IPv4
ที่ได้รับการจัดการโดย masscanned
( เช่น ที่อยู่ที่อยู่ในไฟล์ที่อยู่ IP ที่ให้มาพร้อมกับตัวเลือก -f
)
คำตอบประกอบด้วยที่อยู่ MAC
แรกที่เป็นไปได้ต่อไปนี้:
MAC
ที่ระบุด้วย -a
ในบรรทัดคำสั่งหากมีMAC
ของอินเทอร์เฟซที่ระบุด้วย -i
ในบรรทัดคำสั่งหากมีMAC
เริ่มต้นของ masscanned
เช่น c0:ff:ee:c0:ff:ee
คำตอบ masscanned
สำหรับเฟรม Ethernet
หากและเฉพาะในกรณีที่ตรงตามข้อกำหนดต่อไปนี้:
ที่อยู่ปลายทางของเฟรมควรได้รับการจัดการโดย masscanned
ซึ่งหมายความว่า:
MAC
ของตัวเอง masscanned
MAC
ff:ff:ff:ff:ff:ff
MAC
แบบหลายผู้รับที่สอดคล้องกับหนึ่งในที่อยู่ IPv4
ที่จัดการโดย masscanned
(RFC 1112)MAC
แบบหลายผู้รับที่สอดคล้องกับหนึ่งในที่อยู่ IPv6
ที่จัดการโดย masscanned
ฟิลด์ EtherType
เป็นหนึ่งใน ARP
, IPv4
หรือ IPv6
หมายเหตุ: แม้ว่าจะเป็นที่อยู่ IP ที่ไม่ใช่แบบหลายผู้รับก็ตาม masscanned
จะตอบสนองต่อเฟรม L2 ที่ส่งไปยังที่อยู่ MAC
แบบหลายผู้รับที่สอดคล้องกัน ตัวอย่างเช่น หาก masscanned
จัดการ 10.11.12.13
มันจะตอบไปยังเฟรมที่ส่งถึง 01:00:5e:0b:0c:0d
คำตอบ masscanned
สำหรับแพ็กเก็ต IPv4
และ IPv6
เฉพาะในกรณีที่:
IP
ในไฟล์ ( เช่น ไม่มีการระบุตัวเลือก -f
หรือไฟล์ว่างเปล่า)หรือ
masscanned
ข้อกำหนดเพิ่มเติมคือรองรับโปรโตคอลเลเยอร์ถัดไป - ดูด้านล่าง
รองรับโปรโตคอล L3+/4 ต่อไปนี้สำหรับแพ็กเก็ต IPv4
:
ICMPv4
UDP
TCP
หากโปรโตคอลชั้นถัดไปไม่ใช่หนึ่งในนั้น แพ็กเก็ตก็จะหลุดออกไป
รองรับโปรโตคอล L3+/4 ต่อไปนี้สำหรับแพ็กเก็ต IPv6
:
ICMPv6
UDP
TCP
หากโปรโตคอลชั้นถัดไปไม่ใช่หนึ่งในนั้น แพ็กเก็ตก็จะหลุดออกไป
คำตอบ masscanned
สำหรับแพ็คเก็ต ICMPv4
ถ้าหาก:
ICMP
ของแพ็กเก็ตขาเข้าคือ EchoRequest
( 8
)ICMP
ของแพ็กเก็ตขาเข้าคือ 0
หากตรงตามเงื่อนไขเหล่านี้ ระบบจะสแกนคำตอบ masscanned
ด้วยแพ็กเก็ต ICMP
ประเภท EchoReply
( 0
) รหัส 0
และเพย์โหลดเดียวกันกับแพ็กเก็ตขาเข้า ตามที่ระบุโดย RFC 792
คำตอบ masscanned
สำหรับแพ็กเก็ต ICMPv6
ถ้าหาก:
ICMP
คือ NeighborSol
( 135
) และ :masscanned
masscanned
ในกรณีนั้น คำตอบคือแพ็กเก็ต Neighbor Advertisement
( 136
) พร้อมที่อยู่ MAC
masscanned
หรือ
ICMP
คือ EchoRequest
( 128
) ในกรณีนั้น คำตอบคือแพ็กเก็ต EchoReply
( 129
)
คำตอบ masscanned
สำหรับแพ็กเก็ต TCP
ต่อไปนี้:
PSH
และ ACK
การสแกน masscanned
จะตรวจสอบ SYNACK-cookie และหากคำตอบที่ถูกต้องอย่างน้อย ACK
หรือ PSH-ACK
หากตรวจพบโปรโตคอลที่รองรับ (เลเยอร์ 5/6/7)ACK
ก็จะถูกละเว้นRST
หรือ FIN-ACK
ก็จะถูกละเว้นSYN
แสดงว่า masscanned
จะพยายามเลียนแบบพฤติกรรมของ Linux Stack มาตรฐานซึ่งก็คือ:PSH
, URG
, CWR
, ECE
ดังนั้น SYN
จะถูกละเว้นCWR
และ ECE
พร้อมกัน SYN
จะถูกละเว้นmasscanned
ด้วยแพ็กเก็ต SYN-ACK
โดยตั้ง ค่าคุกกี้ SYNACK ในหมายเลขลำดับ คำตอบ masscanned
สำหรับแพ็กเก็ต UDP
ถ้าหากโปรโตคอลชั้นบนได้รับการจัดการและให้คำตอบเท่านั้น
คำตอบ masscanned
สำหรับคำขอ HTTP
ใด ๆ (กริยา ที่ถูกต้อง ใด ๆ ) โดย 401 Authorization Required
โปรดทราบว่าคำขอ HTTP
ที่มีกริยาที่ไม่ถูกต้องจะไม่ได้รับคำตอบ
ตัวอย่าง:
$ 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]
ตัวอย่าง:
$ stun 10.11.10.129
STUN client version 0.97
Primary: Open
Return value is 0x000001
คำตอบ masscanned
สำหรับไคลเอนต์ SSH
Client: Protocol
พร้อม Server: Protocol
:
SSH-2.0-1rn
คำตอบ masscanned
สำหรับแพ็กเก็ต Negotiate Protocol Request
เพื่อให้ไคลเอนต์ส่ง NTLMSSP_NEGOTIATE
ซึ่งสแกนคำตอบ masscanned
ด้วยการท้าทาย
ตัวอย่าง:
##$ smbclient -U user \\10.11.10.129\shared
Enter WORKGROUPuser's password:
คำตอบ masscanned
สำหรับการสืบค้น DNS
ของคลาส IN
และประเภท A
(ในตอนนี้) คำตอบที่ให้ไว้จะมีที่อยู่ IP ที่ส่งแบบสอบถามไปเสมอ
ตัวอย่าง:
$ 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
คุณยังสามารถเลือกการทดสอบที่จะรันโดยใช้ตัวแปรสภาพแวดล้อม 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
กริยา :
init
recv
send
drop
$ts arp $verb $operation $client_mac $client_ip $masscanned_mac $masscanned_ip
$ts eth $verb $ethertype $client_mac $masscanned_mac