【问题标题】:Listening Application (winsock2) behavior towards Port scanning (Syn Scan)监听应用程序 (winsock2) 对端口扫描 (Syn Scan) 的行为
【发布时间】:2015-04-23 02:09:37
【问题描述】:

侦听端口的服务器应用程序是否应该能够检测并记录 Syn Scanning 完成的任何连接尝试?

测试场景

我编写了一个 Windows 程序,我简单地称之为“simpleServer.exe”。 这个程序只是一个非常基本的服务器应用程序的模拟。 它监听一个端口,并等待传入​​的消息。 监听 Socket 被定义为 TCP Stream Socket。 这就是这个程序所做的一切。

我一直在 2 台不同的机器上部署这个完全相同的程序,它们都在 Windows 7 Professional 64 位上运行。 这台机器将充当主机。 并且他们驻扎在同一个网络区域。

然后,使用程序“nmap”, 我使用同一网络上的另一台机器作为客户端。 使用“nmap”上的“-sS”参数,我对两台机器上的侦听 simpleServer 的 IP 和端口进行 Syn Scan(一次尝试一次)。

(请注意,2 台主机已经启动了“wireshark”,并且正在监视来自客户端 IP 和侦听端口的 tcp 数据包。)

在两台机器上的“wireshark”条目中,我看到了 Syn Scan 的预期 tcp 数据包:

client ----(SYN)----> host

client <--(SYN/ACK)-- host

client ----(RST)----> host

上面的数据包交换表明连接没有建立。

但在“simpleServer.exe”中,只有一个实例在日志中打印了“新传入连接”,而另一个实例没有收到任何新传入连接的警报,因此根本没有日志。

代码片段

// socket bind and listen was done above this loop 
while(TRUE)
{
    sClient=accept(sListen,(SOCKADDR*)&remoteAddr,&nAddrLen);
    if(sClient == INVALID_SOCKET)
    {
        printf("Failed accept()");
        continue;
    }
    dwSockOpt (sListen);
    printf ("recv a connection: %s\n", inet_ntoa(remoteAddr.sin_addr));

    closesocket(sClient);
}

旁注: 是的,因为它只是一个简单的程序,所以流程可能有点滑稽,比如 while 循环中没有 break。所以请不要介意这种简单而有缺陷的设计。

进一步调查

我还在“simpleServer”进入侦听状态后立即将 getsockopt() 放入其中,以检查两个侦听套接字的 SOL_SOCKET 选项的差异。

我发现两个主机之间的一个显着区别是 SO_MAX_MSG_SIZE。 检测到传入连接的主机的十六进制值为 0x3FFFFFFF (1073741823),而另一个没有日志的主机是 0xFFFFFFFF (-1)。不确定这是否相关,但我只是发送了我在测试环境中可能发现的任何差异。 SOL_SOCKET 的其他值大致相同。

旁注:我在其他机器上进行了测试,它涵盖了另一台 windows 7 专业版、windows server 2008 r2、windows server 2003。我不确定这是否是巧合,但是具有 SO_MAX_MSG_SIZE == -1 的机器,他们都没有检测到 Syn Scanning 的连接。但也许这只是一个巧合。我没有什么可以证明的。

我需要的帮助

  • 为什么同一应用程序在具有相同操作系统的不同机器上的 2 个相同的行为会出现不同的行为?
  • 什么决定了 SO_MAX_MSG_SIZE 的值?考虑两个相同的操作系统,但具有 2 个不同的值。

【问题讨论】:

    标签: tcp server behavior winsock2 difference


    【解决方案1】:

    如果从未建立连接,accept() 将永远不会返回。这解决了你 90% 的问题。

    “新传入连接”(或“接收连接”或其他任何内容)消息的唯一解释是其他连接。

    SO_MAX_MSG_SIZE 对于 TCP 套接字没有意义,更不用说监听 TCP 套接字了。所以你经历的任何变化都是没有意义的。

    【讨论】:

    • 您好 EJP,感谢您的回复。顺便说一句,还有什么可以连接到它的?如果我在wireshark 上正确跟踪我的踪迹,则只有来自客户端的数据包。只有当我在客户端上运行 nmap 时才会出现这些痕迹。
    • accept() 必须有一个 SYN-SYN/ACK-ACK 序列才能返回。
    • 这就是为什么我试图找出我的机器上发生了什么。我看到一个 SYN-SYN/ACK-RST(在 wireshark 跟踪中从未发现 SYN-SYN/ACK-ACK),但 accept() 以某种方式返回了一个值。并且还打印了客户端的IP。它只发生在某台机器上(包括我的笔记本电脑)。顺便说一句,对不起,如果我在我的问题中使用了不正确的术语/句子。
    猜你喜欢
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多