BadTunnel 這個漏洞出來已經近一個月了,筆者在剛剛爆發這個漏洞的時候對其進行了分析,并且寫出了POC,最近閑來無事,又重新翻起這個漏洞,改進了攻擊腳本,使之成為一個實際滲透測試中可用的一個工具。
原理:
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,即類似”S.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服務器+代理服務器,來收集域內信息。
此工具已經集成到四維創智天象綜合滲透測試平臺中。