changeset 10:b0784443ed87

add netcat and unsleep.
author pyon@macmini
date Sat, 04 Nov 2017 11:07:50 +0900
parents 54a75ff1c288
children c3a589f0521d
files src/netcat.go src/unsleep.go
diffstat 2 files changed, 255 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/netcat.go	Sat Nov 04 11:07:50 2017 +0900
@@ -0,0 +1,175 @@
+// OK : windows -> osx 
+// Not OK : osx -> windows
+// OK : osx, win <-> yahoo.com
+/*
+ Netcat
+
+ -v  verbose
+ -vv very verbose
+ -w  timeout [ -w 2 2seconds ]
+ -i  interval
+ -s  local source address
+ -z  zero-I/O mode ( for portscan )
+ -u  with UDP ( default use TCP )
+ -n  don't resolve name/address
+ -d  stealth mode ( don't read from stdin )
+ -l  listen mode ( once )
+ -L  listen mode ( continuous )
+
+ Portscan
+ $ nc -v -z -w 1 192.168.1.1 1-140
+ $ nc -u -v -z -w 1 192.168.1.1 1-140
+
+ Web-client
+ $ nc -v www.yahoo.com 80
+
+ File transfer
+ $ nc -l 1234 >  file
+ % nc hoge.com 1234 < file
+
+ Backdoor
+ C:\> nc -L -d -e cmd.exe -p 8080
+
+ */
+package main
+
+import (
+    "flag"
+    "fmt"
+    "io"
+    "log"
+    "net"
+    "os"
+)
+
+func main() {
+
+    verbose  := flag.Bool( "v", false, "verbose" )
+    vverbose := flag.Bool( "vv", false, "very verbose" )
+    udp      := flag.Bool( "u", false, "with udp" )
+//    interval := flag.Int( "i", 0, "interval for lines sent, port scanned" )
+//    timeout := flag.Int( "w", 7, "timeout for connects and final net reads" )
+    listen   := flag.Bool( "l", false, "listen mode" )
+    zmode    := flag.Bool( "z", false, "zero-I/O mode" )
+    laddr    := flag.String( "s", "", "local source address" )
+    example  := flag.Bool( "e", false, "print examples" )
+
+    flag.Parse()
+
+    if *example {
+        printExample()
+        os.Exit( 0 )
+    }
+
+    if flag.NArg() == 0 {
+        fmt.Fprintf( os.Stderr, "netcat v0.1 (20170604)\n" )
+        fmt.Fprintf( os.Stderr, " -h or --help option\n" )
+        os.Exit( 0 )
+    }
+
+    p := "tcp"
+    if *udp {
+        p = "udp"
+    }
+
+    if *listen {
+
+        if flag.NArg() != 1 {
+            flag.PrintDefaults()
+            os.Exit( 1 )
+        }
+
+        port := flag.Arg( 0 )
+
+        addr := getLocalIP()
+        if *laddr == "" {
+            addr = *laddr
+        }
+
+        if *verbose || *vverbose {
+            msg := fmt.Sprintf( "listening... %s:%s[%s]", addr, port, p )
+            printVerbose( msg, "" )
+        }
+
+        l, err := net.Listen( p, net.JoinHostPort( addr, port ) )
+        if err != nil {
+            log.Fatal( err )
+        }
+        defer l.Close()
+
+        conn, err := l.Accept()
+        if err != nil {
+            log.Fatal( err )
+        }
+        io.Copy( os.Stdout, conn )
+        conn.Close()
+
+    } else {
+
+        if flag.NArg() != 2 {
+            flag.PrintDefaults()
+            os.Exit( 1 )
+        }
+
+        addr := flag.Arg( 0 )
+        port := flag.Arg( 1 )
+
+        conn, err := net.Dial( p, net.JoinHostPort( addr, port ) )
+        if err != nil {
+            log.Fatal( err )
+        }
+        defer conn.Close()
+        go mustCopy( os.Stdout, conn )
+        mustCopy( conn, os.Stdin )
+    }
+
+    if *zmode {
+        /*
+        address := "" // for me.
+        port := "1-1024"
+        server := address + ":" + port
+        */
+    }
+}
+
+func mustCopy( dst io.Writer, src io.Reader ) {
+    if _, err := io.Copy( dst, src ); err != nil {
+        log.Fatal( err )
+    }
+}
+
+func printVerbose( vmsg, vvmsg string ) {
+    fmt.Fprintln( os.Stderr, vmsg, vvmsg )
+}
+
+func printExample() {
+    fmt.Fprintln( os.Stderr, "\n[Exaples]" )
+    fmt.Fprintln( os.Stderr, "  Portscan" )
+    fmt.Fprintln( os.Stderr, "   $ nc -v -z -w 1 192.168.1.1 1-140" )
+    fmt.Fprintln( os.Stderr, "   $ nc -u -v -z -w 1 192.168.1.1 1-140\n" )
+    fmt.Fprintln( os.Stderr, "  Web-client" )
+    fmt.Fprintln( os.Stderr, "   $ nc -v www.yahoo.com 80" )
+    fmt.Fprintln( os.Stderr, "   GET / HTTP/1.0[Enter]" )
+    fmt.Fprintln( os.Stderr, "   [ENTER]\n" )
+    fmt.Fprintln( os.Stderr, "  File transfer" )
+    fmt.Fprintln( os.Stderr, "   $ nc -l 1234 >  file" )
+    fmt.Fprintln( os.Stderr, "   % nc hoge.com 1234 < file\n" )
+    fmt.Fprintln( os.Stderr, "  Backdoor" )
+    fmt.Fprintln( os.Stderr, "   C:\\> nc -L -d -e cmd.exe -p 8080" )
+}
+
+func getLocalIP() string {
+    addrs, err := net.InterfaceAddrs()
+    if err != nil {
+        log.Fatal( err )
+    }
+    for _, addr := range addrs {
+        if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
+            if ipnet.IP.To4() != nil {
+                return ipnet.IP.String()
+            }
+        }
+    }
+    return "127.0.0.1"
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/unsleep.go	Sat Nov 04 11:07:50 2017 +0900
@@ -0,0 +1,80 @@
+package main
+
+import(
+    "flag"
+    "fmt"
+    "time"
+    "os"
+)
+
+var sec = 0
+
+func main() {
+
+    // arguments
+    t := flag.Int( "t", 1, "interval" )
+    s := flag.Bool( "s", false, "normal sleep" )
+    q := flag.Bool( "q", false, "quiet ( not print count and time )" )
+    c := flag.Int( "c", 0, "loop count ( without [s] )" )
+    m := flag.Bool( "m", false, "print every minute ( without [q] )" )
+    b := flag.Bool( "b", false, "beep" )
+
+    flag.Parse()
+
+    if *t > 0 {
+
+        if !*q {
+            s := fmt.Sprintf( "[%04d] %s ...", *c, time.Now().Format( "15:04:05" ) )
+            fmt.Println( s )
+        }
+
+        if *s {
+            for i := 0; i < *t; i++ {
+                sleep1ms( *q, *m, *b, i + 1 )
+            }
+            os.Exit( 0 )
+        }
+
+        if *c < 0 {
+            fmt.Fprintln( os.Stderr, "bad loop count." )
+            os.Exit( 1 )
+        }
+        if *c > 0 {
+            for i := 0; i < *c; i++ {
+                sleep1ms( *q, *m, *b, *c - i - 1 )
+            }
+        } else {
+            n := 1
+            for {
+                sleep1ms( *q, *m, *b, n )
+                n++
+            }
+        }
+
+    } else {
+        fmt.Fprintln( os.Stderr, "bad time." )
+        os.Exit( 1 )
+    }
+}
+
+func sleep1ms( quiet, minute, beep bool, n int ) {
+
+    s := time.Duration( 1.00 * 1000 ) * time.Millisecond
+    time.Sleep( s )
+    sec++
+
+    if minute && sec % 60 == 0 {
+        str := fmt.Sprintf( "[%04d] %s", n / 60, time.Now().Format( "15:04:05" ) )
+        fmt.Println( str )
+    }
+    if !quiet && !minute {
+        str := fmt.Sprintf( "[%04d] %s", n, time.Now().Format( "15:04:05" ) )
+        fmt.Println( str )
+    }
+
+    if beep {
+        //os.Stdout.Write( []byte( "\u0007" ) )
+        fmt.Print( "\a" )
+    }
+}
+