【问题标题】:C check what service is running on an open portC 检查开放端口上正在运行什么服务
【发布时间】:2013-03-08 21:21:46
【问题描述】:

我正在用 C 语言编写端口扫描器,我想检测在开放端口上运行的服务及其版本。
我已经编写了扫描器代码,但现在我不知道如何检测正在运行服务。
我能做什么?

【问题讨论】:

  • 我知道在端口 (22->ssh) 上运行的teorically 服务是什么,但我想知道的是:我如何才能检查确定 正在运行的服务及其版本。
  • 您可能无法完全准确地做到这一点。您可以根据服务运行的端口做出有根据的猜测,如果您愿意,您可以为每个服务编写最少的“客户端”并进行测试 - 如果它们按预期响应,您可以将其标记为该服务.但很明显,这不是一项可以永远以 100% 准确度完成的任务。

标签: c port-scanning


【解决方案1】:

如果你确定要在自己的代码中做,你可以连接到端口,看看你有没有得到任何数据,如果没有则发送几个字节,然后再检查一次。

然后将其与预期响应相匹配。

要了解您要查找的内容,您可以使用 telnet 手动连接到端口并戳它。在许多情况下(Web 服务器就是一个简单的例子),您必须发送一些格式正确的数据才能获得可用的响应。

nmap 已经完成了所有这些以及更多工作(例如,广泛的检查,例如查找 arp 流量的字节顺序和时间)

更新:一些人提到了众所周知的端口,但这无助于您发现在非标准端口上运行的标准服务,例如在自定义端口上运行的 ssh 或 http 服务器。

【讨论】:

  • 我同意这里的一切,但会重复我在上面的评论中所说的话:即使您为每个协议编写“最小客户端”,您也无法 100% 准确地实现这一点为人所知。
  • @NikBougalis 绝对正确。检测方法和您需要发送以获得响应的数据几乎是无穷无尽的。我不会从事这样的项目,除了 a)为了好玩,或者 b)为了 nmap 不知道的内部定制服务
【解决方案2】:

如果服务器先发送一些东西,用它来识别协议。

如果不是,则根据某种协议发送一些东西,例如 http,然后查看服务器发回的内容(有效响应或错误)。您可能需要使用不同的协议进行多次尝试,并且良好的顺序对于最大限度地减少连接数非常重要。

有些协议可能很难识别,很容易用你不知道的独特协议制作自定义服务器,甚至将真实服务器隐藏在其他proto的简单假服务器下,例如http。

如果你只是想知道端口通常是什么,请查看"well known ports"和官方reserved ports

同时检查nmap源代码。

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    相关资源
    最近更新 更多