端口扫描时的随机端口连接
Random port connection while portscan
我用 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.
"open ports" 总是在变化,但总是优于 40000。但是,我检查了 netstat -tulpn
,只有我的端口 68 为 dhclient 打开,它是 UDP 而不是 TCP。为什么它说我有开放端口?
我怀疑你在扫描时 运行 进入你打开的套接字 source 端口。
TCP 连接有源端口。如果一个没有分配给套接字(通过 bind
),那么当你调用 connect
, 在发送 SYN 之前。
由于您正在将套接字连接到本地计算机,因此当您遍历目标端口时,内核可能会分配一个随机的临时源端口,该端口恰好与您要访问的目标端口相匹配即将连接。
参见:
- Linux/Unix Socket Self-connection
- Socket getting created with same IP and port on local host
我用 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.
"open ports" 总是在变化,但总是优于 40000。但是,我检查了 netstat -tulpn
,只有我的端口 68 为 dhclient 打开,它是 UDP 而不是 TCP。为什么它说我有开放端口?
我怀疑你在扫描时 运行 进入你打开的套接字 source 端口。
TCP 连接有源端口。如果一个没有分配给套接字(通过 bind
),那么当你调用 connect
, 在发送 SYN 之前。
由于您正在将套接字连接到本地计算机,因此当您遍历目标端口时,内核可能会分配一个随机的临时源端口,该端口恰好与您要访问的目标端口相匹配即将连接。
参见:
- Linux/Unix Socket Self-connection
- Socket getting created with same IP and port on local host