Пример #1
0
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
	}
}
Пример #2
0
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
	}
}