专栏首页渗透测试红队专栏记一次.Net代码审计-通过machineKey伪造任意用户身份

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

温馨提示

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

0x01 起因

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

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

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

0x02 场景

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

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

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

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

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

Cookie: ys-dLogin.PositionId=xxx;
ys-dLogin.UserId=xxxxxx;
ASP.NET_SessionId=atn2xhww13wfclf3ycs1045l;
UserDisplayName=xxxxxxx;
.ASPXAUTH=DCD91077D0C3FAF548406C2E885A9E202C7D16C832E9.......

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

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

<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或许有新突破。

本文分享自微信公众号 - M78安全团队(M78sec),作者:Nick

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 就算有DES加密和session校验我也要进入你的心

    前几天写了篇突破某线上教育平台身份校验的文章,当时中午没睡觉,写的时候非常的困倦,很多地方可能表达的不是那么清楚,但是我也懒得去改了。今天正好休息,我写一篇审计...

    FB客服
  • Session分布式共享 = Session + Redis + Nginx

    一、Session 1、Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。 Sess...

    逸鹏
  • .NET Core 必备安全措施

    .NET Core大大简化了.NET应用程序的开发。它的自动配置和启动依赖大大减少了开始一个应用所需的代码和配置量,本文目的是介绍如何创建更安全的.NET Co...

    张善友
  • .Net 反序列化之 ViewState 利用

    .NET 相关漏洞中,ViewState也算是一个常客了。Exchange CVE-2020-0688,SharePoint CVE-2020-16952 中都...

    Seebug漏洞平台
  • 利用真实或伪造的计算机账号进行隐秘控制

    这个系列的文章翻译由信安之路红蓝对抗小组的所有成员共同完成,后续将陆续发布,敬请期待!

    信安之路
  • 内网横向移动:Kerberos认证与(哈希)票据传递攻击

    在上节《内网横向移动:获取域内单机密码与Hash》中,我们讲了如何在内网渗透中抓取主机的的密码和哈希值。获取了Hash,我们可以对其进行破解,破解不出来的,我们...

    FB客服
  • 代码审计 | 利用思维导图快速读懂框架和理清思路

    html/javascript/dom元素使用,主要是为了挖掘xss漏洞,jquery 主要写一些涉及到CSRF脚本使用的或者DOM型XSS,JSON劫持等

    HACK学习
  • 你只知大数据的便利,却不知漏洞——hadoop安全完整解析

    内容来源:2017 年 07 月 29 日,威客安全技术合伙人安琪在“CDAS 2017 中国数据分析师行业峰会”进行《大数据平台基础架构hadoop安全分析》...

    IT大咖说
  • 通过SSH隧道传递票证

    由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 雷神众测拥有对此文章的修改和...

    安恒网络空间安全讲武堂

扫码关注云+社区

领取腾讯云代金券