Using Scapy to Scan a System
The following is an example of a Python script that uses Scapy to perform a basic TCP port scan:
from scapy.all import *
import sys
def tcp_port_scan(target, ports):
for port in ports:
tcp_packet = IP(dst=target) / TCP(dport=port, flags="S")
response = sr1(tcp_packet, timeout=2, verbose=0)
if response is not None and response[TCP].flags == 18:
print(f"Port {port} is open on {target}")
else:
print(f"Port {port} is closed on {target}")
if __name__ == "__main__":
target = sys.argv[1]
ports = range(1, 1024)
tcp_port_scan(target, ports)
Here's how to use the script:
1. Save the script in a file named port_scan.py
.
2. Run the script by using the following command in the terminal:
<target_ip>
with the IP address of the target machine.
Detailed Explanation
- The script begins by importing necessary modules:
from scapy.all import *
imports all necessary components from the Scapy library, a powerful interactive packet manipulation tool.-
import sys
imports the system-specific parameters and functions module. -
The
tcp_port_scan(target, ports)
function is defined to perform the TCP port scan: - For each port in the provided ports, it creates a TCP packet with the
S
(SYN) flag set usingIP(dst=target) / TCP(dport=port, flags="S")
. - The script then sends the packet to the target machine using the
sr1()
function, which sends the packet and returns the first response received. -
If a response is received (
response is not None
) and the TCP flags of the response are equal to 18 (response[TCP].flags == 18
), the script prints that the port is open. TCP flag 18 representsSYN/ACK
packet which is usually the response to our SYN packet when a port is open. If there is no response or the response is notSYN/ACK
, the script prints that the port is closed. -
In the
__main__
part of the script: target
is set to the first argument given in the command line (sys.argv[1]
), which is the IP address of the target machine.ports
is set to the range of 1-1023, which are the well-known port numbers.- The
tcp_port_scan()
function is then called with thetarget
andports
as parameters.
This is a simple script and does not handle many edge cases. In a real-world situation, additional code would be required to handle potential exceptions, timeouts, and other situations.