前沿
Netcat 是一款简单的 Unix 工具,使用 UDP 和 TCP 协议。 它是一个可靠的容易被其他程序所启用的后台操作工具,同时它也被用作网络的测试工具或黑客工具。 使用它你可以轻易的建立任何连接。内建有很多实用的工具。可以用来在两台机器之间建立TCP/UDP连接,并通过标准的输入输出进行数据的读写
Netcat 的安装
大部分的Linux发行版会都会自带Netcat,可以使用nc命令查看系统中是否有安装Netcat
$ nc
usage: nc [-46AacCDdEFhklMnOortUuvz] [-K tc] [-b boundif] [-i interval] [-p source_port]
[--apple-recv-anyif] [--apple-awdl-unres]
[--apple-boundif ifbound]
[--apple-no-cellular] [--apple-no-expensive]
[--apple-no-flowadv] [--apple-tcp-timeout conntimo]
[--apple-tcp-keepalive keepidle] [--apple-tcp-keepintvl keepintvl]
[--apple-tcp-keepcnt keepcnt] [--apple-tclass tclass]
[--tcp-adp-rtimo num_probes] [--apple-initcoproc-allow]
[--apple-tcp-adp-wtimo num_probes]
[--setsockopt-later] [--apple-no-connectx]
[--apple-delegate-pid pid] [--apple-delegate-uuid uuid]
[--apple-kao] [--apple-ext-bk-idle]
[--apple-netsvctype svc] [---apple-nowakefromsleep]
[--apple-notify-ack] [--apple-sockev]
[--apple-tos tos] [--apple-tos-cmsg]
[-s source_ip_address] [-w timeout] [-X proxy_version]
[-x proxy_address[:port]] [hostname] [port[s]]
出现上面提示信息说明系统中已经安装了Netcat,如果没有安装,可以使用下面命令进行安装
$ wget https://sourceforge.NET/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz
$ tar zxvf netcat-0.7.1.tar.gz
$ cd netcat-0.7.1
$ ./configure
$ make
$ make install
快速开始
我们可以使用Netcat与HTTP服务器建立连接,以百度为例,使用下面命令与百度建立TCP连接
$ nc www.baidu.com 80
第一个参数为要建立连接的服务器地址,第二个参数为连接端口。成功建立连接后,会进入输入/输出界面,在该界面能向TCP连接发送/接收数据。如百度服务器发送GET请求,模拟浏览器访问百度首页,输入GET / HTTP/1.0并按两次回车
$ nc www.baidu.com 80
GET / HTTP/1.0
(Enter)
(Enter)
发送请求后,会收到如下HTTP响应
HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 14332
Content-Type: text/html
......
完整流程如下
[root@ferris#nc www.baidu.com 80
GET HTTP/1.0
HTTP/1.02000K
Accept-Ranges:bytes
Cache-Control:no-cache
Content-Length:14332
Content-Type:text/html
Date:Mon,20 Feb 2023 20:11:38 GMT
P3p:CP="OTI DSP COR IVA OUR IND COM
P3p:CP="OTI DSP COR IVA OUR IND COM
Pragma:no-cache
Server:BWS/1.1
Set-Cookie:BAIDUID=3D34E92B258EF4BF327B4FCC92AF5F02:FG=1;expires=Thu,31-Dec-37 23:55:55
GMT;max-age=2147483647;path=/;domain=.baidu.com
Set-Cookie:BIDUPSID=3D34E92B258EF4BF327B4FCC92AF5F02;expires=Thu,31-Dec-37 23:55:55 GMT;
max-age=2147483647;path=/;domain=.baidu.com
Set-Cookie:PSTM=1613812859;expires=Thu,31-Dec-37 23:55:55 GMT;max-age=2147483647;path=
/domain=.baidu.com
Set-Cookie:BAIDUID=3D34E92B258EF4BF8570821B49FA9D08:FG=1;max-age=31536000;expires=Sun,2
0-Feb-22 09:20:59 GMT;domain=.baidu.com;path=/;version=1;comment=bd
Traceid:161381285905795658349934945070579850255
Vary:Accept-Encoding
X-Ua-Compatible:IE=Edge,chrome=1
<!DOCTYPE html><!--STATUS OK-->
更多用法
端口扫描
Netcat可以做端口扫描,用来发现一些机器上开放的端口
$ nc -zv localhost 9995-9999
nc: connect to localhost port 9995 (tcp) failed: Connection refused
nc: connect to localhost port 9995 (tcp) failed: Connection refused
nc: connect to localhost port 9996 (tcp) failed: Connection refused
nc: connect to localhost port 9996 (tcp) failed: Connection refused
nc: connect to localhost port 9997 (tcp) failed: Connection refused
nc: connect to localhost port 9997 (tcp) failed: Connection refused
nc: connect to localhost port 9998 (tcp) failed: Connection refused
nc: connect to localhost port 9998 (tcp) failed: Connection refused
nc: connect to localhost port 9999 (tcp) failed: Connection refused
Connection to localhost 9999 port [tcp/*] succeeded!
-z参数表示使用Zero-I/O模式,即连接的时候禁止输入输出,仅查看端口是否开启,很适合用于做端口扫描。-v参数用来显示网络连接中的详细输出信息。根据输出信息可以看出,9999端口能连上,证明9999端口开发着
简易聊天工具
如果用C编写一个简单点对点聊天程序,至少需要几十行代码,使用Netcat让两台机器建立TCP连接,只需要执行两行命令,就能实现简单的聊天功能,如在服务器192.168.1.2上执行
$ nc -l 9999
-l参数,表示以监听模式运行Netcat,这里我们监听的是9999端口,接着在另外一台服务器上执行
$ nc 192.168.1.2 9999
执行成功,两台服务器就建立了TCP连接,接着就能通过该连接发送消息了,如在客户端服务器发送Hello, I’m client
$ nc 192.168.1.2 9999
Hello, I'm client
服务端马上就收到该消息
$ nc -l 9999
Hello, I'm client
同样的,在服务端发送的消息,客户端也能收到
传输文件
同样的,通过建立TCP连接,可以很方便的在两台主机间传输文件。如要将服务器A上的f.txt发送到服务器B(IP地址为192.168.1.2)上,在服务器B上执行
$ nc -l 9999 > f.txt
然后在服务器A上执行
$ nc 192.168.1.2 9999 < f.txt
这样就试用netcat实现了文件的收发。
正向 shell
这点比较有意思,使用Netcat能实现类似ssh的功能,即将目标机器的shell终端暴露在某个端口上,然后本地机器使用Netcat连接到目标机器上,就可以访问目标机器的shell终端
在目标机器上执行
$ nc -l 9999 | /bin/bash
这里使用Netcat作为服务端监听9999端口,并将接收到的数据通过管道发送给/bin/bash,相当于将/bin/bash暴露到9999端口上,接着在本地机器上执行
$ nc 192.168.1.2 9999
通过Netcat建立连接,就能在本地机器上访问目标机器的/bin/bash终端啦,比如在本地机器上执行ls命令
$ nc 192.168.1.2 9999
ls -l
目标机器输出如下:
$ nc -l 9999 | /bin/bash
total 4
-rw-rw-r-- 1 ferris ferris 20 Feb 21 11:50 f.txt
可以看到我们在本地机器上输入的命令,已经在目标机器上成功执行了
虽然我们能使用本地机器传输命令给到目标机器执行,但与ssh连接还是有点区别,因为在本地机器上并不能看到命令的执行结果。可以使用管道巧妙的解决该问题,在目标机器上执行
$ mkfifo /tmp/pipe
$ cat /tmp/pipe | /bin/bash 2>&1 | nc -l -p 9999 > /tmp/pipe
上面两条命令主要功能如下:
- 用mkfifo命令创建一个命名管道
- 然后通过cat命令读取/tmp/pipe的内容,将内容通过管道发送给/bin/bash
- 将/bin/bash的执行结果通过管道发送给nc
- nc将从本地机器上接收到的命令保存到/tmp/pipe中
- /tmp/pipe中的命令又被cat读取,传输到/bin/bash中,至次完成整个数据的流向
现在在本地机器上就能收到/bin/bash命令的执行结果啦
$ nc 192.168.1.2 9999
ls -l
total 4
-rw-rw-r-- 1 ferris ferris 20 Feb 21 11:50 f.txt
与 TCP 服务端交互
Netcat可以与任何使用TCP协议的服务端进行数据交互,比如使用Netcat在Redis执行PING命令
$ printf "PING\r\n" | nc localhost 6379
+PONG
等同于
$ nc localhost 6379
PING
+PONG
评论区