【问题标题】:How should I do to check if the service running on a remote host?我应该如何检查服务是否在远程主机上运行?
【发布时间】:2015-02-05 23:33:06
【问题描述】:

我正在编写一个端口扫描器,我想验证一个特定端口是否正在运行该端口上预期的标准服务,例如SSHHTTP。我知道其中一种方法是向该端口发送查询并分析返回的信息。例如,SSH 在连接后立即向我发送版本信息。然而,当我对一个 IP 地址的 22 端口执行connect() 时,我只得到了Error number: 110. Error message: Connection timed out。任何想法将不胜感激。

整个代码说来话长。我在这里粘贴一些摘录。

struct sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(22);
dest_addr.sin_addr.s_addr = inet_addr("8.8.8.8");

int service_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (service_sock < 0) {
    printf("Error creating service socket. Error number: %d. Error message: %s\n", errno, strerror(errno));
    exit(0);
}

int dest_addr_len = sizeof(dest_addr);
if (connect(service_sock, (struct sockaddr *)&dest_addr, dest_addr_len) < 0) { // stuck here
    printf("Error connection. Error number: %d. Error message: %s\n", errno, strerror(errno));
    exit(0);
}

为了澄清这个问题,我需要举一个例子。我刚刚想出了一种方法来验证HTTP 服务。即向目标地址发送一个字符串"GET / HTTP\n\n"。然后调用recv()函数读取返回的消息。我可以得到这样的东西。

HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 1419
Date: Tue, 02 Dec 2014 05:56:25 GMT
Server: GFE/2.0
...

我可以从第一行读取HTTP 版本是1.0

这里我想检查远程主机上的许多服务,包括但不限于SSHHTTP。我不认为猜测是个好主意。所以我需要一个通用的方法来从dest_addr 中检索这些信息。

【问题讨论】:

  • connection time out 不是表示远程主机在该端口上没有响应?
  • @Ubica 确实如此。我只是不知道我应该发送什么样的查询,或者,我如何从远程主机获得响应。
  • @Ubica 谢谢,但该链接没有帮助。我已经实现了如何检查端口是打开还是关闭。这里我想验证一个特定的服务是否在那个端口上运行。
  • 除非端口响应,否则您无法检查端口是否有服务...就这么简单:) 试试这个链接nmap.org/nmap_doc.html

标签: service port-scanning


【解决方案1】:

好的,最后我需要回答我自己的问题。我刚拿到这个验证工作,并为此写了一个post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多