package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net/http" "strings" "github.com/gliderlabs/ssh" ) // Handling incoming SSH connections func handlePass(ctx ssh.Context, pass string) bool { // increase the counter tracking the amount of passwords catched metricsNumPasswords++ log.Printf("%s@%s: '%s'", ctx.User(), ctx.RemoteAddr().String(), pass) // get the ip of the remote user stringip := strings.Split(ctx.RemoteAddr().String(), ":")[0] // Define the request string for the geoip service requestString := fmt.Sprintf("%s%s", "https://ip-api.com/json/", stringip) // Send the GET request resp, err := http.Get(requestString) if err != nil { log.Fatal(err) } // if the response status code from the geoip service is not a 200 code, return false if resp.StatusCode != 200 { return false } // Read the response body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } // Unmarshal the response to json var result geoipresult err = json.Unmarshal(body, &result) if err != nil { fmt.Println("JSON ERROR, abort mission!") log.Fatal(err) } // if an entry for the city does not exists yet, create the city // if the city does allready exist, increase it's value by one if metricsCityNum[result.City] == 0 { metricsCityNum[result.City] = 1 } else { metricsCityNum[result.City] += 1 } // if the actual city is not known, create the city // this is used for the grafana worldmap plugin if (cities[result.City] == location{}) { newCity := location{ key: strings.ToLower(result.City), latitude: result.Lat, longitude: result.Lon, name: result.City, } cities[result.City] = newCity } return false }