总览
这篇文章将向您展示如何制编写端口扫描程序。使用Python可以执行多种操作,而我将使用内置模块Socket(套接字)来完成此操作。
Socket(套接字)
Python中的Socket(套接字)模块提供对BSD套接字接口的访问。它包括用于处理实际数据通道的Socket(套接字)类,以及用于网络相关任务的功能,例如将服务器的名称转换为地址并格式化要通过网络发送的数据。
套接字在Internet上被广泛使用,因为它们是计算机进行任何类型网络通信基础组件。例如,您使用的网络浏览器会打开一个套接字并连接到网络服务器(网站)。任何网络通信都通过套接字进行,有关套接字模块的更多信息,请参见官方文档。
套接字功能
在开始使用示例程序之前,让我们看一下将要使用的一些套接字函数。
sock = socket.socket(socket_family,socket_type)
创建套接字的语法
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
创建一个流套接字
AF_INET
套接字族(此处为地址族版本4或IPv4)
SOCK_STREAM
套接字类型TCP连接
SOCK_DGRAM套接字类型UDP连接
gethostbyname(“host”)
将主机名转换为IPv4地址格式
socket.gethostbyname_ex(“host”)
将主机名转换为IPv4地址格式,扩展接口
socket.getfqdn(“8.8.8.8”)
获取fqdn(完全限定域名)
socket.gethostname()
返回计算机的主机名。
socket.error
套接字错误异常处理
使用Python套接字编写程序
下面介绍如何使用Python创建一个简单的端口扫描程序,该小型端口扫描程序将尝试在您为特定主机定义的每个端口上建立连接。
打开文本编辑器,复制并复制粘贴下面的代码。将文件另存为:portscanner.py,并退出编辑器
#!/usr/bin/env python
import socket
import subprocess
import sys
from datetime import datetime
# Clear the screen
subprocess.call('clear', shell=True)
# Ask for input
remoteServer = raw_input("Enter a remote host to scan: ")
remoteServerIP = socket.gethostbyname(remoteServer)
# Print a nice banner with information on which host we are about to scan
print "-" * 60
print "Please wait, scanning remote host", remoteServerIP
print "-" * 60
# Check what time the scan started
t1 = datetime.now()
# Using the range function to specify ports (here it will scans all ports between 1 and 1024)
# We also put in some error handling for catching errors
try:
for port in range(1,1025):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((remoteServerIP, port))
if result == 0:
print "Port {}: Open".format(port)
sock.close()
except KeyboardInterrupt:
print "You pressed Ctrl+C"
sys.exit()
except socket.gaierror:
print 'Hostname could not be resolved. Exiting'
sys.exit()
except socket.error:
print "Couldn't connect to server"
sys.exit()
# Checking the time again
t2 = datetime.now()
# Calculates the difference of time, to see how long it took to run the script
total = t2 - t1
# Printing the information to screen
print 'Scanning Completed in: ', total
然后我们运行程序,看看输出什么:
$ python portscanner.py
Enter a remote host to scan: www.your_host_example.com
------------------------------------------------------------
Please wait, scanning remote host xxxx.xxxx.xxxx.xxxx
------------------------------------------------------------
Port 21: Open
Port 22: Open
Port 23: Open
Port 80: Open
Port 110: Open
Port 111: Open
Port 143: Open
Port 443: Open
Port 465: Open
Port 587: Open
Port 993: Open
Port 995: Open
Scanning Completed in: 0:06:34.705170
免责声明
该程序旨在供个人测试其设备的弱安全性,如果将其用于任何其他用途,作者将不承担任何责任。