Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions modules/smtp/scanner.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,12 @@ type Flags struct {

// SMTPSecure indicates that the entire transaction should be wrapped in a TLS session.
SMTPSecure bool `long:"smtps" description:"Perform a TLS handshake immediately upon connecting."`

// EHLODomain is the client domain sent with EHLO; empty falls back to the target domain.
EHLODomain string `long:"ehlo-domain" description:"Client domain to send with the EHLO command (default: target domain)"`

// HELODomain is the client domain sent with HELO; empty falls back to the target domain.
HELODomain string `long:"helo-domain" description:"Client domain to send with the HELO command (default: target domain)"`
}

func NewModule() *zgrab2.TypedModule[Flags, Scanner, *Scanner] {
Expand Down Expand Up @@ -254,15 +260,23 @@ func (scanner *Scanner) Scan(ctx context.Context, dialGroup *zgrab2.DialerGroup,
shouldSendEHLO := !scanner.config.SendHELOOverride && (serverSupportsEHLO || scanner.config.SendEHLOOverride)
if shouldSendEHLO {
// server supports EHLO, use Extended Hello
ret, err := smtpConn.SendCommand(getCommand("EHLO", target.Domain))
domain := scanner.config.EHLODomain
if domain == "" {
domain = target.Domain
}
ret, err := smtpConn.SendCommand(getCommand("EHLO", domain))
if err != nil {
return appErrStatus(), result, fmt.Errorf("could not send EHLO command: %w", err)
}
result.EHLO = ret
moduleMetadata.incrementHostsSupportingEHLO() // mark that we found a host that supports EHLO
} else {
// send a HELO msg since server doesn't support EHLO
ret, err := smtpConn.SendCommand(getCommand("HELO", target.Domain))
domain := scanner.config.HELODomain
if domain == "" {
domain = target.Domain
}
ret, err := smtpConn.SendCommand(getCommand("HELO", domain))
if err != nil {
return appErrStatus(), result, fmt.Errorf("could not send HELO command: %w", err)
}
Expand Down