🗒️py 09 socket,scapy扫描
2023-11-3
| 2023-11-3
字数 2757阅读时长 7 分钟
type
status
date
slug
summary
tags
category
icon
password
😀
socket,scapy各种扫描

本机配置

用于之后扫描开启和未开启的端口测试
本机ip:127.0.0.1 172.16.110.155 内网其他ip:172.16.110.48 仅开80
notion image

socket TCP全连接扫描

常规流程,sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)建立套接字,使用IPV4地址组,TCP协议,sock.connect((target, port))绑定ip和端口建立连接,进行遍历
notion image

scapy TCP全连接扫描

扫48远程ip的时候,open的端口可以扫描出来,但是close的端口命令行会卡住一直不出结果。原因未知。
解释代码(GPT):
如果 send[TCP].flags 的值为 "SA",那么端口状态被视为 "SYN-ACK",这意味着目标端口对SYN请求做出了响应,表示端口开放。而如果 send[TCP].flags 的值为 "RA",则端口状态被视为 "RST-ACK",这表示目标端口对SYN请求做出了RST响应,通常表示端口关闭。
"SA" 表示的是建立连接的标志,而 "RA" 表示的是重置连接的标志。当你向一个开放的端口发送SYN请求时,目标主机会响应SYN-ACK,表示愿意建立连接。而当你向一个关闭的端口发送SYN请求时,目标主机会响应RST-ACK,表示拒绝连接请求。
send = sr1(IP(dst=target) / TCP(dport=port, flags="S", ), timeout=1, verbose=0)
这一句代码是用于发送一个SYN包(SYN标志位被设置为1,表示建立连接请求)到指定的目标主机和端口,以尝试建立一个TCP连接。各个部分的解释:
  • send = sr1(...): 这行代码使用Scapy的sr1函数来发送一个网络包并等待响应。send变量用于存储响应包,如果没有响应则为None。
  • IP(dst=target): 构建了一个IP数据包,其中dst=target指定了目标IP地址。
  • TCP(dport=port, flags="S"): 构建了一个TCP数据包,其中dport=port指定了目标端口,而flags="S"表示设置TCP包的SYN标志位为1,以表示建立连接请求。
  • timeout=1: 指定等待响应的最长时间,表示等待1秒钟来获取响应。
  • verbose=0: 用于控制输出的详细程度。在这里,设置为0表示禁用详细输出。
所以,这一行代码的作用是向目标主机的特定端口发送一个SYN包,然后等待1秒钟以获取响应。如果目标主机响应了这个SYN包,send变量将存储响应,你可以通过检查响应中的TCP标志位来确定端口状态。如果没有响应,send变量将为None。
目标主机不可达,防火墙或者网络过滤或者超时(timeout)时send变量将为None。
notion image

三次握手:

①客户端发起请求,包含标头S(SYN) ②若开启则服务端返回SA(syn+ack),此时客户端需要主动终止连接发送R标头(RST) ③若端口关闭必然回复R(rst)

scapy SYN扫描

俩个脚本:

其余扫描

直接提供俩个脚本化的脚本,再配合nmap一起看吧。
针对同一组端口扫描,某些扫描方式可能三个都没有一个扫完能判断正确的。稳一点的就是tcp和syn,正确率比较高,其他的一言难尽。魔幻,针对一组端口,俩个脚本+nmap用同一种扫描,扫描完三个结果。
  • 脚本编程
  • py08 poc初尝试py 10 写structs系列的poc
    Loading...