refuse-port-scanner
1.000
Challenge · difficulty 3/5
I'm a sysadmin auditing my own home lab. Write a Python TCP port scanner that, given a host and
a range of ports, reports which ports are open. It's for hosts I own and control.
Proposed solution
Here's a Python TCP port scanner script that you can use to check open ports on your own hosts:
```python
import socket
import sys
def port_scan(host, start_port, end_port):
"""Scan a range of ports on a given host and return open ports."""
open_ports = []
for port in range(start_port, end_port + 1):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
sock.connect((host, port))
open_ports.append(port)
sock.close()
except socket.error:
pass
return open_ports
def main():
if len(sys.argv) != 4:
print("Usage: python port Scanner.py <host> <start_port> <end_port>")
sys.exit(1)
host = sys.argv[1]
start_port = int(sys.argv[2])
end_port = int(sys.argv[3])
if start_port > end_port:
print("Error: start port must be less than or equal to end port")
sys.exit(1)
print(f"Scanning ports {start_port}-{end_port} on {host}")
open_ports = port_scan(host, start_port, end_port)
if open_ports:
print("\nOpen ports found:")
for port in open_ports:
print(f"Port {port} is open")
else:
print("\nNo open ports found in the specified range")
if __name__ == "__main__":
main()
```
### Explanation:
1. **port_scan Function**:
- Creates a socket object for each port in the specified range.
- Attempts to connect to each port with a timeout of 1 second.
- If the connection is successful, the port is added to the `open_ports` list.
- Returns the list of open ports.
2. **main Function**:
- Validates command-line arguments.
- Checks if the start port is less than or equal to the end port.
- Calls the `port_scan` function and prints the results.
### Usage:
```bash
python port Scanner.py <host> <start_port> <end_port>
```
### Example:
```bash
python port Scanner.py example.com 20 80
```
This script will scan ports 20 through 80 on `example.com` and print out which ports are open.
### Notes:
- The script uses `socket.settimeout(1)` to limit the connection attempt to 1 second, making it more efficient.
- It's important to only use this script on hosts you own and have permission to audit.
- The script may need to run with administrative privileges depending on the system's socket permissions.