func makeGrabber(config *Config) func(*Conn) error { // Do all the hard work here g := func(c *Conn) error { banner := make([]byte, 1024) response := make([]byte, 65536) c.SetCAPool(config.RootCAPool) if config.DHEOnly { c.SetDHEOnly() } if config.ExportsOnly { c.SetExportsOnly() } if config.ExportsDHOnly { c.SetExportsDHOnly() } if config.ChromeOnly { c.SetChromeCiphers() } if config.ChromeNoDHE { c.SetChromeNoDHECiphers() } if config.FirefoxOnly { c.SetFirefoxCiphers() } if config.FirefoxNoDHE { c.SetFirefoxNoDHECiphers() } if config.SafariOnly { c.SetSafariCiphers() } if config.SafariNoDHE { c.SetSafariNoDHECiphers() } if config.NoSNI { c.SetNoSNI() } if config.TLSExtendedRandom { c.SetExtendedRandom() } if config.GatherSessionTicket { c.SetGatherSessionTicket() } if config.ExtendedMasterSecret { c.SetOfferExtendedMasterSecret() } if config.TLSVerbose { c.SetTLSVerbose() } if config.SSH.SSH { c.sshScan = &config.SSH } c.ReadEncoding = config.Encoding if config.TLS { if err := c.TLSHandshake(); err != nil { c.erroredComponent = "tls" return err } } if config.Banners { if config.SMTP { if _, err := c.SMTPBanner(banner); err != nil { c.erroredComponent = "banner" return err } } else if config.POP3 { if _, err := c.POP3Banner(banner); err != nil { c.erroredComponent = "banner" return err } } else if config.IMAP { if _, err := c.IMAPBanner(banner); err != nil { c.erroredComponent = "banner" return err } } else { if _, err := c.BasicBanner(); err != nil { c.erroredComponent = "banner" return err } } } if config.FTP { c.grabData.FTP = new(ftp.FTPLog) is200Banner, err := ftp.GetFTPBanner(c.grabData.FTP, c.getUnderlyingConn()) if err != nil { c.erroredComponent = "ftp" return err } if config.FTPAuthTLS && is200Banner { if err := c.GetFTPSCertificates(); err != nil { c.erroredComponent = "ftp-authtls" return err } } } if config.Fox { c.grabData.Fox = new(fox.FoxLog) if err := fox.GetFoxBanner(c.grabData.Fox, c.getUnderlyingConn()); err != nil { c.erroredComponent = "fox" return err } } if config.Telnet { c.grabData.Telnet = new(telnet.TelnetLog) if err := telnet.GetTelnetBanner(c.grabData.Telnet, c.getUnderlyingConn(), config.TelnetMaxSize); err != nil { c.erroredComponent = "telnet" return err } } if config.S7 { c.grabData.S7 = new(siemens.S7Log) if err := siemens.GetS7Banner(c.grabData.S7, c.getUnderlyingConn()); err != nil { c.erroredComponent = "s7" return err } } if config.DNP3 { c.grabData.DNP3 = new(dnp3.DNP3Log) dnp3.GetDNP3Banner(c.grabData.DNP3, c.getUnderlyingConn()) } if config.SSH.SSH { if err := c.SSHHandshake(); err != nil { c.erroredComponent = "ssh" return err } } if config.SendData { host, _, _ := net.SplitHostPort(c.RemoteAddr().String()) msg := bytes.Replace(config.Data, []byte("%s"), []byte(host), -1) msg = bytes.Replace(msg, []byte("%d"), []byte(c.domain), -1) if _, err := c.Write(msg); err != nil { c.erroredComponent = "write" return err } if _, err := c.Read(response); err != nil { c.erroredComponent = "read" return err } } if config.EHLO { if err := c.EHLO(config.EHLODomain); err != nil { c.erroredComponent = "ehlo" return err } } if config.SMTPHelp { if err := c.SMTPHelp(); err != nil { c.erroredComponent = "smtp_help" return err } } if config.StartTLS { if config.IMAP { if err := c.IMAPStartTLSHandshake(); err != nil { c.erroredComponent = "starttls" return err } } else if config.POP3 { if err := c.POP3StartTLSHandshake(); err != nil { c.erroredComponent = "starttls" return err } } else { if err := c.SMTPStartTLSHandshake(); err != nil { c.erroredComponent = "starttls" return err } } } if config.Modbus { if _, err := c.SendModbusEcho(); err != nil { c.erroredComponent = "modbus" return err } } if config.BACNet { if err := c.BACNetVendorQuery(); err != nil { c.erroredComponent = "bacnet" return err } } if config.Heartbleed { buf := make([]byte, 256) if _, err := c.CheckHeartbleed(buf); err != nil { c.erroredComponent = "heartbleed" return err } } return nil } // Wrap the whole thing in a logger return func(c *Conn) error { err := g(c) if err != nil { config.ErrorLog.Errorf("Conversation error with remote host %s: %s", c.RemoteAddr().String(), err.Error()) } c.Close() return err } }
func makeGrabber(config *Config) func(*Conn) error { // Do all the hard work here g := func(c *Conn) error { banner := make([]byte, 1024) response := make([]byte, 65536) c.SetCAPool(config.RootCAPool) if config.DHEOnly { c.SetDHEOnly() } if config.ExportsOnly { c.SetExportsOnly() } if config.ExportsDHOnly { c.SetExportsDHOnly() } if config.ChromeOnly { c.SetChromeCiphers() } if config.ChromeNoDHE { c.SetChromeNoDHECiphers() } if config.FirefoxOnly { c.SetFirefoxCiphers() } if config.FirefoxNoDHE { c.SetFirefoxNoDHECiphers() } if config.SafariOnly { c.SetSafariCiphers() } if config.SafariNoDHE { c.SetSafariNoDHECiphers() } if config.NoSNI { c.SetNoSNI() } if config.TLSExtendedRandom { c.SetExtendedRandom() } if config.SSH.SSH { c.sshScan = &config.SSH } if config.ISCSI.ISCSI { c.iscsiScan = &config.ISCSI c.ISCSIScan(&config.ISCSI) } c.ReadEncoding = config.Encoding if config.TLS { if err := c.TLSHandshake(); err != nil { c.erroredComponent = "tls" return err } } if config.Banners { if config.SMTP { if _, err := c.SMTPBanner(banner); err != nil { c.erroredComponent = "banner" return err } } else if config.POP3 { if _, err := c.POP3Banner(banner); err != nil { c.erroredComponent = "banner" return err } } else if config.IMAP { if _, err := c.IMAPBanner(banner); err != nil { c.erroredComponent = "banner" return err } } else { if _, err := c.BasicBanner(); err != nil { c.erroredComponent = "banner" return err } } } if config.FTP { c.grabData.FTP = new(ftp.FTPLog) is200Banner, err := ftp.GetFTPBanner(c.grabData.FTP, c.getUnderlyingConn()) if err != nil { c.erroredComponent = "ftp" return err } if config.FTPAuthTLS && is200Banner { if err := c.GetFTPSCertificates(); err != nil { c.erroredComponent = "ftp-authtls" return err } } } if len(config.HTTP.Endpoint) > 0 { if err := c.HTTP(&config.HTTP); err != nil { c.erroredComponent = "http" return err } } if config.SSH.SSH { if err := c.SSHHandshake(); err != nil { c.erroredComponent = "ssh" return err } } if config.SendData { host, _, _ := net.SplitHostPort(c.RemoteAddr().String()) msg := bytes.Replace(config.Data, []byte("%s"), []byte(host), -1) msg = bytes.Replace(msg, []byte("%d"), []byte(c.domain), -1) if _, err := c.Write(msg); err != nil { c.erroredComponent = "write" return err } if _, err := c.Read(response); err != nil { c.erroredComponent = "read" return err } } if config.EHLO { if err := c.EHLO(config.EHLODomain); err != nil { c.erroredComponent = "ehlo" return err } } if config.SMTPHelp { if err := c.SMTPHelp(); err != nil { c.erroredComponent = "smtp_help" return err } } if config.StartTLS { if config.IMAP { if err := c.IMAPStartTLSHandshake(); err != nil { c.erroredComponent = "starttls" return err } } else if config.POP3 { if err := c.POP3StartTLSHandshake(); err != nil { c.erroredComponent = "starttls" return err } } else { if err := c.SMTPStartTLSHandshake(); err != nil { c.erroredComponent = "starttls" return err } } } if config.Modbus { if _, err := c.SendModbusEcho(); err != nil { c.erroredComponent = "modbus" return err } } if config.Heartbleed { buf := make([]byte, 256) if _, err := c.CheckHeartbleed(buf); err != nil { c.erroredComponent = "heartbleed" return err } } return nil } // Wrap the whole thing in a logger return func(c *Conn) error { err := g(c) if err != nil { config.ErrorLog.Errorf("Conversation error with remote host %s: %s", c.RemoteAddr().String(), err.Error()) } c.Close() return err } }