Python之SYN数据包探测端口

本篇文章叙述的是运用TCP里面的SYN来探测端口是否开放,如果开放则返回一个SYN+ACK包,是非常实用的小程序,因为在信息收集中,几乎都是需要探测端口号,之后便可以对该端口做些不可描述的事情。

代码区:

from scapy.all import * #主要用来构造包(Windows系统需要安装scapy模块,如果不懂安装可以看https://blog.csdn.net/q759451733/article/details/84038114

def syn_scan_final(hostname,lport,hport):
    result_raw = sr(IP(dst = hostname)/TCP(dport =                (int(lport),int(hport)),flags=2),
timeout = 1,verbose = False)          

#dport = (int(lport),int(hport))可以扫描指定的端口范围,这也是scapy的一个好处,flags=2表示syn包(三次握手的第一个包)。sr是发送三层数据包,timeout是定义超时时间,verbose如果不将该参数定义为False,那么屏幕将会打印一些不相关的字符串,定义为False之后,就可以打印自己想看到的字符串

    result_list = result_raw[0].res #表示接收到的数据包的第0层里面的res全部赋值给result_list
    for i in range(len(result_list)):   #主要意思是将收到的每个包的下标赋值给i,如接收到了1024个包,那么i就等于0、1、2、3...(如图一、二)
        if result_list[i][1].haslayer(TCP): #在i层里的1层中,有没有TCP这一层,如果有执行
            TCP_Fields = result_list[i][1].getlayer(TCP).fields #在i层里的1层中,将TCP层里的fields里面的值赋值给TCP_Fields
            if TCP_Fields['flags'] == 18:  #这个flags == 18,是指SYN+ACK包(如图三、四)
                print('port:' + str(TCP_Fields['sport'])) #打印开放的端口

if __name__ == '__main__':
    host = '183.232.231.172'
    low = 1
    high = 1024
    syn_scan_final(host,low,high)

(图一)

(图二)

如上图,每循环一次增加1,如有1024个返回包,则循环1024次。

 

(图三)

(图四)

如下图:18这个值来源是   10010(二进制) == 18(十进制),这个就是服务端(百度)发回的响应包。

 

在抓包过程中有个在发送端(本主机)会自动发送一个RST包,这个包会告诉服务端(百度),立即关闭连接,因为我们不需要后续的连接,所以就直接发送了一个RST包。我们也来感受一下计算机发收包的速度有多快。从6.857175秒到6.880380秒,之间仅仅只需要了0.023205秒而已。

 

总结:多调试多抓包,构造不同的TCP包,抓不同的返回包,这样很有助于自己对包的理解,可以改变里面的参数,查看返回的包,有助于TCP的理解。

如果有什么讲解得不好的地方,或者想问的问题都可以在下方评论区评论哟!

发布了31 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/q759451733/article/details/84174631