From 0046817c2e4c55aea1b53a8b0254587ce087a5c1 Mon Sep 17 00:00:00 2001 From: ZacharyZcR <2903735704@qq.com> Date: Sat, 23 May 2026 07:17:55 +0800 Subject: [PATCH] fix mssql login client metadata --- plugins/services/mssql_raw.go | 12 ++++----- plugins/services/mssql_raw_test.go | 39 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 plugins/services/mssql_raw_test.go diff --git a/plugins/services/mssql_raw.go b/plugins/services/mssql_raw.go index 9ae00fd..8b3cbfc 100644 --- a/plugins/services/mssql_raw.go +++ b/plugins/services/mssql_raw.go @@ -9,7 +9,6 @@ import ( "fmt" "io" "net" - "os" "sort" "time" "unicode/utf16" @@ -190,17 +189,16 @@ func mssqlParsePreloginFields(payload []byte) (map[byte][]byte, error) { } func mssqlSendLogin7(w io.Writer, host, username, password string) error { - hostname, _ := os.Hostname() values := []struct { text string password bool }{ - {hostname, false}, + {"", false}, {username, false}, {password, true}, - {"fscan", false}, - {host, false}, - {"fscan", false}, + {"", false}, + {"", false}, + {"", false}, {"", false}, {"master", false}, {"", false}, @@ -233,7 +231,7 @@ func mssqlSendLogin7(w io.Writer, host, username, password string) error { put32(tdsVersion74) put32(tdsDefaultPacketLen) put32(0) - put32(uint32(os.Getpid())) + put32(0) put32(0) body.WriteByte(tdsOptionUseDB | tdsOptionSetLang) body.WriteByte(tdsOptionODBC) diff --git a/plugins/services/mssql_raw_test.go b/plugins/services/mssql_raw_test.go new file mode 100644 index 0000000..d49c930 --- /dev/null +++ b/plugins/services/mssql_raw_test.go @@ -0,0 +1,39 @@ +//go:build plugin_mssql || !plugin_selective + +package services + +import ( + "bytes" + "encoding/binary" + "os" + "testing" +) + +func TestMSSQLLogin7DoesNotExposeClientIdentity(t *testing.T) { + var packet bytes.Buffer + if err := mssqlSendLogin7(&packet, "target-host", "sa", "password"); err != nil { + t.Fatalf("mssqlSendLogin7() error = %v", err) + } + + data := packet.Bytes() + if len(data) < 8+20 { + t.Fatalf("login packet too short: %d", len(data)) + } + + payload := data[8:] + if pid := binary.LittleEndian.Uint32(payload[16:20]); pid != 0 { + t.Fatalf("client pid = %d, want 0", pid) + } + + for _, value := range []string{"fscan", "target-host"} { + if bytes.Contains(payload, mssqlUCS2(value)) { + t.Fatalf("login packet contains client-identifying value %q", value) + } + } + + if hostname, err := os.Hostname(); err == nil && hostname != "" { + if bytes.Contains(payload, mssqlUCS2(hostname)) { + t.Fatalf("login packet contains local hostname %q", hostname) + } + } +}