netcat介绍
Netcat是一个主流的命令行网络工具。它主要是建立一****个传输层的连接,可以交互式的读取、写入应用层数据。支持TCP、UDP两个传输层协议,也支持Unix domain socket。作为客户端连接到服务器,作为服务端为某些程序提供一个网络接口。可以用来做一些的故障排查、文件传输、四层代理。
Unix domain sockets 使用系统文件的地址来作为自己的身份。它可以被系统进程引用。所以两个进程可以同时打开一个Unix domain sockets来进行通信。不过这种通信方式是发生在系统内核里而不会在网络里传播。
一些使用
网络故障排查
- 检测端口是否启用
nc 192.168.31.111 22 -v
- 检测端口是否可用
nc 127.0.0.1 2345 -v
客户端
一些明文协议可以交互式的与服务端交互,如HTTP、Redis、memcache、smtp等协议
- HTTP客户端
- 单个HTTP请求
printf "GET / HTTP/1.1\r\n\r\n" | nc 127.0.0.1 8000
- 多个HTTP请求
nc 192.168.31.111 8080 < multiple_http_request
- 单个HTTP请求
- Redis客户端
nc 192.168.31.111 6379
- SMTP客户端
nc smtp.sina.com 25 -v
- memcache客户端
nc 192.168.31.111 11211 -v
- JSON RPC客户端
nc 192.168.31.111 8101 -v
协议检测
对于一些非明文协议,比如SSH、MySQL等,虽然与服务端交互不是很友好,但是可以做一些协议类型的检测。
-
SSH协议检测
nc 192.168.31.111 22
- 输出:
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3
- MySQL协议检测
nc 192.168.31.111 3306
- 输出:
Q5.7.21-20-log}El/n}f a-ag[qgosOmysql_native_password
服务端
netcat可以监听一个地址,作为服务端,接受客户端的请求。
- 监听在本地2345端口
nc -l 2345
文件传输
- 服务端:
nc -l 2345 < test.php
- 客户端:
nc 192.168.100.100 > test.php
作为一个程序的网络接口
需要通过命名管道(named pipe
)实现两个进程的输入输出重定向。
命名管道是计算机进程间的一种先进先出通信机制。是类Unix系统传统管道的扩展。传统管道属于匿名管道,其生存期不超过创建管道的进程的生存期。但命名管道的生存期可以与操作系统运行期一样长。
与传统的无名的shell管道不同,命名管道利用了文件系统。使用mkfifo或mknod创建命名管道。两个进程可以通过管道的名字打开、读写管道。
jsonnrpc_server.py
是一个简单的json rpc实现,它接收请求从标准输入,将jsonrpc响应输出到标准输出。
- jsonrpc服务端:
nc -l 2345 < /tmp/jsonrpc | ./jsonrpc_server.py > /tmp/jsonrpc
- jsonrpc客户端:
nc 127.0.0.1 2345
反向代理
HTTP
mkfifo /tmp/netcat_tunnel
nc -l 8081 < /tmp/netcat_tunnel | nc www.baidu.com 80 > /tmp/netcat_tunnel
curl 127.0.0.1:8081 -H ‘Host: www.baidu.com‘
HTTPS
nc -l 8081 < /tmp/netcat_tunnel | nc www.baidu.com 443 > /tmp/netcat_tunnel
curl https://127.0.0.1:8081 -H ‘Host: www.baidu.com‘ -I -k
SSH
nc -l 8081 < /tmp/netcat_tunnel | nc 192.168.31.111 22 > /tmp/netcat_tunnel
ssh root@127.0.0.1 -p8081 -i ~/.ssh/id_rsa
安全
端口扫描
扫描192.168.31.111上的22到80端口号
nc -z 192.168.31.111 22-80
反向shell
nc -l 2345 < /tmp/netcat_tunnel | sh -i > /tmp/netcat_tunnel
OpenSSL
openssl套装提供了两个子命令,s_server
和s_client
分别是ssl服务器和ssl客户端。
文件加密传输(openssl)
- 生成自签名证书
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
- 启动openssl服务端
openssl s_server -key key.pem -cert cert.pem -port 2345 < test.php
- 客户端接收文件
openssl s_client -host 127.0.0.1 -port 2345 -sess_out test.php