请考虑以下代码:
import socket, sys, time
HOST = '172.16.0.19'
PORT = 1000
#create a raw socket
try:
s = socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.IPPROTO_TCP)
except socket.error , msg:
print 'Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
s.bind((HOST,PORT))
while True:
print "Waiting for SYN..."
rec_packet, addr = s.recvfrom(100)
print "Incoming connection detected!"
print "".join(map("{0:08b}".format, map(ord, list(rec_packet[0:10]))))
print addr[0]
print ""
它是自动SYN攻击检测器的简化版本。当我使用时:
nmap 172.16.0.19 -sS -p 1001 **NOTE THE DIFFERENT PORT**
我仍然可以从代码中获得检测。 s.bind不能只听取给定的端口吗?
SSH到目标也会触发代码。
答案 0 :(得分:1)
原始套接字(有关详细信息,请参阅raw(7)
)支持发送原始IP数据报。原始ip数据报没有端口。端口是在IP之上分层的更高级协议的构造,如UDP和TCP。
您可以自己检查收到的数据包以解压缩udp / tcp端口。
另一种解决方案可能是利用netfilter框架捕获设置了SYN标志的特定tcp端口上的数据包,然后通过nfqueue扩展名将其发送到您的程序。