有勇气的牛排博客

应用隧道技术 ssh转发 dnscat2

有勇气的牛排 1086 网络、逆向、汇编 2021-10-13 14:14:21

介绍

在内网中建立一个稳定、可靠的数据通道,对渗透测试非常重要。

应用层的隧道通信技术主要利用应用软件提供的端口来发送数据。

产检的隧道协议: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 本地转发

将内网服务器指定端口映射到VPS6666端口,然后访问vps6666端口

任意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"

ssh动态转发

然后再浏览器设置此端口,即可代理,相当于一个vpn

1.4 防御SSH隧道攻击思路

  • 设置ssh远程白名单
  • 在ACL中限制特定ip

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解析也成功

dnscat2 VPS服务器上抓包

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


留言

专栏
文章
加入群聊