add redirect; godoc for connection.go; remove debugging from tests
This commit is contained in:
parent
5c081acbe5
commit
9a5549940f
@ -1,8 +1,6 @@
|
|||||||
package oracle
|
package oracle
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
@ -16,67 +14,53 @@ const (
|
|||||||
logIndexNSNResponse = 3
|
logIndexNSNResponse = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// HandshakeLog gives the results of the initial connection handshake in a form
|
||||||
|
// suitable for zgrab2 output.
|
||||||
type HandshakeLog struct {
|
type HandshakeLog struct {
|
||||||
RawAccept []byte `json:"raw_accept,omitempty" zgrab:"debug"`
|
// AcceptVersion is the protocol version value from the Accept packet.
|
||||||
AcceptVersion uint16 `json:"accept_version"`
|
AcceptVersion uint16 `json:"accept_version"`
|
||||||
GlobalServiceOptions map[string]bool `json:"global_service_options,omitempty"`
|
|
||||||
ConnectFlags [2]map[string]bool `json:"connect_flags,omitempty"`
|
|
||||||
|
|
||||||
|
// GlobalServiceOptions is the set of GlobalServiceOptions flags that the
|
||||||
|
// server returns in the Accept packet.
|
||||||
|
GlobalServiceOptions map[string]bool `json:"global_service_options,omitempty"`
|
||||||
|
|
||||||
|
// ConnectFlags is the ste of ConnectFlags values that the server returns
|
||||||
|
// in the Accept packet. Both are included in the array.
|
||||||
|
ConnectFlags [2]map[string]bool `json:"connect_flags,omitempty"`
|
||||||
|
|
||||||
|
// DidResend is true if the server sent a Resend packet in response to the
|
||||||
|
// client's first Connect packet.
|
||||||
DidResend bool `json:"did_resend"`
|
DidResend bool `json:"did_resend"`
|
||||||
|
|
||||||
RawNSN []byte `json:"raw_nsn,omitempty" zgrab:"debug"`
|
// RedirectTarget is the connection string returned by the server in the
|
||||||
NSNVersion string `json:"nsn_version,omitempty"`
|
// Redirect packet, if one is sent. Otherwise it is empty/omitted.
|
||||||
|
RedirectTarget string `json:"redirect_target,omitempty"`
|
||||||
|
|
||||||
|
// DidResend is set to true if the server sent a Resend packet after the
|
||||||
|
// first Connect packet.
|
||||||
|
|
||||||
|
// NSNVersion is the ReleaseVersion string (in dotted decimal format) in the
|
||||||
|
// root of the Native Service Negotiation packet.
|
||||||
|
NSNVersion string `json:"nsn_version,omitempty"`
|
||||||
|
|
||||||
|
// NSNServiceVersions is a map from the Native Service Negotiation service
|
||||||
|
// name to the ReleaseVersion in that service packet.
|
||||||
NSNServiceVersions map[string]string `json:"nsn_service_versions,omitempty"`
|
NSNServiceVersions map[string]string `json:"nsn_service_versions,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type PacketLogEntry struct {
|
// Connection holds the state for a scan connection to the Oracle server.
|
||||||
Outgoing bool
|
|
||||||
Data []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
type loggedReader struct {
|
|
||||||
reader io.Reader
|
|
||||||
data []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func logReader(reader io.Reader) *loggedReader {
|
|
||||||
return &loggedReader{reader: reader}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (reader *loggedReader) Read(data []byte) (int, error) {
|
|
||||||
n, err := reader.reader.Read(data)
|
|
||||||
if err != nil {
|
|
||||||
reader.data = append(reader.data, data[0:n]...)
|
|
||||||
}
|
|
||||||
return n, err
|
|
||||||
}
|
|
||||||
|
|
||||||
type Connection struct {
|
type Connection struct {
|
||||||
conn net.Conn
|
conn net.Conn
|
||||||
target *zgrab2.ScanTarget
|
target *zgrab2.ScanTarget
|
||||||
scanner *Scanner
|
scanner *Scanner
|
||||||
resent bool
|
resent bool
|
||||||
packetLog []PacketLogEntry
|
redirect string
|
||||||
reader *loggedReader
|
|
||||||
}
|
|
||||||
|
|
||||||
func (conn *Connection) getLastPacket(outgoing bool) []byte {
|
|
||||||
for i := range conn.packetLog {
|
|
||||||
r := len(conn.packetLog) - i - 1
|
|
||||||
v := conn.packetLog[r]
|
|
||||||
if v.Outgoing == outgoing {
|
|
||||||
return v.Data
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (conn *Connection) send(data []byte) error {
|
func (conn *Connection) send(data []byte) error {
|
||||||
conn.appendLogEntry(true, data)
|
|
||||||
rest := data
|
rest := data
|
||||||
n := 0
|
n := 0
|
||||||
for n < len(rest) {
|
for n < len(rest) {
|
||||||
fmt.Println("n=", n, "rest=", len(rest))
|
|
||||||
n, err := conn.conn.Write(rest)
|
n, err := conn.conn.Write(rest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -86,18 +70,8 @@ func (conn *Connection) send(data []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (conn *Connection) appendLogEntry(outgoing bool, data []byte) {
|
|
||||||
conn.packetLog = append(conn.packetLog, PacketLogEntry{
|
|
||||||
Outgoing: outgoing,
|
|
||||||
Data: data,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (conn *Connection) readPacket() (*TNSPacket, error) {
|
func (conn *Connection) readPacket() (*TNSPacket, error) {
|
||||||
wrapped := logReader(conn.conn)
|
return ReadTNSPacket(conn.conn)
|
||||||
ret, err := ReadTNSPacket(wrapped)
|
|
||||||
conn.appendLogEntry(false, wrapped.data)
|
|
||||||
return ret, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (conn *Connection) SendPacket(packet TNSPacketBody) (TNSPacketBody, error) {
|
func (conn *Connection) SendPacket(packet TNSPacketBody) (TNSPacketBody, error) {
|
||||||
@ -135,21 +109,13 @@ func u16Flag(v string) uint16 {
|
|||||||
return uint16(ret)
|
return uint16(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
func dump(tag string, val interface{}) {
|
|
||||||
j, err := json.MarshalIndent(val, " ", " ")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
fmt.Println(tag + "=[[" + string(j) + "]]")
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
func (conn *Connection) Connect(connectionString string) (*HandshakeLog, error) {
|
func (conn *Connection) Connect(connectionString string) (*HandshakeLog, error) {
|
||||||
result := HandshakeLog{}
|
result := HandshakeLog{}
|
||||||
if len(connectionString) > 0x7fff {
|
extraData := []byte{}
|
||||||
|
if len(connectionString)+len(extraData)+0x3A > 0x7fff {
|
||||||
return nil, ErrInvalidInput
|
return nil, ErrInvalidInput
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Variable fields in the connection string (e.g. host?)
|
// TODO: Variable fields in the connection string (e.g. host?)
|
||||||
connectPacket := &TNSConnect{
|
connectPacket := &TNSConnect{
|
||||||
Version: conn.scanner.config.Version,
|
Version: conn.scanner.config.Version,
|
||||||
@ -159,9 +125,9 @@ func (conn *Connection) Connect(connectionString string) (*HandshakeLog, error)
|
|||||||
TDU: u16Flag(conn.scanner.config.TDU),
|
TDU: u16Flag(conn.scanner.config.TDU),
|
||||||
ProtocolCharacteristics: NTProtocolCharacteristics(u16Flag(conn.scanner.config.ProtocolCharacterisics)),
|
ProtocolCharacteristics: NTProtocolCharacteristics(u16Flag(conn.scanner.config.ProtocolCharacterisics)),
|
||||||
MaxBeforeAck: 0,
|
MaxBeforeAck: 0,
|
||||||
ByteOrder: DefaultByteOrder,
|
ByteOrder: defaultByteOrder,
|
||||||
DataLength: uint16(len(connectionString)),
|
DataLength: uint16(len(connectionString)),
|
||||||
DataOffset: 0x003A,
|
DataOffset: uint16(0x003A + len(extraData)),
|
||||||
MaxResponseSize: 0x00000800,
|
MaxResponseSize: 0x00000800,
|
||||||
ConnectFlags0: ConnectFlags(u16Flag(conn.scanner.config.ConnectFlags) & 0xff),
|
ConnectFlags0: ConnectFlags(u16Flag(conn.scanner.config.ConnectFlags) & 0xff),
|
||||||
ConnectFlags1: ConnectFlags(u16Flag(conn.scanner.config.ConnectFlags) >> 8),
|
ConnectFlags1: ConnectFlags(u16Flag(conn.scanner.config.ConnectFlags) >> 8),
|
||||||
@ -169,22 +135,30 @@ func (conn *Connection) Connect(connectionString string) (*HandshakeLog, error)
|
|||||||
CrossFacility1: 0,
|
CrossFacility1: 0,
|
||||||
ConnectionID0: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
ConnectionID0: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
ConnectionID1: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
ConnectionID1: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
Unknown3A: []byte{},
|
Unknown3A: extraData,
|
||||||
ConnectionString: connectionString,
|
ConnectionString: connectionString,
|
||||||
}
|
}
|
||||||
response, err := conn.SendPacket(connectPacket)
|
response, err := conn.SendPacket(connectPacket)
|
||||||
|
// TODO: handle redirect
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if conn.resent {
|
if conn.resent {
|
||||||
result.DidResend = true
|
result.DidResend = true
|
||||||
}
|
}
|
||||||
result.RawAccept = conn.getLastPacket(false)
|
var accept *TNSAccept
|
||||||
|
switch resp := response.(type) {
|
||||||
accept, ok := response.(*TNSAccept)
|
case *TNSAccept:
|
||||||
if !ok {
|
accept = resp
|
||||||
|
break
|
||||||
|
case *TNSRedirect:
|
||||||
|
result.RedirectTarget = string(resp.Data)
|
||||||
|
// TODO: Follow redirects?
|
||||||
|
return &result, nil
|
||||||
|
default:
|
||||||
return &result, ErrUnexpectedResponse
|
return &result, ErrUnexpectedResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Unclear what these do. Taken from my client.
|
// TODO: Unclear what these do. Taken from my client.
|
||||||
result.AcceptVersion = accept.Version
|
result.AcceptVersion = accept.Version
|
||||||
result.GlobalServiceOptions = accept.GlobalServiceOptions.Set()
|
result.GlobalServiceOptions = accept.GlobalServiceOptions.Set()
|
||||||
@ -221,6 +195,7 @@ func (conn *Connection) Connect(connectionString string) (*HandshakeLog, error)
|
|||||||
nsnRequest := &TNSData{
|
nsnRequest := &TNSData{
|
||||||
DataFlags: 0,
|
DataFlags: 0,
|
||||||
Data: (&TNSDataNSN{
|
Data: (&TNSDataNSN{
|
||||||
|
ID: 0xdeadbeef,
|
||||||
Version: EncodeReleaseVersion(conn.scanner.config.ReleaseVersion),
|
Version: EncodeReleaseVersion(conn.scanner.config.ReleaseVersion),
|
||||||
Options: NSNOptions(0),
|
Options: NSNOptions(0),
|
||||||
Services: []NSNService{
|
Services: []NSNService{
|
||||||
@ -268,8 +243,6 @@ func (conn *Connection) Connect(connectionString string) (*HandshakeLog, error)
|
|||||||
return &result, err
|
return &result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
result.RawNSN = conn.getLastPacket(false)
|
|
||||||
|
|
||||||
wrappedNSNResponse, ok := response.(*TNSData)
|
wrappedNSNResponse, ok := response.(*TNSData)
|
||||||
if !ok {
|
if !ok {
|
||||||
return &result, ErrUnexpectedResponse
|
return &result, ErrUnexpectedResponse
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -4,13 +4,9 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"math"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func max(a, b int) int {
|
func max(a, b int) int {
|
||||||
@ -20,12 +16,13 @@ func max(a, b int) int {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// debugging -- interleave hex dumps of expected/actual, highlight differences
|
||||||
func interleave(expected, actual []byte) string {
|
func interleave(expected, actual []byte) string {
|
||||||
ret := make([]string, 0)
|
ret := make([]string, 0)
|
||||||
e := strings.Split(string(hex.Dump(expected)), "\n")
|
e := strings.Split(string(hex.Dump(expected)), "\n")
|
||||||
a := strings.Split(string(hex.Dump(actual)), "\n")
|
a := strings.Split(string(hex.Dump(actual)), "\n")
|
||||||
n := max(len(e), len(a))
|
n := max(len(e), len(a))
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n-1; i++ {
|
||||||
var ei, ai string = "", ""
|
var ei, ai string = "", ""
|
||||||
if i < len(e) {
|
if i < len(e) {
|
||||||
ei = e[i]
|
ei = e[i]
|
||||||
@ -54,15 +51,6 @@ func interleave(expected, actual []byte) string {
|
|||||||
return strings.Join(ret, "\n")
|
return strings.Join(ret, "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
type Buffer struct {
|
|
||||||
Data []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func (buf *Buffer) Write(data []byte) (int, error) {
|
|
||||||
buf.Data = append(buf.Data, data...)
|
|
||||||
return len(data), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromHex(h string) []byte {
|
func fromHex(h string) []byte {
|
||||||
bytes := strings.Fields(h)
|
bytes := strings.Fields(h)
|
||||||
ret := make([]byte, len(bytes))
|
ret := make([]byte, len(bytes))
|
||||||
@ -154,6 +142,7 @@ var validTNSData = map[string]TestCase{
|
|||||||
Body: &TNSData{
|
Body: &TNSData{
|
||||||
DataFlags: 0,
|
DataFlags: 0,
|
||||||
Data: (&TNSDataNSN{
|
Data: (&TNSDataNSN{
|
||||||
|
ID: 0xdeadbeef,
|
||||||
Version: EncodeReleaseVersion("10.2.0.3.0"),
|
Version: EncodeReleaseVersion("10.2.0.3.0"),
|
||||||
Options: NSNOptions(0),
|
Options: NSNOptions(0),
|
||||||
Services: []NSNService{
|
Services: []NSNService{
|
||||||
@ -217,15 +206,6 @@ var validTNSData = map[string]TestCase{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
type TestCaseOld struct {
|
|
||||||
ConnectEncoding string
|
|
||||||
ConnectHeader *TNSHeader
|
|
||||||
ConnectValue *TNSConnect
|
|
||||||
AcceptEncoding string
|
|
||||||
AcceptHeader *TNSHeader
|
|
||||||
AcceptValue *TNSAccept
|
|
||||||
}
|
|
||||||
|
|
||||||
var validTNSConnect = map[string]TestCase{
|
var validTNSConnect = map[string]TestCase{
|
||||||
"01. 013A-0139": TestCase{
|
"01. 013A-0139": TestCase{
|
||||||
Encoding: "00 ca 00 00 01 00 00 00 01 3a 01 2c 0c 41 20 00 " + /* .........:.,.A . */
|
Encoding: "00 ca 00 00 01 00 00 00 01 3a 01 2c 0c 41 20 00 " + /* .........:.,.A . */
|
||||||
@ -251,7 +231,7 @@ var validTNSConnect = map[string]TestCase{
|
|||||||
TDU: 0xffff,
|
TDU: 0xffff,
|
||||||
ProtocolCharacteristics: NTPCConfirmedRelease | NTPCTDUBasedIO | NTPCSpawnerRunning | NTPCDataTest | NTPCCallbackIO | NTPCAsyncIO | NTPCPacketIO | NTPCGenerateSIGURG, // 0x7F08
|
ProtocolCharacteristics: NTPCConfirmedRelease | NTPCTDUBasedIO | NTPCSpawnerRunning | NTPCDataTest | NTPCCallbackIO | NTPCAsyncIO | NTPCPacketIO | NTPCGenerateSIGURG, // 0x7F08
|
||||||
MaxBeforeAck: 0,
|
MaxBeforeAck: 0,
|
||||||
ByteOrder: DefaultByteOrder,
|
ByteOrder: defaultByteOrder,
|
||||||
DataLength: 0x0090,
|
DataLength: 0x0090,
|
||||||
DataOffset: 0x003A,
|
DataOffset: 0x003A,
|
||||||
MaxResponseSize: 0x00000800,
|
MaxResponseSize: 0x00000800,
|
||||||
@ -293,7 +273,7 @@ var validTNSConnect = map[string]TestCase{
|
|||||||
TDU: 0x7fff,
|
TDU: 0x7fff,
|
||||||
ProtocolCharacteristics: NTPCHangon | NTPCCallbackIO | NTPCAsyncIO | NTPCGenerateSIGURG | NTPCUrgentIO | NTPCFullDuplex, // 0x860e
|
ProtocolCharacteristics: NTPCHangon | NTPCCallbackIO | NTPCAsyncIO | NTPCGenerateSIGURG | NTPCUrgentIO | NTPCFullDuplex, // 0x860e
|
||||||
MaxBeforeAck: 0,
|
MaxBeforeAck: 0,
|
||||||
ByteOrder: DefaultByteOrder,
|
ByteOrder: defaultByteOrder,
|
||||||
DataLength: 0x00c6,
|
DataLength: 0x00c6,
|
||||||
DataOffset: 0x003a,
|
DataOffset: 0x003a,
|
||||||
MaxResponseSize: 0x00000200,
|
MaxResponseSize: 0x00000200,
|
||||||
@ -334,7 +314,7 @@ var validTNSConnect = map[string]TestCase{
|
|||||||
TDU: 0x7fff,
|
TDU: 0x7fff,
|
||||||
ProtocolCharacteristics: NTPCHangon | NTPCCallbackIO | NTPCAsyncIO | NTPCGenerateSIGURG | NTPCUrgentIO | NTPCFullDuplex, // 0x860e
|
ProtocolCharacteristics: NTPCHangon | NTPCCallbackIO | NTPCAsyncIO | NTPCGenerateSIGURG | NTPCUrgentIO | NTPCFullDuplex, // 0x860e
|
||||||
MaxBeforeAck: 0,
|
MaxBeforeAck: 0,
|
||||||
ByteOrder: DefaultByteOrder,
|
ByteOrder: defaultByteOrder,
|
||||||
DataLength: 0x00b2,
|
DataLength: 0x00b2,
|
||||||
DataOffset: 0x003a,
|
DataOffset: 0x003a,
|
||||||
MaxResponseSize: 0x00000200,
|
MaxResponseSize: 0x00000200,
|
||||||
@ -374,7 +354,7 @@ var validTNSConnect = map[string]TestCase{
|
|||||||
TDU: 0xffff,
|
TDU: 0xffff,
|
||||||
ProtocolCharacteristics: NTPCConfirmedRelease | NTPCTDUBasedIO | NTPCSpawnerRunning | NTPCDataTest | NTPCCallbackIO | NTPCAsyncIO | NTPCPacketIO | NTPCGenerateSIGURG, // 0x7F08
|
ProtocolCharacteristics: NTPCConfirmedRelease | NTPCTDUBasedIO | NTPCSpawnerRunning | NTPCDataTest | NTPCCallbackIO | NTPCAsyncIO | NTPCPacketIO | NTPCGenerateSIGURG, // 0x7F08
|
||||||
MaxBeforeAck: 0,
|
MaxBeforeAck: 0,
|
||||||
ByteOrder: DefaultByteOrder,
|
ByteOrder: defaultByteOrder,
|
||||||
DataLength: 0x0091,
|
DataLength: 0x0091,
|
||||||
DataOffset: 0x0046, // points past the 12 bytes of \x00/\x20 at the start
|
DataOffset: 0x0046, // points past the 12 bytes of \x00/\x20 at the start
|
||||||
MaxResponseSize: 0x00000800,
|
MaxResponseSize: 0x00000800,
|
||||||
@ -389,6 +369,46 @@ var validTNSConnect = map[string]TestCase{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"unknown3a": TestCase{
|
||||||
|
Encoding: "00 d7 00 00 01 00 00 00 01 3b 01 2c 0c 41 20 00 " + /* .........;.,.A . */
|
||||||
|
"ff ff 7f 08 00 00 01 00 00 91 00 46 00 00 08 00 " + /* ...........F.... */
|
||||||
|
"41 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " + /* AA.............. */
|
||||||
|
"00 00 00 00 00 00 00 00 00 00 12 34 56 78 9a bc " + /* ............ .. */
|
||||||
|
"de fe dc ba 98 76 28 44 45 53 43 52 49 50 54 49 " + /* ......(DESCRIPTI */
|
||||||
|
"4f 4e 3d 28 43 4f 4e 4e 45 43 54 5f 44 41 54 41 " + /* ON=(CONNECT_DATA */
|
||||||
|
"3d 28 53 49 44 3d 6f 72 63 6c 31 31 67 29 28 43 " + /* =(SID=orcl11g)(C */
|
||||||
|
"49 44 3d 28 50 52 4f 47 52 41 4d 3d 73 71 6c 70 " + /* ID=(PROGRAM=sqlp */
|
||||||
|
"6c 75 73 40 6b 61 6c 69 29 28 48 4f 53 54 3d 6b " + /* lus@kali)(HOST=k */
|
||||||
|
"61 6c 69 29 28 55 53 45 52 3d 72 6f 6f 74 29 29 " + /* ali)(USER=root)) */
|
||||||
|
"29 28 41 44 44 52 45 53 53 3d 28 50 52 4f 54 4f " + /* )(ADDRESS=(PROTO */
|
||||||
|
"43 4f 4c 3d 54 43 50 29 28 48 4f 53 54 3d 31 30 " + /* COL=TCP)(HOST=10 */
|
||||||
|
"2e 30 2e 37 32 2e 31 31 33 29 28 50 4f 52 54 3d " + /* .0.72.113)(PORT= */
|
||||||
|
"31 35 32 31 29 29 29 ",
|
||||||
|
Value: &TNSPacket{
|
||||||
|
Header: &TNSHeader{Length: 0x00d7, PacketChecksum: 0, Type: PacketTypeConnect, Flags: 0, HeaderChecksum: 0},
|
||||||
|
Body: &TNSConnect{
|
||||||
|
Version: 0x013b,
|
||||||
|
MinVersion: 0x012c,
|
||||||
|
GlobalServiceOptions: SOHeaderChecksum | SOFullDuplex | SOUnknown0040 | SOUnknown0001, // (0x0c41)
|
||||||
|
SDU: 0x2000,
|
||||||
|
TDU: 0xffff,
|
||||||
|
ProtocolCharacteristics: NTPCConfirmedRelease | NTPCTDUBasedIO | NTPCSpawnerRunning | NTPCDataTest | NTPCCallbackIO | NTPCAsyncIO | NTPCPacketIO | NTPCGenerateSIGURG, // 0x7F08
|
||||||
|
MaxBeforeAck: 0,
|
||||||
|
ByteOrder: defaultByteOrder,
|
||||||
|
DataLength: 0x0091,
|
||||||
|
DataOffset: 0x0046,
|
||||||
|
MaxResponseSize: 0x00000800,
|
||||||
|
ConnectFlags0: CFUnknown40 | CFServicesWanted,
|
||||||
|
ConnectFlags1: CFUnknown40 | CFServicesWanted,
|
||||||
|
CrossFacility0: 0,
|
||||||
|
CrossFacility1: 0,
|
||||||
|
ConnectionID0: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
|
ConnectionID1: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
|
Unknown3A: []byte{0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xfe, 0xdc, 0xba, 0x98, 0x76},
|
||||||
|
ConnectionString: "(DESCRIPTION=(CONNECT_DATA=(SID=orcl11g)(CID=(PROGRAM=sqlplus@kali)(HOST=kali)(USER=root)))(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.72.113)(PORT=1521)))",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var validTNSAccept = map[string]TestCase{
|
var validTNSAccept = map[string]TestCase{
|
||||||
@ -402,7 +422,7 @@ var validTNSAccept = map[string]TestCase{
|
|||||||
GlobalServiceOptions: 0,
|
GlobalServiceOptions: 0,
|
||||||
SDU: 0x0800,
|
SDU: 0x0800,
|
||||||
TDU: 0x7fff,
|
TDU: 0x7fff,
|
||||||
ByteOrder: DefaultByteOrder,
|
ByteOrder: defaultByteOrder,
|
||||||
DataLength: 0,
|
DataLength: 0,
|
||||||
DataOffset: 0x20,
|
DataOffset: 0x20,
|
||||||
ConnectFlags0: CFUnknown40 | CFUnknown20 | CFServicesWanted,
|
ConnectFlags0: CFUnknown40 | CFUnknown20 | CFServicesWanted,
|
||||||
@ -414,243 +434,6 @@ var validTNSAccept = map[string]TestCase{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var old1ValidTNSConnect = map[string]TestCaseOld{
|
|
||||||
"01. 013A-0139": TestCaseOld{
|
|
||||||
ConnectEncoding: "00 ca 00 00 01 00 00 00 01 3a 01 2c 0c 41 20 00 " + /* .........:.,.A . */
|
|
||||||
"ff ff 7f 08 00 00 01 00 00 90 00 3a 00 00 08 00 " + /* ...........:.... */
|
|
||||||
"41 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " + /* AA.............. */
|
|
||||||
"00 00 00 00 00 00 00 00 00 00 28 44 45 53 43 52 " + /* ..........(DESCR */
|
|
||||||
"49 50 54 49 4f 4e 3d 28 43 4f 4e 4e 45 43 54 5f " + /* IPTION=(CONNECT_ */
|
|
||||||
"44 41 54 41 3d 28 53 45 52 56 49 43 45 5f 4e 41 " + /* DATA=(SERVICE_NA */
|
|
||||||
"4d 45 3d 63 6b 64 62 29 28 43 49 44 3d 28 50 52 " + /* ME=ckdb)(CID=(PR */
|
|
||||||
"4f 47 52 41 4d 3d 67 73 71 6c 29 28 48 4f 53 54 " + /* OGRAM=gsql)(HOST */
|
|
||||||
"3d 4d 63 41 66 65 65 29 28 55 53 45 52 3d 72 6f " + /* =McAfee)(USER=ro */
|
|
||||||
"6f 74 29 29 29 28 41 44 44 52 45 53 53 3d 28 50 " + /* ot)))(ADDRESS=(P */
|
|
||||||
"52 4f 54 4f 43 4f 4c 3d 54 43 50 29 28 48 4f 53 " + /* ROTOCOL=TCP)(HOS */
|
|
||||||
"54 3d 31 30 2e 31 2e 35 30 2e 31 34 29 28 50 4f " + /* T=10.1.50.14)(PO */
|
|
||||||
"52 54 3d 31 35 32 31 29 29 29 ", /* RT=1521))) */
|
|
||||||
ConnectHeader: &TNSHeader{Length: 0x00ca, PacketChecksum: 0, Type: PacketTypeConnect, Flags: 0, HeaderChecksum: 0},
|
|
||||||
ConnectValue: &TNSConnect{
|
|
||||||
Version: 0x013a,
|
|
||||||
MinVersion: 0x012c,
|
|
||||||
GlobalServiceOptions: SOHeaderChecksum | SOFullDuplex | SOUnknown0040 | SOUnknown0001, // (0x0c41)
|
|
||||||
SDU: 0x2000,
|
|
||||||
TDU: 0xffff,
|
|
||||||
ProtocolCharacteristics: NTPCConfirmedRelease | NTPCTDUBasedIO | NTPCSpawnerRunning | NTPCDataTest | NTPCCallbackIO | NTPCAsyncIO | NTPCPacketIO | NTPCGenerateSIGURG, // 0x7F08
|
|
||||||
MaxBeforeAck: 0,
|
|
||||||
ByteOrder: DefaultByteOrder,
|
|
||||||
DataLength: 0x0090,
|
|
||||||
DataOffset: 0x003A,
|
|
||||||
MaxResponseSize: 0x00000800,
|
|
||||||
ConnectFlags0: CFUnknown40 | CFServicesWanted,
|
|
||||||
ConnectFlags1: CFUnknown40 | CFServicesWanted,
|
|
||||||
CrossFacility0: 0,
|
|
||||||
CrossFacility1: 0,
|
|
||||||
ConnectionID0: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
|
||||||
ConnectionID1: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
|
||||||
Unknown3A: []byte{},
|
|
||||||
ConnectionString: "(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=ckdb)(CID=(PROGRAM=gsql)(HOST=McAfee)(USER=root)))(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.50.14)(PORT=1521)))",
|
|
||||||
},
|
|
||||||
AcceptEncoding: "00 20 00 00 02 00 00 00 01 39 00 00 08 00 7f ff " + /* . .......9...... */
|
|
||||||
"01 00 00 00 00 20 61 61 00 00 00 00 00 00 00 00 ", /* ..... aa........ */
|
|
||||||
AcceptHeader: &TNSHeader{Length: 0x0020, PacketChecksum: 0, Type: PacketTypeAccept, Flags: 0, HeaderChecksum: 0},
|
|
||||||
AcceptValue: &TNSAccept{
|
|
||||||
Version: 0x0139,
|
|
||||||
GlobalServiceOptions: 0,
|
|
||||||
SDU: 0x0800,
|
|
||||||
TDU: 0x7fff,
|
|
||||||
ByteOrder: DefaultByteOrder,
|
|
||||||
DataLength: 0,
|
|
||||||
DataOffset: 0x20,
|
|
||||||
ConnectFlags0: CFUnknown40 | CFUnknown20 | CFServicesWanted,
|
|
||||||
ConnectFlags1: CFUnknown40 | CFUnknown20 | CFServicesWanted,
|
|
||||||
Unknown18: []byte{0, 0, 0, 0, 0, 0, 0, 0},
|
|
||||||
AcceptData: []byte{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"02. 138-138": TestCaseOld{
|
|
||||||
ConnectEncoding: "01 00 00 00 01 04 00 00 01 38 01 2c 00 00 08 00 " + /* .........8.,.... */
|
|
||||||
"7f ff 86 0e 00 00 01 00 00 c6 00 3a 00 00 02 00 " + /* ...........:.... */
|
|
||||||
"61 61 00 00 00 00 00 00 00 00 00 00 04 10 00 00 " + /* aa.............. */
|
|
||||||
"00 03 00 00 00 00 00 00 00 00 28 44 45 53 43 52 " + /* ..........(DESCR */
|
|
||||||
"49 50 54 49 4f 4e 3d 28 41 44 44 52 45 53 53 3d " + /* IPTION=(ADDRESS= */
|
|
||||||
"28 50 52 4f 54 4f 43 4f 4c 3d 54 43 50 29 28 48 " + /* (PROTOCOL=TCP)(H */
|
|
||||||
"4f 53 54 3d 31 39 32 2e 31 36 38 2e 31 2e 32 32 " + /* OST=192.168.1.22 */
|
|
||||||
"31 29 28 50 4f 52 54 3d 31 35 32 31 29 29 28 43 " + /* 1)(PORT=1521))(C */
|
|
||||||
"4f 4e 4e 45 43 54 5f 44 41 54 41 3d 28 53 49 44 " + /* ONNECT_DATA=(SID */
|
|
||||||
"3d 76 6f 69 64 29 28 53 45 52 56 45 52 3d 44 45 " + /* =void)(SERVER=DE */
|
|
||||||
"44 49 43 41 54 45 44 29 28 43 49 44 3d 28 50 52 " + /* DICATED)(CID=(PR */
|
|
||||||
"4f 47 52 41 4d 3d 46 3a 5c 6f 72 61 63 6c 65 5c " + /* OGRAM=F:\oracle\ */
|
|
||||||
"6f 72 61 39 32 5c 62 69 6e 5c 73 71 6c 70 6c 75 " + /* ora92\bin\sqlplu */
|
|
||||||
"73 2e 65 78 65 29 28 48 4f 53 54 3d 46 41 4e 47 " + /* s.exe)(HOST=FANG */
|
|
||||||
"48 4f 4e 47 5a 48 41 4f 29 28 55 53 45 52 3d 41 " + /* HONGZHAO)(USER=A */
|
|
||||||
"64 6d 69 6e 69 73 74 72 61 74 6f 72 29 29 29 29 ", /* dministrator)))) */
|
|
||||||
ConnectHeader: &TNSHeader{Length: 0x0100, PacketChecksum: 0, Type: PacketTypeConnect, Flags: 0x04, HeaderChecksum: 0},
|
|
||||||
ConnectValue: &TNSConnect{
|
|
||||||
Version: 0x0138,
|
|
||||||
MinVersion: 0x012c,
|
|
||||||
GlobalServiceOptions: 0,
|
|
||||||
SDU: 0x0800,
|
|
||||||
TDU: 0x7fff,
|
|
||||||
ProtocolCharacteristics: NTPCHangon | NTPCCallbackIO | NTPCAsyncIO | NTPCGenerateSIGURG | NTPCUrgentIO | NTPCFullDuplex, // 0x860e
|
|
||||||
MaxBeforeAck: 0,
|
|
||||||
ByteOrder: DefaultByteOrder,
|
|
||||||
DataLength: 0x00c6,
|
|
||||||
DataOffset: 0x003a,
|
|
||||||
MaxResponseSize: 0x00000200,
|
|
||||||
ConnectFlags0: CFUnknown40 | CFUnknown20 | CFServicesWanted,
|
|
||||||
ConnectFlags1: CFUnknown40 | CFUnknown20 | CFServicesWanted,
|
|
||||||
CrossFacility0: 0,
|
|
||||||
CrossFacility1: 0,
|
|
||||||
ConnectionID0: [8]byte{0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x03},
|
|
||||||
ConnectionID1: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
|
||||||
Unknown3A: []byte{},
|
|
||||||
ConnectionString: "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.221)(PORT=1521))(CONNECT_DATA=(SID=void)(SERVER=DEDICATED)(CID=(PROGRAM=F:\\oracle\\ora92\\bin\\sqlplus.exe)(HOST=FANGHONGZHAO)(USER=Administrator))))",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"03. 138-138": TestCaseOld{
|
|
||||||
ConnectEncoding: "00 ec 00 00 01 04 00 00 01 38 01 2c 00 00 08 00 " + /* .........8.,.... */
|
|
||||||
"7f ff 86 0e 00 00 01 00 00 b2 00 3a 00 00 02 00 " + /* ...........:.... */
|
|
||||||
"61 61 00 00 00 00 00 00 00 00 00 00 10 ec 00 00 " + /* aa.............. */
|
|
||||||
"00 05 00 00 00 00 00 00 00 00 28 44 45 53 43 52 " + /* ..........(DESCR */
|
|
||||||
"49 50 54 49 4f 4e 3d 28 41 44 44 52 45 53 53 3d " + /* IPTION=(ADDRESS= */
|
|
||||||
"28 50 52 4f 54 4f 43 4f 4c 3d 54 43 50 29 28 48 " + /* (PROTOCOL=TCP)(H */
|
|
||||||
"4f 53 54 3d 41 41 29 28 50 4f 52 54 3d 31 35 32 " + /* OST=AA)(PORT=152 */
|
|
||||||
"31 29 29 28 43 4f 4e 4e 45 43 54 5f 44 41 54 41 " + /* 1))(CONNECT_DATA */
|
|
||||||
"3d 28 53 49 44 3d 76 6f 69 64 29 28 53 45 52 56 " + /* =(SID=void)(SERV */
|
|
||||||
"45 52 3d 44 45 44 49 43 41 54 45 44 29 28 43 49 " + /* ER=DEDICATED)(CI */
|
|
||||||
"44 3d 28 50 52 4f 47 52 41 4d 3d 44 3a 5c 6f 72 " + /* D=(PROGRAM=D:\or */
|
|
||||||
"61 63 6c 65 5c 6f 72 61 39 32 5c 62 69 6e 5c 73 " + /* acle\ora92\bin\s */
|
|
||||||
"71 6c 70 6c 75 73 2e 65 78 65 29 28 48 4f 53 54 " + /* qlplus.exe)(HOST */
|
|
||||||
"3d 48 49 4e 47 45 2d 48 41 4e 59 46 29 28 55 53 " + /* =HINGE-HANYF)(US */
|
|
||||||
"45 52 3d 68 61 6e 79 66 29 29 29 29 ", /* ER=hanyf)))) */
|
|
||||||
ConnectHeader: &TNSHeader{Length: 0x00EC, PacketChecksum: 0, Type: PacketTypeConnect, Flags: 0x04, HeaderChecksum: 0},
|
|
||||||
ConnectValue: &TNSConnect{
|
|
||||||
Version: 0x0138,
|
|
||||||
MinVersion: 0x012c,
|
|
||||||
GlobalServiceOptions: 0,
|
|
||||||
SDU: 0x0800,
|
|
||||||
TDU: 0x7fff,
|
|
||||||
ProtocolCharacteristics: NTPCHangon | NTPCCallbackIO | NTPCAsyncIO | NTPCGenerateSIGURG | NTPCUrgentIO | NTPCFullDuplex, // 0x860e
|
|
||||||
MaxBeforeAck: 0,
|
|
||||||
ByteOrder: DefaultByteOrder,
|
|
||||||
DataLength: 0x00b2,
|
|
||||||
DataOffset: 0x003a,
|
|
||||||
MaxResponseSize: 0x00000200,
|
|
||||||
ConnectFlags0: CFUnknown40 | CFUnknown20 | CFServicesWanted,
|
|
||||||
ConnectFlags1: CFUnknown40 | CFUnknown20 | CFServicesWanted,
|
|
||||||
CrossFacility0: 0,
|
|
||||||
CrossFacility1: 0,
|
|
||||||
ConnectionID0: [8]byte{0x00, 0x00, 0x10, 0xec, 0x00, 0x00, 0x00, 0x05},
|
|
||||||
ConnectionID1: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
|
||||||
Unknown3A: []byte{},
|
|
||||||
ConnectionString: "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=AA)(PORT=1521))(CONNECT_DATA=(SID=void)(SERVER=DEDICATED)(CID=(PROGRAM=D:\\oracle\\ora92\\bin\\sqlplus.exe)(HOST=HINGE-HANYF)(USER=hanyf))))",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"unknown": TestCaseOld{
|
|
||||||
ConnectEncoding: "00 d7 00 00 01 00 00 00 01 3b 01 2c 0c 41 20 00 " + /* .........;.,.A . */
|
|
||||||
"ff ff 7f 08 00 00 01 00 00 91 00 46 00 00 08 00 " + /* ...........F.... */
|
|
||||||
"41 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " + /* AA.............. */
|
|
||||||
"00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 20 " + /* ............ .. */
|
|
||||||
"00 00 00 00 00 00 28 44 45 53 43 52 49 50 54 49 " + /* ......(DESCRIPTI */
|
|
||||||
"4f 4e 3d 28 43 4f 4e 4e 45 43 54 5f 44 41 54 41 " + /* ON=(CONNECT_DATA */
|
|
||||||
"3d 28 53 49 44 3d 6f 72 63 6c 31 31 67 29 28 43 " + /* =(SID=orcl11g)(C */
|
|
||||||
"49 44 3d 28 50 52 4f 47 52 41 4d 3d 73 71 6c 70 " + /* ID=(PROGRAM=sqlp */
|
|
||||||
"6c 75 73 40 6b 61 6c 69 29 28 48 4f 53 54 3d 6b " + /* lus@kali)(HOST=k */
|
|
||||||
"61 6c 69 29 28 55 53 45 52 3d 72 6f 6f 74 29 29 " + /* ali)(USER=root)) */
|
|
||||||
"29 28 41 44 44 52 45 53 53 3d 28 50 52 4f 54 4f " + /* )(ADDRESS=(PROTO */
|
|
||||||
"43 4f 4c 3d 54 43 50 29 28 48 4f 53 54 3d 31 30 " + /* COL=TCP)(HOST=10 */
|
|
||||||
"2e 30 2e 37 32 2e 31 31 33 29 28 50 4f 52 54 3d " + /* .0.72.113)(PORT= */
|
|
||||||
"31 35 32 31 29 29 29 ",
|
|
||||||
ConnectHeader: &TNSHeader{Length: 0x00d7, PacketChecksum: 0, Type: PacketTypeConnect, Flags: 0, HeaderChecksum: 0},
|
|
||||||
ConnectValue: &TNSConnect{
|
|
||||||
Version: 0x013b,
|
|
||||||
MinVersion: 0x012c,
|
|
||||||
GlobalServiceOptions: SOHeaderChecksum | SOFullDuplex | SOUnknown0040 | SOUnknown0001, // (0x0c41)
|
|
||||||
SDU: 0x2000,
|
|
||||||
TDU: 0xffff,
|
|
||||||
ProtocolCharacteristics: NTPCConfirmedRelease | NTPCTDUBasedIO | NTPCSpawnerRunning | NTPCDataTest | NTPCCallbackIO | NTPCAsyncIO | NTPCPacketIO | NTPCGenerateSIGURG, // 0x7F08
|
|
||||||
MaxBeforeAck: 0,
|
|
||||||
ByteOrder: DefaultByteOrder,
|
|
||||||
DataLength: 0x0091,
|
|
||||||
DataOffset: 0x0046, // points past the 12 bytes of \x00/\x20 at the start
|
|
||||||
MaxResponseSize: 0x00000800,
|
|
||||||
ConnectFlags0: CFUnknown40 | CFServicesWanted,
|
|
||||||
ConnectFlags1: CFUnknown40 | CFServicesWanted,
|
|
||||||
CrossFacility0: 0,
|
|
||||||
CrossFacility1: 0,
|
|
||||||
ConnectionID0: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
|
||||||
ConnectionID1: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
|
||||||
Unknown3A: []byte{0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
|
||||||
ConnectionString: "(DESCRIPTION=(CONNECT_DATA=(SID=orcl11g)(CID=(PROGRAM=sqlplus@kali)(HOST=kali)(USER=root)))(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.72.113)(PORT=1521)))",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var oldValidTNSHeader = map[string]TNSHeader{
|
|
||||||
"old1": TNSHeader{Length: 0x00d7, PacketChecksum: 0, Type: PacketTypeConnect, Flags: 0, HeaderChecksum: 0},
|
|
||||||
}
|
|
||||||
var oldValidTNSConnect = map[string]TNSConnect{
|
|
||||||
|
|
||||||
"00 d7 00 00 01 00 00 00 01 3b 01 2c 0c 41 20 00 " + /* .........;.,.A . */
|
|
||||||
"ff ff 7f 08 00 00 01 00 00 91 00 46 00 00 08 00 " + /* ...........F.... */
|
|
||||||
"41 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 " + /* AA.............. */
|
|
||||||
"00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 20 " + /* ............ .. */
|
|
||||||
"00 00 00 00 00 00 28 44 45 53 43 52 49 50 54 49 " + /* ......(DESCRIPTI */
|
|
||||||
"4f 4e 3d 28 43 4f 4e 4e 45 43 54 5f 44 41 54 41 " + /* ON=(CONNECT_DATA */
|
|
||||||
"3d 28 53 49 44 3d 6f 72 63 6c 31 31 67 29 28 43 " + /* =(SID=orcl11g)(C */
|
|
||||||
"49 44 3d 28 50 52 4f 47 52 41 4d 3d 73 71 6c 70 " + /* ID=(PROGRAM=sqlp */
|
|
||||||
"6c 75 73 40 6b 61 6c 69 29 28 48 4f 53 54 3d 6b " + /* lus@kali)(HOST=k */
|
|
||||||
"61 6c 69 29 28 55 53 45 52 3d 72 6f 6f 74 29 29 " + /* ali)(USER=root)) */
|
|
||||||
"29 28 41 44 44 52 45 53 53 3d 28 50 52 4f 54 4f " + /* )(ADDRESS=(PROTO */
|
|
||||||
"43 4f 4c 3d 54 43 50 29 28 48 4f 53 54 3d 31 30 " + /* COL=TCP)(HOST=10 */
|
|
||||||
"2e 30 2e 37 32 2e 31 31 33 29 28 50 4f 52 54 3d " + /* .0.72.113)(PORT= */
|
|
||||||
"31 35 32 31 29 29 29 ": TNSConnect{
|
|
||||||
Version: 0x013b,
|
|
||||||
MinVersion: 0x012c,
|
|
||||||
GlobalServiceOptions: SOHeaderChecksum | SOFullDuplex | SOUnknown0040 | SOUnknown0001, // (0x0c41)
|
|
||||||
SDU: 0x2000,
|
|
||||||
TDU: 0xffff,
|
|
||||||
ProtocolCharacteristics: NTPCConfirmedRelease | NTPCTDUBasedIO | NTPCSpawnerRunning | NTPCDataTest | NTPCCallbackIO | NTPCAsyncIO | NTPCPacketIO | NTPCGenerateSIGURG, // 0x7F08
|
|
||||||
MaxBeforeAck: 0,
|
|
||||||
ByteOrder: DefaultByteOrder,
|
|
||||||
DataLength: 0x0091,
|
|
||||||
DataOffset: 0x0046, // points past the 12 bytes of \x00/\x20 at the start
|
|
||||||
MaxResponseSize: 0x00000800,
|
|
||||||
ConnectFlags0: CFUnknown40 | CFServicesWanted,
|
|
||||||
ConnectFlags1: CFUnknown40 | CFServicesWanted,
|
|
||||||
CrossFacility0: 0,
|
|
||||||
CrossFacility1: 0,
|
|
||||||
ConnectionID0: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
|
||||||
ConnectionID1: [8]byte{0, 0, 0, 0, 0, 0, 0, 0},
|
|
||||||
Unknown3A: []byte{0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
|
||||||
ConnectionString: "(DESCRIPTION=(CONNECT_DATA=(SID=orcl11g)(CID=(PROGRAM=sqlplus@kali)(HOST=kali)(USER=root)))(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.72.113)(PORT=1521)))",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func str(a interface{}) string {
|
|
||||||
temp := ""
|
|
||||||
switch v := a.(type) {
|
|
||||||
case []byte:
|
|
||||||
temp = string(v)
|
|
||||||
case string:
|
|
||||||
temp = v
|
|
||||||
default:
|
|
||||||
temp = string(serialize(a))
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(temp) > 23 {
|
|
||||||
return temp[0:10] + "..." + temp[len(temp)-10:]
|
|
||||||
}
|
|
||||||
return temp
|
|
||||||
}
|
|
||||||
|
|
||||||
func assertEqualBytes(t *testing.T, expected []byte, actual []byte) {
|
|
||||||
if !bytes.Equal(expected, actual) {
|
|
||||||
t.Errorf("Mismatch: expected %s, got %s", str(expected), str(actual))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func serialize(val interface{}) []byte {
|
func serialize(val interface{}) []byte {
|
||||||
ret, err := json.Marshal(val)
|
ret, err := json.Marshal(val)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -659,10 +442,6 @@ func serialize(val interface{}) []byte {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertEqualElementwise(t *testing.T, expected interface{}, actual interface{}) {
|
|
||||||
assertEqualBytes(t, serialize(expected), serialize(actual))
|
|
||||||
}
|
|
||||||
|
|
||||||
func min(a, b int) int {
|
func min(a, b int) int {
|
||||||
if a < b {
|
if a < b {
|
||||||
return a
|
return a
|
||||||
@ -670,46 +449,17 @@ func min(a, b int) int {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func getExpectedActual(expected string, actual string) string {
|
// TODO: TNSRedirect
|
||||||
lex := len(expected)
|
// TODO: Invalid cases
|
||||||
lac := len(actual)
|
|
||||||
|
|
||||||
if lex < 20 && lac < 20 {
|
|
||||||
return fmt.Sprintf("Expected [%s], got [%s]", expected, actual)
|
|
||||||
}
|
|
||||||
if math.Abs(float64(lex-lac)/float64(min(lex, lac))) > 0.5 {
|
|
||||||
return fmt.Sprintf("Expected [%s] - %d bytes, got [%s] - %d bytes", str(expected), lex, str(actual), lac)
|
|
||||||
}
|
|
||||||
|
|
||||||
firstDiff := lex
|
|
||||||
for i := 0; i < min(lex, lac); i++ {
|
|
||||||
ex := byte(0)
|
|
||||||
ac := byte(0)
|
|
||||||
if i < lac {
|
|
||||||
ac = actual[i]
|
|
||||||
}
|
|
||||||
if i < lac {
|
|
||||||
ex = expected[i]
|
|
||||||
}
|
|
||||||
if ex != ac {
|
|
||||||
firstDiff = i
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if firstDiff < 10 || (firstDiff > lac-10) || (firstDiff > lex-10) {
|
|
||||||
return fmt.Sprintf("Expected [%s...%s], got [%s...%s]", str(expected[0:10]), str(expected[lex-10:]), str(actual[0:10]), str(actual[lac-10:]))
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("Expected [%s...%s...%s], got [%s...%s...%s] (first diff @ %d)", expected[0:10], expected[firstDiff-50:firstDiff+50], expected[lex-10:], actual[0:10], actual[firstDiff-50:firstDiff+50], actual[lac-10:], firstDiff)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTNSHeaderEncode(t *testing.T) {
|
func TestTNSHeaderEncode(t *testing.T) {
|
||||||
for hex, header := range validHeaders {
|
for hex, header := range validHeaders {
|
||||||
bin := fromHex(hex)
|
bin := fromHex(hex)
|
||||||
encoded := header.Encode()
|
encoded := header.Encode()
|
||||||
if !bytes.Equal(bin, encoded) {
|
if !bytes.Equal(bin, encoded) {
|
||||||
t.Errorf("TNSHeader.Encode mismatch: %s", getExpectedActual(string(bin), string(encoded)))
|
t.Errorf("TNSHeader.Encode mismatch:[\n%s\n]", interleave(bin, encoded))
|
||||||
}
|
}
|
||||||
decoded, rest, err := DecodeTNSHeader(nil, bin)
|
decoded, rest, err := DecodeTNSHeader(bin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Decode error: %v", err)
|
t.Fatalf("Decode error: %v", err)
|
||||||
}
|
}
|
||||||
@ -719,7 +469,7 @@ func TestTNSHeaderEncode(t *testing.T) {
|
|||||||
jsonHeader := serialize(header)
|
jsonHeader := serialize(header)
|
||||||
jsonDecoded := serialize(decoded)
|
jsonDecoded := serialize(decoded)
|
||||||
if !bytes.Equal(jsonHeader, jsonDecoded) {
|
if !bytes.Equal(jsonHeader, jsonDecoded) {
|
||||||
t.Errorf("TNSHeader.Read mismatch: %s", getExpectedActual(string(jsonHeader), string(jsonDecoded)))
|
t.Errorf("TNSHeader.Read mismatch:[\n%s\n]", interleave(jsonHeader, jsonDecoded))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -729,7 +479,7 @@ func TestTNSConnect(t *testing.T) {
|
|||||||
bin := fromHex(info.Encoding)
|
bin := fromHex(info.Encoding)
|
||||||
encoded := info.Value.Encode()
|
encoded := info.Value.Encode()
|
||||||
if !bytes.Equal(bin, encoded) {
|
if !bytes.Equal(bin, encoded) {
|
||||||
t.Errorf("%s: TNSConnect.Encode mismatch: %s", tag, getExpectedActual(string(bin), string(encoded)))
|
t.Errorf("%s: TNSConnect.Encode mismatch:[\n%s\n]", tag, interleave(bin, encoded))
|
||||||
}
|
}
|
||||||
reader := getSliceReader(bin)
|
reader := getSliceReader(bin)
|
||||||
response, err := ReadTNSPacket(reader)
|
response, err := ReadTNSPacket(reader)
|
||||||
@ -744,7 +494,7 @@ func TestTNSConnect(t *testing.T) {
|
|||||||
jsonPacket := serialize(info.Value.Body)
|
jsonPacket := serialize(info.Value.Body)
|
||||||
jsonDecoded := serialize(decoded)
|
jsonDecoded := serialize(decoded)
|
||||||
if !bytes.Equal(jsonPacket, jsonDecoded) {
|
if !bytes.Equal(jsonPacket, jsonDecoded) {
|
||||||
t.Errorf("%s: TNSConnect.Read mismatch: %s", tag, getExpectedActual(string(jsonPacket), string(jsonDecoded)))
|
t.Errorf("%s: TNSConnect.Read mismatch:[\n%s\n]", tag, interleave(jsonPacket, jsonDecoded))
|
||||||
}
|
}
|
||||||
if len(reader.Data) > 0 {
|
if len(reader.Data) > 0 {
|
||||||
t.Errorf("%s: TNSConnect.Read: %d bytes left over", tag, len(reader.Data))
|
t.Errorf("%s: TNSConnect.Read: %d bytes left over", tag, len(reader.Data))
|
||||||
@ -757,7 +507,7 @@ func TestTNSAccept(t *testing.T) {
|
|||||||
bin := fromHex(info.Encoding)
|
bin := fromHex(info.Encoding)
|
||||||
encoded := info.Value.Encode()
|
encoded := info.Value.Encode()
|
||||||
if !bytes.Equal(bin, encoded) {
|
if !bytes.Equal(bin, encoded) {
|
||||||
t.Errorf("%s: TNSAccept.Encode mismatch: %s", tag, getExpectedActual(string(bin), string(encoded)))
|
t.Errorf("%s: TNSAccept.Encode mismatch:[\n%s\n]", tag, interleave(bin, encoded))
|
||||||
}
|
}
|
||||||
reader := getSliceReader(bin)
|
reader := getSliceReader(bin)
|
||||||
response, err := ReadTNSPacket(reader)
|
response, err := ReadTNSPacket(reader)
|
||||||
@ -772,7 +522,7 @@ func TestTNSAccept(t *testing.T) {
|
|||||||
jsonPacket := serialize(info.Value.Body)
|
jsonPacket := serialize(info.Value.Body)
|
||||||
jsonDecoded := serialize(decoded)
|
jsonDecoded := serialize(decoded)
|
||||||
if !bytes.Equal(jsonPacket, jsonDecoded) {
|
if !bytes.Equal(jsonPacket, jsonDecoded) {
|
||||||
t.Errorf("%s: TNSAccept.Read mismatch: %s", tag, getExpectedActual(string(jsonPacket), string(jsonDecoded)))
|
t.Errorf("%s: TNSAccept.Read mismatch:[\n%s\n]", tag, interleave(jsonPacket, jsonDecoded))
|
||||||
}
|
}
|
||||||
if len(reader.Data) > 0 {
|
if len(reader.Data) > 0 {
|
||||||
t.Errorf("%s: TNSAccept.Read: %d bytes left over", tag, len(reader.Data))
|
t.Errorf("%s: TNSAccept.Read: %d bytes left over", tag, len(reader.Data))
|
||||||
@ -785,12 +535,7 @@ func TestTNSData(t *testing.T) {
|
|||||||
bin := fromHex(info.Encoding)
|
bin := fromHex(info.Encoding)
|
||||||
encoded := info.Value.Encode()
|
encoded := info.Value.Encode()
|
||||||
if !bytes.Equal(bin, encoded) {
|
if !bytes.Equal(bin, encoded) {
|
||||||
expected := hex.Dump(bin)
|
t.Errorf("%s: TNSData.Encode mismatch:[\n%s\n]", tag, interleave(bin, encoded))
|
||||||
actual := hex.Dump(encoded)
|
|
||||||
logrus.Warnf("Expected: {[\n%s\n]}\n", expected)
|
|
||||||
logrus.Warnf("Actual: {[\n%s\n]}\n", actual)
|
|
||||||
logrus.Warnf("{[\n%s\n]}\n", interleave(bin, encoded))
|
|
||||||
t.Errorf("%s: TNSData.Encode mismatch: %s", tag, getExpectedActual(string(bin), string(encoded)))
|
|
||||||
}
|
}
|
||||||
reader := getSliceReader(bin)
|
reader := getSliceReader(bin)
|
||||||
response, err := ReadTNSPacket(reader)
|
response, err := ReadTNSPacket(reader)
|
||||||
@ -805,94 +550,10 @@ func TestTNSData(t *testing.T) {
|
|||||||
jsonPacket := serialize(info.Value.Body)
|
jsonPacket := serialize(info.Value.Body)
|
||||||
jsonDecoded := serialize(decoded)
|
jsonDecoded := serialize(decoded)
|
||||||
if !bytes.Equal(jsonPacket, jsonDecoded) {
|
if !bytes.Equal(jsonPacket, jsonDecoded) {
|
||||||
t.Errorf("%s: TNSData.Read mismatch: %s", tag, getExpectedActual(string(jsonPacket), string(jsonDecoded)))
|
t.Errorf("%s: TNSData.Read mismatch:[\n%s\n]", tag, interleave(jsonPacket, jsonDecoded))
|
||||||
}
|
}
|
||||||
if len(reader.Data) > 0 {
|
if len(reader.Data) > 0 {
|
||||||
t.Errorf("%s: TNSData.Read: %d bytes left over", tag, len(reader.Data))
|
t.Errorf("%s: TNSData.Read: %d bytes left over", tag, len(reader.Data))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTNSConnect2(t *testing.T) {
|
|
||||||
for tag, info := range old1ValidTNSConnect {
|
|
||||||
bin := fromHex(info.ConnectEncoding)
|
|
||||||
if info.ConnectValue != nil {
|
|
||||||
packet := &TNSPacket{
|
|
||||||
Header: info.ConnectHeader,
|
|
||||||
Body: info.ConnectValue,
|
|
||||||
}
|
|
||||||
encoded := packet.Encode()
|
|
||||||
if !bytes.Equal(bin, encoded) {
|
|
||||||
t.Errorf("%s: TNSConnect.Encode mismatch: %s", tag, getExpectedActual(string(bin), string(encoded)))
|
|
||||||
}
|
|
||||||
reader := getSliceReader(bin)
|
|
||||||
response, err := ReadTNSPacket(reader)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("%s: Error reading TNSConnect packet: %v", tag, err)
|
|
||||||
}
|
|
||||||
// TODO: check header
|
|
||||||
decoded, ok := response.Body.(*TNSConnect)
|
|
||||||
if !ok {
|
|
||||||
t.Fatalf("%s: Read wrong packet: %v", tag, response.Body)
|
|
||||||
}
|
|
||||||
jsonPacket := serialize(packet.Body)
|
|
||||||
jsonDecoded := serialize(decoded)
|
|
||||||
if !bytes.Equal(jsonPacket, jsonDecoded) {
|
|
||||||
t.Errorf("%s: TNSConnect.Read mismatch: %s", tag, getExpectedActual(string(jsonPacket), string(jsonDecoded)))
|
|
||||||
}
|
|
||||||
if len(reader.Data) > 0 {
|
|
||||||
t.Errorf("%s: TNSConnect.Read: %d bytes left over", tag, len(reader.Data))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestTNSAccept2(t *testing.T) {
|
|
||||||
for tag, info := range old1ValidTNSConnect {
|
|
||||||
if info.AcceptValue == nil {
|
|
||||||
fmt.Println("skipping ", tag)
|
|
||||||
} else {
|
|
||||||
fmt.Println("testing ", tag)
|
|
||||||
bin := fromHex(info.AcceptEncoding)
|
|
||||||
packet := &TNSPacket{
|
|
||||||
Header: info.AcceptHeader,
|
|
||||||
Body: info.AcceptValue,
|
|
||||||
}
|
|
||||||
encoded := packet.Encode()
|
|
||||||
if !bytes.Equal(bin, encoded) {
|
|
||||||
fmt.Println("expected=[\n", string(hex.Dump(bin)), "]")
|
|
||||||
fmt.Println(" actual=[\n", string(hex.Dump(encoded)), "]")
|
|
||||||
t.Errorf("%s: TNSAccept.Encode mismatch: %s", tag, getExpectedActual(string(bin), string(encoded)))
|
|
||||||
}
|
|
||||||
reader := getSliceReader(bin)
|
|
||||||
response, err := ReadTNSPacket(reader)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("%s: Error reading TNSAccept packet: %v", tag, err)
|
|
||||||
}
|
|
||||||
// TODO: check header
|
|
||||||
decoded, ok := response.Body.(*TNSAccept)
|
|
||||||
if !ok {
|
|
||||||
t.Fatalf("%s: Read wrong packet: %v", tag, response.Body)
|
|
||||||
}
|
|
||||||
jsonPacket := serialize(packet.Body)
|
|
||||||
jsonDecoded := serialize(decoded)
|
|
||||||
if !bytes.Equal(jsonPacket, jsonDecoded) {
|
|
||||||
dump(tag+":expected", packet.Body)
|
|
||||||
dump(tag+":actual", decoded)
|
|
||||||
t.Errorf("%s: TNSAccept.Read mismatch: %s", tag, getExpectedActual(string(jsonPacket), string(jsonDecoded)))
|
|
||||||
}
|
|
||||||
if len(reader.Data) > 0 {
|
|
||||||
t.Errorf("%s: TNSAccept.Read: %d bytes left over", tag, len(reader.Data))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func dump(tag string, a interface{}) {
|
|
||||||
j, err := json.MarshalIndent(a, "", " ")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Error encoding:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Println(tag + " [[[" + string(j) + "]]]")
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user