全连接端口扫描的原理
全连接扫描的优缺点
nmap软件
TCP SYN扫描
TCP SYN扫描也称为half-open扫描(半开放扫描),其原理是由扫描器向目标服务器的端口发送一个请求连接的SYN包,如果目标端口开放,则服务器会向扫描器返回一个SYN/ACK包,否则会返回一个RST包。这种扫描最大的特征是,扫描器在收到SYN/ACK后,不是发送的ACK应答而是发送RST包请求断开连接。这样,三次握手就没有完成,没有建立正常的TCP连接,大多数的系统不会对这种事件进行审计记录,因此这种扫描技术一般不会在目标主机上留下扫描痕迹,并且这种方法可以伪造源IP。但是,这种扫描需要攻击者有root权限,并且随着时代发展,很多IDS都会对这种扫描行为进行监测,但相比前面的connect扫描而言,已经有了技术上的提高。
https://zhuanlan.zhihu.com/p/502016393
TCP SYN扫描需要用户自己构造TCP数据包发送,就不能使用常用的SOCK_STREAM流式套接字,而是要用更加接近底层的SOCK_RAW原始套接字,它允许用户自己构造数据包并在网卡上发送(也正是这个原因导致这个方法需要攻击者拥有root权限,同时也给了伪造握手包源IP地址的机会)
void process_packet(unsigned char* buffer, int size) {
// Get the IP Header part of this packet
struct iphdr* iph = (struct iphdr*)buffer;
struct sockaddr_in source, dest;
unsigned short iphdrlen;
if (iph->protocol == 6) {
struct iphdr* iph = (struct iphdr*)buffer;
iphdrlen = iph->ihl * 4;
struct tcphdr* tcph = (struct tcphdr*)(buffer + iphdrlen);
memset(&source, 0, sizeof(source));
source.sin_addr.s_addr = iph->saddr;
memset(&dest, 0, sizeof(dest));
dest.sin_addr.s_addr = iph->daddr;
if (tcph->syn == 1 && tcph->ack == 1 &&
source.sin_addr.s_addr == dest_ip.s_addr) {
printf("Port %d open \n", ntohs(tcph->source));
fflush(stdout);
} else if (source.sin_addr.s_addr == dest_ip.s_addr) {
printf("Port %d close \n", ntohs(tcph->source));
fflush(stdout);
}
}
}
Xmas Tree扫描模式是什么样的,介绍一下:
https://blog.csdn.net/zHx981/article/details/112268991
该扫描模式通过发送带有下列标志位的tcp数据包 :
**URG:**指示数据时紧急数据,应立即处理。
**PSH:**强制将数据压入缓冲区。
**FIN:**在结束TCP会话时使用。
正常情况下,三个标志位不能被同时设置,但在此种扫描中可以用来判断哪些端口关闭还是开放。
端口开放时:发送URG/PSH/FIN, 没有响应
端口关闭: 发送URG/PSH/FIN,没有响应 , 但响应RST(TCP连接异常终止)
XMAS扫描原理和NULL扫描的类似,将TCP数据包中的ACK、FIN、RST、SYN、URG、PSH标志位置1后发送给目标主机。在目标端口开放的情况下,目标主机将不返回任何信息。