Skip to content

Commit 60b6e00

Browse files
Merge pull request #1341 from projectdiscovery/fix/interaction-unmarshal-corruption
fix: interaction data corruption causing unmarshal errors
2 parents a7751f3 + 70580fa commit 60b6e00

10 files changed

Lines changed: 494 additions & 53 deletions

File tree

pkg/client/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ func (c *Client) getInteractions(callback InteractionCallback) error {
459459
gologger.Error().Msgf("Could not decrypt interaction: %v\n", err)
460460
continue
461461
}
462+
plaintext = bytes.TrimRight(plaintext, " \t\r\n")
462463
interaction := &server.Interaction{}
463464
if err := jsoniter.Unmarshal(plaintext, interaction); err != nil {
464465
gologger.Error().Msgf("Could not unmarshal interaction data interaction: %v\n", err)

pkg/server/dns_server.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package server
22

33
import (
4-
"bytes"
54
"context"
65
"fmt"
76
"net"
@@ -295,12 +294,12 @@ func (h *DNSServer) handleInteraction(domain string, w dns.ResponseWriter, r *dn
295294
h.options.OnResult(interaction)
296295
}
297296

298-
buffer := &bytes.Buffer{}
299-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
297+
data, err := jsoniter.Marshal(interaction)
298+
if err != nil {
300299
gologger.Warning().Msgf("Could not encode root tld dns interaction: %s\n", err)
301300
} else {
302-
gologger.Debug().Msgf("Root TLD DNS Interaction: \n%s\n", buffer.String())
303-
if err := h.options.Storage.AddInteractionWithId(correlationID, buffer.Bytes()); err != nil {
301+
gologger.Debug().Msgf("Root TLD DNS Interaction: \n%s\n", string(data))
302+
if err := h.options.Storage.AddInteractionWithId(correlationID, data); err != nil {
304303
gologger.Warning().Msgf("Could not store dns interaction: %s\n", err)
305304
}
306305
}
@@ -348,12 +347,12 @@ func (h *DNSServer) handleInteraction(domain string, w dns.ResponseWriter, r *dn
348347
RemoteAddress: host,
349348
Timestamp: time.Now(),
350349
}
351-
buffer := &bytes.Buffer{}
352-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
350+
data, err := jsoniter.Marshal(interaction)
351+
if err != nil {
353352
gologger.Warning().Msgf("Could not encode dns interaction: %s\n", err)
354353
} else {
355-
gologger.Debug().Msgf("DNS Interaction: \n%s\n", buffer.String())
356-
if err := h.options.Storage.AddInteraction(correlationID, buffer.Bytes()); err != nil {
354+
gologger.Debug().Msgf("DNS Interaction: \n%s\n", string(data))
355+
if err := h.options.Storage.AddInteraction(correlationID, data); err != nil {
357356
gologger.Warning().Msgf("Could not store dns interaction: %s\n", err)
358357
}
359358
}

pkg/server/ftp_server.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package server
22

33
import (
4-
"bytes"
54
"crypto/tls"
65
"fmt"
76
"io"
@@ -131,12 +130,12 @@ func (h *FTPServer) recordInteraction(remoteAddress, data string) {
131130
RawRequest: data,
132131
Timestamp: time.Now(),
133132
}
134-
buffer := &bytes.Buffer{}
135-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
133+
dataBytes, err := jsoniter.Marshal(interaction)
134+
if err != nil {
136135
gologger.Warning().Msgf("Could not encode ftp interaction: %s\n", err)
137136
} else {
138-
gologger.Debug().Msgf("FTP Interaction: \n%s\n", buffer.String())
139-
if err := h.options.Storage.AddInteractionWithId(h.options.Token, buffer.Bytes()); err != nil {
137+
gologger.Debug().Msgf("FTP Interaction: \n%s\n", string(dataBytes))
138+
if err := h.options.Storage.AddInteractionWithId(h.options.Token, dataBytes); err != nil {
140139
gologger.Warning().Msgf("Could not store ftp interaction: %s\n", err)
141140
}
142141
}

pkg/server/http_server.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package server
22

33
import (
4-
"bytes"
54
"crypto/tls"
65
"encoding/base64"
76
"fmt"
@@ -158,12 +157,12 @@ func (h *HTTPServer) logger(handler http.Handler) http.HandlerFunc {
158157
RemoteAddress: host,
159158
Timestamp: time.Now(),
160159
}
161-
buffer := &bytes.Buffer{}
162-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
160+
data, err := jsoniter.Marshal(interaction)
161+
if err != nil {
163162
gologger.Warning().Msgf("Could not encode root tld http interaction: %s\n", err)
164163
} else {
165-
gologger.Debug().Msgf("Root TLD HTTP Interaction: \n%s\n", buffer.String())
166-
if err := h.options.Storage.AddInteractionWithId(ID, buffer.Bytes()); err != nil {
164+
gologger.Debug().Msgf("Root TLD HTTP Interaction: \n%s\n", string(data))
165+
if err := h.options.Storage.AddInteractionWithId(ID, data); err != nil {
167166
gologger.Warning().Msgf("Could not store root tld http interaction: %s\n", err)
168167
}
169168
}
@@ -218,13 +217,13 @@ func (h *HTTPServer) handleInteraction(r *http.Request, uniqueID, fullID, reqStr
218217
RemoteAddress: hostPort,
219218
Timestamp: time.Now(),
220219
}
221-
buffer := &bytes.Buffer{}
222-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
220+
data, err := jsoniter.Marshal(interaction)
221+
if err != nil {
223222
gologger.Warning().Msgf("Could not encode http interaction: %s\n", err)
224223
} else {
225-
gologger.Debug().Msgf("HTTP Interaction: \n%s\n", buffer.String())
224+
gologger.Debug().Msgf("HTTP Interaction: \n%s\n", string(data))
226225

227-
if err := h.options.Storage.AddInteraction(correlationID, buffer.Bytes()); err != nil {
226+
if err := h.options.Storage.AddInteraction(correlationID, data); err != nil {
228227
gologger.Warning().Msgf("Could not store http interaction: %s\n", err)
229228
}
230229
}

pkg/server/ldap_server.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package server
22

33
import (
4-
"bytes"
54
"crypto/tls"
65
"fmt"
76
"strings"
@@ -145,12 +144,12 @@ func (ldapServer *LDAPServer) handleInteraction(uniqueID, fullID, reqString, hos
145144
RemoteAddress: host,
146145
Timestamp: time.Now(),
147146
}
148-
buffer := &bytes.Buffer{}
149-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
147+
data, err := jsoniter.Marshal(interaction)
148+
if err != nil {
150149
gologger.Warning().Msgf("Could not encode ldap interaction: %s\n", err)
151150
} else {
152-
gologger.Debug().Msgf("LDAP Interaction: \n%s\n", buffer.String())
153-
if err := ldapServer.options.Storage.AddInteraction(correlationID, buffer.Bytes()); err != nil {
151+
gologger.Debug().Msgf("LDAP Interaction: \n%s\n", string(data))
152+
if err := ldapServer.options.Storage.AddInteraction(correlationID, data); err != nil {
154153
gologger.Warning().Msgf("Could not store ldap interaction: %s\n", err)
155154
}
156155
}
@@ -411,12 +410,12 @@ func (ldapServer *LDAPServer) logInteraction(interaction Interaction) {
411410
// Correlation id doesn't apply here, we skip encryption
412411
interaction.Protocol = "ldap"
413412
interaction.Timestamp = time.Now()
414-
buffer := &bytes.Buffer{}
415-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
413+
data, err := jsoniter.Marshal(interaction)
414+
if err != nil {
416415
gologger.Warning().Msgf("Could not encode ldap interaction: %s\n", err)
417416
} else {
418-
gologger.Debug().Msgf("LDAP Interaction: \n%s\n", buffer.String())
419-
if err := ldapServer.options.Storage.AddInteractionWithId(ldapServer.options.Token, buffer.Bytes()); err != nil {
417+
gologger.Debug().Msgf("LDAP Interaction: \n%s\n", string(data))
418+
if err := ldapServer.options.Storage.AddInteractionWithId(ldapServer.options.Token, data); err != nil {
420419
gologger.Warning().Msgf("Could not store ldap interaction: %s\n", err)
421420
}
422421
}

pkg/server/responder_server.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package server
22

33
import (
4-
"bytes"
54
"os"
65
"os/exec"
76
"path/filepath"
@@ -89,12 +88,12 @@ func (h *ResponderServer) ListenAndServe(responderAlive chan bool) error {
8988
RawRequest: responderData,
9089
Timestamp: time.Now(),
9190
}
92-
buffer := &bytes.Buffer{}
93-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
91+
data, err := jsoniter.Marshal(interaction)
92+
if err != nil {
9493
gologger.Warning().Msgf("Could not encode responder interaction: %s\n", err)
9594
} else {
96-
gologger.Debug().Msgf("Responder Interaction: \n%s\n", buffer.String())
97-
if err := h.options.Storage.AddInteractionWithId(h.options.Token, buffer.Bytes()); err != nil {
95+
gologger.Debug().Msgf("Responder Interaction: \n%s\n", string(data))
96+
if err := h.options.Storage.AddInteractionWithId(h.options.Token, data); err != nil {
9897
gologger.Warning().Msgf("Could not store dns interaction: %s\n", err)
9998
}
10099
}

pkg/server/smb_server.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package server
22

33
import (
4-
"bytes"
54
"fmt"
65
"os"
76
"os/exec"
@@ -101,12 +100,12 @@ func (h *SMBServer) ListenAndServe(smbAlive chan bool) error {
101100
RawRequest: smbData,
102101
Timestamp: time.Now(),
103102
}
104-
buffer := &bytes.Buffer{}
105-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
103+
data, err := jsoniter.Marshal(interaction)
104+
if err != nil {
106105
gologger.Warning().Msgf("Could not encode smb interaction: %s\n", err)
107106
} else {
108-
gologger.Debug().Msgf("SMB Interaction: \n%s\n", buffer.String())
109-
if err := h.options.Storage.AddInteractionWithId(h.options.Token, buffer.Bytes()); err != nil {
107+
gologger.Debug().Msgf("SMB Interaction: \n%s\n", string(data))
108+
if err := h.options.Storage.AddInteractionWithId(h.options.Token, data); err != nil {
110109
gologger.Warning().Msgf("Could not store dns interaction: %s\n", err)
111110
}
112111
}

pkg/server/smtp_server.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package server
22

33
import (
4-
"bytes"
54
"crypto/tls"
65
"net"
76
"strings"
@@ -107,12 +106,12 @@ func (h *SMTPServer) defaultHandler(remoteAddr net.Addr, from string, to []strin
107106
RemoteAddress: host,
108107
Timestamp: time.Now(),
109108
}
110-
buffer := &bytes.Buffer{}
111-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
109+
data, err := jsoniter.Marshal(interaction)
110+
if err != nil {
112111
gologger.Warning().Msgf("Could not encode root tld SMTP interaction: %s\n", err)
113112
} else {
114-
gologger.Debug().Msgf("Root TLD SMTP Interaction: \n%s\n", buffer.String())
115-
if err := h.options.Storage.AddInteractionWithId(ID, buffer.Bytes()); err != nil {
113+
gologger.Debug().Msgf("Root TLD SMTP Interaction: \n%s\n", string(data))
114+
if err := h.options.Storage.AddInteractionWithId(ID, data); err != nil {
116115
gologger.Warning().Msgf("Could not store root tld smtp interaction: %s\n", err)
117116
}
118117
}
@@ -148,12 +147,12 @@ func (h *SMTPServer) defaultHandler(remoteAddr net.Addr, from string, to []strin
148147
RemoteAddress: host,
149148
Timestamp: time.Now(),
150149
}
151-
buffer := &bytes.Buffer{}
152-
if err := jsoniter.NewEncoder(buffer).Encode(interaction); err != nil {
150+
data, err := jsoniter.Marshal(interaction)
151+
if err != nil {
153152
gologger.Warning().Msgf("Could not encode smtp interaction: %s\n", err)
154153
} else {
155-
gologger.Debug().Msgf("%s\n", buffer.String())
156-
if err := h.options.Storage.AddInteraction(correlationID, buffer.Bytes()); err != nil {
154+
gologger.Debug().Msgf("%s\n", string(data))
155+
if err := h.options.Storage.AddInteraction(correlationID, data); err != nil {
157156
gologger.Warning().Msgf("Could not store smtp interaction: %s\n", err)
158157
}
159158
}

0 commit comments

Comments
 (0)