文章还没发几天就爆出这个你还敢用Github上的PoC么?

前言

最近在@洛米唯熊公众号中看到一篇对Github新CVE的监控并推送到微信的文章,其结合Github的API获取CVE的相关数据,并通过itchat库推送到微信。但是使用这个库登录的微信时,是不能再在PC端登录微信的,否则会被挤下线。虽然可以使用小号微信来运行脚本,但是感觉还是不方便,因为偶尔小号也可能会需要登录PC端。因此对这部分代码进行了改写,使用Server酱来进行消息的推送。

数据获取

  • 这里进行了一点改动,将获取到的数据通过JSON库转换成字典类型返回,便于后续匹配。并通过CVE-{当前年份}来获取今年的CVE,这样就不用每年都改了(如果这个脚本能跑上几年...
import json
import requests

def getNews():
    year = time.strftime("%Y", time.localtime(time.time()))
    try:
       api = f"https://api.github.com/search/repositories?q=CVE-{year}&sort=updated"
       response = requests.get(api).text
       data = json.loads(response)
       return data
    except Exception as e:
       print(e, "Github链接不通")

if __name__ == '__main__':
    data = getNews()

数据解析

from operator import itemgetter

def parseData(index):
    item = items[index]
    cve_name = item['name']
    cve_url = item['svn_url']
    cve_des = item['description']
    if not cve_des:  # 描述为空时会返回None
        cve_des = "Null"
    content = f"{cve_name}: {cve_url}, Des: {cve_des}"
    return content

if __name__ == '__main__':
    total = 0  # 初始化为0
    data = getNews()
    if total != data['total_count']:
        total = data['total_count']
        items = sorted(data['items'], key=itemgetter('id'), reverse=True)  # 根据items中的id进行排序
        content = parseData(0)  # 返回最新的1条

推送信息

  • 使用Server酱很轻松就可以实现消息的推送
def sendMsg(content):
    send_url = f"https://sc.ftqq.com/{SCKEY}.send"
    data = {
        "text": "CVE监控提醒",
        "desp": content
    }
    r = requests.post(send_url, data=data)

if __name__ == '__main__':
    SCKEY = "Your_SCKEY"
    total = 0  # 初始化
    data = getDic()
    if total != data['total_count']:
        total = data['total_count']
        items = sorted(data['items'], key=itemgetter('id'), reverse=True)  # 根据items中的id进行排序
        content = parseData(0)  # 返回最新的1条
        sendMsg(content)

推送效果

Github_CVE_Wechat-1

Github_CVE_Wechat-2

完整代码

  • 最后引入time()函数,每隔一段时间运行一次即可
# -*- coding:utf-8 -*-
"""
@Author: Naraku
@File: Github_CVE_Wechat.py
"""
import time
import json
import requests
from operator import itemgetter


def getNews():
    year = time.strftime("%Y", time.localtime(time.time()))
    try:
       api = f"https://api.github.com/search/repositories?q=CVE-{year}&sort=updated"
       response = requests.get(api).text
       data = json.loads(response)
       return data
    except Exception as e:
       print(e, "Github链接不通")


def parseData(index):
    item = items[index]
    cve_name = item['name']
    cve_url = item['svn_url']
    cve_des = item['description']
    if not cve_des:  # 描述为空时会返回None
        cve_des = "Null"
    content = f"{cve_name}: {cve_url}, Des: {cve_des}"
    return content


def sendMsg(content):
    send_url = f"https://sc.ftqq.com/{SCKEY}.send"
    data = {
        "text": "CVE监控提醒",
        "desp": content
    }
    r = requests.post(send_url, data=data)


if __name__ == '__main__':
    SCKEY = "Your_SCKEY"
    total = 0  # 初始化
    while True:
        data = getNews()
        if total != data['total_count']:
            total = data['total_count']
            items = sorted(data['items'], key=itemgetter('id'), reverse=True)  # 根据items中的id进行排序
            content = parseData(0)  # 返回最新的1条
            sendMsg(content)
        time.sleep(60)
最后修改:2020 年 05 月 04 日 04 : 16 PM
如果觉得我的文章对你有帮助,请我吃颗糖吧~