奇怪的netcat行为,随机套接字?

时间:2017-01-12 20:38:13

标签: linux sockets undefined

运行Debian Jessie Linux。在学习nmap时,我在侦听模式下使用nc(netcat),以便nmap找到一个开放端口。全部在一台主机上完成。

我的nc语法错误,所以命令是'nc -l 3306',它应该是'nc -l -p 3306'。 nmap然后没有报告3306打开但是DID显示SOME端口打开,比如40000。

所以我做了'lsof | grep nc'和nc确实有40000,或者一些类似的高端口开放,奇怪。

然后我把nc拉了过来。使用'nc -l 3306'的错误语法,相关的系统调用序列是socket,listen,accept。注意没有绑定调用。正确的'nc -l -p 3306'命令产生预期的socket,bind,listen,accept。

所以,我的观点是,你可以打开一个套接字来接受而不指定端口!显然,你不知道你将获得哪个端口,但你得到一个端口。现在,如果用户空间(即nc)没有提供任何绑定信息,这意味着内核空间正在选择端口?我首先期望端口来自nc代码中未定义的堆栈内存,但是如果没有完成绑定调用,则该内存的值根本不会传输到内核。

奇妙!

1 个答案:

答案 0 :(得分:0)

一点也不奇怪,这就是netcat(nc)的工作原理:

netcat -l -p port [-options] [hostname] [port]

如果要指定特定端口,则必须使用“ -p”。

执行此操作

netcat -l 3306

与执行相同:

netcat -l

选择一个随机套接字进行监听。

现在,您是对的,没有绑定调用,但是不存在其他系统调用:

  

使用错误的语法进行呼叫

mortiz@florida:~/Documents/projects$ strace -c netcat -l 4000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 15.09    0.000040           8         5           read
 10.94    0.000029           7         4           openat
 10.19    0.000027           4         6           rt_sigaction
  9.81    0.000026          26         1           stat
  9.81    0.000026           8         3           brk
  7.55    0.000020           5         4           close
  7.55    0.000020          20         1           socket
  6.04    0.000016           4         4           fstat
  6.04    0.000016          16         1           alarm
  5.28    0.000014           7         2           getpid
  5.28    0.000014           7         2           setsockopt
  4.53    0.000012          12         1           listen
  1.89    0.000005           5         1           rt_sigprocmask
  0.00    0.000000           0         7           mmap
  0.00    0.000000           0         4           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000265                    50         1 total
  

使用正确的语法进行调用

mortiz@florida:~/Documents/projects$ strace -c netcat -l -p 4000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 33.81    0.000334           8        41        32 openat
 21.76    0.000215           6        33        28 stat
  8.10    0.000080           5        14           mmap
  5.97    0.000059           5        11           close
  5.77    0.000057           4        14           read
  4.76    0.000047          15         3           munmap
  4.05    0.000040          20         2         2 connect
  3.95    0.000039           4         9           fstat
  3.34    0.000033           5         6           rt_sigaction
  2.83    0.000028           9         3           socket
  2.73    0.000027           4         6           mprotect
  1.21    0.000012           2         6           lseek
  0.61    0.000006           3         2           getpid
  0.51    0.000005           5         1           listen
  0.30    0.000003           3         1           rt_sigprocmask
  0.30    0.000003           3         1           alarm
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           bind
  0.00    0.000000           0         2           setsockopt
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000988                   162        63 total
  

使用正确的语法(没有特定端口)进行调用

mortiz@florida:~/Documents/projects$ strace -c netcat -l
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 17.62    0.000040           6         6           rt_sigaction
 17.18    0.000039           7         5           read
 13.66    0.000031           7         4           openat
 12.33    0.000028          28         1           listen
  9.69    0.000022          22         1           socket
  7.93    0.000018           4         4           close
  7.49    0.000017           8         2           setsockopt
  3.96    0.000009           2         4           fstat
  3.52    0.000008           8         1           rt_sigprocmask
  3.52    0.000008           8         1           alarm
  3.08    0.000007           3         2           getpid
  0.00    0.000000           0         1           stat
  0.00    0.000000           0         7           mmap
  0.00    0.000000           0         4           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000227                    50         1 total

因此我们可以看到更改参数显然会更改系统调用(有意义)。

分配的端口不使用bind()的事实可能与Linux中的默认端口有关:

mortiz@florida:~/Documents/projects$ cat /proc/sys/net/ipv4/ip_local_port_range 
32768   60999

net.ipv4.ip_local_port_range已经“保留”了,但这只是我的理论。