a honeypot ssh server in Go

honey-ssh-pot Curious about who and how attempts ssh login to your home server ? Me too… So I wrote a very simple ssh honeypot, just to collect interesting info about the kind guys who knocks my door :) warning: this is safe, but don’t run the service (well, ANY service) as root user. Even better if you can run it as a dedicate unprivileged user. This program is only for didactic use and not intended for deployment in a production network environment. If you want to have it exposed on the public internet, you must map port 22 of your wan router to the internal server port ( 2222 by default)… Do it at your risk! ...

June 26, 2018 · Andrea Manzini

a simple PNG decoder in Go

while working with image files, I needed a simple way to analyze content of a picture; so I wrote this tool that “walks” inside a PNG file and reports all the chunks seen; this is intended to be expanded with more features in a future. package main import ( "encoding/binary" "fmt" "io" "os" ) type chunk struct { Length uint32 ChunkType [4]byte } func main() { if len(os.Args) != 2 { fmt.Printf("Usage: %s filename.png\n", os.Args[0]) os.Exit(1) } f, err := os.Open(os.Args[1]) if err != nil { panic(err) } defer f.Close() header := make([]byte, 8) _, err = f.Read(header) fmt.Printf("header: %v\n", header) if err != nil { panic(err) } var data chunk var offset int64 offset = 8 for { err = binary.Read(f, binary.BigEndian, &data) if err != nil { if err == io.EOF { break } panic(err) } fmt.Printf("Offset: %d chunk len=%d, type: %s\n", offset, data.Length, string(data.ChunkType[:4])) f.Seek(int64(data.Length+4), io.SeekCurrent) offset += int64(data.Length) + 4 } } usage: ...

January 28, 2018 · Andrea Manzini

a simple HTTP rewriting proxy

This is an example of using goproxy, a fast and robust multithread proxy engine to develop an HTTP proxy that rewrites content on the fly, with multiple search and substitutions. It can be useful for debugging and other less noble (but useful) purposes … // rewriting_proxy project main.go package main import ( "bytes" "flag" "io/ioutil" "log" "net/http" "github.com/elazarl/goproxy" ) var replacements = []struct { from []byte to []byte }{ {[]byte("#e8ecec"), []byte("Red")}, // ugly colors!! {[]byte("Comic Sans MS"), []byte("Lucida Sans Unicode")}, // for eyes sanity {[]byte("Java "), []byte("Golang ")}, // just joking } func myHandler(resp *http.Response, ctx *goproxy.ProxyCtx) *http.Response { readBody, err := ioutil.ReadAll(resp.Body) if err != nil { //TODO handle read error gracefully return resp } resp.Body.Close() for _, elem := range replacements { readBody = bytes.Replace(readBody, elem.from, elem.to, -1) } resp.Body = ioutil.NopCloser(bytes.NewReader(readBody)) return resp } func main() { verbose := flag.Bool("v", true, "should every proxy request be logged to stdout") proxy := goproxy.NewProxyHttpServer() proxy.Verbose = *verbose proxy.OnResponse().DoFunc(myHandler) log.Fatal(http.ListenAndServe(":8081", proxy)) }

August 12, 2016 · Andrea Manzini

monit helper for quota monitoring in go

I want to keep under control a system where each user has an amount of filesystem quota reserved; in particular I would like to get notified if and when a user exceeds some treshold. Since I already have Monit in place in the server, I took the chance to write a small Go utility in order to retrieve the quota percentage. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 // quotachecker.go package main import ( "os" "os/exec" "regexp" "strconv" "strings" ) func main() { //a fake implementation, just for testing purpose //cmd := exec.Command("/bin/sh", "-c", "cat fakequota.txt") cmd := exec.Command("/usr/bin/repquota", "-a") stdout, err := cmd.Output() if err != nil { panic(err.Error()) } re, err := regexp.Compile("^[[:alnum:]]+\\s+--\\s+\\d+\\s+\\d+") if err != nil { panic(err.Error()) } percent_max := 0 result := strings.Split(string(stdout), "\n") for _, line := range result { match := re.MatchString(line) if !match { continue } fields := strings.Fields(line) spaceused, err := strconv.ParseInt(fields[2], 10, 64) if err != nil { panic(err.Error()) } spacetotal, err := strconv.ParseInt(fields[4], 10, 64) if err != nil { panic(err.Error()) } if spacetotal == 0 { continue } //calculate max percent used percent := int(100 * spaceused / spacetotal) if percent > percent_max { percent_max = int(percent) } } os.Exit(percent_max) } This is also an example on how to run external programs in Go and filter the output using regular expressions. ...

March 30, 2016 · Andrea Manzini