【问题标题】:C scan open ports on remote serverC 扫描远程服务器上的开放端口
【发布时间】:2016-08-17 18:04:58
【问题描述】:

我正在尝试编写一个 C 程序来检查远程服务器上的开放端口。

重要提示:我知道有类似 nmap 之类的解决方案,但这里的关键是让我自己学习如何编写这样的东西。

我编写了以下代码,它会提示您输入 IP 和端口。

现在有两种解决方案:

a) 已输入端口号 -> 将测试到此端口的连接

b) 将输入“扫描” -> 将检查从 1 到 5000 的每个端口是否成功连接。

所以我的问题是,每当我输入“扫描”时,只有端口 21 会被列为“开放”。

    #include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>

#define OK 0
#define NO_INPUT 1
#define TOO_LONG 2

static int getLine (char *prmpt, char *buff, size_t sz){

    int ch, extra;

    if (prmpt != NULL) {
        printf("%s", prmpt);
        fflush(stdout);
    }

    if (fgets(buff, sz, stdin) == NULL)
        return NO_INPUT;

    if (buff[strlen(buff)-1] != '\n') {
        extra = 0;
        while (((ch = getchar()) != '\n') && (ch != EOF)){
            extra = 1;
        }
        return (extra == 1) ? TOO_LONG : OK;
    }

    buff[strlen(buff) - 1] = '\0';
    return OK;
}



int main (int argc, char *argv[])
{

int socket_desc;
struct sockaddr_in server;

socket_desc = socket(AF_INET, SOCK_STREAM, 0);

if (socket_desc == -1){
    printf("Could not open socket\n");
}

char ip[30];
char port[5];



getLine("IP> ", ip, sizeof(ip));
getLine("Port> ", port, sizeof(port));

if (strcmp("scan", port) == 0){
    puts("scanning....");
    server.sin_addr.s_addr = inet_addr(ip);
    server.sin_family = AF_INET;

    for (int i = 1; i < 5000; i++){
        server.sin_port = htons(i);
        if (connect(socket_desc, (struct sockaddr * )&server, sizeof(server)) < 0 ) {

        }
        else {
            printf("Open port: %d\n", i);
        }



    }


}
else {
int iport = atoi(port);

server.sin_addr.s_addr = inet_addr(ip);
server.sin_family = AF_INET;
server.sin_port = htons(iport);

if (connect(socket_desc, (struct sockaddr * )&server, sizeof(server)) < 0 )
{
puts("connect error");
return 1;
}

puts("Connected");
}

return 0;

}

为什么只有端口 21 (FTP) 被列为开放?是否由于我使用的功能的性质,这些功能仅用于数据连接(当时是端口 21)。我应该使用不同的功能,甚至可能是不同的方法(在我的脑海中,也许 ping 一个端口(如果可能的话)而不是尝试连接)

我的最终目标是编写一个程序来扫描服务器并列出打开的端口以及那里正在运行的端口(SSH、SMTP 等)

感谢您的帮助!!

【问题讨论】:

  • 可能是因为远程主机上只有端口 21 是开放的..?您是否尝试过使用 nmap 进行类似的扫描?相同/不同的结果?
  • 你说它只显示端口 21,所以这是错误的。你怎么知道这是错的?您是否使用其他工具证明任何其他端口是开放的?
  • 我拥有服务器,我知道哪些端口是开放的,nmap 也显示 30 个开放端口
  • 我知道你知道nmap。查看一段完善的代码的来源,不是作弊,也不会阻止您学习,但肯定可以避免您犯一些早已从该代码中调试出来的相同错误@ 987654323@

标签: c server port


【解决方案1】:

一旦连接了套接字,对connect 的进一步尝试肯定会以EISCONN 失败。您需要在每次迭代中创建一个新套接字(不要忘记关闭它)。

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多