about summary refs log tree commit diff
path: root/ssh.go
diff options
context:
space:
mode:
Diffstat (limited to 'ssh.go')
-rw-r--r--ssh.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/ssh.go b/ssh.go
new file mode 100644
index 0000000..fbbfc9c
--- /dev/null
+++ b/ssh.go
@@ -0,0 +1,63 @@
+package main
+
+// Handling incoming SSH connections
+func handlePass(ctx ssh.Context, pass string) bool {
+
+	// increase the counter tracking the amount of passwords catched
+	metrics_num_passwords++
+	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", "http://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 metrics_city_num[result.City] == 0 {
+		metrics_city_num[result.City] = 1
+	} else {
+		metrics_city_num[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
+}
\ No newline at end of file