Skip to content

Instantly share code, notes, and snippets.

@ChrisPritchard
Created September 10, 2021 20:11
Show Gist options
  • Save ChrisPritchard/89121c7042a6762dd75f0bce6b15b043 to your computer and use it in GitHub Desktop.
Save ChrisPritchard/89121c7042a6762dd75f0bce6b15b043 to your computer and use it in GitHub Desktop.
small go script to ask a imap server to delete all its emails - part of the first module for the OSWE course
package main
import (
"bufio"
"fmt"
"log"
"net"
"regexp"
"strconv"
"strings"
)
var messageHeader = "m "
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
service := "192.168.167.106:143"
tcpAddress, err := net.ResolveTCPAddr("tcp4", service)
check(err)
conn, err := net.DialTCP("tcp", nil, tcpAddress)
check(err)
defer conn.Close()
reader := bufio.NewReader(conn)
readOne := func() string {
received, err := reader.ReadString('\n')
check(err)
text := string(received)
fmt.Print(text)
return text
}
read := func() string {
result := ""
for {
text := readOne()
result += text
if strings.HasPrefix(text, messageHeader) {
break
}
}
return result
}
write := func(text string) {
fmt.Println(messageHeader + text)
_, err = conn.Write([]byte(messageHeader + text + "\r\n"))
check(err)
}
readOne() // just getting the connect ok message
write("login [email protected] 123456")
read()
write("select inbox")
response := read()
extracted := regexp.MustCompile(`(\d*) EXISTS`).FindStringSubmatch(response)
emails, err := strconv.Atoi(extracted[1])
check(err)
for i := 1; i <= emails; i++ {
write(fmt.Sprintf("store %d +flags \\deleted", i))
read()
}
if emails > 0 {
write("expunge")
read()
}
write("logout")
read()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment