<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/tips/12749

            本文翻譯自: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 的權限做一些有趣的事情。

            p1

            登陸后,我在 MSSQL 服務器上打開 Wireshark 2.0,開始抓包。我用 “tds.query” 的 filter 在 Wireshark 上過濾,這樣就可以隱藏其他亂七八糟的流量,僅現實 TDS 查詢包了。(順便一提啊,我發現“tds.query” filter 在老版本的 Wireshark 上不受支持)

            抓流量的同時,接著我切回到工作站然后在我建立的測試數據庫上執行了一條 MSSQL 查詢語句。這個數據庫叫做 testdb,只有一個叫做 Products 的表。Products 表有兩個字段:ProductID 和 ProductName。雖然里面沒有任何數據,但是這次測試并不需要數據。這條查詢語句的意思是從指定的數據庫的表里獲取所有的數據。

            p2

            查詢成功執行了,然后返回了空的表。你可以看見字段在截圖的右下方列出來了。切回到 Wireshark,我停止抓包然后看了下抓到的數據。我注意到一個 TDS 查詢包,然后點擊這個數據包,讓它里面所有的數據在我面前顯示出來。MSSQL Server 2014 Express 默認沒有任何加密,所我我可以分分鐘看到它的數據。

            p3

            看在中心窗格底下被解碼的數據,很容易的辨識出這個查詢。它甚至包含回車和換行符。注意到的比較有意思的是,在兩個字節之間會有一個空字節(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 進制。

            譯者注:真特喵的啰嗦..

            p4

            我寫了一個 filter,用來測試我們想要的數據。

            p5

            第一行確保 filter 只會在 1433 端口的 TCP 流量上工作,如果條件滿足了,filter 會輸出 debug 信息,這樣我們就知道它找到了 MSSQL 流量。這僅僅是為了讓我內心平靜,因為我知道這個 filter 部分的可用了。嘛,下一個 if 語句搜索 hex 數據,這些數據翻譯過來就是帶有空字節的“select”。如果 filter 定位到了這個字符串,也會輸出 debug 信息。

            最后,見證奇跡的時刻。replace 命令將我們指定的字符串準確的替換成了包含空字節的“ssssss”。這只是為了測試這個腳本是不是正確的運行了。比較重要的一點需要注意的是,我們替換的數據長度要和被替換的數據長度相等,這樣 TCP 連接就不會斷掉了。

            寫完 filter 之后,需要編譯。這也很簡單的通過 etterfilter 命令完成。

            p6

            沒有報錯,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 文件。

            p7

            這個 filter 會搜索 “select ProductID, ProductName from Products where ProductID=1;” 并把它替換為 “CREATE LOGIN anitian with PASSWORD=’YouGotHacked1#’”。我之前說過兩個字符串的長度要一樣長,所以我怎么去控制我的語句呢?因為我的語句比原語句短,所以我僅僅在語句后添加了幾個空格,空格并不會影響語句執行結果的。我編譯好這個 filter,然后用之前的方法加載進 Ettercap。接著我在工作站提交查詢。

            p8

            注意到這此返回的內容和我用 Ettercap 之前返回的內容的不同了嗎?原來是返回了一個空表,但這一次,沒有返回表,而是返回了“Command(s) completed successfully.”。如果 DBA 看到了這個,他們會把這個當做奇怪的錯誤而忽視。不幸的是,太晚了。我已經在數據庫上添加了自己的用戶,現在,真正的 hack 才剛剛開始。

            我從之前用 sa 賬戶登錄的 Windows 10 工作站上用我剛創建的新用戶“anitian”登陸。

            p9

            p10

            成功啦!我成功登陸了自己的賬戶。不過不幸的是這個賬戶權限比較低,所以我不能干太多的事。然而,這個很好解決。下一步就是利用 Ettercap filter 修改我的權限。

            在這一點上,我可以很容易地完成這件事。但是手動來轉換 hex 很乏味,而且還要插入空細節。誰愿意在這上面花費心思?這是一個足夠好的 PoC 么?

            沒門!我不想輕易放棄。而且,為什么要做這些無聊的工作,我可以用一個腳本完成全部這些工作!

            0x06 自動化攻擊

            SQLinject.sh shell 腳本可以在這里下載。

            http://pastebin.com/Nge9rx7g

            這個腳本自動的完成全部的過程,從把 SQL 語句轉化為 hex 開始,到 ARP 攻擊、加載 Ettercap filter。它使得整個過程變得十分簡單。

            這個腳本需要以下信息:

            通常情況下,除了我想注入的 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 登陸。

            p11

            233333333!你看截圖,anitian 已經是 sysadmin 權限了。我可以通過這個權限訪問整個系統。它給了我一餓過很好的中樞點來攻擊網絡上的其他的系統。當然,假定這個數據庫不包含我想要的付款卡號或者個人身份信息。

            不過這個腳本最大的敗筆就是你需要知道要被替換的原語句。幸運的是,MSSQL 經常有定時運行的批處理工作或者查詢在指定的時刻。盯著 Wireshark 一段時間,將會抓到至少一條查詢的吧。當然我也可以讓它變成一個更成熟的方案:進行 MITM 攻擊使得我代理所有的流量,然后在其中搜尋 TDS 查詢數據包,接著自動替換數據,不需要知道任何原語句...到那時這個項目還是日后再說吧...

            0x07 防御 SQL MITM 攻擊

            我才不想翻譯了呢,大家可以看原文 :D

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线