原理:
1. Badtunnel漏洞的原理是,当某台主机(受害主机)给一个指定IP的主机发送一个SMB共享连接请求时,因为该指定主机的默认共享端口445、139不可达(超时或拒绝连接),则该主机会向这个指定IP的主机发送一个目的端口为137的NetBIOS NB STATE包。一旦发送这个数据,且网络核心部件(防火墙、NAT网关等)允许通过,那么就必然允许在一定的时间内通过该隧道(即Badtunnel)返回数据。而这个NetBIOS包使用的协议是无连接状态的UDP,其源端口和目的端口用且只用137端口。这就表示这样一段时间内,处于外部网络的机器可以构造一个源端口为137,目的为该IP的137端口,发往受害主机,且该网络一定是可达的。
2. Badtunnel中一共用到了2种NetBIOS数据包,第一种是受害主机向目的主机UDP的137端口发送的NetBIOS NB STATE包,第二种则是从目的主机137端口源源不断地返回的NetBIOSNAME RESPONSE包。发送第二个包的目的是什么呢?其实就是在当这个Badtunnel构建起来后,假定目标再未来的一段时间内,一定会向自己的局域网内广播一个NetBIOS NAME QUERY的请求包,用来请求某一个未知的域名或者机器名的IP地址(注意这个广播报是不能通过Badtunnel发送给黑客的服务器的,即黑客是看不到这个广播包的)。这个请求包内部其实是一个DNS协议的报文,但是和DNS协议不同的是,它的Trasaction ID不是随机,而是递增的!而且这个ID还和之前发送的NetBIOSNB STATE数据包的ID享用同一个计数器!也就是说,在受害主机给一个指定的主机发送一个NetBIOSNB STATE包时,这个ID就已经泄露了。只要受害主机接收到ID匹配的RESPONSE,那么它就会更新自己本机的NetBIOS缓存。
3. 当Badtunnel构建起来以后,可以不断地通过这个tunnel给受害主机发送一个NetBIOSNAME RESPONSE包,不断地告诉受害主机:WPAD(或者其他域名)的IP地址是xxx,这个xxx通常是攻击者自己的WEB服务器,用来给受害者主机发送wpad.dat文件,从而更改受害主机的网络代理设置。而发送的这个NetBIOSNAME RESPONSE包,使用的ID号必然是大于之前收到的NB STATE的ID号,且通常不会大很多。通过不断地发包完全可以“蒙”对。
4. 触发这个漏洞的确很简单,但是门槛也不是那种受害者完全不知情就能劫持的。根据1,受害者需要访问一个SMB的UNI PATH,即类似”\123.123.123.123\”的地址,一个仅仅放在资源管理器的快捷方式、或者打开一个网页、打开一个文档都可以触发,但是这还是有一定门槛的,虽然并不是很高。即便成功地触发,部分运营商似乎在网络层就已经屏蔽了udp的137端口,这样这个Tunnel还是构建不起来。
5. Badtunnel漏洞的核心在于这个Tunnel,而不是WPAD。WPAD(即网络代理自发现协议 – Web Proxy Auto-Discovery Protocol)只是基于这个Tunnel的一个目前发现的比较好的利用方式而已(其实还有一个潜在的更好的利用方式,这里笔者卖个关子,尚待研究)。事实上,在部分内网中,很多Web连接数据库是通过机器名来连接的,也就是说,在Web服务器刚启动的初始化阶段,或者连接超时以后重新发起连接的阶段,它也会在内部网络发送一个NetBIOS NAME QUERY广播,只要能够知道这个主机名,一样可以通过Badtunnel来欺骗数据库客户端主机,使用Metasploit的MYSQL Capture或者MSSQL Capture模块就能捕捉到数据库的密码。
利用
Metasploite中的利用代码,其实并不能算是一个真正的Badtunnel利用代码,因为它会遍历0-65535号的Trasaction ID。根据我之前所说,这个ID是可以被预测并且精确攻击的。因此Metasploit中的利用代码效率低、成功率不高。
笔者使用Python编写了一个真正的BadTunnel利用工具,该工具能够精准的欺骗受害主机,重定向一个指定的域名(默认是WPAD)到一个指定的IP地址。还有NetBIOS探针模式、混合模式(构建Badtunnel,通过Badtunnel重定向WPAD并且探针局域网内NetBIOS NAME QUERY),自动欺骗模式(自动欺骗局域网内所有的NetBIOS NAMEQUERY,把任意域名定向到一个指定IP)。其中探针模式、自动欺骗模式不支持跨网段。可以想象以下攻击场景,注意构建BadTunnel需要首先关闭445和139端口,Linux中默认是smbd服务和nmbd服务,Windows可以设置防火墙禁止通过:
1. 劫持QQ好友、远程/局域网络的流量:
准备好环境。最方便的是直接使用burpsuit来开启一个代理端口,注意需要监听在所有接口上(即监听0.0.0.0),然后使用metasploit的server/wpad模块来快速搭建一个80端口下的HTTP服务器,来返回wpad配置文件。
1)使用QQ、邮件发送一个带有SMBURI PATH的文档、快捷方式,或者一个网页,注意网页中的标签应该是src=”\\123.123.123.123\”这种;快捷方式可以用metasploit生成。如果处于同一个局域网,则不需要任何工作。
2)发送给朋友或者妹子,最好做点其他功课,你懂的。直接使用工具的默认模式即可。
2. 进入内网,横向渗透时非ARP嗅探内网账号密码:
1)使用探针模式,把所有NetBIOS NAME QUERY记录下来。Windows主机非管理员权限即可监听udp的137端口,Linux主机则需要提权成功。
2)分析局域网内所有NetBIOS NAME QUERY请求,如果发现有请求MYSQL、SQLSERVER或者直接使用机器名连接服务和打开共享的,可以根据需要调整攻击环境,然后再使用自动欺骗模式来抓密码。
3. 进入边界提权成功,纵向渗透时密码采集:
1)域内机器有偶尔访问边界服务器的情况,有的环境甚至是经常存在。一般边界服务器都是Web服务器,那么可以通过在该肉鸡的某个页面中插入的标签,并且配置好wpad.dat文件,还有webproxy.py等小的HTTP代理工具,使用该主机做WPAD服务器+代理服务器,来收集域内信息。