今天来编写一个 端口扫描器, 扫描某个主机 ,开放的端口
原理
对某个端口进行 socket 连接, 如果连接成功, 则代表 该端口有效,
可以根据端口,判断 是 哪个服务, 很多情况下,都是很准确的。
80 http
443 https
22 ssh
23 telnet
59 dns
3389 microsoft rdp
一共有 1-65535 个端口(其实0也可以用)
简单代码
# coding = utf-8
import socket
socket.setdefaulttimeout(0.1)
def get_port(host, port):
try:
obj = socket.socket()
obj.connect((host,port))
return True
except:
return False
def port_scan_test():
if get_port('127.0.0.1',135):
print('open!!!')
else:
print("No No No!!!")
代码优化
对代码进行优化, 刚才的代码,运行的时间非常慢,还只是在扫描一个端口的情况下
- 如果扫描一个 不存在的端口的时候, 会超时, 可以把 超时时间 设置短一点
- 对代码进行 多线程 或者 多进程的优化 ,大大缩短 扫描所有端口的时间
最后的代码
# coding = utf-8
import socket
import queue
socket.setdefaulttimeout(0.1)
import threading
def get_port(host, port):
try:
obj = socket.socket()
obj.connect((host,port))
return True
except:
return False
class mutit_scan(threading.Thread):
def __init__(self, host, port_queue):
threading.Thread.__init__(self)
self.port_queue = port_queue
self.host = host
def run(self):
while not self.port_queue.empty():
port = self.port_queue.get()
self.get_port_sign(port)
def get_port_sign(self, port):
# print(port)
if get_port(self.host, port):
print(port, 'is open!!!')
def mutili_port_scan_all():
""" 多线程优化 """
ip = '60.172.40.204'
thread_count = 500
threads = []
port_que = queue.Queue()
port_list = []
for i in range(1,65536):
port_list.append(i)
port_que.put(i)
for _ in range(thread_count):
thread = mutit_scan(ip, port_que)
threads.append(thread)
thread.start()
for i in threads:
i.join()
mutili_port_scan_all()
差不多 7 秒跑完, 那个 socket 超时时间可以设置成 0.01s
记录一下, 写这个东西的思路, 虽然很简单,但是千里之行始于足下嘛