Skip to content

Instantly share code, notes, and snippets.

@terretta
Forked from elazarl/redcon.go
Created March 14, 2013 14:47
Show Gist options
  • Select an option

  • Save terretta/5161930 to your computer and use it in GitHub Desktop.

Select an option

Save terretta/5161930 to your computer and use it in GitHub Desktop.

Revisions

  1. @elazarl elazarl created this gist Jun 6, 2011.
    131 changes: 131 additions & 0 deletions redcon.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,131 @@
    package main

    import (
    "log"
    "io"
    "os"
    "crypto/tls"
    "strings"
    "net"
    "flag"
    "time"
    )

    func redCon(r io.ReadCloser,w io.Writer) {
    defer r.Close()
    buf := make([]byte,100)
    for {
    nr,err := r.Read(buf)
    if err == os.EOF {break}
    if err != nil {log.Println("Read:",err);break}
    w.Write(buf[:nr])
    }
    }

    func redirect(sock net.Listener,mkCon func() (net.Conn,os.Error)) {
    for {
    conn, err := sock.Accept()
    if err != nil {
    log.Fatal(err)
    }
    red_to,err := mkCon()
    if err != nil {log.Println("Error connecting",err);continue}
    go redCon(conn, red_to)
    go redCon(red_to, conn)
    }
    }

    func mkTls(addr string) func() (net.Conn,os.Error) {
    if !strings.Contains(addr,":") {
    addr += ":443"
    }
    return func() (net.Conn,os.Error) {
    return tls.Dial("tcp",addr,nil)
    }
    }

    func mkTcp(addr string) func() (net.Conn,os.Error) {
    if !strings.Contains(addr,":") {
    addr += ":80"
    }
    return func() (net.Conn,os.Error) {
    return net.Dial("tcp",addr)
    }
    }

    var SERVER_CERT = []byte(`-----BEGIN CERTIFICATE-----
    MIICATCCAWoCCQD/6eUeFn3yRDANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB
    VTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0
    cyBQdHkgTHRkMB4XDTExMDYwMzEzMjEwMVoXDTEyMDYwMjEzMjEwMVowRTELMAkG
    A1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0
    IFdpZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0OwS
    N2h83OXkzdv8azyvAwFsAWJZPyV8oLvL05OIUb+RgvzeA1FL3YXsRR1dIBLqD7H8
    OmS1ZctpQ61N8dOKISTohGdkK0l3X1ZKNDlwCgHwYl0+GfX63kM7NoNeevA3/paT
    Tej4d+MEZ/xKugCwNeKb1M9ULAB9fMGBrLP4D3MCAwEAATANBgkqhkiG9w0BAQUF
    AAOBgQAITr5Ly40GBFfaYquy1IhhqbIzaTg8JaPnd7yBvxoez4U7D4SB8Gu90QdW
    0t2fPdiNmLaUzHckPnSJURiUjXW1v7eEDCAN6Gxc2TVt/wc4xshgCiOL7XBqxmNA
    c1kT5IqLS7CMqOnSBNCaTtQxba3E/xi8BcODJ8aeFw6AGU7O+A==
    -----END CERTIFICATE-----`)
    var SERVER_KEY = []byte(`-----BEGIN RSA PRIVATE KEY-----
    MIICWwIBAAKBgQDQ7BI3aHzc5eTN2/xrPK8DAWwBYlk/JXygu8vTk4hRv5GC/N4D
    UUvdhexFHV0gEuoPsfw6ZLVly2lDrU3x04ohJOiEZ2QrSXdfVko0OXAKAfBiXT4Z
    9freQzs2g1568Df+lpNN6Ph34wRn/Eq6ALA14pvUz1QsAH18wYGss/gPcwIDAQAB
    AoGAF0mJCkYKTPEPHOcdbrKX62TYLhtRSVmbV6s3IAE826fXx1r6QDJqm2mXGWkZ
    fT6+ejtjmvqowYz30cRagM8MgUuTRkDUhKMbAzSEO8uCEEoTLDOZpUUCSOg78WUH
    jV04INJi6jpduPj5vjm81gcTvE0+jB8KLCQeu8PoVZKC5WkCQQD4x1rsjP4tfyCl
    K/SXD2ou3Nlwf6wHH5CXXHbmzX3WnP0eFMJ5s3dKFlX4Kgl9eMTQC6zYsaqc22uq
    lqOuEGetAkEA1vyL6okLsKQFp+vPAqZMw6P6gw4XEeG4MD0H+ruWxzLaIfqLq4w8
    ZNQqWu5EyfHUfpNVFIR3ST+8ZkpW5be3nwJAIIwESzpO7qjZHoLXpwOvQp5GHD+3
    w97PTd4c+CkeM3uqacsRflaKXrj5WlQ1laK9LPK6FEd6KLdUKKc4lscyqQJAemJy
    VCWIHhqBjcJTqjJ5aLYkmg6fW3Kfo/ZaYIYBo4xzWPyEHjhK+Ss+oV0ak8uzKAs/
    V9rA/VXnLmQLa+JWCQJAPxvmm5VLT0lFh6gYswvEJtUnJ++x1axbGlNxx+cg+vbT
    QSD5/EcAsiDP5HgX2BQ8VubV+cruuuOew56wcLjS/Q==
    -----END RSA PRIVATE KEY-----`)

    func mkSSLListener(addr string) (l net.Listener, err os.Error) {
    config := &tls.Config{
    //Rand: rand.Reader,
    Time: time.Nanoseconds,
    }
    config.Certificates = make([]tls.Certificate, 1)
    config.Certificates[0], err = tls.X509KeyPair(SERVER_CERT,
    SERVER_KEY)
    if err != nil {
    log.Printf("Certificates: ", err.String())
    return
    }
    l, e := tls.Listen("tcp", addr, config)
    if e != nil {
    log.Printf("Listen error : ", e)
    return
    }
    return
    }

    func mkTCPListener(addr string) (l net.Listener,err os.Error) {
    tcpaddr, err := net.ResolveTCPAddr("tcp", addr)
    if err != nil {log.Fatal("Resolve:",err)}
    l,err = net.ListenTCP("tcp", tcpaddr)
    return
    }


    func main() {
    var dialWithTls bool
    var listenWithTls bool
    var listenPort string
    flag.StringVar(&listenPort, "l", ":8080", "Address we'll listen to")
    flag.BoolVar(&dialWithTls, "rtls", false, "connect to target with SSL")
    flag.BoolVar(&listenWithTls, "ltls", false, "Listen to connections with SSL")
    flag.Parse()
    if flag.NArg() == 0 {log.Fatal("No address to connect")}
    lmap := map[bool]func(string)(net.Listener,os.Error){true:mkSSLListener,false:mkTCPListener}
    lsn, err := lmap[listenWithTls](listenPort)
    if err != nil {log.Fatal("Listen:",err)}
    maker := mkTcp(flag.Arg(0))
    if dialWithTls {
    log.Println("Dialing with TLS")
    maker = mkTls(flag.Arg(0))
    }
    redirect(lsn,maker)
    }