Netcat

netcat介绍

Netcat是一个主流的命令行网络工具。它主要是建立一****个传输层的连接,可以交互式的读取、写入应用层数据。支持TCP、UDP两个传输层协议,也支持Unix domain socket。作为客户端连接到服务器,作为服务端为某些程序提供一个网络接口。可以用来做一些的故障排查、文件传输、四层代理。

Unix domain sockets 使用系统文件的地址来作为自己的身份。它可以被系统进程引用。所以两个进程可以同时打开一个Unix domain sockets来进行通信。不过这种通信方式是发生在系统内核里而不会在网络里传播。

Netcat使用介绍

一些使用

网络故障排查

  1. 检测端口是否启用
    • nc 192.168.31.111 22 -v
  2. 检测端口是否可用
    • nc 127.0.0.1 2345 -v

客户端

一些明文协议可以交互式的与服务端交互,如HTTP、Redis、memcache、smtp等协议

  1. 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
  2. Redis客户端
    • nc 192.168.31.111 6379
  3. SMTP客户端
    • nc smtp.sina.com 25 -v
  4. memcache客户端
    • nc 192.168.31.111 11211 -v
  5. JSON RPC客户端
    • nc 192.168.31.111 8101 -v

协议检测

对于一些非明文协议,比如SSH、MySQL等,虽然与服务端交互不是很友好,但是可以做一些协议类型的检测。

  1. SSH协议检测

    • nc 192.168.31.111 22
    • 输出: SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3
  2. 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

Netcat使用介绍

反向代理

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_servers_client分别是ssl服务器和ssl客户端。

文件加密传输(openssl)

  1. 生成自签名证书
    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
  2. 启动openssl服务端
    openssl s_server -key key.pem -cert cert.pem -port 2345 < test.php
  3. 客户端接收文件
    openssl s_client -host 127.0.0.1 -port 2345 -sess_out test.php