前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记一次.Net代码审计-通过machineKey伪造任意用户身份

记一次.Net代码审计-通过machineKey伪造任意用户身份

作者头像
用户1789928
发布2021-04-13 15:28:33
1.5K0
发布2021-04-13 15:28:33
举报
文章被收录于专栏:渗透测试红队专栏

温馨提示

本文章仅供学习交流使用,文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!

0x01 起因

某次机缘巧合,领导给了一套国内某主流.net BPM系统源码,要求审计,于是便开始了这次审计之旅。。。

BPM(业务流程管理系统),这套系统采用前后端分离架构,前端ExtJS,后端.net的一般处理程序+windows服务开放socket端口1580,一般处理程序与服务器本地1580端口通信。数据库Oracle/SQLServer等。

环境搭建好后,使用VS打开站点,使用附加到进程,选择IIS进程,开启调试,配合Reflector查看DLL封装。

0x02 场景

看了没多久发现一个任意文件下载的漏洞,SQL注入,文件上传任意代码执行也存在.

但是只有任意文件文件下载是不需要验证的,其他漏洞都需要验证身份后才能利用成功,如何才能获取一个身份扩大利用面呢?

仔细查看登录逻辑代码并不存在sql注入,系统支持中文,数字,字母格式的用户名,弱口令也是不好搞的,况且也未发现敏感信息泄露。

等等,不是还有任意文件下载吗?下载web.config后数据库直连不可以吗,还真不行,由于业务流程一般涉及到企业的核心,基本都部署在内网,通过NAT方式映射到公网访问,或者纯内网方式访问不对外,这类情况基本没有对外映射数据库端口的(主要看运气)。

仔细观察登录后的身份信息:

代码语言:javascript
复制
Cookie: ys-dLogin.PositionId=xxx;
ys-dLogin.UserId=xxxxxx;
ASP.NET_SessionId=atn2xhww13wfclf3ycs1045l;
UserDisplayName=xxxxxxx;
.ASPXAUTH=DCD91077D0C3FAF548406C2E885A9E202C7D16C832E9.......

使用这个session通过PostMan调用后端接口发现其真正具有身份验证功能的只有.ASPXAUTH这个值。那么这个值是否可以伪造?

答案是肯定的。web.config除了数据库配置之外,还有这个:

代码语言:javascript
复制
<machineKey
validationKey="ABAA84D7EC4BB56D75D237CECFFB9628809BDB8.............." decryptionKey="ABAA84D7EC4BB56D75D237CECFFB9628809BDB8.............."
validation="SHA1"
decryption="AES"
/>

看到这里老.net开发肯定就明白是怎么回事了.

是的,这套系统使用了微软FormsAuthentication类作为身份认证。

该类的实现方法在System.Web.dll,通过该认证,可以把用户Name 和部分用户数据存储在Cookie中,通过基本的条件设置可以,很简单的实现基本的身份角色认证。

FormsAuthenticationTicket类用于创建一个对象,该对象表示 forms 身份验证用于标识已经过身份验证的用户的身份验证票证。Forms 身份验证票证的属性和值与存储在 cookie 或 URL 中的加密字符串进行转换。

FormsAuthentication类提供了一个 Encrypt 方法,用于创建一个字符串值,该字符串值可以存储在 cookie 中,也可以存储在 URL 中 FormsAuthenticationTicket 。FormsAuthentication类还提供了一 个Decrypt 方法,用于 FormsAuthenticationTicket 根据从 forms 身份验证 cookie 或 URL 检索到的加密的身份验证票证来创建对象。

FormsAuthenticationTicket可使用类的属性访问当前经过身份验证的用户的 Ticket FormsIdentity 。可以 FormsIdentity 通过 Identity 将当前的属性转换 User 为类型来访问当前的对象 FormsIdentity 。

根据微软MSDN,生成Cookie的 Demo:

那么知道了怎么生成的,于是定位到代码的Login方法,关键逻辑如下:

首先从上下文获取请求中的key,此key为页面Load时由后端动态生成的,然后分别获取加密后的用户名和密码,使用key进行解密,调用:

此函数调用了后端的windows服务,逻辑复杂,命名不规范(个人水平菜...),总之没找到生成规则,推测是和web.config定义的SecurityKey有关,这个函数返回一个token,该token并不产生变化,所以可以写死。

继续跟入:

这里就出现了熟悉的画面了:

所以简单写个工具,把machineKey放入app.config中:

接下来就是Burpsuit一把梭,拦截响应头信息,替换cookie值,放包,刷新页面,成功伪造默认管理员用户登陆。

因此.Net程序在某些只有任意文件下载的场景下,配合web.config的machineKey或许有新突破。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 M78安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 起因
  • 0x02 场景
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档