- Notifications
You must be signed in to change notification settings - Fork109
🖖 Fast, modern, easy-to-use network scanner
License
v-byte-cpu/sx
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
sx is the command-line network scanner designed to follow the UNIX philosophy.
The goal of this project is to create the fastest network scanner with clean and simple code.
- ⚡ 30x times faster than nmap
- ARP scan: Scan your local networks to detect live devices
- ICMP scan: Use advanced ICMP scanning techniques to detect live hosts and firewall rules
- TCP SYN scan: Traditional half-open scan to find open TCP ports
- TCP FIN / NULL / Xmas scans: Scan techniques to bypass some firewall rules
- Custom TCP scans with any TCP flags: Send whatever exotic packets you want and get a result with all the TCP flags set in the reply packet
- UDP scan: Scan UDP ports and get full ICMP replies to detect open ports or firewall rules
- Application scans:
- SOCKS5 scan: Detect live SOCKS5 proxies by scanning ip range or list of ip/port pairs from a file
- Docker scan: Detect open Docker daemons listening on TCP ports and get information about the docker node
- Elasticsearch scan: Detect open Elasticsearch nodes and pull out cluster information with all index names
- Randomized iteration over IP addresses using finite cyclic multiplicative groups
- JSON output support: sx is designed specifically for convenient automatic processing of results
The simplest way is to download fromGitHub Releases and place the executable file in your PATH.
Requirements:
- Go 1.15 or newer
- libpcap (already installed if you usewireshark)
From the root of the source tree, run:
go buildHere's a quick examples showing how you can scan networks withsx.
Scan your local network and display the IP address, MAC address and associated hardware vendor of connected devices:
sx arp 192.168.0.1/24sample output:
192.168.0.1 b0:be:76:40:05:8d TP-LINK TECHNOLOGIES CO.,LTD.192.168.0.111 80:c5:f2:0b:02:e3 AzureWave Technology Inc.192.168.0.171 88:53:95:2d:3c:af Apple, Inc.with JSON output:
sx arp --json 192.168.0.1/24sample output:
{"ip":"192.168.0.1","mac":"b0:be:76:40:05:8d","vendor":"TP-LINK TECHNOLOGIES CO.,LTD."}{"ip":"192.168.0.111","mac":"80:c5:f2:0b:02:e3","vendor":"AzureWave Technology Inc."}{"ip":"192.168.0.171","mac":"88:53:95:2d:3c:af","vendor":"Apple, Inc."}wait 5 seconds before exiting to receive delayed reply packets, by defaultsx waits 300 milliseconds:
sx arp --exit-delay 5s 192.168.0.1/24Live scan mode that rescans network every 10 seconds:
sx arp 192.168.0.1/24 --live 10sUnlike nmap and other scanners that implicitly perform ARP requests to resolve IP addresses to MAC addresses before the actual scan,sx explicitly uses theARP cache concept. ARP cache file is a simple text file containing JSON string on each line (JSONL file), which has the same JSON fields as the ARP scan JSON output described above. Scans of higher-level protocols like TCP and UDP read the ARP cache file from the stdin and then start the actual scan.
This not only simplifies the design of the program, but also speeds up the scanning process, since it is not necessary to perform an ARP scan every time.
Let's assume that the actual ARP cache is in thearp.cache file. We can create it manuallyor use ARP scan as shown below:
sx arp 192.168.0.1/24 --json | tee arp.cacheOnce we have the ARP cache file, we can run scans of higher-level protocols like TCP SYN scan:
cat arp.cache | sx tcp -p 1-65535 192.168.0.171sample output:
192.168.0.171 22192.168.0.171 443In this case we find out that ports 22 and 443 are open.
scan with JSON output:
cat arp.cache | sx tcp --json -p 1-65535 192.168.0.171sample output:
{"scan":"tcpsyn","ip":"192.168.0.171","port":22}{"scan":"tcpsyn","ip":"192.168.0.171","port":443}scan multiple port ranges:
cat arp.cache | sx tcp -p 1-23,25-443 192.168.0.171or individual ports:
cat arp.cache | sx tcp -p 22,443 192.168.0.171or use the--ports-file option to specify a file with ports or port ranges to scan, one per line.
scan ip/port pairs from a file with JSON output:
cat arp.cache | sx tcp --json -f ip_ports_file.jsonlEach line of the input file is a json string, which must contain theip andport fields.
sample input file:
{"ip":"10.0.1.1","port":1080}{"ip":"10.0.2.2","port":1081}It is possible to specify the ARP cache file using the-a or--arp-cache options:
sx tcp -a arp.cache -p 22,443 192.168.0.171or stdin redirect:
sx tcp -p 22,443 192.168.0.171 < arp.cacheYou can also use thetcp syn subcommand instead of thetcp:
cat arp.cache | sx tcp syn -p 22 192.168.0.171tcp subcomand is just a shorthand fortcp syn subcommand unless--flags option is passed, see below.
sx supports scanning with virtual network interfaces (wireguard, openvpn, etc.) and in this case it isnot necessary to use the arp cache, since these interfaces require raw IP packets instead of Ethernet frames as input. For instance, scanning an IP address on a vpn network:
sx tcp 10.1.27.1 -p 80 --jsonMost network scanners try to interpret results of the scan. For instance they say "this port is closed" instead of "I received a RST". Sometimes they are right. Sometimes not. It's easier for beginners, but when you know what you're doing, you keep on trying to deduce what really happened from the program's interpretation, especially for more advanced scan techniques.
sx tries to overcome those problems. It returns information about all reply packets for TCP FIN, NULL, Xmas and custom TCP scans. The information contains IP address, TCP port and all TCP flags set in the reply packet.
TCP FIN scan and its other variations (NULL and Xmas) exploit RFC793 Section 3.9:
SEGMENT ARRIVES
If the state is CLOSED (i.e., TCB does not exist) then
all data in the incoming segment is discarded. An incoming segment containing a RST is discarded. An incoming segment not containing a RST causes a RST to be sent in response. The acknowledgment and sequence field values are selected to make the reset sequence acceptable to the TCP that sent the offending segment.
so closed port should return packet with RST flag.
This section also states that:
If the state is LISTEN then
...
Any other control or text-bearing segment (not containing SYN)must have an ACK and thus would be discarded by the ACKprocessing. An incoming RST segment could not be valid, sinceit could not have been sent in response to anything sent by thisincarnation of the connection. So you are unlikely to get here,but if you do, drop the segment, and return.
the main phrase here:drop the segment, and return. So an open port on most operating systemswill drop the TCP packet containing any flags except SYN,ACK and RST.
Let's scan some closed port with TCP FIN scan:
cat arp.cache | sx tcp fin --json -p 23 192.168.0.171sample output:
{"scan":"tcpfin","ip":"192.168.0.171","port":23,"flags":"ar"}flags field contains all TCP flags in the reply packet, where each letter represents one of the TCP flags:
s- SYN flaga- ACK flagf- FIN flagr- RST flagp- PSH flagu- URG flage- ECE flagc- CWR flagn- NS flag
In this case we find out that port 23 sent reply packet with ACK and RST flags set (typical response for a closed port according to the rfc793).
If we scan an open port, we get no response (unless the firewall is spoofing the responses).
Other types of TCP scans can be conducted by analogy.
TCP NULL scan:
cat arp.cache | sx tcp null --json -p 23 192.168.0.171TCP Xmas scan:
cat arp.cache | sx tcp xmas --json -p 23 192.168.0.171It is possible to send TCP packets with custom TCP flags using--flags option.
Let's send TCP packet with SYN, FIN and ACK flags set to fingerprint remote OS:
cat arp.cache | sx tcp --flags syn,fin,ack --json -p 23 192.168.0.171Windows and MacOS will not respond to this packet, but Linux will send reply packet with RST flag.
Possible arguments to--flags option:
syn- SYN flagack- ACK flagfin- FIN flagrst- RST flagpsh- PSH flagurg- URG flagece- ECE flagcwr- CWR flagns- NS flag
sx can help investigate open UDP ports. UDP scan exploits RFC1122 Section 4.1.3.1:
If a datagram arrives addressed to a UDP port for whichthere is no pending LISTEN call, UDP SHOULD send an ICMPPort Unreachable message.
Similar to TCP scans,sx returns information about all reply ICMP packets for UDP scan. The information contains IP address, ICMP packet type and code set in the reply packet.
For instance, to detect DNS server on host, run:
cat arp.cache | sx udp --json -p 53 192.168.0.171sample output:
{"scan":"udp","ip":"192.168.0.171","icmp":{"type":3,"code":3}}In this case we find out that host sent ICMP reply packet withDestination Unreachable type andPort Unreachable code (typical response for a closed port according to the rfc1122).
Firewalls typically set ICMP code distinct fromPort Unreachanble and so can be easily detected.
Sometimes you need to limit the speed at which generated packets are sent. This can be done withthe--rate option.
For example, to limit the speed to 1 packet per 5 seconds:
cat arp.cache | sx tcp --rate 1/5s --json -p 22,80,443 192.168.0.171Sometimes you need to exclude some ip addresses and subnets from scanning. This can be done withthe--exclude option. It specifies a file with IPs or subnets in CIDR notation to exclude, one-per line.
For instance, to exclude RFC 1918 addresses, create a fileips.txt with the following contents:
10.0.0.0/8172.16.0.0/16192.168.0.0/16You can also insert comments and blank lines:
# exclude RFC 1918 addresses10.0.0.0/8 # comment 1172.16.0.0/12 # comment 2192.168.0.0/16 # comment 30.0.0.0/8 # used in initialization procedures (RFC 6890)# exclude RFC 5735 addresses127.0.0.0/8 # loopback address192.0.0.0/24 # reserved block for IETF protocol assignments224.0.0.0/4 # allocated for use in IPv4 multicast address assignments240.0.0.0/4 # reserved for future use# exclude Amazon network3.0.0.0/8# ip addresses are valid as well1.1.1.1and run a scan with--exclude ips.txt option.
As an example of scan composition, you can combine ARP and TCP SYN scans to create live TCP port scanner that periodically scan whole LAN network.
Start live ARP scan and save results toarp.cache file:
sx arp 192.168.0.1/24 --live 10s --json | tee arp.cacheIn another terminal start TCP SYN scan:
while true; do sx tcp -p 1-65535 -a arp.cache -f arp.cache; sleep 30; donesx can detect live SOCKS5 proxies. To scan, you must specify an IP range or JSONL file with ip/port pairs.
For example, an IP range scan:
sx socks -p 1080 10.0.0.1/16scan ip/port pairs from a file with JSON output:
sx socks --json -f ip_ports_file.jsonlEach line of the input file is a json string, which must contain theip andport fields.
sample input file:
{"ip":"10.0.1.1","port":1080}{"ip":"10.0.2.2","port":1081}You can also specify a range of ports to scan:
sx socks -p 1080-4567 -f ips_file.jsonlIn this case only ip addresses will be taken from the file and theport field is no longer necessary.
Elasticsearch scan retrieves the cluster information and a list of all indexes along with aliases.
For example, an IP range scan:
sx elastic -p 9200 10.0.0.1/16By default the scan uses the http protocol, to use the https protocol specify the--proto option:
sx elastic --proto https -p 9200 10.0.0.1/16scan ip/port pairs from a file with JSON output:
sx elastic --json -f ip_ports_file.jsonlEach line of the input file is a json string, which must contain theip andport fields.
sample input file:
{"ip":"10.0.1.1","port":9200}{"ip":"10.0.2.2","port":9201}You can also specify a range of ports to scan:
sx elastic -p 9200-9267 -f ips_file.jsonlIn this case only ip addresses will be taken from the file and theport field is no longer necessary.
sx help- Network Security Assessment: Know Your Network 1st Edition by Chris McNab
- ICMP Usage in Scanning - The Complete Know-How by Ofir Arkin
- Transmission Control Protocol ( rfc793 )
- User Datagram Protocol ( rfc768 )
- Requirements for Internet Hosts -- Communication Layers ( rfc1122 )
- SOCKS Protocol Version 5 ( rfc1928 )
- Internet Control Message Protocol ( rfc792 )
Contributions, issues and feature requests are welcome.
Logo is designed bymikhailtsoy.com
This project is licensed under the MIT License. See theLICENSE file for the full license text.
About
🖖 Fast, modern, easy-to-use network scanner
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors4
Uh oh!
There was an error while loading.Please reload this page.