Случайное соединение с портом при сканировании портов - PullRequest
0 голосов
/ 13 февраля 2019

Я сделал очень простую программу сканирования портов на C для сканирования диапазона портов.Вот оно:

#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>

#define HOST "127.0.0.1"
#define PORT 4444

int createConnection(const char *host[], const int port)
{
    struct sockaddr_in addr;
    int sock = 0;
    int ret;
    struct sockaddr_in server_addr;
    if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
    {
        printf("Error %d socket creating.\n", sock);
        return -1;
    }
    else
    {
        memset(&server_addr, '0', sizeof(server_addr));

        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(port);
        ret = inet_pton(AF_INET, host, &server_addr.sin_addr);
        if (ret <= 0)
        {
            printf("Error %d unsuported address: %d\n", ret);
            return -2;
        }
        else
        {
            ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
            if (ret < 0)
            {
                //printf("[-] Port %d closed.\n", port);
                close(sock);
                return 1;
            }
            else
            {
                printf("[+] Port %d open.\n", port);
                close(sock);
                return 0;
            }
        }

    }
}

int main(int argc, const char *argv[])
{
    for (int i = 1; i < 65536; i++)
    {
        createConnection("127.0.0.1", i);
    }
}

Как вы можете видеть в цикле for, он сканирует с порта 1 на порт 65535. Проблема в том, что при запуске я получаю следующие выходные данные:

[+] Port 42178 open.
[+] Port 48650 open.
[+] Port 60078 open.

«Открытые порты» всегда меняются, но всегда превосходят 40000. Но я проверил с помощью netstat -tulpn, только мой порт 68 открыт для dhclient, который является UDP, а не TCP.Почему это говорит, что у меня есть открытые порты?

1 Ответ

0 голосов
/ 13 февраля 2019

Я подозреваю, что при сканировании вы используете порты открытого сокета источника .

Соединения TCP имеют порт источника.Если он не назначен сокету (через bind), то ядро ​​назначает сокету эфемерный (в верхнем диапазоне) сокету при вызове connect перед отправкой SYN.

Поскольку вы подключаете свои сокеты к локальному компьютеру, когда вы перебираете порты назначения, вполне возможно, что ядро ​​назначит случайный эфемерный исходный порт, который совпадает с тем же портом назначения, с которым вы 'готово к соединению.

См .:

...