作者:
Ricter
·
2016/02/16 10:19
本文翻譯自:https://blog.anitian.com/hacking-microsoft-sql-server-without-a-password/
原作者:Rick Osgood
版權歸原作者所有
0x01 前言
在最近的一次滲透測試中,我抓包的時候無意中注意到一些沒被加密的 MSSQL 流量。因為語法擺在那裡,不會弄錯。最開始我以為這是一個可以抓到認證憑證的方法,然而,MSSQL 加密了登入流量,這意味著我不得不去破解它的加密演算法來獲得憑證。如果安裝 MSSQL 的時候用了一個自簽發證書,那麼很簡單的就可以破解了。
不過不幸的事,破解 MSSQL 加密並不在和這個客戶簽訂的協議的範圍中。所以我只能把我的好奇心放在一邊,然後繼續完成這次滲透測試。然而我卻情不自禁的去想這件事應該有貓膩。是不是這是一種不用任何憑據去攻擊 MSSQL 的方法呢?我決定去實驗室驗證我的假說。
最終我僅透過很少的一部分資料包 hacking,我就可以控制 MSSQL,不用去偷取任何的憑據,僅僅透過中間人攻擊就可以做到。
0x02 中間人
回到實驗室後,我開始研究。為了我的進一步研究,我在 Windows Server 2012 R2 上執行了 MSSQL Server 2014 Express。客戶機是一臺 Windows 10 系統,上面跑了 MSSQL Management Studio 2014。我的攻擊機是一臺新安裝的 Kali 2.0。所有的機器在同一個子網裡,以模擬在內網的攻擊。這個環境和我在客戶那邊的環境幾乎一模一樣。
這類攻擊是 MITM,Anitian 做過很多這類攻擊,正如我們在 hacking 基礎設施裝置上有很多專長。MITM 典型的方式是執行某種重定向,像 ARP 快取投毒(在某些環境下仍然可以用)一樣,強行讓在兩個系統之間的流量重定向到攻擊者的計算機上。這可以讓攻擊者不僅可以看見所有受害者的資料,而且可以控制這些流量。
這就是我想要做的。
0x03 理解資料
我需要了解的第一件事就是 MSSQL query 流量。為了讓這次測試更有意思一點,我用 sa 賬戶登入 MSSQL。sa 是 MSSQL 的 system admin 賬戶,可以做任何你想要做的奇奇怪怪的事情。如果我的實驗成功了,那麼我可以利用 sa 的許可權做一些有趣的事情。
登陸後,我在 MSSQL 伺服器上開啟 Wireshark 2.0,開始抓包。我用 “tds.query” 的 filter 在 Wireshark 上過濾,這樣就可以隱藏其他亂七八糟的流量,僅現實 TDS 查詢包了。(順便一提啊,我發現“tds.query” filter 在老版本的 Wireshark 上不受支援)
抓流量的同時,接著我切回到工作站然後在我建立的測試資料庫上執行了一條 MSSQL 查詢語句。這個資料庫叫做 testdb,只有一個叫做 Products 的表。Products 表有兩個欄位:ProductID 和 ProductName。雖然裡面沒有任何資料,但是這次測試並不需要資料。這條查詢語句的意思是從指定的資料庫的表裡獲取所有的資料。
查詢成功執行了,然後返回了空的表。你可以看見欄位在截圖的右下方列出來了。切回到 Wireshark,我停止抓包然後看了下抓到的資料。我注意到一個 TDS 查詢包,然後點選這個資料包,讓它裡面所有的資料在我面前顯示出來。MSSQL Server 2014 Express 預設沒有任何加密,所我我可以分分鐘看到它的資料。
看在中心窗格底下被解碼的資料,很容易的辨識出這個查詢。它甚至包含回車和換行符。注意到的比較有意思的是,在兩個位元組之間會有一個空位元組(0x00)。這在下面窗格的 raw data 種是很明顯的。Wireshark 顯示了這些位元組的週期特徵,但是真的,這都是空位元組。這意味著我並不能直接尋找 “select”,我不得不在稍後的搜尋中考慮這些空位元組,而且在最終我要替換的資料中也要插入這些空位元組。
0x04 和 Ettercap Filters 的愉♂快的事情
現在我知道了資料的樣子,我試圖找一種方式去操控這些資料。我決定用 Ettercap。Ettercap 是一個專門為 MITM 攻擊設計的工具,同時它也有一個內建的功能,叫做 Ettercap filters。一個 filter 可以讓我搜尋資料包的資料,接著操控這些資料。你可以自己寫一個 filter,然後把它載入到 Ettercap 裡面。Ettercap 會在每次找到匹配的資料的時候自動替換這些資料。雖然這個功能有點限制性,但是對於 PoC 來說足夠了。
filters 使用一個簡單的指令碼語言寫的,我想要用的函式就是 search 和 replace 了。search 函式可以在資料包裡搜尋指定的資料,replace 會替換我們想替換的資料。這是這次專案的關鍵。
因為 TDS 查詢資料中有空位元組,所以一些字元是不可列印的(non-printable)。這意味著我不能簡單的去搜尋/替換掉一個字串。我需要一種方法來搜尋不可列印的字元,而且我並不能在鍵盤上輸入空位元組。幸運的事,Ettercap filters 支援 16 進位制。比如,搜尋“s”的時候,我可以透過“\x73
”來搜尋,所以空位元組也可以簡單的用“\x00
”來表示了。Kali 有一個程式叫做 hexdump,可以將字串轉化為 16 進位制,我用它轉變了“select”到 16 進位制。
譯者注:真特喵的囉嗦..
我寫了一個 filter,用來測試我們想要的資料。
第一行確保 filter 只會在 1433 埠的 TCP 流量上工作,如果條件滿足了,filter 會輸出 debug 資訊,這樣我們就知道它找到了 MSSQL 流量。這僅僅是為了讓我內心平靜,因為我知道這個 filter 部分的可用了。嘛,下一個 if 語句搜尋 hex 資料,這些資料翻譯過來就是帶有空位元組的“select”。如果 filter 定位到了這個字串,也會輸出 debug 資訊。
最後,見證奇蹟的時刻。replace 命令將我們指定的字串準確的替換成了包含空位元組的“ssssss”。這只是為了測試這個指令碼是不是正確的執行了。比較重要的一點需要注意的是,我們替換的資料長度要和被替換的資料長度相等,這樣 TCP 連線就不會斷掉了。
寫完 filter 之後,需要編譯。這也很簡單的透過 etterfilter 命令完成。
沒有報錯,filter 可以進行測試了。我啟動了 Ettercap 圖形介面,啟動 ARP 欺騙,去攻擊 MSSQL 伺服器和客戶端工作站。我執行 Wireshark 驗證了兩個被攻擊者之間的流量。接著在 Ettercap 中,我點選“Filters -> Load a filter”,選擇了我的 filter。Ettercap console 裡面顯示了“Content filters loaded”的資訊。幾乎同時我看到了“SQL Traffic Discovered”。一切都在計劃之中。
下一步就是返回到工作站,然後嘗試執行查詢語句。根據計劃,“select”會被替換成“ssssss”,打亂了這個查詢。我執行了這個查詢,但這一次我並沒有看到像之前一樣的一個空表,而是一段報錯。
“Incorrect syntax near ‘ssssss’.”。太完美了,filter 完全按照預期工作了。它把“select”替換成了“ssssss”。MSSQL 不能夠理解,所以返回報錯。這是在正確道路上的第一步,下一步就是把所有的語句替換成我們攻擊的查詢語句了。
0x05 建立賬戶
我決定在伺服器上增加一個賬戶,這是我作為攻擊者來說最好的一個劇本了,特別是當工作站的被害者使用 sa 賬戶登入的時候。為了新增賬戶,我需要在 MSSQL 上提交如下查詢:
#!sql
CREATE LOGIN anitian WITH PASSWORD=’YouGotHacked1#’;
這樣會在 MSSQL 上新增一個使用者名稱為“anitian”,密碼為“YouGotHacked1#”的賬戶。將它轉化為 hex 之後,我修改了 mssql.filter 檔案。
這個 filter 會搜尋 “select ProductID, ProductName from Products where ProductID=1;
” 並把它替換為 “CREATE LOGIN anitian with PASSWORD=’YouGotHacked1#’
”。我之前說過兩個字串的長度要一樣長,所以我怎麼去控制我的語句呢?因為我的語句比原語句短,所以我僅僅在語句後新增了幾個空格,空格並不會影響語句執行結果的。我編譯好這個 filter,然後用之前的方法載入進 Ettercap。接著我在工作站提交查詢。
注意到這此返回的內容和我用 Ettercap 之前返回的內容的不同了嗎?原來是返回了一個空表,但這一次,沒有返回表,而是返回了“Command(s) completed successfully.”。如果 DBA 看到了這個,他們會把這個當做奇怪的錯誤而忽視。不幸的是,太晚了。我已經在資料庫上新增了自己的使用者,現在,真正的 hack 才剛剛開始。
我從之前用 sa 賬戶登入的 Windows 10 工作站上用我剛建立的新使用者“anitian”登陸。
成功啦!我成功登陸了自己的賬戶。不過不幸的是這個賬戶許可權比較低,所以我不能幹太多的事。然而,這個很好解決。下一步就是利用 Ettercap filter 修改我的許可權。
在這一點上,我可以很容易地完成這件事。但是手動來轉換 hex 很乏味,而且還要插入空細節。誰願意在這上面花費心思?這是一個足夠好的 PoC 麼?
沒門!我不想輕易放棄。而且,為什麼要做這些無聊的工作,我可以用一個指令碼完成全部這些工作!
0x06 自動化攻擊
SQLinject.sh shell 指令碼可以在這裡下載。
http://pastebin.com/Nge9rx7g
這個指令碼自動的完成全部的過程,從把 SQL 語句轉化為 hex 開始,到 ARP 攻擊、載入 Ettercap filter。它使得整個過程變得十分簡單。
這個指令碼需要以下資訊:
- MSSQL server 的 IP 地址
- MSSQL client 的 IP 地址
- 想替換的原 SQL 語句
- 替換成的新 SQL 語句
通常情況下,除了我想注入的 SQL 語句以外,其他的所有的資訊我都知道。我知道我想給 anitian 使用者 sysadmin 許可權,快速地學習了一下 MSSQL 命令後,我寫了如下語句:
#!sql
ALTER SERVER ROLE sysadmin ADD MEMBER anitian;
這條語句將會讓我新新增的 anitian 使用者擁有 sysadmin 許可權,讓我可以幹更多的事情。現在我知道了所有的四個資訊了,那麼我執行這個指令碼:
#!bash
./SQLInject.sh –o “select ProductID, ProductName from Products where ProductID=1;” –i “ALTER SERVER ROLE sysadmin ADD MEMBER anitian;” –s 192.168.1.114 –c 192.168.1.100 –f mssql.filter
用這個指令碼,我不用擔心這些討厭的 hex 格式和空字元,這個指令碼做了所有的事情。它會將字串轉化為 hex 格式,然後輸出一個 Ettercap filter 到 mssql.filter 中(檔名基於 -f
引數)。接著,指令碼執行 etterfilter 然後編譯 filter。最後,這個指令碼甚至執行了命令列介面的 Ettercap、載入 filter,進行 ARP 欺騙攻擊 MSSQL 伺服器和客戶端工作站。它甚至也比較了兩個字串的長度來進行自動補充空格使得兩個字串長度相等。只需要一個命令就能完成所有的事情。
我執行了這個指令碼,然後切換到工作站。當我執行相同的 select 查詢的時候,我注意到我再次得到了“Command(s) completed successfully”的資訊。這是一個好象徵。我登出 sa 賬戶然後透過 anitian 登陸。
233333333!你看截圖,anitian 已經是 sysadmin 許可權了。我可以透過這個許可權訪問整個系統。它給了我一餓過很好的中樞點來攻擊網路上的其他的系統。當然,假定這個資料庫不包含我想要的付款卡號或者個人身份資訊。
不過這個指令碼最大的敗筆就是你需要知道要被替換的原語句。幸運的是,MSSQL 經常有定時執行的批處理工作或者查詢在指定的時刻。盯著 Wireshark 一段時間,將會抓到至少一條查詢的吧。當然我也可以讓它變成一個更成熟的方案:進行 MITM 攻擊使得我代理所有的流量,然後在其中搜尋 TDS 查詢資料包,接著自動替換資料,不需要知道任何原語句...到那時這個專案還是日後再說吧...
0x07 防禦 SQL MITM 攻擊
我才不想翻譯了呢,大家可以看原文 :D
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!