python实现syn半扫描_python 实现 syn 扫描

1.scapy这个库轻松实现构造数据包、发送数据包、分析数据包

2.scapy安装:

pip install scapy   ======> scapy不是内置模块,故需要额外安装

3.导入scapy方式:

from scapy.all import *

函数使用:

sr1 函数来发送和接收第三层的数据包 sr1 表示一次只发送一次

SYN扫描:

1.向目标主机发送请求连接SYN包,扫描器收到SYN/ACK后,不是发送ACK应答而是发送RST请求断开连接

判断端口开放:1.Client发送SYN 2.Server端发送SYN/ACK 3.Client发送RST断开

端口关闭: 1.Client发送SYN 2.Server端发送RST(表示端口断开)

TCP3次握手:

在TCP/IP协议中,TCP协议提供可靠的连接服务,

采用三次握手建立一个连接。

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,

并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),

即SYN+ACK包,此时服务器进入SYN_RECV状态;

#!/usr/bin/python

from scapy.all import *

import socket

import time

#syn扫描

def syn_scan(target_ip,start,end):

print('扫描主机:%s ......'%target_ip)

i = 0

for port in range(start, end):

#sr1 向目标发送一个SYN分组(packet)

a = sr1(IP(dst=target_ip) / TCP(dport=port), timeout=1, verbose=0)

if a == None:

pass

else:

#接收返回的数据包验证flags 的值 即ACK+SYN回包的16进制数据转为10进制 0X12

# 转成int 来判断是否回包是ACK+SYN的值18是表示端口开放

if int(a[TCP].flags) == 18:

print('[*]'+ target_ip+' '+ str(port)+' 端口开放 ')

i+=1

else:

pass

print('[*]总共开放了 %s 个端口'%i)

#核验ip是否输入合格,还是网址

def checkip(hostip):

pat = re.compile(r'([0-9]{1,3})\.')

r = re.findall(pat, hostip + ".")

if len(r) == 4 and len([x for x in r if int(x) >= 0 and int(x) <= 255]) == 4:

return hostip

else :

domain_ip = socket.getaddrinfo(hostip,None)[0][4][0]

return domain_ip

def run():

print(' '*35+'SYN扫描器')

print(' '*30+'退出程序请输入exit'+' '*30)

while True:

host_ip = input("请输入网址或者ip地址:")

if host_ip=='exit':

exit()

else:

if checkip(host_ip) != None:

target_ip = checkip(host_ip)

inputs = input('端口范围eg:50-80: ')

ports = inputs.split('-')

start = int(ports[0])

end = int(ports[1])

syn_scan(target_ip, start, end)

time.sleep(0.01)

print('[*]主机:%s 扫描完成!'%target_ip)

if __name__ == '__main__':

run()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值