初学netcat

前几天,从网络中得知netcat这一被称为“网络瑞士军刀”的神器后,学习了一些基本的用法,现在总结一下。

使用netcat,我们可以把计算机A上的文件传到计算机B上。根据建立连接方式的不同,我们有两种方法。方法一,计算机B负责监听,A向B主动连接。这时在B上先输入“nc -l 8000 > file”,其中8000是监听的端口,然后在A上输入“nc IP 8000 < file”。方法二,计算机A负责监听,B向A主动连接。这时先在A上输入“nc -l 8080 < file”,然后在B上输入“nc IP 8080 > file”。

netcat从名字上是net+cat,但是它和cat有着本质上的不同。cat把标准输入的内容拷贝到标准输出,是单向的。然而,netcat是双向的,两台计算机的netcat建立连接后(不妨把两台计算机称为A和B),A从标准输入读到的东西,会经过网络,然后从B的标准输出出来,反之亦然。

netcat

我觉得这种I/O很像立交桥,它能同时处理两路I/O,然而,把netcat用于传文件显然只能用到其中一路I/O。如果能同时用上两路I/O,会发生什么有趣的事情呢?首先,如果两端的netcat的输入和输出都是接Terminal,那么两端的人可以用nc聊天,如上图所示。

如果把监听的一端(不妨称为计算机B)的输入输出重定向,那就更有趣。比如把B上nc的输出接到bash,然后把bash的输出又接回nc,那么B就是一个bash服务器,相当于开了个后门。具体实现可以使用命名管道和重定向,

mkfifo named_pipe; bash named_pipe | nc -l 8000 > named_pipe

同理,如果把程序换为cat,那么B就是一个echo服务器;如果把程序换为date,那么B就是一个date服务器。但和真正的服务器不一样,B只能接受一个连接,并且接受一次连接后就马上退出。

制作自签名的证书

当搭建一个内部网站系统时,我们可能会使用自签名(self-signed)的证书,它的主要目的不是防伪,而是使用户和系统之间能够进行SSL通信,保证密码等个人信息传输时的安全。

一般情况下,制作证书要经过几个步骤,如上图所示。首先,用openssl genrsa生成一个私钥;然后,用openssl req生成一个签署请求;最后,把请求交给CA,CA签署后就成为该CA认证的证书了。

如果在第二步请求时加上-x509参数,那么就直接生成一个self-signed的证书,即自己充当CA认证自己。

除了这种方式外,在Debian或者Ubuntu系统中有更加简便的方法制作self-signed证书——使用make-ssl-cert(1)命令。该命令在ssl-cert的包里,一般会伴随着Apache的安装而安装,可能单独安装也可以。

make-ssl-cert generate-default-snakeoil命令生成一对万金油式的公钥密钥,可以直接使用。其中,公钥(证书)在/etc/ssl/certs/ssl-cert-snakeoil.pem,密钥在/etc/ssl/private/ssl-cert-snakeoil.key。另外make-ssl-cert还可以根据模板生成公钥密钥,并保存在其他位置,这样我们可以在默认的模板文件的基础上添加一些信息,如Organization等,默认的模板文件在/usr/share/ssl-cert/ssleay.cnf。例子:

# make-ssl-cert /usr/share/ssl-cert/sslsvn.cnf /home/svn/sslsvn.pem

我利用模板文件生成了一个公钥私钥文件,它们的内容放在了一起,一般问题不大,如果实在需要分开,手工分开即可。还有一点值得注意,我发现Debian里,make-ssl-cert是只能由root执行的命令。

使用这个方法,我们就可以快速方便地生成一个或多个公钥密钥对。