等等,我知道你很急但你先别急
SYN扫描原理 奇妙至极~
朋友,想成为SYN扫描传奇吗?
发送SYN包:扫描器向目标端口发送一个SYN(同步序列编号)数据包,它正试图建立一个正常的连接。
如果收到SYN-ACK(同步确认)响应,这意味着端口是开放的,因为目标已准备好完成连接。
如果收到RST(重置)响应,这意味着端口是关闭的,目标没有等待任何连接在该端口上。
不完成握手:在收到SYN-ACK后,扫描器通常会发送一个RST包来中断连接过程,因此不会建立一个完整的TCP连接。
要构建一个完整的数据包,需要按照协议栈的层次结构依次封装这些层。
例如,一个完整的TCP/IP数据包会包括:
数据负载(如果有的话)
// IPv4
opts = append(opts, pcapx.WithIPv4_Flags(layers.IPv4DontFragment))
opts = append(opts, pcapx.WithIPv4_Version(4))
opts = append(opts, pcapx.WithIPv4_NextProtocol(layers.IPProtocolTCP))
opts = append(opts, pcapx.WithIPv4_TTL(64))
opts = append(opts, pcapx.WithIPv4_ID(40000+rand.Intn(10000)))
opts = append(opts, pcapx.WithIPv4_SrcIP(srcIP))
opts = append(opts, pcapx.WithIPv4_DstIP(dstIP)) // 要扫描的IP
opts = append(opts, pcapx.WithIPv4_Option(nil, nil))
// TCP
opts = append(opts,
pcapx.WithTCP_SrcPort(srcPort),
pcapx.WithTCP_DstPort(port), // 要扫描的端口
pcapx.WithTCP_Flags(pcapx.TCP_FLAG_SYN),
pcapx.WithTCP_Window(1024),
pcapx.WithTCP_Seq(500000+rand.Intn(10000)),
)
长度(Length):在某些协议(如IEEE 802.3)中,这个字段表示数据字段的长度。
对于同一个子网掩码地址内的两个内网IP通信相对简单,因为它们位于同一个局域网(LAN)内。这种情况下,数据包通常不需要经过路由器进行路由,而是直接通过交换机或者集线器在内部网络中传输。
目的IP非本地子网:
IPv4 路由表
===========================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 192.168.3.1 192.168.3.3 30
127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331
127.0.0.1 255.255.255.255 在链路上 127.0.0.1 331
127.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
172.22.160.0 255.255.240.0 在链路上 172.22.160.1 5256
172.22.160.1 255.255.255.255 在链路上 172.22.160.1 5256
172.22.175.255 255.255.255.255 在链路上 172.22.160.1 5256
172.25.16.0 255.255.240.0 在链路上 172.25.16.1 5256
172.25.16.1 255.255.255.255 在链路上 172.25.16.1 5256
172.25.31.255 255.255.255.255 在链路上 172.25.16.1 5256
192.168.3.0 255.255.255.0 在链路上 192.168.3.3 286
192.168.3.3 255.255.255.255 在链路上 192.168.3.3 286
192.168.3.255 255.255.255.255 在链路上 192.168.3.3 286
224.0.0.0 240.0.0.0 在链路上 127.0.0.1 331
224.0.0.0 240.0.0.0 在链路上 192.168.3.3 286
224.0.0.0 240.0.0.0 在链路上 172.25.16.1 5256
224.0.0.0 240.0.0.0 在链路上 172.22.160.1 5256
255.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
255.255.255.255 255.255.255.255 在链路上 192.168.3.3 286
255.255.255.255 255.255.255.255 在链路上 172.25.16.1 5256
255.255.255.255 255.255.255.255 在链路上 172.22.160.1 5256
===========================================================================
内网扫描时,目标IP 的MAC 地址通过 ARP 协议请求目标 IP 获取。
通过前文得知,最终我们需要先通过构造ARP数据包来拿到相应的目的MAC地址。
ARP 数据包的构造相对简单很多:
eth := layers.Ethernet{
SrcMAC: sender.adapterDevice.Mac,
DstMAC: net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
EthernetType: layers.EthernetTypeARP,
}
arp := layers.ARP{
AddrType: layers.LinkTypeEthernet,
Protocol: layers.EthernetTypeIPv4,
HwAddressSize: 6,
ProtAddressSize: 4,
Operation: layers.ARPRequest,
SourceHwAddress: srcMAC,
SourceProtAddress: srcIP,
DstHwAddress: []byte{0, 0, 0, 0, 0, 0},
DstProtAddress: dstIP,
}
至此,我们已经完成了所有的前置工作,最终的关键扫描逻辑大致如下
YAK官方资源
Yak 语言官方教程:
https://yaklang.com/docs/intro/
Yakit 视频教程:
https://space.bilibili.com/437503777
Github下载地址:
https://github.com/yaklang/yakit
Yakit官网下载地址:
https://yaklang.com/
Yakit安装文档:
https://yaklang.com/products/download_and_install
Yakit使用文档:
https://yaklang.com/products/intro/
常见问题速查:
https://yaklang.com/products/FAQ