10
|
1 // OK : windows -> osx
|
|
2 // Not OK : osx -> windows
|
|
3 // OK : osx, win <-> yahoo.com
|
|
4 /*
|
|
5 Netcat
|
|
6
|
|
7 -v verbose
|
|
8 -vv very verbose
|
|
9 -w timeout [ -w 2 2seconds ]
|
|
10 -i interval
|
|
11 -s local source address
|
|
12 -z zero-I/O mode ( for portscan )
|
|
13 -u with UDP ( default use TCP )
|
|
14 -n don't resolve name/address
|
|
15 -d stealth mode ( don't read from stdin )
|
|
16 -l listen mode ( once )
|
|
17 -L listen mode ( continuous )
|
|
18
|
|
19 Portscan
|
|
20 $ nc -v -z -w 1 192.168.1.1 1-140
|
|
21 $ nc -u -v -z -w 1 192.168.1.1 1-140
|
|
22
|
|
23 Web-client
|
|
24 $ nc -v www.yahoo.com 80
|
|
25
|
|
26 File transfer
|
|
27 $ nc -l 1234 > file
|
|
28 % nc hoge.com 1234 < file
|
|
29
|
|
30 Backdoor
|
|
31 C:\> nc -L -d -e cmd.exe -p 8080
|
|
32
|
|
33 */
|
|
34 package main
|
|
35
|
|
36 import (
|
|
37 "flag"
|
|
38 "fmt"
|
|
39 "io"
|
|
40 "log"
|
|
41 "net"
|
|
42 "os"
|
|
43 )
|
|
44
|
|
45 func main() {
|
|
46
|
|
47 verbose := flag.Bool( "v", false, "verbose" )
|
|
48 vverbose := flag.Bool( "vv", false, "very verbose" )
|
|
49 udp := flag.Bool( "u", false, "with udp" )
|
|
50 // interval := flag.Int( "i", 0, "interval for lines sent, port scanned" )
|
|
51 // timeout := flag.Int( "w", 7, "timeout for connects and final net reads" )
|
|
52 listen := flag.Bool( "l", false, "listen mode" )
|
|
53 zmode := flag.Bool( "z", false, "zero-I/O mode" )
|
|
54 laddr := flag.String( "s", "", "local source address" )
|
|
55 example := flag.Bool( "e", false, "print examples" )
|
|
56
|
|
57 flag.Parse()
|
|
58
|
|
59 if *example {
|
|
60 printExample()
|
|
61 os.Exit( 0 )
|
|
62 }
|
|
63
|
|
64 if flag.NArg() == 0 {
|
|
65 fmt.Fprintf( os.Stderr, "netcat v0.1 (20170604)\n" )
|
|
66 fmt.Fprintf( os.Stderr, " -h or --help option\n" )
|
|
67 os.Exit( 0 )
|
|
68 }
|
|
69
|
|
70 p := "tcp"
|
|
71 if *udp {
|
|
72 p = "udp"
|
|
73 }
|
|
74
|
|
75 if *listen {
|
|
76
|
|
77 if flag.NArg() != 1 {
|
|
78 flag.PrintDefaults()
|
|
79 os.Exit( 1 )
|
|
80 }
|
|
81
|
|
82 port := flag.Arg( 0 )
|
|
83
|
|
84 addr := getLocalIP()
|
|
85 if *laddr == "" {
|
|
86 addr = *laddr
|
|
87 }
|
|
88
|
|
89 if *verbose || *vverbose {
|
|
90 msg := fmt.Sprintf( "listening... %s:%s[%s]", addr, port, p )
|
|
91 printVerbose( msg, "" )
|
|
92 }
|
|
93
|
|
94 l, err := net.Listen( p, net.JoinHostPort( addr, port ) )
|
|
95 if err != nil {
|
|
96 log.Fatal( err )
|
|
97 }
|
|
98 defer l.Close()
|
|
99
|
|
100 conn, err := l.Accept()
|
|
101 if err != nil {
|
|
102 log.Fatal( err )
|
|
103 }
|
|
104 io.Copy( os.Stdout, conn )
|
|
105 conn.Close()
|
|
106
|
|
107 } else {
|
|
108
|
|
109 if flag.NArg() != 2 {
|
|
110 flag.PrintDefaults()
|
|
111 os.Exit( 1 )
|
|
112 }
|
|
113
|
|
114 addr := flag.Arg( 0 )
|
|
115 port := flag.Arg( 1 )
|
|
116
|
|
117 conn, err := net.Dial( p, net.JoinHostPort( addr, port ) )
|
|
118 if err != nil {
|
|
119 log.Fatal( err )
|
|
120 }
|
|
121 defer conn.Close()
|
|
122 go mustCopy( os.Stdout, conn )
|
|
123 mustCopy( conn, os.Stdin )
|
|
124 }
|
|
125
|
|
126 if *zmode {
|
|
127 /*
|
|
128 address := "" // for me.
|
|
129 port := "1-1024"
|
|
130 server := address + ":" + port
|
|
131 */
|
|
132 }
|
|
133 }
|
|
134
|
|
135 func mustCopy( dst io.Writer, src io.Reader ) {
|
|
136 if _, err := io.Copy( dst, src ); err != nil {
|
|
137 log.Fatal( err )
|
|
138 }
|
|
139 }
|
|
140
|
|
141 func printVerbose( vmsg, vvmsg string ) {
|
|
142 fmt.Fprintln( os.Stderr, vmsg, vvmsg )
|
|
143 }
|
|
144
|
|
145 func printExample() {
|
|
146 fmt.Fprintln( os.Stderr, "\n[Exaples]" )
|
|
147 fmt.Fprintln( os.Stderr, " Portscan" )
|
|
148 fmt.Fprintln( os.Stderr, " $ nc -v -z -w 1 192.168.1.1 1-140" )
|
|
149 fmt.Fprintln( os.Stderr, " $ nc -u -v -z -w 1 192.168.1.1 1-140\n" )
|
|
150 fmt.Fprintln( os.Stderr, " Web-client" )
|
|
151 fmt.Fprintln( os.Stderr, " $ nc -v www.yahoo.com 80" )
|
|
152 fmt.Fprintln( os.Stderr, " GET / HTTP/1.0[Enter]" )
|
|
153 fmt.Fprintln( os.Stderr, " [ENTER]\n" )
|
|
154 fmt.Fprintln( os.Stderr, " File transfer" )
|
|
155 fmt.Fprintln( os.Stderr, " $ nc -l 1234 > file" )
|
|
156 fmt.Fprintln( os.Stderr, " % nc hoge.com 1234 < file\n" )
|
|
157 fmt.Fprintln( os.Stderr, " Backdoor" )
|
|
158 fmt.Fprintln( os.Stderr, " C:\\> nc -L -d -e cmd.exe -p 8080" )
|
|
159 }
|
|
160
|
|
161 func getLocalIP() string {
|
|
162 addrs, err := net.InterfaceAddrs()
|
|
163 if err != nil {
|
|
164 log.Fatal( err )
|
|
165 }
|
|
166 for _, addr := range addrs {
|
|
167 if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
|
|
168 if ipnet.IP.To4() != nil {
|
|
169 return ipnet.IP.String()
|
|
170 }
|
|
171 }
|
|
172 }
|
|
173 return "127.0.0.1"
|
|
174 }
|
|
175
|