本篇文章叙述的是运用TCP里面的SYN来探测端口是否开放,如果开放则返回一个SYN+ACK包,是非常实用的小程序,因为在信息收集中,几乎都是需要探测端口号,之后便可以对该端口做些不可描述的事情。
代码区:
from scapy.all import * #主要用来构造包(Windows系统需要安装scapy模块,如果不懂安装可以看)
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的理解。
如果有什么讲解得不好的地方,或者想问的问题都可以在下方评论区评论哟!