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作為網絡通訊媒介,實作各種用戶端。
***********************************************************
學習永遠不晚。——高爾基