利用python scapy 这个强大的类库写了个tcp 端口扫描器
原理
向指定端口发送tcp包flags=‘S’,如果该端口开放则回复tcp包 flags=‘SA’;
yes,就这么简单,当然如果有firewall那另当别论了
流程
1.定义数据包捕捉器并送入子线程运行
2.运行发包函数
ps:这种多个端口扫描的脚本如果用sr或srp一个个的发和收,是非常慢的。
建议向我学习定义一个捕捉器子线程运行,将会非常高效的
code[name: tcp_scan.py]
import sys
from scapy.all import *
from threading import Thread
def scan_Fun(args): //构造tcp数据包flags至"s"标志位并发送
ip,ports = args
pkt = IP(dst=ip)/TCP(dport=ports,flags="S")
send(pkt,verbose=False)
#print(a.show())
def port_active(): //捕捉数据包并进行条件匹配
def print_liver(pkt):
if TCP in pkt and pkt[TCP].flags == 'SA':
retstring = '%IP.src%: '+str(pkt[TCP].sport)+'[%TCP.sport%] is open'
return pkt.sprintf(retstring)
sniff(filter='tcp',timeout=3,prn=print_liver) //定义一个捕捉器,捕捉TCP包并调用回调函数进行处理
def main():
args = sys.argv //接收两个参数,如参数不足则输出提示,并退出
if len(args) != 3:
print('Usage: python tcp_scan.py ip start_port,end_port')
print('for example: python tcp_scan.py 192.168.199.3 21,80')
exit()
start_port,end_port = args[2].split(',')
Thread(target=port_active).start() //定义一个子线程并运行
scan_Fun([args[1],(int(start_port),int(end_port))]) //传参并运行发包函数
if __name__ == '__main__':
main()
如何运行
[root@local]#python tcp_scan.py 192.168.199.3 21,80