第三章:隐藏通信隧道技术
文章目录
基础知识
概述
下面所说的隧道,就是一种绕过端口屏蔽的通信方式,其实也就是使用不同协议的通信,以达到绕过防火墙的目的。常见的隧道如下:
- 网络层:IPv6、ICMP隧道、GRE隧道。
- 传输层:TCP隧道、UDP隧道、常规端口转发。
- 应用层:SSH隧道、HTTP隧道、HTTPS隧道、DNS隧道。
判断内网连通性
判断内网是否能出网,需要综合判断各种协议和端口。 常用的内网连通性的判断方法如下:
IMCP协议(网络层)
ping命令就是基于ICMP来工作的,所以我们可以使用ping来判断IMCP协议的连通性,例如如下命令:
ping www.baidu.com
# linux下需要指定-c选项,否则会一直ping,例如:
ping -c 3 www.baidu.com
TCP协议(传输层)
nc是基于TCP/UDP协议来进行通信的,所以我们可以使用nc工具来判断TCP协议的连通性,例如如下命令:
# -z选择是关闭IO,仅做扫描
nc -vz 49.234.105.98 22
演示如下:
HTTP协议(应用层)
测试HTTP协议的连通性,可以使用curl工具,linux下自带此工具,但是windows需要下载才能使用,例如如下命令:
DNS协议(应用层)
在进行DNS连通性检测时,通常使用nslookup和dig命令,nslookup是windows下自带的工具,而dig是linux下自带的命令。两个工具都可以指定DNS服务器进行解析。如下所示:
网络层隧道技术
网络层最常用ICMP和IPv6两个协议进行隧道传输。
IPv6隧道
- IPv6是用来设计为了替代IPv4的一种新协议。
- IPv6隧道技术,就是将Ipv4作为隧道载体,将Ipv6报文整体封装在IPv4数据报文中。
一个示意图如下所示:
支持IPv6隧道的工具有:socat,6tunnel,nt6tunnel等。
ICMP隧道
ICMP协议比较特殊,通信双方不需要开放端口。如果攻击者上层隧道失败了,那么可以尝试使用ping建立ICMP隧道,将TCP/UDP数据封装到ICMP的ping数据包中,从而绕过防火墙,实现不受限制的网络访问。
常用的ICMP隧道工具有icmpsh、PingTunnel、icmptunnel、powershell icmp等。
icmpsh
使用此工具不需要管理员权限,且跨平台。但是slave只能是windows平台。我这里在linux上将icmpsh-m.c编译成master.out运行作为master,然后windows运行icmpsh.exe来连接master,将shell反弹给master,具体操作如下:
首先在攻击机上关闭本机的ICMP应答,防止shell不稳定:
# 设置为0就是开启
sysctl -w net.ipv4.icmp_echo_ignore_all=1
然后linux开启master监听如下:
然后windows反弹shell连接master如下:
过一会,就会发现linux已经反弹得到了windows的shell:
此工具的一些参数说明如下:
-t host host ip address to send ping requests to. This option is mandatory!
-r send a single test icmp request containing the string "Test1234" and then quit.
This is for testing the connection.
-d milliseconds delay between requests in milliseconds
-o milliseconds timeout of responses in milliseconds. If a response has not received in time,
the slave will increase a counter of blanks. If that counter reaches a limit, the slave will quit.
The counter is set back to 0 if a response was received.
-b num limit of blanks (unanswered icmp requests before quitting
-s bytes maximal data buffer size in bytes
PingTunnel
PingTunnel也是一个常用的ICMP隧道工具,可以跨平台使用,且可以设置密码,也支持socke5、tcp/udp隧道。
如果内网的机器A不能直接访问机器B,但是机器A可以ping通机器B,此时可以尝试将机器A与外网建立ICMP隧道,将机器A作为跳板与机器B利用ICMP通信。例如如下图示:
详情可以查看链接:PingTunnel工具
传输层隧道协议
传输层包括TCP隧道、UDP隧道和常规端口转发等。
lcx端口转发
端口转发最经典的工具,是一个基于socket套接字实现的端口转发工具。有windows和linux两个版本,windows版本为lcx.exe,linux版本为portmap,一个正常的socket隧道必须具备两端:一端服务端,监听一个端口,等待客户端的链接;一段作为客户端,通过服务端的ip和端口与服务器主动进行连接。
内网端口转发
可以使用内网端口转发实现内网穿透,将内网机器的端口转发到公网vps,然后通过公网vps就可以连接内网的端口了。
例如将内网的22端口抓发到公网:
然后公网vps启动监听:
然后我们访问公网vps的33579端口就可以和内网的被转发机器的22端口通信了:
本地端口映射
如果目标服务器的某些端口无法通过防火墙,可以将目标服务器相应端口的数据传到防火墙允许的其他端口。在靶机上执行如下命令,就可以通过连接目标的80端口转发到22端口:
netcat
netcat也就是大家常用的nc,俗称网络界的瑞士军刀,基于TCP/UDP协议。一些常用参数如下:
-d:后台模式。
-e:程序重定向,正向shell用。
-l:使用监听模式,管理和控制传入的数据。
-n:直接使用ip地址,不通过域名服务器解析。
-o <输出文件>:指定文件名,把往来传输的数据转换为16进制字节码保存在该文件中。
-p <端口>:设置本地主机通信端口。
-u:使用UDP传输协议。
-v:详细输出。
-z:将输入/输出功能关闭,仅在用于扫描通信端口时使用。
Banner抓取
命令如下:
连接远程主机
也就是正向的nc连接,例如靶机先开启监听,重定向/bash/sh,如下所示:
然后nc正向连接shell,如下所示:
端口扫描
如果只是想查看目标某个端口是否打开,可以使用nc的 -v
选项即可。如果想批量扫描端口段,可以使用nc的 -z
选项:
文件传输
使用nc还可以传输文件呦!例如在本地输入如下命令:
例如机器A上存在一个test.txt文件,想传输到机器B上,那么可以先在机器B上输入如下命令:
机器A上输入如下命令将本机上的test.txt传输过去:
获取shell
nc用的最多的就是获取shell,分为正向和反向。一般反弹shell用的多。正向连接shell举个linux下的例子如下:
攻击机开启监听,如下:
靶机正向连接攻击机转发shell:
然后攻击机就获取靶机的shell了:
反弹shell的时候,一般靶机没有nc,所以一般需要依赖其他方式反弹shell。常用的有bash、php、python、perl等方式。
内网代理
假设存在机器A、B、C。机器A是公网VPS、机器B和C是内网机器、机器B可以出网,但是C不能出网且无法从公网访问。现在想获取机器C的shell:
首先机器A上开启nc监听:
在机器C上开启正向nc监听:
然后在机器B上开启转发,将机器C的shell转发到机器A上:
于是机器A就反弹到了机器C的shell,如下所示:
powercat
powercat是nc的powershell版本。用法和nc差不多,但是 可以返回powershell。
应用层隧道技术
常用的隧道协议有SSH、HTTP、HTTPS和DNS。
SSH协议
SSH协议一般是可以通过防火墙的,而且很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。
常用参数如下:
-C:压缩传输,提高传输速度。
-f:将SSH传输转入后台执行,不占用当前shell。
-N:建立静默连接(建立了连接,但是看不到具体会话)。
-g:允许远程主机连接本地用于转发的端口。
-L:本地端口转发。
-R:远程端口转发.
-D:动态转发(SOCKS代理)。
-P:指定SSH端口。
本地转发
例如,存在机器A、B、C。机器A为公网VPS,机器B、C内网服务器。现在想通过机器B(机器B有公网IP)作为跳板访问机器C的3389端口。可以如下操作:
在机器A上输入如下命令后,就可以机器A的本地访问1152端口连接机器C的3389端口了:
远程转发
例如,存在机器A、B、C。机器A为公网VPS,机器B、C内网服务器。现在想通过机器B(机器B没有公网IP,但是能出网)作为跳板访问机器C的3389端口。可以如下操作:
在机器B上输入如下命令后,就可以在公网机器A的1152端口连接机器的3389端口了:
由于我公网VPS无法连接桌面,所以我把公网VPS的1152端口转发到了1153端口,这样我们在本地连接公网VPS的1153端口就会转发到1152端口,从而与机器C的3389端口通信,如下所示:
动态转发
例如,存在机器A、B、C。机器A为公网VPS,机器B、C内网服务器。现在想通过机器B(机器B有公网IP)作为socket4/5跳板漫游内网。可以如下操作:
在机器A公网VPS上输入如下命令,建立一个动态的socket4/5隧道,需要输入机器B的密码:
然后浏览器设置socket代理就可以访问内网的应用了:
HTTP/HTTPS协议
HTTPService代理用于将所有流量转发到内网。常见的代理工具有reGeorg、meterpreter、tunna等。下面演示使用reGeorg:
先将tunnel(我这里是http.jsp)上传到web服务器:
然后本机攻击机启动py脚本,如下所示:
然后浏览器挂上代理,或者攻击机挂上全局代理,就可以访问内网应用啦:
DNS协议
现在DNS、ICMP、HTTP/HTTPS等难以被禁用的协议已成为攻击者控制隧道的主流。
查看DNS的连通性
需要测试DNS的连通性,也就是能否通过内部DNS解析外部域名。输入如下命令查看内部域名和IP地址:
cat /etc/resolv.conf|grep -v "#"
如图所示:
然后使用dig或者nslookup测试能否解析外部域名:
dnscat2
dnscat2的客户端是C编写的,服务端是Ruby编写的。有如下特点:
- 支持直连和中继模式。
- 支持多个会话。
- 使用密钥防止MiTM攻击。
- 在内存中直接执行PowerShell脚本。
- 隐蔽通信。
(1)配置域名解析:
要使用dnscat2首先需要配置域名解析,以下是我的配置:
Notice: 如果直接访问ns1.pinger.fun,因为此域名对应A记录,所以可以直接得到IP,不需要再请求域名解析。所以我们如果采用中继模式建立DNS隧道,那么应该再配置一个NS记录,指向ns1.pinger.fun,让ns1.pinger.fun对应ip的服务器给出域名解析结果。
此时我们直接ping以下ns1.pinger.fun,就可以查看A类解析是否生效:
然后在攻击机,也就是ns1.pinger.fun对应IP的服务器上开启抓包,此时dig一下www.pinger.fun,可以在攻击机上看到有域名解析请求,也就代表NS解析配置生效了:
(2)安装dnscat2服务端:
dnscat2的服务端是ruby编写的,需要安装一些库。安装好后,启动服务端的命令如下(采用的中继模式):
Notice: -c选择设置密钥预防中间人攻击;-e指定安全级别,open表示服务端允许客户端不进行加密;–no-cache表示禁止缓存,务必要添加此选项,防止兼容问题。
(3)在目标机上安装客户端
windows下需要使用编译打包好的exe文件,在dnscat2进行下载。linux下直接进入client目录运行 make
即可安装。
首先需要测试能否与服务端通信,输入如下命令进行测试(注意选项带两个横杠):
保证能通信后,就可以与服务端进行连接了,在客户端靶机上输入如下所示命令:
然后攻击机就能控制靶机啦~有点和msf类似的使用方式,但是感觉这shell不咋友好:
如果想直连,不用中继,那么可以使用如下参数开启Server(Client怎么连,会给出提示):
Socket代理
- Socket是一种代理服务,可以将一端系统连接另一端。
- Socket4只支持TCP协议;Socket5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口为1080.
前面其实已经用过一个Socket代理工具了,就是reGeorg,其利用webshell建立一个Socket代理进行内网穿透。然后其他常用的工具有:EarthWorm和SocketCap64、ProxyChains等。
文章作者 P1n93r
上次更新 2021-02-07