天天看點

Linux每天一個指令:nc/ncat

nmap-ncat.x86_64版nc/ncat

nc/ncat所做的就是在兩台電腦之間建立連結并傳回兩個資料流,在這之後所能做的事就看你的想像力了。你能建立一個伺服器,傳輸檔案,與朋友聊天,傳輸流媒體或者用它作為其它協定的獨立用戶端。

centos 7下安裝nc

yum install nmap-ncat.x86_64 -y

[root@localhost ~]# rpm -ql nmap-ncat

/usr/bin/nc

/usr/bin/ncat

...

常用參數選項

nc -h檢視

-4 使用IPV4

-6 使用IPV6

-c, --sh-exec <command> 接收到的指令通過command(例如/bin/bash)執行

-e, --exec <command> 和-c差不多

--lua-exec <filename> 接收到的資料通過腳本filename執行

-m, --max-conns <n> 最大并發連接配接數(單獨開啟不生效,需配合--keep-open/--broker使用)

-d, --delay <time> 讀寫收發間隔時間

-o, --output <filename> 将會話資料轉儲到檔案

-i, --idle-timeout <time> 讀寫逾時時間

-p, --source-port port 指定連接配接使用的源端口号(client端使用)

-s, --source addr 用戶端指定連接配接伺服器使用的ip(client端使用)

-l, --listen 綁定和監聽接入連接配接(server端使用)

-k, --keep-open 在監聽模式中接受多個連接配接(配合-m使用)

-n, --nodns 不使用DNS解析主機名

-t, --telnet 響應telnet連接配接

-u, --udp 使用udp協定,預設tcp

-v, --verbose 顯示詳細資訊

-w, --wait <time> 連接配接逾時時間

--allow 允許指定主機連接配接

--allowfile 允許指定檔案内的主機連接配接

--deny 拒絕指定主機連接配接

--denyfile 拒絕指定檔案内的主機連接配接

--broker 啟用代理模式

--proxy <addr[:port]> 指定代理主機ip和port

--proxy-type <type> 指定代理類型("http" or "socks4")

--proxy-auth <auth> 代理身份驗證

執行個體:

主機A:192.168.1.130

主機B:192.168.1.120

1、chat server:簡單傳輸資料伺服器

假如你想和你的朋友聊聊,有很多的軟體和資訊服務可以供你使用。但是,如果你沒有這麼奢侈的配置,比如你在計算機實驗室,所有的對外的連接配接都是被限制的,你怎樣和整天坐在隔壁房間的朋友溝通那?不要郁悶了,netcat提供了這樣一種方法,你隻需要建立一個Chat伺服器,一個預先确定好的端口,這樣子他就可以聯系到你了。

Server A

[root@localhost tmp]# ncat -v -lp 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081
Ncat: Connection from 192.168.1.120.
Ncat: Connection from 192.168.1.120:34356.
hello world!!!      

nc/ncat 指令在8081端口啟動了一個tcp 伺服器,所有的标準輸出和輸入會輸出到該端口。輸出和輸入都在此shell中展示。

Client B

[root@localhost ~]# nc -v 192.168.1.130 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.1.130:8081.
hello world!!!      

不管你在機器B上鍵入什麼都會出現在機器A上。

2、檔案傳輸

大部分時間中,我們都在試圖通過網絡或者其他工具傳輸檔案。有很多種方法,比如FTP,SCP,SMB等等,但是當你隻是需要臨時或者一次傳輸檔案,真的值得浪費時間來安裝配置一個軟體到你的機器上嘛。假設,你想要傳一個檔案file.txt 從A 到B。A或者B都可以作為伺服器或者用戶端,以下,讓A作為伺服器,B為用戶端。

[root@localhost tmp]# ncat -v -lp 8081 < file.txt 
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081
Ncat: Connection from 192.168.1.120.
Ncat: Connection from 192.168.1.120:34358.      
[root@localhost ~]# ll
total 4
-rw-------. 1 root root 1238 Sep 19 12:19 anaconda-ks.cfg
[root@localhost ~]# nc -v 192.168.1.130 8081 > file.txt
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.1.130:8081.
^C
[root@localhost ~]# ll
total 40220
-rw-------. 1 root root     1238 Sep 19 12:19 anaconda-ks.cfg
-rw-r--r--. 1 root root 41180832 Sep 19 14:33 file.txt      

這裡我們建立了一個伺服器在A上并且重定向netcat的輸入為檔案file.txt,那麼當任何成功連接配接到該端口,netcat會發送file的檔案内容。

在用戶端我們重定向輸出到file.txt,當B連接配接到A,A發送檔案内容,B儲存檔案内容到file.txt.

沒有必要建立檔案源作為Server,我們也可以相反的方法使用。像下面的我們發送檔案從B到A,但是伺服器建立在A上,這次我們僅需要重定向netcat的輸出并且重定向B的輸入檔案。

B作為Server

[root@localhost tmp]# ncat -v -lp 8081 > file.txt 
...      
[root@localhost ~]# nc -v 192.168.1.130 8081 < file.txt      

3、目錄傳輸

發送一個檔案很簡單,但是如果我們想要發送多個檔案,或者整個目錄,一樣很簡單,隻需要使用壓縮工具tar,壓縮後發送壓縮包。

如果你想要通過網絡傳輸一個目錄從A到B。

[root@localhost tmp]# tar cvf - nc_dir | nc -v -lp 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081
nc_dir/
nc_dir/an
Ncat: Connection from 192.168.1.120.
Ncat: Connection from 192.168.1.120:34362.
nc_dir/yum.log      
[root@localhost ~]# ll
total 40220
-rw-------. 1 root root     1238 Sep 19 12:19 anaconda-ks.cfg
-rw-r--r--. 1 root root 41180832 Sep 19 14:33 file.txt
[root@localhost ~]# nc -nv 192.168.1.130 8081 | tar xvf -
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.1.130:8081.
nc_dir/
nc_dir/an
nc_dir/yum.log^C
[root@localhost ~]# ll
total 40220
-rw-------. 1 root root     1238 Sep 19 12:19 anaconda-ks.cfg
-rw-r--r--. 1 root root 41180832 Sep 19 14:33 file.txt
drwxr-xr-x. 2 root root       31 Sep 20  2017 nc_dir      

這裡在A伺服器上,我們建立一個tar歸檔包并且通過-在控制台重定向它,然後使用管道,重定向給netcat,netcat可以通過網絡發送它。

在用戶端我們下載下傳該壓縮包通過netcat 管道然後打開檔案。

如果想要節省帶寬傳輸壓縮包,我們可以使用bzip2或者其他工具壓縮。

通過bzip2壓縮

[root@localhost tmp]# tar cvf - nc_dir | bzip2 -z | nc -v -lp 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081
nc_dir/
nc_dir/an
Ncat: Connection from 192.168.1.120.
Ncat: Connection from 192.168.1.120:34372.
nc_dir/yum.log      

使用bzip2解壓

[root@localhost ~]# ll
total 40220
-rw-------. 1 root root     1238 Sep 19 12:19 anaconda-ks.cfg
-rw-r--r--. 1 root root 41180832 Sep 19 14:33 file.txt
[root@localhost ~]# nc -nv 192.168.1.130 8081 | bzip2 -d | tar xvf -
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.1.130:8081.
nc_dir/
nc_dir/an
nc_dir/yum.log^C
[root@localhost ~]# ll
total 40220
-rw-------. 1 root root     1238 Sep 19 12:19 anaconda-ks.cfg
-rw-r--r--. 1 root root 41180832 Sep 19 14:33 file.txt
drwxr-xr-x. 2 root root       31 Sep 20  2017 nc_dir      

4、加密你通過網絡發送的資料

如果你擔心你在網絡上發送資料的安全,你可以在發送你的資料之前用如mcrypt的工具加密。

服務端 A

[root@localhost tmp]# mcrypt --flush --bare -F -q -m ecb < file.txt | nc -v -lp 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase: 
Enter passphrase: 

Ncat: Connection from 192.168.1.120.
Ncat: Connection from 192.168.1.120:34392.      

使用mcrypt工具加密資料。

用戶端 B

[root@localhost tmp]# ll
total 402160
-rw-r--r--. 1 root root 411808322 Sep 19 14:56 test.txt
[root@localhost tmp]# nc 192.168.1.130 8081 | mcrypt --flush --bare -F -q -d -m ecb > file.txt
Enter passphrase: 
^C
[root@localhost tmp]# ll
total 442376
-rw-r--r--. 1 root root  41180832 Sep 19 15:13 file.txt
-rw-r--r--. 1 root root 411808322 Sep 19 14:56 test.txt      

使用mcrypt工具解密資料。

以上兩個指令會提示需要密碼,確定兩端使用相同的密碼。

這裡我們是使用mcrypt用來加密,使用其它任意加密工具都可以。

5、打開一個shell

我們已經用過遠端shell-使用telnet和ssh,但是如果這兩個指令沒有安裝并且我們沒有權限安裝他們,我們也可以使用netcat建立遠端shell。

假設你的netcat支援 -c -e 參數(預設 netcat)

[root@localhost tmp]# nc -v -c /bin/bash -lp 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081
Ncat: Connection from 192.168.1.120.
Ncat: Connection from 192.168.1.120:34404.      
[root@localhost tmp]# nc -v 192.168.1.130 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.1.130:8081.
ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:0a:cb:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.130/24 brd 192.168.1.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::21af:eea9:759a:962f/64 scope link 
       valid_lft forever preferred_lft forever      

這裡我們已經建立了一個netcat伺服器并且表示當它連接配接成功時執行/bin/bash

假如netcat 不支援-c 或者 -e 參數(openbsd netcat),我們仍然能夠建立遠端shell

[root@server-A ~]# mkfifo /tmp/tmp_fifo
[root@server-A ~]# cat /tmp/tmp_fifo | /bin/bash -i 2>&1 | nc -v -lp 8081 > /tmp/tmp_fifo
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081      

這裡我們建立了一個fifo檔案,然後使用管道指令把這個fifo檔案内容定向到shell 2>&1中。是用來重定向标準錯誤輸出和标準輸出,然後管道到netcat 運作的端口8081上。至此,我們已經把netcat的輸出重定向到fifo檔案中。

說明:

從網絡收到的輸入寫到fifo檔案中

cat 指令讀取fifo檔案并且其内容發送給bash指令

bash指令程序受到輸入并把它寫回到netcat。

netcat 通過網絡發送輸出到client

至于為什麼會成功是因為管道使指令平行執行,fifo檔案用來替代正常檔案,因為fifo使讀取等待而如果是一個普通檔案,cat指令會盡快結束并開始讀取空檔案。

在用戶端僅僅簡單連接配接到伺服器

[root@client-B ~]# nc 192.168.1.130 8081
[root@server-A ~]# ip add
ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:0a:cb:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.130/24 brd 192.168.1.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::21af:eea9:759a:962f/64 scope link 
       valid_lft forever preferred_lft forever
[root@server-A ~]#       

你會得到一個shell提示符在用戶端

反向shell

反向shell是指在用戶端打開的shell。反向shell這樣命名是因為不同于其他配置,這裡伺服器使用的是由客戶提供的服務。

[root@server-A ~]# nc -v -lp 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081
Ncat: Connection from 192.168.1.120.
Ncat: Connection from 192.168.1.120:34414.
ls
anaconda-ks.cfg
file.txt
nc_dir
ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b9:7e:94 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.106/24 brd 192.168.1.255 scope global dynamic ens33
       valid_lft 7170sec preferred_lft 7170sec
    inet6 fe80::b95d:60d:d901:d271/64 scope link 
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b9:7e:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.120/24 brd 192.168.1.255 scope global ens34
       valid_lft forever preferred_lft forever
    inet6 fe80::2812:38ee:6773:1a7c/64 scope link 
       valid_lft forever preferred_lft forever      

在用戶端,簡單地告訴netcat在連接配接完成後,執行shell。

[root@client-B ~]# nc -v 192.168.1.130 8081 -c /bin/bash 
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.1.130:8081.      

現在,什麼是反向shell的特别之處呢 

反向shell經常被用來繞過防火牆的限制,如阻止入站連接配接。

6、指定源端口

假設你的防火牆過濾除25端口外其它所有端口,你需要使用-p選項指定源端口。

伺服器端 A

[root@server-A ~]# nc -v -lp 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081
Ncat: Connection from 192.168.1.120.
Ncat: Connection from 192.168.1.120:8082.      
[root@client-B ~]# nc -v 192.168.1.130 8081 -p 8082
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.1.130:8081.      

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

該指令将在用戶端開啟25端口用于通訊,否則将使用随機端口。

7、指定源位址

假設你的機器有多個位址,希望明确指定使用哪個位址用于外部資料通訊。我們可以在netcat中使用-s選項指定ip位址。

伺服器端

[root@server-A ~]# nc -v -lp 8081
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Listening on :::8081
Ncat: Listening on 0.0.0.0:8081
Ncat: Connection from 192.168.1.106.
Ncat: Connection from 192.168.1.106:44694.      
[root@localhost log]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b9:7e:94 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.106/24 brd 192.168.1.255 scope global dynamic ens33
       valid_lft 6803sec preferred_lft 6803sec
    inet6 fe80::b95d:60d:d901:d271/64 scope link 
       valid_lft forever preferred_lft forever
3: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b9:7e:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.120/24 brd 192.168.1.255 scope global ens34
       valid_lft forever preferred_lft forever
    inet6 fe80::2812:38ee:6773:1a7c/64 scope link 
       valid_lft forever preferred_lft forever      
[root@client-B ~]# nc -v 192.168.1.130 8081 -s 192.168.1.106
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 192.168.1.130:8081.      

該指令将綁定位址192.168.1.106。

這僅僅是使用netcat的一些示例。

其它用途有:

  •     使用-t選項模拟Telnet用戶端,
  •     HTTP用戶端用于下載下傳檔案,
  •     連接配接到郵件伺服器,使用SMTP協定檢查郵件,
  •     使用ffmpeg截取螢幕并通過流式傳輸分享,等等。其它更多用途。

簡單來說,隻要你了解協定就可以使用netcat作為網絡通訊媒介,實作各種用戶端。

***********************************************************

 學習永遠不晚。——高爾基