From 07d4f8df906778ce50bc24d1e25dea87defae358 Mon Sep 17 00:00:00 2001 From: hanc00l Date: Wed, 20 Jul 2022 14:40:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=BC=E5=85=A5Naabu?= =?UTF-8?q?=E5=92=8CHttpx=E6=89=AB=E6=8F=8F=E7=BB=93=E6=9E=9C=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=88=B0=E5=B9=B3=E5=8F=B0=EF=BC=8C=E4=BB=A5=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E5=9C=A8=E5=86=85=E7=BD=91=E6=B8=97=E9=80=8F=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E4=BF=A1=E6=81=AF=E6=94=B6=E9=9B=86=E5=92=8C=E5=8D=8F?= =?UTF-8?q?=E5=90=8C=EF=BC=9B=E6=94=AF=E6=8C=81IP=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=97=B6=E8=B7=B3=E8=BF=87=E7=AB=AF=E5=8F=A3=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=EF=BC=8C=E8=AF=BB=E5=8F=96=E8=B5=84=E4=BA=A7=E5=B7=B2=E6=8E=A2?= =?UTF-8?q?=E6=B5=8B=E7=9A=84=E5=85=A8=E9=83=A8=E7=AB=AF=E5=8F=A3=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=8C=87=E7=BA=B9=E5=92=8C=E4=BF=A1=E6=81=AF=E6=94=B6?= =?UTF-8?q?=E9=9B=86=EF=BC=9B=E5=8E=BB=E9=99=A4=E6=95=88=E6=9E=9C=E4=B8=8D?= =?UTF-8?q?=E5=A4=AA=E7=94=A8=E5=A5=BD=E7=9A=84Wappalyzer=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++- pkg/comm/service.go | 7 +++- pkg/task/domainscan/result.go | 1 - pkg/task/pocscan/result.go | 8 ++-- pkg/task/portscan/result.go | 3 +- pkg/task/runner/config.go | 5 +-- pkg/task/runner/run.go | 34 +++++++--------- pkg/task/workerapi/domainscan.go | 2 + pkg/task/workerapi/fingerprint.go | 10 ----- pkg/task/workerapi/onlineapi.go | 2 - pkg/task/workerapi/pocscan.go | 2 +- pkg/task/workerapi/portscan.go | 61 ++++++++++++++++++++++------- version.txt | 2 +- web/static/js/server/domain-list.js | 1 - web/static/js/server/ip-list.js | 20 +++------- web/views/domain-info.html | 6 +++ web/views/domain-list.html | 10 ----- web/views/ip-info.html | 6 +++ web/views/ip-list.html | 48 +++++++++++++---------- 19 files changed, 128 insertions(+), 105 deletions(-) diff --git a/README.md b/README.md index 61ca50b..48fb10e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Nemo是用来进行自动化信息收集的一个简单平台,通过集成常 - IP归属地(纯真离线数据) - 自定义IP归属地、Service、蜜罐 - 导入本地的Masscan、Nmap端口扫描结果 -- 导入[fscan](https://github.com/shadow1ng/fscan)扫描结果(适用于内网渗透的资产信息收集) +- 导入[fscan](https://github.com/shadow1ng/fscan)、[Naabu]( https://github.com/projectdiscovery/naabu)、[Httpx]( https://github.com/projectdiscovery/httpx)扫描结果(适用于内网渗透的资产信息收集) - CDN识别 ### 2、域名资产 @@ -29,7 +29,7 @@ Nemo是用来进行自动化信息收集的一个简单平台,通过集成常 - [HTTPX](https://github.com/projectdiscovery/httpx) - [ScreenShot](https://github.com/chromedp/chromedp) (调用chrome headless) -- [Wappalyzer](https://github.com/AliasIO/Wappalyzer) (基于[webanalyze](https://github.com/rverton/webanalyze) 代码,可[自定义指纹规则](thirdparty/wappalyzer/technologies_custom.json)) +- ~~[Wappalyzer](https://github.com/AliasIO/Wappalyzer) (基于[webanalyze](https://github.com/rverton/webanalyze) 代码,可[自定义指纹规则](thirdparty/wappalyzer/technologies_custom.json))~~ - [ObserverWard](https://github.com/0x727/ObserverWard_0x727) (指纹信息来源于https://github.com/0x727/FingerprintHub) - IconHash(基于[mat/besticon](github.com/mat/besticon)和[Becivells/iconhash](github.com/Becivells/iconhash)项目) @@ -110,6 +110,7 @@ Tested on [ubuntu18.04/20.04 LTS](docs/install_linux.md)、[macOS](docs/install_ ## 版本更新 +- 2.5.3:2022-7-20,增加导入Naabu和Httpx扫描结果导入到平台,以方便在内网渗透时的信息收集和协同;支持IP任务时跳过端口扫描,读取资产已探测的全部端口进行指纹和信息收集;去除效果不太用好的Wappalyzer功能;修复ObserverWard设置工作目录以正确加载指纹库,升级到2022年7月最新版本。 - 2.5.2:2022-7-14,增加域名的Whois查询。注意:由2.5.1版本升级时,需在thirdparty中增加whois目录用于存放whois查询的缓存信息。 - 2.5.1:2022-6-12,更新beego框架至v2.0.3,sessionOn属性修改至app.conf中,更新chromedp至v0.8.2;增加version.txt,记录每次更新后的版本号并在web的“系统设置”-“配置管理”中显示当前的version;导入fscan扫描结果时将结果中的poc-yaml-*漏洞加入到vulnerability中。注意:由2.5.0版本升级时,需在conf/app.conf中增加对应的sessionOn属性。 - 2.5.0:2022-5-30,新增定时任务执行;Docker的Ubuntun升级为20.04LTS、调整Docker时区;新增webfiles路径映射,统一处理server的web目录访问,取消原screenshot、taskresult与imageicon目录映射;注意:本次累积升级有较大的改动,由v2.4.21升级需导入task.sql与task_cron.sql,并修改app.conf与server.yml中staticdir字段。 diff --git a/pkg/comm/service.go b/pkg/comm/service.go index 7abb327..d1fe4d8 100644 --- a/pkg/comm/service.go +++ b/pkg/comm/service.go @@ -277,10 +277,13 @@ func (s *Service) NewTask(ctx context.Context, args *NewTaskArgs, replay *string // LoadOpenedPort 读取指定IP已开放的全部端口 func (s *Service) LoadOpenedPort(ctx context.Context, args *string, replay *string) error { var resultIPAndPort []string - ipDb := db.Ip{} - portDb := db.Port{} + ips := strings.Split(*args, ",") for _, ip := range ips { + //Fix Bug: + //每次重新初始化数据库对象 + ipDb := db.Ip{} + portDb := db.Port{} host := utils.HostStrip(ip) // 如果不是有效的IP(可能是域名)则直接返回原来的目标) if utils.CheckIPV4(host) == false { diff --git a/pkg/task/domainscan/result.go b/pkg/task/domainscan/result.go index 613d890..d8780bd 100644 --- a/pkg/task/domainscan/result.go +++ b/pkg/task/domainscan/result.go @@ -25,7 +25,6 @@ type Config struct { IsIPPortScan bool `json:"portscan"` IsIPSubnetPortScan bool `json:"subnetPortscan"` IsScreenshot bool `json:"screenshot"` - IsWappalyzer bool `json:"wappalyzer"` IsFingerprintHub bool `json:"fingerprinthub"` IsIconHash bool `json:"iconhash"` PortTaskMode int `json:"portTaskMode"` diff --git a/pkg/task/pocscan/result.go b/pkg/task/pocscan/result.go index de6d15d..1d5ead5 100644 --- a/pkg/task/pocscan/result.go +++ b/pkg/task/pocscan/result.go @@ -8,10 +8,10 @@ import ( ) type Config struct { - Target string `json:"target"` - PocFile string `json:"pocFile"` - CmdBin string `json:"cmdBin"` - LoadOpenedPort bool `json:"loadOpenedPort"` + Target string `json:"target"` + PocFile string `json:"pocFile"` + CmdBin string `json:"cmdBin"` + IsLoadOpenedPort bool `json:"loadOpenedPort"` } type Result struct { diff --git a/pkg/task/portscan/result.go b/pkg/task/portscan/result.go index cd9ab19..713f876 100644 --- a/pkg/task/portscan/result.go +++ b/pkg/task/portscan/result.go @@ -24,10 +24,11 @@ type Config struct { IsHttpx bool `json:"httpx"` IsWhatWeb bool `json:"whatweb"` IsScreenshot bool `json:"screenshot"` - IsWappalyzer bool `json:"wappalyzer"` IsFingerprintHub bool `json:"fingerprinthub"` IsIconHash bool `json:"iconhash"` CmdBin string `json:"cmdBin"` + IsLoadOpenedPort bool `json:"loadOpenedPort"` + IsPortscan bool `json:"isPortscan"` } // PortAttrResult 端口属性结果 diff --git a/pkg/task/runner/config.go b/pkg/task/runner/config.go index 3356211..80b855d 100644 --- a/pkg/task/runner/config.go +++ b/pkg/task/runner/config.go @@ -17,13 +17,13 @@ type PortscanRequestParam struct { IsPing bool `form:"ping"` ExcludeIP string `form:"exclude"` IsScreenshot bool `form:"screenshot"` - IsWappalyzer bool `form:"wappalyzer"` IsFingerprintHub bool `form:"fingerprinthub"` IsIconHash bool `form:"iconhash"` TaskMode int `form:"taskmode"` IsTaskCron bool `form:"taskcron" json:"-"` TaskCronRule string `form:"cronrule" json:"-"` TaskCronComment string `form:"croncomment" json:"-"` + IsLoadOpenedPort bool `form:"load_opened_port"` } type DomainscanRequestParam struct { @@ -43,7 +43,6 @@ type DomainscanRequestParam struct { IsScreenshot bool `form:"screenshot"` IsICPQuery bool `form:"icpquery"` IsWhoisQuery bool `form:"whoisquery"` - IsWappalyzer bool `form:"wappalyzer"` IsFingerprintHub bool `form:"fingerprinthub"` IsIconHash bool `form:"iconhash"` TaskMode int `form:"taskmode"` @@ -63,7 +62,7 @@ type PocscanRequestParam struct { NucleiPocFile string `form:"nuclei_poc_file"` IsDirsearch bool `form:"dirsearch"` DirsearchExtName string `form:"ext"` - LoadOpenedPort bool `form:"load_opened_port"` + IsLoadOpenedPort bool `form:"load_opened_port"` IsTaskCron bool `form:"taskcron" json:"-"` TaskCronRule string `form:"cronrule" json:"-"` TaskCronComment string `form:"croncomment" json:"-"` diff --git a/pkg/task/runner/run.go b/pkg/task/runner/run.go index 02d18b8..a41ef55 100644 --- a/pkg/task/runner/run.go +++ b/pkg/task/runner/run.go @@ -28,10 +28,8 @@ func StartPortScanTask(req PortscanRequestParam, cronTaskId string) (taskId stri for _, t := range targets { for _, p := range ports { // 端口扫描 - if req.IsPortScan { - if taskId, err = doPortscan(cronTaskId, t, p, req); err != nil { - return - } + if taskId, err = doPortscan(cronTaskId, t, p, req); err != nil { + return } // IP归属地:如果有端口执行任务,则IP归属地任务在端口扫描中执行,否则单独执行 if !req.IsPortScan && req.IsIPLocation { @@ -41,19 +39,19 @@ func StartPortScanTask(req PortscanRequestParam, cronTaskId string) (taskId stri } // FOFA if req.IsFofa { - if taskId, err = doOnlineAPISearch(cronTaskId, "fofa", t, &req.OrgId, req.IsIPLocation, req.IsHttpx, req.IsWappalyzer, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { + if taskId, err = doOnlineAPISearch(cronTaskId, "fofa", t, &req.OrgId, req.IsIPLocation, req.IsHttpx, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { return } } // Quake if req.IsQuake { - if taskId, err = doOnlineAPISearch(cronTaskId, "quake", t, &req.OrgId, req.IsIPLocation, req.IsHttpx, req.IsWappalyzer, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { + if taskId, err = doOnlineAPISearch(cronTaskId, "quake", t, &req.OrgId, req.IsIPLocation, req.IsHttpx, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { return } } // Hunter if req.IsHunter { - if taskId, err = doOnlineAPISearch(cronTaskId, "hunter", t, &req.OrgId, req.IsIPLocation, req.IsHttpx, req.IsWappalyzer, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { + if taskId, err = doOnlineAPISearch(cronTaskId, "hunter", t, &req.OrgId, req.IsIPLocation, req.IsHttpx, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { return } } @@ -134,17 +132,17 @@ func StartDomainScanTask(req DomainscanRequestParam, cronTaskId string) (taskId } } if req.IsFofa { - if taskId, err = doOnlineAPISearch(cronTaskId, "fofa", t, &req.OrgId, true, req.IsHttpx, req.IsWappalyzer, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { + if taskId, err = doOnlineAPISearch(cronTaskId, "fofa", t, &req.OrgId, true, req.IsHttpx, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { return } } if req.IsQuake { - if taskId, err = doOnlineAPISearch(cronTaskId, "quake", t, &req.OrgId, true, req.IsHttpx, req.IsWappalyzer, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { + if taskId, err = doOnlineAPISearch(cronTaskId, "quake", t, &req.OrgId, true, req.IsHttpx, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { return } } if req.IsHunter { - if taskId, err = doOnlineAPISearch(cronTaskId, "hunter", t, &req.OrgId, true, req.IsHttpx, req.IsWappalyzer, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { + if taskId, err = doOnlineAPISearch(cronTaskId, "hunter", t, &req.OrgId, true, req.IsHttpx, req.IsFingerprintHub, req.IsScreenshot, req.IsIconHash); err != nil { return } } @@ -171,7 +169,7 @@ func StartPocScanTask(req PocscanRequestParam, cronTaskId string) (taskId string } } if req.IsPocsuiteVerify && req.PocsuitePocFile != "" { - config := pocscan.Config{Target: strings.Join(targetList, ","), PocFile: req.PocsuitePocFile, CmdBin: "pocsuite", LoadOpenedPort: req.LoadOpenedPort} + config := pocscan.Config{Target: strings.Join(targetList, ","), PocFile: req.PocsuitePocFile, CmdBin: "pocsuite", IsLoadOpenedPort: req.IsLoadOpenedPort} configJSON, _ := json.Marshal(config) taskId, err = serverapi.NewTask("pocsuite", string(configJSON), cronTaskId) if err != nil { @@ -179,7 +177,7 @@ func StartPocScanTask(req PocscanRequestParam, cronTaskId string) (taskId string } } if req.IsXrayVerify && req.XrayPocFile != "" { - config := pocscan.Config{Target: strings.Join(targetList, ","), PocFile: req.XrayPocFile, CmdBin: "xray", LoadOpenedPort: req.LoadOpenedPort} + config := pocscan.Config{Target: strings.Join(targetList, ","), PocFile: req.XrayPocFile, CmdBin: "xray", IsLoadOpenedPort: req.IsLoadOpenedPort} configJSON, _ := json.Marshal(config) taskId, err = serverapi.NewTask("xray", string(configJSON), cronTaskId) if err != nil { @@ -187,7 +185,7 @@ func StartPocScanTask(req PocscanRequestParam, cronTaskId string) (taskId string } } if req.IsNucleiVerify && req.NucleiPocFile != "" { - config := pocscan.Config{Target: strings.Join(targetList, ","), PocFile: req.NucleiPocFile, CmdBin: "nuclei", LoadOpenedPort: req.LoadOpenedPort} + config := pocscan.Config{Target: strings.Join(targetList, ","), PocFile: req.NucleiPocFile, CmdBin: "nuclei", IsLoadOpenedPort: req.IsLoadOpenedPort} configJSON, _ := json.Marshal(config) taskId, err = serverapi.NewTask("nuclei", string(configJSON), cronTaskId) if err != nil { @@ -195,7 +193,7 @@ func StartPocScanTask(req PocscanRequestParam, cronTaskId string) (taskId string } } if req.IsDirsearch && req.DirsearchExtName != "" { - config := pocscan.Config{Target: strings.Join(targetList, ","), PocFile: req.DirsearchExtName, CmdBin: "dirsearch", LoadOpenedPort: req.LoadOpenedPort} + config := pocscan.Config{Target: strings.Join(targetList, ","), PocFile: req.DirsearchExtName, CmdBin: "dirsearch", IsLoadOpenedPort: req.IsLoadOpenedPort} configJSON, _ := json.Marshal(config) taskId, err = serverapi.NewTask("dirsearch", string(configJSON), cronTaskId) if err != nil { @@ -219,10 +217,11 @@ func doPortscan(cronTaskId string, target string, port string, req PortscanReque IsHttpx: req.IsHttpx, IsWhatWeb: req.IsWhatweb, IsScreenshot: req.IsScreenshot, - IsWappalyzer: req.IsWappalyzer, IsFingerprintHub: req.IsFingerprintHub, IsIconHash: req.IsIconHash, CmdBin: req.CmdBin, + IsPortscan: req.IsPortScan, + IsLoadOpenedPort: req.IsLoadOpenedPort, } if req.CmdBin == "" { config.CmdBin = conf.GlobalWorkerConfig().Portscan.Cmdbin @@ -268,7 +267,6 @@ func doBatchScan(cronTaskId string, target string, port string, req PortscanRequ IsHttpx: req.IsHttpx, IsWhatWeb: req.IsWhatweb, IsScreenshot: req.IsScreenshot, - IsWappalyzer: req.IsWappalyzer, IsFingerprintHub: req.IsFingerprintHub, IsIconHash: req.IsIconHash, CmdBin: "masscan", @@ -316,7 +314,6 @@ func doDomainscan(cronTaskId string, target string, req DomainscanRequestParam) IsIPPortScan: req.IsIPPortscan, IsIPSubnetPortScan: req.IsSubnetPortscan, IsScreenshot: req.IsScreenshot, - IsWappalyzer: req.IsWappalyzer, IsFingerprintHub: req.IsFingerprintHub, IsIconHash: req.IsIconHash, PortTaskMode: req.PortTaskMode, @@ -340,13 +337,12 @@ func doDomainscan(cronTaskId string, target string, req DomainscanRequestParam) } // doOnlineAPISearch Fofa,hunter,quaker的查询 -func doOnlineAPISearch(cronTaskId string, apiName string, target string, orgId *int, isIplocation, isHttp, isWappalyzer, isFingerprintHub, isScreenshot bool, isIconHash bool) (taskId string, err error) { +func doOnlineAPISearch(cronTaskId string, apiName string, target string, orgId *int, isIplocation, isHttp, isFingerprintHub, isScreenshot bool, isIconHash bool) (taskId string, err error) { config := onlineapi.OnlineAPIConfig{ Target: target, OrgId: orgId, IsIPLocation: isIplocation, IsHttpx: isHttp, - IsWappalyzer: isWappalyzer, IsFingerprintHub: isFingerprintHub, IsScreenshot: isScreenshot, IsIconHash: isIconHash, diff --git a/pkg/task/workerapi/domainscan.go b/pkg/task/workerapi/domainscan.go index e08ec38..5412781 100644 --- a/pkg/task/workerapi/domainscan.go +++ b/pkg/task/workerapi/domainscan.go @@ -121,6 +121,8 @@ func doPortScan(config domainscan.Config, resultDomainScan *domainscan.Result) { IsScreenshot: config.IsScreenshot, IsFingerprintHub: config.IsFingerprintHub, IsIconHash: config.IsIconHash, + IsLoadOpenedPort: false, //只扫描当前结果 + IsPortscan: true, } configPortScanJSON, _ := json.Marshal(configPortScan) // 创建端口扫描任务 diff --git a/pkg/task/workerapi/fingerprint.go b/pkg/task/workerapi/fingerprint.go index 269e7ac..32ce2a4 100644 --- a/pkg/task/workerapi/fingerprint.go +++ b/pkg/task/workerapi/fingerprint.go @@ -21,11 +21,6 @@ func DoIPFingerPrint(config portscan.Config, resultPortScan *portscan.Result) { httpx.ResultPortScan = *resultPortScan httpx.Do() } - if config.IsWappalyzer { - wappalyzer := fingerprint.NewWappalyzer() - wappalyzer.ResultPortScan = *resultPortScan - wappalyzer.Do() - } if config.IsFingerprintHub { fp := fingerprint.NewFingerprintHub() fp.ResultPortScan = *resultPortScan @@ -49,11 +44,6 @@ func DoDomainFingerPrint(config domainscan.Config, resultDomainScan *domainscan. whatweb.ResultDomainScan = *resultDomainScan whatweb.Do() } - if config.IsWappalyzer { - wappalyzer := fingerprint.NewWappalyzer() - wappalyzer.ResultDomainScan = *resultDomainScan - wappalyzer.Do() - } if config.IsFingerprintHub { fp := fingerprint.NewFingerprintHub() fp.ResultDomainScan = *resultDomainScan diff --git a/pkg/task/workerapi/onlineapi.go b/pkg/task/workerapi/onlineapi.go index e4a1660..e7d0765 100644 --- a/pkg/task/workerapi/onlineapi.go +++ b/pkg/task/workerapi/onlineapi.go @@ -94,7 +94,6 @@ func doFingerAndSave(taskId string, portScanResult *portscan.Result, domainScanR portscanConfig := portscan.Config{ IsHttpx: config.IsHttpx, IsWhatWeb: config.IsWhatWeb, - IsWappalyzer: config.IsWappalyzer, IsFingerprintHub: config.IsFingerprintHub, IsIconHash: config.IsIconHash, } @@ -107,7 +106,6 @@ func doFingerAndSave(taskId string, portScanResult *portscan.Result, domainScanR domainscanConfig := domainscan.Config{ IsHttpx: config.IsHttpx, IsWhatWeb: config.IsWhatWeb, - IsWappalyzer: config.IsWappalyzer, IsFingerprintHub: config.IsFingerprintHub, IsIconHash: config.IsIconHash, } diff --git a/pkg/task/workerapi/pocscan.go b/pkg/task/workerapi/pocscan.go index 617467b..d6de2dc 100644 --- a/pkg/task/workerapi/pocscan.go +++ b/pkg/task/workerapi/pocscan.go @@ -20,7 +20,7 @@ func PocScan(taskId, configJSON string) (result string, err error) { } x := comm.NewXClient() //读取资产开放端口 - if config.LoadOpenedPort { + if config.IsLoadOpenedPort { err = x.Call(context.Background(), "LoadOpenedPort", &config.Target, &result) if err == nil { config.Target = result diff --git a/pkg/task/workerapi/portscan.go b/pkg/task/workerapi/portscan.go index 58919d9..bf9e183 100644 --- a/pkg/task/workerapi/portscan.go +++ b/pkg/task/workerapi/portscan.go @@ -6,7 +6,9 @@ import ( "github.com/hanc00l/nemo_go/pkg/comm" "github.com/hanc00l/nemo_go/pkg/logging" "github.com/hanc00l/nemo_go/pkg/task/portscan" + "github.com/hanc00l/nemo_go/pkg/utils" "github.com/remeh/sizedwaitgroup" + "strconv" "strings" ) @@ -25,31 +27,62 @@ func PortScan(taskId, configJSON string) (result string, err error) { return FailedTask(err.Error()), err } var resultPortScan portscan.Result - // 端口扫描 - if config.CmdBin == "masnmap" { - resultPortScan = doMasscanPlusNmap(config) - } else if config.CmdBin == "nmap" { - nmap := portscan.NewNmap(config) - nmap.Do() - resultPortScan = nmap.Result + x := comm.NewXClient() + //端口扫描: + if config.IsPortscan { + if config.CmdBin == "masnmap" { + resultPortScan = doMasscanPlusNmap(config) + } else if config.CmdBin == "nmap" { + nmap := portscan.NewNmap(config) + nmap.Do() + resultPortScan = nmap.Result + } else { + masscan := portscan.NewMasscan(config) + masscan.Do() + resultPortScan = masscan.Result + } } else { - masscan := portscan.NewMasscan(config) - masscan.Do() - resultPortScan = masscan.Result + resultPortScan.IPResult = make(map[string]*portscan.IPResult) + } + // 读取目标的数据库中已保存的开放端口 + if config.IsLoadOpenedPort { + err = x.Call(context.Background(), "LoadOpenedPort", &config.Target, &result) + if err == nil && result != "" { + allTargets := strings.Split(result, ",") + for _, target := range allTargets { + // 必须是ip:port格式 + dataArray := strings.Split(target, ":") + if len(dataArray) != 2 { + continue + } + ip := dataArray[0] + port, err := strconv.Atoi(dataArray[1]) + if utils.CheckIPV4(ip) == false || err != nil { + continue + } + if !resultPortScan.HasIP(ip) { + resultPortScan.SetIP(ip) + } + if !resultPortScan.HasPort(ip, port) { + resultPortScan.SetPort(ip, port) + } + } + } else { + logging.RuntimeLog.Error(err) + } } // IP位置 if config.IsIpLocation { doLocation(&resultPortScan) } // 指纹识别 - DoIPFingerPrint(config,&resultPortScan) + DoIPFingerPrint(config, &resultPortScan) // 保存结果 resultArgs := comm.ScanResultArgs{ - TaskID: taskId, + TaskID: taskId, IPConfig: &config, IPResult: resultPortScan.IPResult, } - x := comm.NewXClient() err = x.Call(context.Background(), "SaveScanResult", &resultArgs, &result) if err != nil { logging.RuntimeLog.Error(err) @@ -57,7 +90,7 @@ func PortScan(taskId, configJSON string) (result string, err error) { } // screenshot if config.IsScreenshot { - result2 := DoScreenshotAndSave(&resultPortScan,nil) + result2 := DoScreenshotAndSave(&resultPortScan, nil) result = strings.Join([]string{result, result2}, ",") } diff --git a/version.txt b/version.txt index f225a78..aedc15b 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.5.2 +2.5.3 diff --git a/web/static/js/server/domain-list.js b/web/static/js/server/domain-list.js index 86263d6..6a39aca 100644 --- a/web/static/js/server/domain-list.js +++ b/web/static/js/server/domain-list.js @@ -49,7 +49,6 @@ $(function () { 'screenshot': $('#checkbox_screenshot').is(":checked"), 'icpquery': $('#checkbox_icpquery').is(":checked"), 'whoisquery': $('#checkbox_whoisquery').is(":checked"), - 'wappalyzer': $('#checkbox_wappalyzer').is(":checked"), 'fingerprinthub': $('#checkbox_fingerprinthub').is(":checked"), 'iconhash': $('#checkbox_iconhash').is(":checked"), 'taskcron': $('#checkbox_cron_task').is(":checked"), diff --git a/web/static/js/server/ip-list.js b/web/static/js/server/ip-list.js index df608bc..9489224 100644 --- a/web/static/js/server/ip-list.js +++ b/web/static/js/server/ip-list.js @@ -91,12 +91,12 @@ $(function () { 'httpx': $('#checkbox_httpx').is(":checked"), 'exclude': exclude_ip, 'screenshot': $('#checkbox_screenshot').is(":checked"), - 'wappalyzer': $('#checkbox_wappalyzer').is(":checked"), 'fingerprinthub': $('#checkbox_fingerprinthub').is(":checked"), 'iconhash': $('#checkbox_iconhash').is(":checked"), 'taskcron': $('#checkbox_cron_task').is(":checked"), 'cronrule': cron_rule, 'croncomment': $('#input_cron_comment').val(), + 'load_opened_port':$('#checkbox_ip_load_opened_port').is(":checked"), }, function (data, e) { if (e === "success" && data['status'] == 'success') { swal({ @@ -204,7 +204,6 @@ $(function () { 'httpx': $('#checkbox_batchscan_httpx').is(":checked"), 'exclude': exclude_ip, 'screenshot': $('#checkbox_batchscan_screenshot').is(":checked"), - 'wappalyzer': false, 'fingerprinthub': $('#checkbox_batchscan_fingerprinthub').is(":checked"), 'iconhash': $('#checkbox_batchscan_iconhash').is(":checked"), 'taskcron': $('#checkbox_cron_task').is(":checked"), @@ -235,29 +234,22 @@ $(function () { $("#select_tech").prop("disabled", false); $("#select_bin").prop("disabled", false); $("#input_rate").prop("disabled", false); - $("#checkbox_whatweb").prop("disabled", false); - $("#checkbox_httpx").prop("disabled", false); $("#checkbox_ping").prop("disabled", false); $("#checkbox_exclude").prop("disabled", false); $("#input_exclude").prop("disabled", false); - $("#checkbox_screenshot").prop("disabled", false); - $("#checkbox_wappalyzer").prop("disabled", false); - $("#checkbox_fingerprinthub").prop("disabled", false); - $("#checkbox_iconhash").prop("disabled", false); } else { $("#input_port").prop("disabled", true); $("#select_tech").prop("disabled", true); $("#select_bin").prop("disabled", true); $("#input_rate").prop("disabled", true); - $("#checkbox_whatweb").prop("disabled", true); - $("#checkbox_httpx").prop("disabled", true); + // $("#checkbox_whatweb").prop("disabled", true); + // $("#checkbox_httpx").prop("disabled", true); $("#checkbox_ping").prop("disabled", true); $("#checkbox_exclude").prop("disabled", true); $("#input_exclude").prop("disabled", true); - $("#checkbox_screenshot").prop("disabled", true); - $("#checkbox_wappalyzer").prop("disabled", true); - $("#checkbox_fingerprinthub").prop("disabled", true); - $("#checkbox_iconhash").prop("disabled", true); + // $("#checkbox_screenshot").prop("disabled", true); + // $("#checkbox_fingerprinthub").prop("disabled", true); + // $("#checkbox_iconhash").prop("disabled", true); } }) $("#checkbox_cron_task").click(function () { diff --git a/web/views/domain-info.html b/web/views/domain-info.html index 051a164..15cc4ab 100644 --- a/web/views/domain-info.html +++ b/web/views/domain-info.html @@ -261,6 +261,12 @@
域名相关信息
{{ else }} {{ .Source }} {{end }} + {{ else if eq .Source "hunter" "quake" }} + {{ .Source }} + {{ else if eq .Source "iconhash" }} + {{ .Source }} + {{ else if eq .Source "ObserverWard" }} + {{ .Source }} {{ else }} {{ .Source }} {{ end }} diff --git a/web/views/domain-list.html b/web/views/domain-list.html index 6b7a41f..597a412 100644 --- a/web/views/domain-list.html +++ b/web/views/domain-list.html @@ -207,16 +207,6 @@