#####################################
# Portscan TCP #
# #
#####################################
# -*- coding: utf-8 -*-
#!/usr/bin/python3
import socket
ip = input("Digite o IP ou endereco: ")
ports = []
count = 0
while count < 10:
ports.append(int(input("Digite a porta: ")))
count += 1
for port in ports:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.settimeout(0.05)
code = client.connect_ex((ip, port)) #conecta e traz a msg de erro
#Like connect(address), but return an error indicator instead of raising an exception for errors
if code == 0: #0 = Success
print (str(port) + " -> Porta aberta")
else:
print (str(port) + " -> Porta fechada")
print ("Scan Finalizado")
上面的python脚本是TCP扫描。如何将其更改为TCP SYN扫描?如何使用方法(TCP SYN)创建端口扫描器TCP SYN ?
正如@ upsampling所提到的,您可以使用原始套接字(https://en.wikipedia.org/),因为您只需要TCP协议的一个子集(发送SYN并接收RST-ACK或SYN- ack )) .
编码类似http://www.binarytides.com/raw-socket-programming-in-python-linux/的东西可能是一个很好的练习,我也建议考虑https://github.com/secdev/scapy
Scapy是一个强大的基于python的交互式数据包操作程序和库。
下面的代码示例已经实现了一个简单的端口扫描程序http://pastebin.com/YCR3vp9B和一篇关于它的详细文章:http://null-byte.wonderhowto.com/how-to/build-stealth-port-scanner-with-scapy-and-python-0164779/
代码是有点丑,但它的工作-我已经检查了它从我的本地Ubuntu PC与我的VPS。下面是最重要的代码片段(稍微调整以符合PEP8):
# Generate Port Number
srcport = RandShort()
# Send SYNC and receive RST-ACK or SYN-ACK
SYNACKpkt = sr1(IP(dst=target) /
TCP(sport=srcport, dport=port, flags="S"))
# Extract flags of received packet
pktflags = SYNACKpkt.getlayer(TCP).flags
if pktflags == SYNACK:
# port is open
pass
else:
# port is not open
# ...
pass
首先,您必须使用RAW套接字生成自己的SYN数据包。你可以在这里找到一个例子
其次,您需要侦听来自扫描主机的SYN-ACK,以便确定哪些端口实际尝试启动TCP握手(SYN、SYN-ACK、ACK)。您应该能够从响应的应用程序中检测和解析TCP报头。从这个报头中,你可以确定源端口,从而找出一个监听的应用程序在那里。
如果你实现这个,你也基本上做了一个SYN DDOS实用程序,因为你将创建大量半打开的tcp连接。