柠檬ban软件测试之python高级测试开发学习笔记

发布于:2023-01-04 ⋅ 阅读:(227) ⋅ 点赞:(0)

本项目已开源数组(1174536086)←v是有序的元素序列。用于差异数组的各个元素的数字编号称为下标。若将有限个类型相同的变量的集结命名,那么这个名称为数组名。数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中。组成数组的各个变量称为数组的重量,数组是在程序设计中,为了处理便当, 把具有相同类型的若干元素按有序的办法组织起来的一种办法。也称为数组的元素,有时也称为下标变量。这些有序摆放的同类数据元素的集结叫数组。它是最简单的数据结构之一,大多数现代编程语言都内置数组支持

本项目已开源:快去 Star & Fork 吧!!!

GitHub:https://github.com/jwt1399/Sec-Tools

Gitee:https://gitee.com/jwt1399/Sec-Tools

项目介绍

体系简介

本项目命名为Sec-Tools,是一款依据 Python-Django 的在线多功用 Web 运用浸透测试体系,包括缝隙检测、目录辨认、端口扫描、指纹辨认、域名勘探、旁站勘探、信息走漏检测等功用。本体系经过旁站勘探和域名勘探功用对待检测网站进行财物搜集,经过端口扫描、指纹辨认、目录辨认和信息走漏检测功用对待检测网站进行信息搜集,经过搜集的信息剖析评估网站存在哪些安全隐患,然后运用缝隙检测功用揭示网站存在的缝隙以及损害等级并给出修正主张。经过这一系列的过程,能够对Web运用进行全面检测,然后发现网站存在的安全隐患,因而用户能够针对相应的网络要挟做出应急呼应,然后提高站点的安全性。

相关技能

称号 版别
Python 3.7.0
Django 3.1.4
SQLite 3.35.2
ECharts 5.0.1
Tabler 1.0.0-beta2
SimpleUI 2021.1.1
Docsify 4.11.6
Layer 3.2.0
Boostrap Table 1.18.2

项目功用

项目主页

主页选用 ECharts 对缝隙扫描的缝隙等级、指纹辨认组件、安全导航数据做了可视化图表展现,图表的风格没有共同,凑合看吧😂

身份验证

新用户想要运用体系功用必需求注册登录,游客只能拜访部分页面。本体系有普通用户和超级用户。普通用户能够运用本体系的一切功用,可是不能登录后台办理体系。超级用户不只能够运用所用功用还能够登录后台办理体系中一切的用户权限和数据。

规划思路:登录和注册模块在 Django 自带的认证模块的基础上进行完成,因而在后台-->用户与授权就可对注册用户进行权限分配和相应办理。咱们运用 Django 自带的数据库 SQLite 来存放账户信息,重构了数据库表auth_user表,增加了用户邮箱字段,auth_user 中暗码字段是加了 salt 的 sha256 值再经过 base64 编码之后的值,保障了用户的信息安全。

[图片上传失利...(image-100e46-1636383910442)]

登录页 [图片上传失利...(image-676a14-1636383910442)]
注册页 [图片上传失利...(image-ed7783-1636383910442)]

重设暗码功用调用第三方包django-password-reset进行完成

过程一 [图片上传失利...(image-1ced47-1636383910442)]
过程二 [图片上传失利...(image-70e9df-1636383910442)]

缝隙检测

该模块首要是对方针Web体系进行安全缝隙扫描,包括SQL注入、跨站脚本进犯(XSS)、弱暗码、中间件缝隙。中间件缝隙扫描包括对Weblogic、Struts2、Tomcat 、Jboss、Drupal、Nexus的已知缝隙进行检测,用户供给方针URL并挑选CVE缝隙编号。

规划思路

该模块的全扫描、SQL注入缝隙扫描、XSS缝隙扫描、弱口令扫描、仅爬取是调用 AWVS API 进行完成。中间件缝隙扫描是依据脚本模拟网络恳求完成。依据缝隙形成的原因,生成一些测试 payload 发送到方针体系,再由回来的状况码和数据来判别payload是否有用。

完成作用

[图片上传失利...(image-f2e56f-1636383910442)]

点击扫描方针跳转到缝隙成果页:

[图片上传失利...(image-21473f-1636383910442)]

再点击扫描方针的跳转到缝隙概况页:

[图片上传失利...(image-120af9-1636383910442)]

详细完成

增加扫描方针

缝隙扫描最开端的工作是增加扫描方针到 AWVS 的扫描行列中。AWVS 供给了一个 API 接口:/api/v1/targets,运用 POST 恳求, POST 恳求参数为:{"address":"XXXX.XXXX.XXXX","description":"xxxx","criticality":"10"}。

当方针增加成功后会回来一个 target_id ,这个值在一切扫描中是仅有的。经过 target_id 判别方针是否增加成功。增加完方针后并没有开端扫描,需求运用另一个 API 接口:/api/v1/scans,运用 POST 恳求,传入刚刚增加方针生成的 target_id 和用户挑选的扫描类型,POST 恳求参数为:{"target_id":"xxxxxxx","profile_id":"xxxxxxx"}。开端扫描将会回来状况码200。

运用 Python 的第三方库 requests 来完成 API 接口拜访。中心代码如下:

#Target: POST恳求/api/v1/targets try: #data包括方针URL和类型,auth_headers包括API_KEY response = requests.post(targets_api, auth_headers, data, False) result = response.json() target_id = result.get('target_id') return target_id except Exception: return None #Scan: POST恳求/api/v1/scans try: response = requests.post(scan_api, data, auth_headers, False) status_code = 200 except Exception: status_code = 404 return status_code 

API 接口现已完成,还需求获取用户输入的数据。由于本体系是依据 Django 完成的,所以运用 HTML+JavaScript 供给用户界面和接受和发送数据到后端,后端运用 Python 完成。首要在 urls.py 里边加入增加拜访途径

path('vuln_scan', views.vuln_scan, name='vuln_scan')

在 views.py 中界说vuln_scan()函数接纳前端的用户输入,并调用现已写好的 API 函数。用户输入的 url 为扫描的方针,扫描类型包括SQL注入、XSS缝隙、弱口令和全扫描,其间全扫描便是扫描一切类型的缝隙,假如增加成功后回来的 target_id 不是 None,阐明增加成功,就能够开端调用开端扫描的 API,开端扫描后回来状况码,为200则开端扫描,回来成功不然回来失利。中心代码如下:

@csrf_exempt def vuln_scan(request): #经过POST恳求获取用户输入的URL和扫描类型 url = request.POST.get('ip') scan_type = request.POST.get('scan_type') t = Target(API_URL, API_KEY) #将方针URL增加到扫描行列中 target_id = t.add(url) #假如target_id不为None,则开端扫描 if target_id is not None: s = Scan(API_URL, API_KEY) status_code = s.add(target_id, scan_type) if status_code == 200: return success() return error() 

最终运用 JavaScript 来完成发送用户输入的数据,挑选经过 POST 办法发送数据,并在发送之前判别用户输入的合法性,中心代码如下:

function get_scan_info(ip , scan_type) { #运用POST恳求发送用户输入
        $.post('/vuln_scan', { ip: ip , scan_type: scan_type }, function (data) { if (data.code !== 200) { ...... } else { ...... } ......}); } var domain = $('input[name=scan_url]').val(); #运用循环判别用户挑选的扫描类型 for(var i=0; i<document.getElementsByName("scan_type").length; i++) { if (document.getElementsByName("scan_type")[i].checked) { var scan_type=document.getElementsByName("scan_type")[i].value; } } if(domain){ get_scan_info(domain,scan_type) }else{ ...... } 

整体来说,经过上述的代码完成,完成了将用户输入经过 JavaScript 传输给后台,后台接纳数据后将调用 AWVS API,然后 AWVS 开端依据用户输入开端扫描方针 URL,扫描完毕后将成果保存在数据库中。完成作用如下:

[图片上传失利...(image-dcd297-1636383910442)]

获取扫描成果

在上一小节中,将方针扫描的成果保存到数据库中,咱们需求得到一切的扫描方针,‘/api/v1/scans‘,恳求办法为 GET,恳求成功后会回来一切扫描方针的信息,利用这个 API 能够完成展现一切扫描方针。要完成展现每个扫描方针的一切缝隙的功用,需求按照 target_id 来在一切扫描方针中查找。AWVS 也供给了相应的 API,咱们需求用到的 API 为:/api/v1/vulnerabilities

?q=severity:{int};criticality:{int};status:{string};cvss_score:{logicexpression};cvss_score:{logicexpression};target_id:{target_id};group_id:{group_id}。恳求办法为 GET。利用 target_id 查找每个扫描方针。这也解决了缝隙细节页面的 URL 问题。当运用 target_id 查找扫描方针成功时将会回来这个方针的所搜缝隙信息,包括这个方针包括的缝隙个数、每个缝隙的风险等级、扫描时刻、扫描类型、扫描状况等信息。

详细完成过程和增加扫描方针大体相似,首要第一步运用 requests 来完成 API 恳求。中心代码如下:

#获取一切扫描方针 response=requests.get(scan_api, self.auth_headers, False) scan_response=response.json().get('scans') for scan in scan_response: scan['request_url'] = request_url
   scan_list.append(scan) return scan_list #查找状况为“open“,对应target_id的扫描方针 vuln_search_api=f'{vuln_api}?q=status:{status};target_id:{target_id}' try: #运用get办法恳求 response = requests.get(vuln_search_api, auth_headers, False) #回来查找成果方针的一切缝隙信息 return response.text except Exception: return None 

在 urls.py 中加入用户拜访的 url ,这个需求供给一个 target_id 方便后续功用的完成,先获取一切方针的target_id,然后运用循环将一切 target_id 加入到 urlpatterns 列表中。由于在 Django 中 views 函数一般只能运用一个 request 参数,由于这儿需求将 target_id 传入到 views 函数中,运用正则匹配的“(?P.*)$”接纳传入的 target_id,在 views 里对应函数的第二个形参名必须和<>里的值共同才有用。中心代码如下:

path('vulnscan', views.vulnscan, name="vulnscan"), for target_id in target_ids: #运用正则匹配获取第二个参数:taget_id urlpatterns.append(url(r'^vuln_result/(?P.*)$', views.vuln_result, name='vuln_result/'+target_id)) 

在 views.py 里界说函数vulnscan(request)获取一切对应的方针缝隙信息。运用 API 得到回来的缝隙风险等级、扫描方针URL、每个缝隙仅有标识的 vuln_id、扫描类型、扫描处理时刻,API 回来的扫描处理时刻不是规范的时刻格局,运用正则匹配的办法,将其转换为“%Y-%m-%d %H:%M:%S“的格局,再界说函数vuln_result(request,target_id),依据 target_id 获取扫描方针中一切缝隙信息,包括存在缝隙的URL、缝隙类型、状况和处理时刻等信息。中心代码如下:

@login_required def vuln_result(request, target_id): d = Vuln(API_URL, API_KEY) data = [] vuln_details = json.loads(d.search(None,None, "open", target_id=str(target_id))) id = 1 for target in vuln_details['vulnerabilities']: item={ 'id': id, 'severity': target['severity'], 'target': target['affects_url'], 'vuln_id':target['vuln_id'], 'vuln_name': target['vt_name'], 'time': re.sub(r'T|\..*$', " ", target['last_seen']) } id += 1 data.append(item) return render(request,'vuln-reslut.html',{'data': data}) 

在这个子功用中,前端的数据展现运用的是 Bootstrap Table。这个模板有许多实用的功用,比方表格的查找功用、分页展现功用等等,增加了用户体会。表格的数据在 HTML 中运用双花括号来接纳,在 views.py 函数中回来的到相应的 HTML 页面时,将 data 字典一同回来。这样的回来办法能够将运用字典中的 key 值获取对应的 values 值。还能够是运用 if-else、for 等句子来分类展现数据。中心代码如下:

{% for item in data %}
……………
# 这个只展现了扫描方针列,其他列相似  {{ item.target }} ……………
{% endfor %} 

最终完成的作用如下图所示,依据每个扫描状况不同有不同的显现,运用红黄蓝绿来分类高危、中危、低危、info等级的缝隙。最终展现了扫描的处理时刻。

[图片上传失利...(image-978c12-1636383910442)]

表格中扫描方针列能够点击进入查看方针的一切缝隙信息,如下图所示,展现了特定的扫描方针每个缝隙的风险等级、存在缝隙的URL、缝隙的类型。
[图片上传失利...(image-71ed88-1636383910442)]

获取缝隙细节

在完成缝隙扫描和成果展现后,还需求获取每个缝隙的细节。包括导致缝隙的恳求参数、测试的 payload、数据恳求包、简要的修正主张等等。由于每个缝隙也存在一个仅有的标识 vuln_id,能够依据这个值查询指定缝隙的一切信息。运用的 API 为:/api/v1/vulnerabilities/{vuln_id},恳求办法为 GET。

同样地,首要运用 requests 来完成 API 的调用,传入 vuln_id 来查询指定缝隙的一切信息,代码如下:

#获取指定缝隙的相关信息 def get(self, vuln_id): vuln_get_api = f'{self.vuln_api}/{vuln_id}' try: #运用GET恳求将vuln_id传给API,成果以json格局回来 response = requests.get(vuln_get_api, auth_headers, False) return response.json() except Exception: return None 

在 urls.py 中增加缝隙细节的 url,这儿与上一节展现扫描方针的一切缝隙相似,都用正则匹配的办法接纳 views.py里函数的第二个形参,可是这儿不在运用 target_id 而是运用 vuln_id。代码如下:

for vuln_id in vuln_ids: urlpatterns.append(url(r'^vuln_detail/(?P.*)$', views.vuln_detail, name='vuln_detail/' + vuln_id)) 

在 views.py 里边界说vuln_details(request,vuln_id)函数,依据 vuln_id 查询指定缝隙的相关信息。该函数将 API 回来的值中有用的信息提取出来到字典 data 里,回来给 vuln-details.html 页面,运用 双花括号 来接纳该缝隙的受影响的URL、处理时刻、缝隙类型、缝隙测试参数、数据恳求包、简要的修正主张等信息。完成作用如下图所示。

@login_required def vuln_detail(request,vuln_id): d = Vuln(API_URL,API_KEY) data = d.get(vuln_id) print(data) parameter_list = BeautifulSoup(data['details'], features="html.parser").findAll('span') request_list = BeautifulSoup(data['details'], features="html.parser").findAll('li') data_dict = { 'affects_url': data['affects_url'], 'last_seen': re.sub(r'T|\..*$', " ", data['last_seen']), 'vt_name': data['vt_name'], 'details': data['details'].replace("  ",'').replace('

',''), 'request': data['request'], 'recommendation': data['recommendation'].replace('
','\n') } try: data_dict['parameter_name'] = parameter_list[0].contents[0] data_dict['parameter_data'] = parameter_list[1].contents[0] except: pass num = 1 try: Str = '' for i in range(len(request_list)): Str += str(request_list[i].contents[0])+str(request_list[i].contents[1]).replace('', '').replace('', '')+'\n' num += 1 except: pass data_dict['Tests_performed'] = Str data_dict['num'] = num data_dict['details'] = data_dict['details'].replace('class="bb-dark"','style="color: #ff0000"') return render(request, "vuln-detail.html", {'data': data_dict})

[图片上传失利...(image-6f7311-1636383910442)]

依据POC验证的中间件缝隙扫描

本体系运用POC脚本完成对一些中间件的缝隙扫描[7],包括Weblogic、Tomcat、Drupal、JBoss、Nexus、Struts2等等。经过每个缝隙的特色,运用Python编写不同的POC脚本验证方针是否存在该缝隙。

首要这儿的用户界面和依据AWVS的缝隙扫描共用,单独加入了中间件缝隙CVE编号的挑选。运用JavaScript发送用户输入的数据到后端。中心代码如下:

#运用POST恳求提交用户的输入 function get_Middleware_scan(ip , CVE_id) { $.post('/Middleware_scan', { ip: ip , #方针URL CVE_id: CVE_id  #挑选的CVE编号 }, function (data) { #处理回来成果
      ………
      ………}); } 

将方针增加到数据库后,再查询数据库开端扫描,经过 ajax 来拜访 start_Middleware_scan 调用开端扫描的函数,由于扫描时刻或许会很长,需求设置满足的 timeout 来等待扫描的成果回来。中心代码如下:

$.ajax({ #运用POST恳求发送方针URL和CVE编号,设置超时为1秒
    type: "POST", url: '/start_Middleware_scan', timeout: 10000, data: { ip: ip, CVE_id: CVE_id } }); 

在 urls.py 里加入中间件缝隙扫描的拜访途径,需求加入两个途径:’Middleware_scan‘,‘start_Middleware_scan’。前者是用户增加扫描方针时的途径,用于接纳用户输入的方针和CVE编号之后将其刺进数据库。后者是将方针刺进数据库之后,经过时刻戳、状况、方针 URL 以及 CVE 编号查询出来开端扫描。当扫描完毕时更新数据库中对应扫描方针的状况。这样的规划能够实时的看到扫描的状况。

数据库运用的是 Sqlite,在 models.py 里创立一个数据库表 Middleware_vuln ,字段包括ID、方针URL、状况、成果、CVE编号、时刻戳。在 Django 里界说这个类表明咱们需求创立的数据库,在 modles.py 里创立好之后,运用指令python manage.py makemigrations来记载 modles.py 的一切改动,并且将这个改动迁移到 migrations 这个文件下生成一个文件例如:0001文件,假如你接下来还要进行改动的话或许生成便是别的一个文件不一定都是0001文件,可是这个指令并没有作用到数据库,再运用指令python manage.py migrate将依据刚刚检测到的改动来创立数据库表和字段特点。中心代码如下:

class Middleware_vuln(models.Model): #类名为数据库表名,变量名为字段名,字段特点界说如下 id = models.AutoField(primary_key=True) url = models.CharField(max_length=100, null=True) status = models.CharField(max_length=20, null=True) result = models.CharField(max_length=100, null=True) CVE_id = models.CharField(max_length=100, null=True) time = models.CharField(max_length=100, null=True, unique=True) 

在增加方针和开端检测的时候咱们需求刺进数据库和查询数据库,这儿运用 Django 的函数来处理数据库的增删查改。对于 Middleware_vule 的刺进运用Middleware_vuln.objects.create(url, status, result, CVE_id, time),更新运用Middleware_vuln.objects.filter(time).update(status, result)。还需求运用 try-except 来处理反常情况并打印犯错信息。

def insert_Middleware_data(url, CVE_id, Time, result=None, status="runing"): try: Middleware_vuln.objects.create(url=url, status=status, result=result, CVE_id=CVE_id, time=Time) print("insert success") return True except: print("data insert error") return False def update_Middleware_data(url, CVE_id, Time, result): try: Middleware_vuln.objects.filter(url=url, status='runing', CVE_id=CVE_id, time=Time).update(status="completed", result=result) print("update success") except: print("data updata error") 

views.py里界说Middleware_scan()获取用户输入,并刺进到数据库中,其间时刻戳 Time 为全局变量,作为后面开端扫描部分查询数据库的条件,在刺进数据成功就回来 success(),否侧回来 error(),这儿回来的函数时回来的状况码,success()回来的是200,error()回来404,经过上面 JavaScrip t接纳后做出判别,并弹出相应的提示框,中心代码如下:

Time = 0.0 @csrf_exempt
@login_required def Middleware_scan(request): #运用POST恳求获取用户输入,并将其刺进数据库中。 #Time作为全局变量刺进到数据库中,作为查询方针信息的条件。 global Time try: url= request.POST.get('ip') CVE_id = request.POST.get('CVE_id').replace('-',"_") Time = time.time() # time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(t))时刻戳转日期格局 if insert_Middleware_data(url, CVE_id, Time): return success() except: return error() 

又界说函数start_Middleware_scan(),完成将数据库中时刻戳为 Time,状况为 run 的方针查询出来,依据 CVE编号调用对应的 POC 脚本。最终更新数据库的扫描成果和扫描状况,由于在上一步中将数据刺进数据库中或许会花费一点时刻,所以需求运用 sleep() 等待数据刺进后再进行查询工作和扫描工作,确保不遗漏扫描方针。

@csrf_exempt @login_required def start_Middleware_scan(request): try: url = request.POST.get('ip') ip, port = urlparse(url).netloc.split(':') CVE_id = request.POST.get('CVE_id').replace('-', "_") time.sleep(5) #等待数据刺进成功后在查询出来扫描 msg = Middleware_vuln.objects.filter(url=url, status='runing', CVE_id=CVE_id, time=Time) print(msg) #扫描条目或许不止一条,需求运用循环来扫描 for target in msg: result = POC_Check(target.url, target.CVE_id) #将扫描成果和状况更新 update_Middleware_data(target.url, target.CVE_id, Time, result) return success() except: return error() 

端口扫描

本体系端口扫描当用户指定了方针IP地址后,体系正式工作,IP传入后台对方针进行扫描,扫描完成后将敞开端口和对应服务显现到前端界面上。在“按端口分布区分”和“按协议类型区分”两个栏目中对端口区分进行解说,运用户免于查询的繁琐。同时该模块还将内置常见端口查询表,在此可进行端口及其对应服务和功用的相关查询和挑选,经过这一系列功用用户能够愈加明晰的认识到方针主机敞开了哪些服务,以此来剖析或许存在缝隙的服务。

规划思路

本体系端口扫描的完成办法是利用Python供给的库函数Socket进行调用,经过TCP三次握手与方针计算机的端口树立衔接。当完成一次完好的三次握手时,则能够推断出端口和对应服务是敞开的,反之则没有敞开,为了提高了扫描的功率,本体系引进多线程扫描机制。

完成作用

[图片上传失利...(image-594aa8-1636383910442)]

详细完成

端口扫描

经过 Python 直接界说 socket,尝试与方针端口进行衔接。本程序中运用sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM);的办法进行 TCP 衔接,调用sock.connect_ex((ip,port)),来尝试衔接端口,假如端口敞开则回来0,不然回来错误代码。运用try句子来捕获反常,假如 socket 衔接超时,则回来反常处理信息。中心代码如下:

def socket_scan(self, hosts): '''端口扫描中心代码''' global PROBE
    socket.setdefaulttimeout(1) ip, port = hosts.split(':') try: if len(self.port) < 25: # 创立套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP/IP三次握手树立衔接 result = sock.connect_ex((ip, int(port))) # 调用socket.connect_ex((ip, port)),端口敞开回来0,不然回来错误代码 # 完成和nmap的全衔接扫描相似的功用。 if result == 0: # 成功树立TCP链接 self.port.append(port) # 成果集中增加端口 for i in PROBE: # 经过HTTP1.1探听 sock.sendall(i.encode()) # 发送完好的TCP数据包 response = sock.recv(256) # 接受最大256byte sock.close() if response: break if response: for pattern in SIGNS: pattern = pattern.split(b'|') if re.search(pattern[-1],response, re.IGNORECASE): # 正则匹配banner信息与字典中的服务 proto = '{}:{}'.format(pattern[1].decode(), port) self.out.append(proto) # 增加至输出成果 break else: self.num = 1 except (socket.timeout, ConnectionResetError): # 反常处理 pass except: pass 

假如这样单线程(串行)堵塞运行,会耗费大量时刻,因而,经过并发的办法,并发恳求,提高扫描速度,经过比照扫描300个端口单线程需求30s左右,多线程仅需10s左右。

本端口扫描功用中选用了并发64条线程来进行扫描,因而,在界说run办法时,每个线程扫描的两个端口号间差数为64,在程序中运用 concurrent.futures 来完成。concurrent.futures 模块供给了一个高水平的接口用于异步执行调用。异步执行能够运用线程完成,运用 ThreadPoolExecutor,或许独立的进程,运用 ProcessPoolExecutor 完成。两者都完成相同接口,都是由笼统 Executor 类界说的。

THREADNUM = 64 # 线程数 def run(self, ip): #多线程扫描 hosts = [] global PORTS, THREADNUM for i in PORTS: hosts.append('{}:{}'.format(ip, i)) try: with concurrent.futures.ThreadPoolExecutor( max_workers=THREADNUM) as executor: executor.map(self.socket_scan, hosts) except EOFError: pass 

端口查询表

端口查询表功用经过搜集网上端口信息树立端口查询库,涉及到的端口数据是存储在数据库中,包括端口ID、端口号、端口对应服务、端口对应协议和端口所属状况。端口查询表结构如下表所示。

字段名 字段类型 允许空 是否主键 补白
id integer Not null True 端口ID
num bigint Not null False 端口号
service text Not null False 端口对应服务
protocol Varchar(20) Not null False 端口对应协议
status Varchar(10) Not null False 端口所属状况

端口查询数据库选用Django Model进行树立,字段包括端口号、服务、协议、和状况。完成代码如下:

class PortList(models.Model): '''端口查询表''' num=models.BigIntegerField(verbose_name='端口号') service=models.TextField(max_length=100,verbose_name='服务') protocol=models.CharField(max_length=20,verbose_name='
协议',blank=True,default='未知') status=models.CharField(max_length=10,verbose_name='
状况',blank=True,default='未知') class Meta: # 后台表头设置 verbose_name=verbose_name_plural='端口列表' 

数据库树立后需求进行后台注册,这样能够进入后台对数据进行办理,完成代码如下:

@admin.register(PortList) class PortListAdmin(ImportExportModelAdmin): # 设置哪些字段显现在后台 list_display = ('num', 'service', 'protocol', 'status',) # 设置num字段进入修正界面  list_display_links = ('num',) search_fields = ('num', 'service',) # 过滤器,按字段进行挑选 list_filter = ('protocol','status') # 设置num为默认排序字段 ordering = ('num', ) list_per_page = 15 #设置每页显现数据条数 

指纹辨认

该模块选用提取指纹特征码特征信息来辨认Web指纹,体系经过结构大量特别的HTTP恳求与Web服务器交互,从其呼应数据包信息中提取提取指纹特征信息,然后经过与指纹数据库进行比对,然后获取到Web服务器及运用的组件信息和版别信息。经过发现这些特征信息并对它进行辨认能够帮助咱们快速地制定浸透战略,是浸透环节中要害的一步。

规划思路

国内外对Web服务器及运用指纹的研究,首要都是经过结构大量特别的HTTP恳求与Web服务器交互,从其呼应数据包信息中提取提取指纹特征信息,然后经过与指纹数据库进行比对,然后获取到Web服务器及运用的组件信息和版别信息。本文选用依据要害字特征匹配的办法完成指纹辨认功用,为了使检测成果愈加准确,比照网上一些主流的指纹数据库,对本体系的数据库进行了一系列优化。

完成作用

[图片上传失利...(image-360594-1636383910442)]

详细完成

指纹辨认流程中最要害的便是提取指纹特征这一过程。提取指纹特征首要需求确认应该提取呼应数据报文中的哪些数据。因而需求规划特征提取算法对呼应数据报文进行剖析,呼应数据包是由呼应行、呼应头、呼应体三部分构成。呼应行由HTTP版别、状况码、状况码描述构成。呼应头用于指示客户端如何处理呼应体,呼应头里边包括许多的组件信息,用于告知浏览器呼应的类型、字符编码服务器类型和字节巨细等信息。呼应体则是服务器依据客户端的恳求回来给客户端的详细数据。呼应头和呼应体中包括了能够辨认Web指纹组件的字段内容,因而,对呼应头和呼应体中要害字段的提取,是完成指纹辨认技能的中心。

指纹辨认技能分为信息搜集阶段和Web指纹辨认阶段。

(I)信息搜集阶段:经过用户输入的URL,搜集Web运用的特定字段信息,回来页面要害字或许特别文件和途径等这些特征。搜集的要害数据越多对接下来的指纹辨认成果越准确。

(2)Web指纹辨认阶段:该阶段包括两部分,一部分是指纹库的树立,该部分首要负责从已知的Web运用程序中搜集特征信息,并且树立指纹特征库;本文经过剖析HTTP呼应数据报文,规划了网站指纹的提取规矩,经过剖析呼应头字段和呼应体内容构建了一个指纹组件信息库,信息库选用JSON格局进行存储。指纹信息是从Wappalyzer和FOFA等渠道上进行搜集概括的。另一部分从待测的Web运用程序中搜集特征信息,并与指纹特征库中的数据进行比较,然后辨认出待测的web运用程序。

目录扫描

目录辨认参照dirsearch完成,包括php、asp、jsp等网站类型进行扫描,还设置了递归扫描和自界说扫描选项。支持自界说前后缀或许子目录。

规划思路

Dirsearch 扫描的成果经过 JSON的格局保存在对应的途径下,因而咱们能够减轻对数据库的依赖。获取的数据被分成 URL 和 TIMR,URL下又分为 content-length、path、redirect、starus四个部分。由于在 JSON 格局中被不同类型括号的数据会被 Django 解析为列表、字典等格局,因而咱们需求对获得的 JSON 数据进行处理,将其转换为 Django 能够辨认的数据,使之在前端进行读取。

要正确解析数据,需求先理解 Python 数据结构和 JSON 数据的转换办法。咱们依据当时的固定的 JSON 格局去解析获得的数据。

完成作用

[图片上传失利...(image-12bb38-1636383910442)]

[图片上传失利...(image-53a734-1636383910442)]

信息走漏

该模块首要为用户供给常见的信息走漏检查。在前端直观的展现后台地址、装备文件等或许存在走漏的信息,在成果列表中,用户能够十分明晰的知道某个Web服务存在的信息走漏问题。

[图片上传失利...(image-64c550-1636383910442)]

旁站勘探

该模块首要对经过 IP 地址,直接获取与当时 IP 地点服务器上的其它网站, 本模块直接调用 api 完成

[图片上传失利...(image-419b60-1636383910442)]

域名勘探

该模块首要经过调用 api 来扫描网站的子域名

[图片上传失利...(image-938d6b-1636383910443)]

安全导航

安全导航页面的灵感来自于Viggo大佬开发的Webstack项目,该项目是依据Bootstrap开发的纯前端页面,因而前端我沿用了Webstack的风格并交融了Tabler UI风格,并用Django写了后台办理,可在线对分类和条目进行办理。

前端页面

[图片上传失利...(image-89ad32-1636383910443)]

后台办理页面

[图片上传失利...(image-e10e11-1636383910443)]

数据库规划

[图片上传失利...(image-7cee4a-1636383910443)]

导航条目-Item

标题title 描述desc 网址url 分类category(外键) 图片img 图片宽度img_width

class Item(models.Model): '''导航条目''' title = models.CharField(max_length=50,verbose_name='称号') desc = models.TextField(max_length=100,verbose_name='描述') url = models.URLField(verbose_name='网址',blank=True) img = models.URLField(default='https://jwt1399.top/favicon.png',verbose_name='logo') img_width = models.IntegerField(default=45, verbose_name='图片宽度') category = models.ForeignKey(Category, blank=True, null=True, verbose_name='分类', on_delete=models.CASCADE) class Meta: verbose_name=verbose_name_plural='导航条目' #后台条目图片预览 def img_admin(self): return format_html( '',self.img,) img_admin.short_description = 'logo预览' def __str__(self): return self.title 

条目分类-Category

称号name 排序 sort 是否增加到导航栏add_menu 图标icon

class Category(models.Model): """条目分类""" name = models.CharField(max_length=20, verbose_name='称号') sort = models.IntegerField(default=1, verbose_name='显现次序') add_menu = models.BooleanField(default=True, verbose_name='增加到导航栏') icon = models.CharField(max_length=30, default='fas fa-home',verbose_name='图标') class Meta: verbose_name_plural=verbose_name = '分类' #统计分类对应条目数,并放入后台 def get_items(self): return len(self.item_set.all()) get_items.short_description = '条目数' # 设置后台显现表头 #后台图标预览 def icon_data(self):#引进Font Awesome Free 5.11.1 return format_html('

',self.icon) #转化为 icon_data.short_description = '图标预览' def __str__(self): return self.name

文档页

将 Docsify 直接嵌入了 Django 中结构了文档页。

[图片上传失利...(image-962fc8-1636383910443)]

兼容性

Phone端

Pad端

竖屏 横屏
[图片上传失利...(image-cc8da8-1636383910443)] [图片上传失利...(image-d09548-1636383910443)]

版别改变记载

v2.7(2021-04-18)

  • 新增域名勘探功用;
  • 新增中间件缝隙扫描;
  • 修正忘掉暗码功用;
  • 优化AWVS未启动报错信息;
  • 优化用户登录逻辑;
  • 优化漏扫概况页UI;
  • 优化导航栏布局;
  • 优化若干小细节;

v2.6(2021-03-31)

  • 新增缝隙扫描概况功用;
  • 新增主页仪表盘;
  • 安全导航页导航栏移动端优化;
  • 安全导航页目录栏缩放优化;
  • 注册&登录界面优化;
  • 文档页导航栏优化;
  • 新增UI夜间形式;
  • 修正若干UI显现Bug;

v2.5(2021-03-02)

  • 新增了缝隙扫描功用;
  • 端口扫描页新增常见端口查询表;
  • 信息走漏页新增常见信息走漏列表;
  • 指纹辨认页新增数据剖析图表;
  • 缝隙扫描页界面优化;

v2.4(2021-02-22)

  • 新增了目录辨认功用;
  • 重写欢迎页;
  • 安全导航页移动端界面适配;
  • 安全导航页UI优化;
  • 目录辨认页界面优化;
  • 指纹辨认页新增常见指纹显现与查找;
  • 引进Boostrap Table完成分页;
  • 淘汰LayUI改用Layer进行弹窗;
  • 文档页增加导航栏;

v2.3(2021-02-08)

  • 全新的页面布局;
  • UI适配移动端;
  • 优化导航页布局;
  • 优化一系列UI显现问题;
    • 优化了手机端页脚显现
    • 优化了平板端导航条显现
    • 页面底部增加回到顶部按钮
    • 按钮触发跳转页面相对方位
    • 回车键触发查询按钮
    • 优化导航页页脚显现

v2.2 (2021-02-03)

  • 新增了信息走漏勘探功用;
  • 新增了旁站勘探功用;
  • 新增了导航页数据剖析功用;
  • 新增了依据Docsify的文档页;
  • 重构了静态文件static文件结构
  • 优化了项目文件结构;
  • 美化了注册页面;
  • 引进了动态粒子背景作用;
  • 修正了一些UI显现问题;

v2.1 (2021-01-13)

  • 新增了指纹辨认功用;
  • 新增了登录和注册功用功用;
  • 新增了欢迎页;
  • 新增了文档页;
  • 修正了一些UI显现问题;

v2.0(2021-01-04)

  • 新增了端口扫描功用;
  • 新增了安全导航功用;
  • 连入了SQLite数据库,后续考虑改为MySQL;
  • 修正了一些UI显现问题;
  • 修正了后台头部小图标无法显现问题;
  • 新增了后台数据导入导出功用;

v1.0(2020-12-20)

  • 依据Tabler结构结构了前端页面;
  • 选用依据Python的 Django 结构编写后端;
  • 引进了SimpleUi美化 Django 后台结构;
  • 引进了Font-Awsome 5.15.1图标;

项目布置

本地布置

1.运用 Pycharm 打开本项目,在 Pycharm 的setting--->Project Interpreter中 add 一个新的虚拟环境。

2.在该虚拟环下打开 Pycharm 自带 Terminal 运行pip install -r requirements.txt下载项目所需的第三方包。

3.现在项目现已能够正常运行了,可是想要运用缝隙扫描功用,需求安装AWVS,并在项目的setting.py中装备 AWVS的API URL和API KEY

4.忘掉暗码功用相关装备在项目的setting.py中修正

EMAIL_HOST = 'smtp.163.com' EMAIL_PORT = 25 # 发件箱的smtp服务器端口 EMAIL_HOST_USER = 'xxx' # 你的邮箱账号 EMAIL_HOST_PASSWORD ="xxx" # 邮箱授权码 EMAIL_USE_TLS = True # 这儿必须是 True,不然发送不成功 EMAIL_FROM = 'xxx' # 你的邮箱账号 DEFAULT_FROM_EMAIL = 'xxx' # 你的邮箱账号 

5.创立超级办理员python manage.py createsuperuser

服务器布置

请参阅:运用浮屠面板快速布置Django项目

TO DO

不论是开发还是安全感觉都有很长的路要走,路漫漫其修远兮,吾将上下而求索,共勉 !

  • 安全东西页
  • 安全图书页
  • 引进MySQL数据库
  • 扫描算法优化
  • 代码变量、数据库结构优化
  • 缝隙陈述导出功用
  • 页面异步刷新


作者:简言之_
链接:https://www.jianshu.com/p/e6a4582b0c04
来源:简书
著作权归作者一切。商业转载请联络作者获得授权,非商业转载请注明出处。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到