diff --git a/CHANGELOG.md b/CHANGELOG.md index 27674b8..abbbce8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ +## v1.3.0 (2023.11.20) + +### 新增 + +- 增加微步在线研究响应中心公众号数据源抓取 [#48](https://github.com/zema1/watchvuln/issues/48), + 感谢 [@hi-unc1e](https://github.com/hi-unc1e) 的贡献 + ## v1.2.3 (2023.11.09) ### 变更 + - 更新 go 版本至 1.20 - 更新大量依赖库 diff --git a/README.md b/README.md index 26f4b17..be11931 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,13 @@ 当前抓取了这几个站点的数据: -| 名称 | 地址 | 推送策略 | -|---------------|---------------------------------------|--------------------------------------------------| -| 阿里云漏洞库 | https://avd.aliyun.com/high-risk/list | 等级为高危或严重 | -| OSCS开源安全情报预警 | https://www.oscs1024.com/cm | 等级为高危或严重**并且**包含 `预警` 标签 | -| 奇安信威胁情报中心 | https://ti.qianxin.com/ | 等级为高危严重**并且**包含 `奇安信CERT验证` `POC公开` `技术细节公布`标签之一 | -| 知道创宇Seebug漏洞库 | https://www.seebug.org/ | 存在 WAF,默认不启用,若通过 `SOURCES`/`-s` 手动启用,则推送等级为高危或严重 | +| 名称 | 地址 | 推送策略 | +|-----------------|---------------------------------------------|--------------------------------------------------| +| 阿里云漏洞库 | https://avd.aliyun.com/high-risk/list | 等级为高危或严重 | +| OSCS开源安全情报预警 | https://www.oscs1024.com/cm | 等级为高危或严重**并且**包含 `预警` 标签 | +| 奇安信威胁情报中心 | https://ti.qianxin.com/ | 等级为高危严重**并且**包含 `奇安信CERT验证` `POC公开` `技术细节公布`标签之一 | +| 微步在线研究响应中心(公众号) | https://x.threatbook.com/v5/vulIntelligence | 等级为高危或严重 | +| 知道创宇Seebug漏洞库 | https://www.seebug.org/ | 存在 WAF,默认不启用,若通过 `SOURCES`/`-s` 手动启用,则推送等级为高危或严重 | > 所有信息来自网站公开页面, 如果有侵权,请提交 issue, 我会删除相关源。 > @@ -39,22 +40,22 @@ Docker 方式推荐使用环境变量来配置服务参数 -| 环境变量名 | 说明 | 默认值 | -|-------------------------|--------------------------------------------------|-----------------------------| -| `DB_CONN` | 数据库链接字符串,详情见 [数据库连接](#数据库连接) | `sqlite3://vuln_v3.sqlite3` | -| `DINGDING_ACCESS_TOKEN` | 钉钉机器人 url 的 `access_token` 部分 | | -| `DINGDING_SECRET` | 钉钉机器人的加签值 (仅支持加签方式) | | -| `LARK_ACCESS_TOKEN` | 飞书机器人 url 的 `/open-apis/bot/v2/hook/` 后的部分 | | -| `LARK_SECRET` | 飞书机器人的加签值 (仅支持加签方式) | | -| `WECHATWORK_KEY ` | 微信机器人 url 的 `key` 部分 | | -| `SERVERCHAN_KEY ` | Server酱的 `SCKEY` | | -| `WEBHOOK_URL` | 自定义 webhook 服务的完整 url | | -| `BARK_URL` | Bark 服务的完整 url, 路径需要包含 DeviceKey | | -| `SOURCES` | 启用哪些漏洞信息源,逗号分隔, 可选 `avd`, `ti`, `oscs`, `seebug` | `avd,ti,oscs` | -| `INTERVAL` | 检查周期,支持秒 `60s`, 分钟 `10m`, 小时 `1h`, 最低 `1m` | `30m` | -| `ENABLE_CVE_FILTER` | 启用 CVE 过滤,开启后多个数据源的统一 CVE 将只推送一次 | `true` | -| `NO_FILTER` | 禁用上述推送过滤策略,所有新发现的漏洞都会被推送 | `false` | -| `NO_START_MESSAGE` | 禁用服务启动的提示信息 | `false` | +| 环境变量名 | 说明 | 默认值 | +|-------------------------|---------------------------------------------------------------|-----------------------------| +| `DB_CONN` | 数据库链接字符串,详情见 [数据库连接](#数据库连接) | `sqlite3://vuln_v3.sqlite3` | +| `DINGDING_ACCESS_TOKEN` | 钉钉机器人 url 的 `access_token` 部分 | | +| `DINGDING_SECRET` | 钉钉机器人的加签值 (仅支持加签方式) | | +| `LARK_ACCESS_TOKEN` | 飞书机器人 url 的 `/open-apis/bot/v2/hook/` 后的部分 | | +| `LARK_SECRET` | 飞书机器人的加签值 (仅支持加签方式) | | +| `WECHATWORK_KEY ` | 微信机器人 url 的 `key` 部分 | | +| `SERVERCHAN_KEY ` | Server酱的 `SCKEY` | | +| `WEBHOOK_URL` | 自定义 webhook 服务的完整 url | | +| `BARK_URL` | Bark 服务的完整 url, 路径需要包含 DeviceKey | | +| `SOURCES` | 启用哪些漏洞信息源,逗号分隔, 可选 `avd`, `ti`, `oscs`, `seebug`,`threatbook` | `avd,ti,oscs,threatbook` | +| `INTERVAL` | 检查周期,支持秒 `60s`, 分钟 `10m`, 小时 `1h`, 最低 `1m` | `30m` | +| `ENABLE_CVE_FILTER` | 启用 CVE 过滤,开启后多个数据源的统一 CVE 将只推送一次 | `true` | +| `NO_FILTER` | 禁用上述推送过滤策略,所有新发现的漏洞都会被推送 | `false` | +| `NO_START_MESSAGE` | 禁用服务启动的提示信息 | `false` | 比如使用钉钉机器人 diff --git a/grab/threatbook.go b/grab/threatbook.go index cc07456..2b68569 100644 --- a/grab/threatbook.go +++ b/grab/threatbook.go @@ -74,7 +74,6 @@ func (t *ThreatBookCrawler) getVulnInfoFromFeed(ctx context.Context, rss *gofeed vuln.Title = getTitleWithoutType(rss.Title) vuln.Description = strings.TrimSpace(description) vuln.UniqueKey = doc.Find(`td:contains('微步编号') + td`).Text() - t.log.Debugf("UniqueKey:\t%v", vuln.UniqueKey) vuln.From = vulnLink severity := Low @@ -92,23 +91,21 @@ func (t *ThreatBookCrawler) getVulnInfoFromFeed(ctx context.Context, rss *gofeed cveIDRegexpLoose := regexp.MustCompile(`CVE-\d+-\d+`) cve := cveIDRegexpLoose.FindString(description) - t.log.Debugf("Desc:\t%v", vuln.Description) - t.log.Debugf("CVE:\t%q", cve) vuln.CVE = cve - vuln.Solutions = doc.Find(`section:contains('修复方案') + section`).Text() + // 获取的不太对,先不要了 + //vuln.Solutions = doc.Find(`section:contains('修复方案') + section`).Text() vuln.Disclosure = doc.Find(`td:contains('公开程度') + td`).Text() vuln.Tags = []string{ + doc.Find(`td:contains('公开程度') + td`).Text(), doc.Find(`td:contains('漏洞类型') + td`).Text(), doc.Find(`td:contains('利用条件') + td`).Text(), doc.Find(`td:contains('交互要求') + td`).Text(), doc.Find(`td:contains('威胁类型') + td`).Text(), } - t.log.Debugf("Solutions:\t%v", vuln.Solutions) - t.log.Debugf("Disclosure:\t%v", vuln.Disclosure) - t.log.Debugf("tags:\t%v", vuln.Tags) - t.log.Debugf("vuln: %v\n", vuln) + t.log.Debugf("%+v", vuln) + vuln.Creator = t return &vuln, nil } diff --git a/grab/threatbook_test.go b/grab/threatbook_test.go index e12e8ed..01db020 100644 --- a/grab/threatbook_test.go +++ b/grab/threatbook_test.go @@ -17,12 +17,11 @@ func TestThreatBook(t *testing.T) { count := 0 for _, v := range vulns { - t.Logf("get vuln info %s", v) + t.Logf("get vuln info %+v", v) count++ assert.NotEmpty(v.UniqueKey) assert.NotEmpty(v.Description) assert.NotEmpty(v.Title) - assert.NotEmpty(v.Disclosure) assert.NotEmpty(v.From) } assert.Greater(count, 1) diff --git a/main.go b/main.go index 474c412..2b360eb 100644 --- a/main.go +++ b/main.go @@ -16,7 +16,7 @@ import ( ) var log = golog.Child("[main]") -var Version = "v1.2.3" +var Version = "v1.3.0" func main() { golog.Default.SetLevel("info") @@ -98,7 +98,7 @@ func main() { Name: "sources", Aliases: []string{"s"}, Usage: "set vuln sources", - Value: "avd,nox,oscs,seebug,threatbook", + Value: "avd,nox,oscs,threatbook", Category: "[Launch Options]", }, &cli.StringFlag{