The goal of this project is to create a Python tool that can scan one or multiple IP addresses for open ports within a specified range and retrieve banners from those ports. The tool is designed to be user-friendly, efficient, and capable of handling multiple IP addresses and port ranges.
Features
- Scan single or multiple IP addresses
- Scan a custom range of ports
- Concurrent port scanning for improved speed
- Banner grabbing from open ports
- Output results to a user-specified file
- User-friendly command-line interface
- IP address validation
Technologies Used
- Python 3.x
- socket module for network connections
- concurrent.futures for multithreading
- ipaddress module for IP address validation
- File I/O for saving results
Source Code
Feel free to modify this however you want.
import socket
import concurrent.futures
import ipaddress
def scan_port(ip, port, timeout=1):
try:
with socket.create_connection((ip, port), timeout=timeout) as sock:
sock.settimeout(timeout)
banner = sock.recv(1024).decode('utf-8', 'ignore').strip()
return f"{ip} - {port} - {banner}"
except (socket.timeout, ConnectionRefusedError):
return None
def scan_ip(ip, start_port, end_port, output_file):
with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
futures = [executor.submit(scan_port, ip, port) for port in range(start_port, end_port + 1)]
for future in concurrent.futures.as_completed(futures):
result = future.result()
if result:
print(result)
with open(output_file, 'a') as f:
f.write(result + '\n')
def main():
output_file = input("Enter the output file name: ")
ip_input = input("Enter IP address(es) (comma-separated for multiple): ")
start_port = int(input("Enter start port: "))
end_port = int(input("Enter end port: "))
ip_list = [ip.strip() for ip in ip_input.split(',')]
for ip in ip_list:
try:
ipaddress.ip_address(ip)
except ValueError:
print(f"Invalid IP address: {ip}")
continue
print(f"Scanning {ip}...")
scan_ip(ip, start_port, end_port, output_file)
print(f"Scan complete. Results saved to {output_file}")
if __name__ == "__main__":
main()
━━━━━━ ❖ ━━━━━━