网络工具的瑞士军刀netcat

时间:2022-11-27 14:42:45
这是一个聒噪的夜晚,假设要给出个原因。可能是由于尽管我认为西班牙不纯粹,可是怎么也不至于干为人家搭台面自己不唱戏的角色吧..结束以后。我认为该玩一下素有网络瑞士军刀之称谓的netcat了。

尽管瑞士军刀和netcat除了在小而精方面之外并没有必定的联系,可是我还是想扯一通我所了解的瑞士,博客嘛。不是论文,不是測试报告,发散一点没有问题,而且,我认为将来。跨界将是一个必定的趋势,拥有跨界的能力也是一个必定的优势。

瑞士是一个没有历史的国家,它全然就是1848年的政治妥协的结果,这也说明了为什么即便是纳粹德国也认可它永久中立国的地位,可是并不意味着生活在这片土地的民族没有历史。自凯撒时代以远。这里就生活着*的民族。罗马化时代,它处在高卢和平氛围之下自我发展。之后它的历史就是一部融合,分离,抗争与中立的历史了,可是不可否认的是,这片土地以及这片土地上的人们在纷乱的中世纪大领主。国王。神罗皇帝,教皇。主教,自治市...之间的激烈混战中存活了下来,并没有变成废墟。直到如今。这里依然是实际上最富裕的地区之中的一个,看看地图就知道。和比利时,荷兰不同。瑞士处在一个大国的包围圈中。法国。德国。意大利。奥地利四强构成了瑞士的邻国。从它的语言上能够看出来它的历史。德语。法语,意大利语(为什么没有奥地利语呢?由于奥地利大部分人说德语,神罗后遗症),这样的地位正恰恰符合欧洲均势原则。所以瑞士反而能够毫发未损地作为中立国躲过N次浩劫,正是欧洲均势原则,为瑞士这样的国家创造了一个稳定的外部环境,它能够将设计精细化,能够不为外部压力而妥协,瑞士军刀就是在这样的环境下打造的。当然,还有手表。

可是假设再来点别的什么就更够味儿了。
       什么呢?那就是北欧基因。

我要是说是北欧基因促成了Linux,你信吗?但无论怎样。北欧基因确实起了作用。北欧人,一个纯粹的海洋民族的后裔,一个和罗马帝国无关的民族的后裔。挣脱了欧洲传统的羁绊。远离了历史遗留的纷争,他们生活在一个童话和神话的世界。驾驭着深不可測的海洋,*摇摆着灵活和*以及规则的原始冲动,这或许是海洋民族的最大特质。

瑞士军刀。一个带有北欧基因的超级小工具,符合其外在自洽内部发散的哲学,怎么形容它的优美都只是分。北欧的基因表现型。加上小而精的追求。正是这样的特质给瑞士军刀营造了和Linux同样的氛围......当然物尽所用并不意味着它是万能的。你不能指望用它来割断起重机的钢丝绳,也不要幻想它能撬起一辆卡车。其实。这些功能的缺失却正是瑞士军刀的优美之处,即它不是大而全,而是小而精,有时候,小而精的哲学确实能取胜。评价一个工具的标准并非它能做什么,而是它能多么简单地做到它声称能够做的事。手里拿着一个瑞士军刀,你能够省去带非常多东西,其实不论什么小工具都能够内置当中。比方温度计。指南针。剪刀,起子,螺丝刀,U盘,电表,牙签。绕线圈...设计的精妙之处在于,怎样把这些东西放在一个有限的空间中,以及怎样不被人们误用这些功能,简单的方式就是每一个小工具仅仅完美实现一个功能。

好吧。这就是瑞士军刀的全部,以下就是netcat了。
       netcat,非常小非常小,而且是真的小,而不是表现的小,它不像Linux内核那样,有人声称它能够被裁减到不到xk。可是你知道这个裁减的人要付出多大的心血吗?假设换一个刚毕业不久辛苦求得一份工作的人来裁减。他可能仅仅是大学期间看过一些代码,那他要加多少班啊。

好东西不在于它能被裁到多小,而是在于它真的不能再小了。netcat能小到什么程度呢?实际上它仅仅提供了一个socket IO通道而已,但别看它自带的这么小的功能集合。甚至都不能称之为集合,它却把扩展的范围提升到了你的想象力所及的范围,对于不善于思考的人来讲。它或许仅仅是一个telnet一样的程序,可是对于善于思考的人来讲。它能够构建一个安全的远程shell。你想过用它来构建一个SSL通道吗?
       在開始我的探索之前,首先简要概览一下能够从网上搜到的netcat的功能,我这里就不再反复了,它的功能点包含但不限于:探測port是否开启,port扫描,远程复制文件。远程复制文件夹,加密传输数据,远程运行shell,反向远程shell...为什么如此小的netcat能完毕这么多的功能呢?
       原因在于,它仅仅提供了最小集,即一个IO通道而已。至于说怎样构建数据,那不是它的职责,netcat并不假设数据的不论什么格式。对数据没有不论什么约束,这一点和telnet不同,尽管telnet也是一个略微通用些的TCP測试程序,可是对于传输数据它有非常多格式规定和假设,毕竟它最開始就是为远程登录设计的,其实上述的功能差点儿都不是netcat完毕的,netcat仅仅是把传输数据到对端而已,仅此而已。这是个创举!

试想,究竟是谁规定一个远程的telnet 23或者ssh必须是TCP的client主动发起连接TCP服务端呢?即究竟凭什么sshd要运行在TCP服务端呢?其实,没有人规定。仅仅是一个远程登录而已。但就是这个实现上的默认行为。导致了非常多远程登录无法进行,由于这些远程登录是从外网到内网的。而非常多防火墙都不同意从外到内的主动訪问。使用netcat能够做到这一点,在内网运行一个netcatclient,在外网运行netcat服务端。然后让/bin/bash覆盖掉netcat就可以,这就是创举所在。我来说下why。

假设你运行一个netcat -e $pro。那么在连接成功后,你以为netcat会像大多数程序一样调用fork/exec来运行pro吗?非常多人都会这么认为,由于这是UNIX传统的标准做法。可是netcat没有这么做,而是直接在当前的netcat进程exec一个pro。这太猛了。当前的netcat就此消失被pro覆盖,那么接下来怎么办?谁来进行主控?其实。netcat就此就把控制权全然交给了pro。在交接之前。把STDIN,STDOUT,STDERR重定向到自己的socket。仅此而已。netcat留下的就是一个socket IO通道。接下来的pro程序的STDIN。STDOUT,STDERR就是socket了。除此之外。netcat没有留下不论什么痕迹,在运行netcat 1.2.3.4 1234 -e /bin/bash的时候,言外之意就好像在运行/bin/bash socketstdin socketstdout...仅仅可惜UNIX哲学不同意/bin/bash这样的程序和socket有不论什么关联。那么仅仅好利用另外一个小程序和它组合从而在网络上模拟本地IO了,netcat在-e參数下除了干这个,没有不论什么毒副作用。假设你不想全然将STDIN,STDOUT。STDERR都重定向,比方你仅仅想重定向STDIN。那么你就能够将|,>,<等符号和netcat组合,比方netcat -l -p 1234 <./transfile。cat transfile2 |netcat 127.0.0.1 2234等,在这样的情况下,netcat本身还在,并没有在-e參数下那样消失。可是它除了做IO之外。什么都不会多做。瑞士军刀般的多样化功能就是这么来的。是的。一切都在于你的想象力,你再也不能说,这个功能或者那个功能netcat没有提供,不能这样说,应该说你自己没有想到它能怎么用。假设让我写netcat的手冊,我就写一句话:它提供且仅仅提供一个TCP或者UDP网络通道。它能实现全部使用TCP或者UDP协议的的网络功能。

我想实现一个远程运行命令的机制,不想编程。也不想用ssh,怎么办呢?使用netcat非常好办,首先它能够实现一个DH密钥交换,然后加密要传输的数据。然后解密,即兴创建一个shell,运行命令后返回结果。加密返回,这些都不在话下。假设你想远程获得一个加密的shell,就须要做一些工作了,要么你实现一个自环管道。即命令序列的最后一个的标准输出定向到第一个命令的标准输入,即netcat 1.2.3.4 1234|decryto|/bin/bash|encryto@,最后的@意味着encryto的标准输出定向到netcat的标准输入,即socket,假设不想这么做。那就你就用以下的代码序列劫持不论什么一个已经处在tty上运行的shell然后运行命令后捕获返回值返回:

int fd = open("/dev/pts/0", O_RDWR);
ioctl(fd, TIOCSTI, "l ");
ioctl(fd, TIOCSTI, "s ");
ioctl(fd, TIOCSTI, "\n ");

可是无论你怎么做,千万不要改动netcat。假设你真的想改动它,那还不如自己写一个满足自己需求的呢,由于netcat没什么好改的,你就把它当成以下的程序就可以:

socket;
listen
accept //注意。没有多处理机制
loop:
read;
write;
loop;

记住,用已有的小工具构建一个大功能是一种艺术,netcat本身不是瑞士军刀。它更像瑞士军刀的刀柄和刀鞘,能够容纳差点儿全部的工具,小即是多。关键在包容,大的包容性,自然约束是最少的。netcat全然符合了UNIX的哲学。
       在网络编程工具上有没有瑞士军刀呢?我认为有,那就是OpenSSL的BIO机制。它抽象了IO过程,和netcat重定向了IO过程相似。假设说netcat在网络环境模拟了本机环境的话。那么BIO则能够在本机模拟网络环境。就OpenVPN而言。数据是直接写到BIO的。而不是直接写到socket的,这个和netcat的过程恰恰相反,在没有网络的环境下,想要调试网络程序。那么BIO就是利器了。
       早上六点多,西班牙已经输了一段时间,我本不是*的球迷,就是跟下风而已,据说明天的意大利VS英格兰会非常精彩。