HFish/core/protocol/vnc/vnc.go
2019-10-28 22:25:40 +08:00

185 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package vnc
import (
"io"
"log"
"net"
"fmt"
"strings"
"HFish/utils/is"
"HFish/core/rpc/client"
"HFish/core/report"
)
const VERSION = "RFB 003.008\n"
const CHALLENGE = "\x00\x00\x00\x00\x00\x00\x00\x00" +
"\x00\x00\x00\x00\x00\x00\x00\x00"
// 5900
func Start(address string) {
l, err := net.Listen("tcp", address)
if nil != err {
}
log.Printf("Listening on %v", l.Addr())
/* Accept and handle clients */
for {
c, err := l.Accept()
if nil != err {
log.Fatalf("Error accepting connection: %v", err)
}
arr := strings.Split(c.RemoteAddr().String(), ":")
// 判断是否为 RPC 客户端
if is.Rpc() {
go client.ReportResult("VNC", "VNC蜜罐", arr[0], "存在VNC扫描", "0")
} else {
go report.ReportVnc("VNC蜜罐", "本机", arr[0], "存在VNC扫描")
}
go handle(c, )
}
}
func handle(c net.Conn) {
defer c.Close()
/* Send our version */
if _, err := c.Write([]byte(VERSION)); nil != err {
log.Printf(
"%v Error before server version: %v",
c.RemoteAddr(),
err,
)
return
}
/* Get his version */
ver := make([]byte, len(VERSION))
n, err := io.ReadFull(c, ver)
ver = ver[:n]
if nil != err {
log.Printf(
"%v Disconnected before client version: %v",
c.RemoteAddr(),
err,
)
return
}
/* Handle versions 3 and 8 */
var cver = string(ver)
switch cver {
case "RFB 003.008\n": /* Protocol version 3.8 */
cver = "RFB 3.8"
/* Send number of security types (1) and the offered type
(2, VNC Auth) */
/* TODO: Also, offer ALL the auths */
if _, err := c.Write([]byte{
0x01, /* We will send one offered auth type */
0x02, /* VNC Auth */
}); nil != err {
log.Printf(
"%v Unable to offer auth type (%v): %v",
c.RemoteAddr(),
cver,
err,
)
return
}
/* Get security type client wants, which should be 2 for now */
buf := make([]byte, 1)
_, err = io.ReadFull(c, buf)
if nil != err {
log.Printf(
"%v Unable to read accepted security type "+
"(%v): %v",
c.RemoteAddr(),
cver,
err,
)
return
}
if 0x02 != buf[0] {
log.Printf(
"%v Accepted unsupported security type "+
"%v (%v)",
c.RemoteAddr(),
cver,
buf[0],
)
return
}
case "RFB 003.003\n": /* Protocol version 3.3, which is ancient */
cver = "RFB 3.3"
/* Tell the client to use VNC auth */
if _, err := c.Write([]byte{0, 0, 0, 2}); nil != err {
log.Printf(
"%v Unable to specify VNC auth (%v): %v",
c.RemoteAddr(),
cver,
err,
)
}
default:
/* Send an error message */
if _, err := c.Write(append(
[]byte{
0, /* 0 security types */
0, 0, 0, 20, /* 20-character message */
},
/* Failure message */
[]byte("Unsupported RFB version.")...,
)); nil != err {
log.Printf(
"%v Unable to send unsupported version "+
"message: %v",
c.RemoteAddr(),
err,
)
}
return
}
if _, err := c.Write([]byte(CHALLENGE)); nil != err {
log.Printf(
"%v Unable to send challenge: %v",
c.RemoteAddr(),
err,
)
return
}
/* Get response */
buf := make([]byte, 16)
n, err = io.ReadFull(c, buf)
buf = buf[:n]
if nil != err {
if 0 == n {
log.Printf(
"%v Unable to read auth response: %v",
c.RemoteAddr(),
err,
)
} else {
log.Printf(
"%v Received incomplete auth response: "+
"%q (%v)",
c.RemoteAddr(),
buf,
err,
)
}
return
}
fmt.Print(c.RemoteAddr())
/* Tell client auth failed */
c.Write(append(
[]byte{
0, 0, 0, 1, /* Failure word */
0, 0, 0, 29, /* Message length */
},
/* Failure message */
[]byte("Invalid username or password.")...,
))
}