临渊羡鱼,不如退而结网
.

[网络安全]python版漏洞扫描器xiaofeixia-sec[已有600poc]

这里介绍一款自己写漏扫,有兴趣的可以看看,欢迎大家提出宝贵的意见或建议

项目地址: https://github.com/qiubo123/xiaofeixia-sec

使用注意点

强调

本文使用的工具和方法仅限学习交流使用,请不要将文中使用的工具和渗透思路用于任何非法用途,对此产生的一切后果,本人不承担任何责任,也不对造成的任何误用或损害负责。

使用注意点

  1. 只要不删除、增加、修改poc的文件名,都不需要“-up”。
  2. 增加、删除poc,或者修改poc的文件名,都需要执行“-up”
  3. 可以在poc目录下移动poc至你认为合适的目录下,只要在移动后执行“-up”即可
  4. 由于个人精力有限,现有poc未一一验证,存在误报或poc错误的情况;

用法

一、准备工作

安装python模块

pip install -r requirements.txt

如网络异常可指定源安装

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

二、用法示例

1、安装完模块后一定要先进行poc初始化,否则脚本无法读取任何poc

python xiaofeixia-sec.py -up

2、对一个网站执行所有poc

python xiaofeixia-sec.py -u http://www.tesssst.com -a

3、匹配某些poc进行扫描

python xiaofeixia-sec.py -u http://www.tesssst.com -s 弱口令

4、批量poc扫描(不支持同时匹配,目前只能匹配一个关键字,如:-s tomcat nginx是不支持的)

python xiaofeixia-sec.py -f targets.txt -s tomcat

5、扫描到的漏洞会记录到log目录下的文件,按照日期命名;

6、“-pl”列出当前所有的poc信息;

python xiaofeixia-sec.py -pl

7、“debug”只能输出部分语法错误,这部分以后改进;

python xiaofeixia-sec.py -debug

8、需要配置邮箱和授权码,最好是qq邮箱,其他的没配置,发现漏洞后可以直接邮件通知,不需要一直盯着,配置文件在config目录下;

9、邮件发送过快可能会被qq限制,导致收不到邮件;

poc编写规范

一、msg()函数

msg()函数下为记录poc的基本信息。在检测到漏洞后会返回部分信息。

def msg():
  ret = {

      'links'     :  '',//编写poc的参考链接

      'huixian'   :  '',//为空即可,如有需要可在`run()`函数下添加返回信息

      'method'    :   'get',//请求得格式:get、post

      'bugname'   :   'HIKVISION 流媒体管理服务器 user.xml 账号密码泄漏',//漏洞名

      'level'     :   'critical',//漏洞等级:critical、high、medium、low

      'FOFA'      :   '"杭州海康威视系统技术有限公司 版权所有" && title="流媒体管理服务器"',//fofa查询语法

      'author'    :   'ppxfx',//脚本作者

      'ifbug'     :   False,//默认无漏洞,匹配到漏洞后将True赋值给ifbug

      'create_time':  '2024/2/26',//poc创建时间
  }
  return ret

二、run()函数

run()函数为检测漏洞的入口,在该函数下编写漏洞检测的相关逻辑

def run(url,ua):
  ret = msg()
  headers = {
      'User-Agent': ua,
      }
  target = ''//路径地址
  url1 = url + target//将域名和路径组合在一起
  ret['url'] = url1
  try:
    res=requests.get(url=url1,headers=headers,timeout=5,verify=False)
    if res.status_code == 200 and re.search(r'root:.*?:[0-9]*:[0-9]*:',res.text,re.S):
      ret['huixian'] = res.text
      res.close()
      ret['ifbug'] = True
      return ret
    else:
      return ret
  except:
    return ret

run()函数传入两个参数,一个是待检测地址的域名(后无路径),一个是随机的user-agent,这两个无需修改。

ret是脚本信息,在检测完脚本后返回是否存在漏洞等基本信息。

headers里写入user-agent,ua是浏览器指纹,如果需要其它的也可写入,全部是字符串格式,需要用引号包裹起来,最后都需要逗号结束,如:

headers = {
      'User-Agent': ua,
      'Content-Type': 'application/x-www-form-urlencoded',
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
      }

target为路径信息,如

target='/../../../../etc/passwd'

三、弱口令的编写注意点

在弱口令poc中的请求包一般需要禁止重定向,如:

res=requests.post(url=url1,headers=headers,data=data,timeout=5,verify=False,allow_redirects=False)

并且在匹配漏洞特征的时候最好检测`localtion`是否符合预期

if res.status_code == 302 and '/out/out.ViewFolder.php' in res.headers['location']

最后如果检测到漏洞可将漏洞关键点赋值给`ret['huixian']`,其它漏洞同理,如:

ret['huixian'] = f'账号/密码:Admin/zabbix'
ret['ifbug'] = True //确认为漏洞的标志,重要!
ret['url'] = url1 //有漏洞的返回值里必须有url,无漏洞的可以没有,最好还是有-_-

注意:几个`return ret`缺一不可!

四、dnslog的使用

如果需要使用dnslog,脚本里需要引入`import script.DnsLog as dnslog`,这里用的是dnslog.cn

首先请求一个dnslog域名

domain,cookie = dnslog.get_domain()

domain就是dnslog生成的域名,可以直接利用,这里省去利用过程。在利用完成后再去请求dnslog是否接收到返回用如下语句获取是否检测到回显,返回True或False,True表示检测到回显,False表示未检测到回显

dnslog.get_result(domain,cookie)#传入domain和cookie两个参数,参数从get_domain()获取。
//用法示例:
if dnslog.get_result(domain,cookie) == True:
    print('存在漏洞')#具体用法根据poc进行修改

五、获取域名的IP地址

如果需要获取网站IP,可以在脚本内任意poc导入

import script.getIP as getIP
def run():
    ip = getIP.main(url)
    if ip == None:#如果返回None,则代表未获取到IP地址,可以直接返回ret信息了。
        return ret
    #继续检测
    print(ip)

六、POC命名建议

由于脚本利用过程需要用到poc名,因此poc命名需要符合一定规则

  1. 不能存在中划线'-',如有需要用下划线'_'代替
  2. 有漏洞编号的最好带上
  3. 支持中文,能唯一标志漏洞的,或者能被批量检索到的最好都写在poc文件名上,漏洞检索功能就是检索`漏洞名`

七、常用正则匹配及常用函数

1、常用正则匹配

匹配/etc/passwd文件
r'root:.*?:[0-9]*:[0-9]*:'

匹配win.ini文件
r'for 16-bit app support'

匹配linux中id命令的结果,有些设备中执行id命令肯能没有groups,可将groups及后面去掉。
r'uid.*?gid.*?groups.*?'

2、常用函数

def randomLowercase(n):#返回特定长度的随机小写字母
	import random
	import string
	lst = []
	for j in range(n):
		lst.append(random.choice(string.ascii_lowercase))
	lowercase = ''.join(lst)
	return lowercase
def randomInt(n,m):#返回某个范围中的int
	import random
	return random.randint(n,m)
def hashmd5(s):#返回字符串的哈希值
	import hashlib
	md5 = hashlib.md5()
	md5.update(str(s).encode('utf-8'))
	str_md5 = md5.hexdigest()
	return str_md5[0:15]
#hashmd5(123456)
def substr(s,n,m):#返回字符串s的切片截取
	return s[n:m]

def base64Str(n):#对字符串做base64编码
	import base64
	base64str = str(base64.b64encode(n.encode('utf-8'))).lstrip("b'").rstrip("'")
	return base64str
#base64Str('admin')

3、获取匹配到的值

import re
text = '''
"code":1,
"data":ico_afaefoijoaeif.jsp
 '''
res = re.search(r'code.*?data.*?:(?P<filename>.*?).jsp',text,re.S)
print(res.group('filename'))
#输出ico_afaefoijoaeif

八、其他注意点

小飞侠脚本由于是python,语法简单,自由发挥的空间比较多,可根据具体漏洞或自身编程习惯进行编写。
相同类型的漏洞放在一个路径下的好处是可以借鉴参考,有助于快速poc的编写

其他

如有问题或其他功能扩充想法请与小飞侠联系,支持请点个star

联系方式:3484762639#qq.com(所有数字减1并将#替换为@)

posted @ 2024-06-27 09:10  胖胖小飞侠  阅读(51)  评论(0编辑  收藏  举报