|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"reflect"
|
|
|
|
//"./timer"
|
|
|
|
"time"
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
"regexp"
|
|
|
|
"io/ioutil"
|
|
|
|
"encoding/hex"
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var tcp_data string = read_tcp_file("/proc/net/tcp")
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
var loops int = 0
|
|
|
|
// How to split on space-delimited fields, then colon-delimited fields?
|
|
|
|
// How to turn this byte into a string?
|
|
|
|
|
|
|
|
// /proc/net/tcp hex addresses need to be reversed two-character-wise
|
|
|
|
// and then converted byte by byte (2 char at a time)
|
|
|
|
//fmt.Println(convert_address(reverse_string(reverse_bytes("0100007F"))))
|
|
|
|
|
|
|
|
for _ = range time.Tick(10 * time.Second) {
|
|
|
|
fmt.Println("Waiting 10 seconds...")
|
|
|
|
for num, row := range get_tcp_rows(tcp_data) {
|
|
|
|
row_type := reflect.TypeOf(row)
|
|
|
|
fmt.Println(num, " ", row_type)
|
|
|
|
}
|
|
|
|
// if loops modulo 6 (1min) then
|
|
|
|
// for address in address_list do
|
|
|
|
// if (grep address address_list | wc -l >=3) then
|
|
|
|
// This is a port scan!
|
|
|
|
// fi
|
|
|
|
// done
|
|
|
|
// elseif (wc -l old_tcp_file < wc -l tcp_file) then
|
|
|
|
// for i in (wc -l tcp_file - wc -l old_tcp_flle) do
|
|
|
|
// print New Connection! reverse_strng(reverse_bytes(tcp_file[i])) // This oversimplifies row value selection for the sake
|
|
|
|
// // of pseudocode
|
|
|
|
// done
|
|
|
|
// else
|
|
|
|
// "No new connections. Waiting another 10 seconds..."
|
|
|
|
// fi
|
|
|
|
loops++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func check(e error) {
|
|
|
|
if e != nil {
|
|
|
|
panic(e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Aiming for an array of [string]string maps
|
|
|
|
// Am I looking for a map[string]interface here?
|
|
|
|
func get_tcp_rows(connections_file string) []string {
|
|
|
|
tcp_lines := strings.Split(connections_file, "\n")
|
|
|
|
regexpression := regexp.MustCompile(`[\r\n\t\f\v]+`)
|
|
|
|
tcp_columns := regexpression.Split(tcp_lines[0], -1)
|
|
|
|
var tcp_values map[string]string
|
|
|
|
|
|
|
|
for i, line := range tcp_lines[1:] {
|
|
|
|
trim_line := strings.TrimSpace(line)
|
|
|
|
values := regexpression.Split(trim_line, -1)
|
|
|
|
column := tcp_columns[i]
|
|
|
|
tcp_values[column] = values
|
|
|
|
}
|
|
|
|
return tcp_values
|
|
|
|
}
|
|
|
|
|
|
|
|
// Take a string, create a rune slice, and use a loop to reverse it character-wise.
|
|
|
|
func reverse_bytes(s string) string {
|
|
|
|
runes := []rune(s)
|
|
|
|
for i, j := len(runes)-2, len(runes)-1; j > 0; i, j = i-2, j-2 {
|
|
|
|
runes[i], runes[j] = runes[j], runes[i]
|
|
|
|
}
|
|
|
|
return string(runes)
|
|
|
|
}
|
|
|
|
|
|
|
|
func reverse_string(s string) string {
|
|
|
|
runes := []rune(s)
|
|
|
|
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
|
|
|
|
runes[i], runes[j] = runes[j], runes[i]
|
|
|
|
}
|
|
|
|
return string(runes)
|
|
|
|
}
|
|
|
|
// Store data function
|
|
|
|
// Loads all fields and subfields into storage (memory? where?)
|
|
|
|
// State check function
|
|
|
|
// hash each line, use to determine new lines, convert to readable, and print
|
|
|
|
|
|
|
|
|
|
|
|
func convert_address(address string) []byte {
|
|
|
|
output, err := hex.DecodeString(address)
|
|
|
|
check(err)
|
|
|
|
return output
|
|
|
|
}
|
|
|
|
func read_tcp_file(connections_file_path string) string {
|
|
|
|
data, err := ioutil.ReadFile(connections_file_path)
|
|
|
|
check(err)
|
|
|
|
fmt.Println("Data file read successfully.\n")
|
|
|
|
return string(data)
|
|
|
|
}
|