golang 实现漏洞监控02——github 历史漏洞信息爬取

admin 2024年1月19日11:37:25评论16 views字数 2147阅读7分9秒阅读模式

整体功能

从 github 的相关 API 接口搜索关键字 CVE-{YEAR},并且按照 best-match 进行排序,获取每年的 CVE 中前 1000 个,再进行判活,去重等等筛选,最终存入数据库。

代码实现

getGithubHeader()

func getGithubHeader() map[string]string{    token := cfg.Github.GithubToken    header := map[string]string{"Authorization":"token "+ token,}return header  }

该函数用于从 config 文件中获取 github token,如果不加上 token 访问,1h 只能访问 50 次:

golang 实现漏洞监控02——github 历史漏洞信息爬取

加上 token 后尝试:

golang 实现漏洞监控02——github 历史漏洞信息爬取

请求次数变成 6000. 更多详细配置参考官方文档:

url: https://docs.github.com/v3/search/title:"Search - GitHub Docs"description:"Use the REST API to search for specific items on GitHub."host: docs.github.comfavicon:/assets/cb-345/images/site/favicon.pngimage: https://github.githubassets.com/images/modules/open_graph/github-logo.png

getCVEInfo(cve string)

func getCVEInfo(cve string)(exists bool, desc, cvss2, cvss3, cna string, err error){    url := nvdURL + cve      res, err := http.Get(url)if err !=nil{       fmt.Println("Error establishing connect:", err)returnfalse,"","","","", err  }    defer res.Body.Close()    doc, err := goquery.NewDocumentFromReader(res.Body)if err !=nil{       fmt.Println("Error parsing html:", err)returnfalse,"","","","", err  }//exists//cvss3 //cna//cvss2//descreturn exists, desc, cvss2, cvss3, cna,nil}

该函数用来判断 CVE 是否存在,如果存在,从返回值取出漏洞描述以及评分信息。

fetchGithub(year, page int, wg *sync.WaitGroup, countchan chan struct{})

func fetchGithub(year, page int, wg *sync.WaitGroup, countchan chan struct{}) {      defer wg.Done()      /*    ...    data handle    ...    */       err = database.InsertGithubDB(cve, desc, date_published, cvss2, cvss3, cna, poc_url)         if err != nil {            fmt.Println("Error insert vul:", cve)            continue         }         countchan <- struct{}{}  //记录插入条数    }  }

该函数用来完成对 github 数据的一次完整的爬取及处理。

ConcurrentGitHubCrawler()

func ConcurrentGitHubCrawler() {      var wg, mainWG sync.WaitGroup      var totalCount int       for year := startYear; year <= endYear; year++ {         mainWG.Add(1)         yearCount := 0         countChan := make(chan struct{})         for page := 1; page <= 10; page++ {            wg.Add(1)            go fetchGithub(year, page, &wg, countChan)         }         go func() {            wg.Wait()            close(countChan)            mainWG.Done()         }()         for range countChan {            yearCount++         }         totalCount += yearCount      }      mainWG.Wait()      fmt.Printf("Github: Successfully insert %d vul info", totalCount)  }

该函数实现了 fetchGithub 函数的并发操作。在外层循环中,依次遍历 year,并且在 mainwg 中加 1,到内层循环里,wg 加 1,并且执行爬取处理的函数,起一个协程来等待当前 year 下所有 page 的数据爬取完成,并且关闭 countChan,当前 year 完成后,通过 for range 来统计插入数据库的条数,当所有 year 的数据爬取完成后,主协程停止等待,并打印结果。

运行结果

golang 实现漏洞监控02——github 历史漏洞信息爬取

原文始发于微信公众号(Crush Sec):golang 实现漏洞监控02——github 历史漏洞信息爬取

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月19日11:37:25
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   golang 实现漏洞监控02——github 历史漏洞信息爬取http://cn-sec.com/archives/2408881.html

发表评论

匿名网友 填写信息