Documentation ¶
Index ¶
- type Asset
- type AssetInfo
- type AssetVulnerabilities
- type AssetVulnerabilityInfo
- type AssetVulnerabilityInfoList
- type Assets
- type AssetsVulnerabilities
- type AwsTargets
- type Client
- func (t *Client) Delete(ctx context.Context, u string, opts *QueryOpts, body io.Reader, ...) (*Response, error)
- func (t *Client) Do(ctx context.Context, req *http.Request, dest interface{}) (*Response, error)
- func (t *Client) Get(ctx context.Context, u string, opts *QueryOpts, dest interface{}) (*Response, error)
- func (t *Client) ImpersonateAs(username string)
- func (t *Client) NewRequest(method string, relativeUrl string, body io.Reader) (*http.Request, error)
- func (t *Client) PlainGet(ctx context.Context, u string) (*http.Response, error)
- func (t *Client) Post(ctx context.Context, u string, opts *QueryOpts, body io.Reader, ...) (*Response, error)
- func (t *Client) SetBaseUrl(baseUrl string)
- func (t *Client) SetHttpClient(client *http.Client)
- type EditorService
- type Filter
- type FilterOpts
- type Filters
- type Folder
- type FoldersList
- type FoldersService
- type History
- type Host
- type Note
- type NumericBool
- type QueryOpts
- type Remediation
- type Response
- type Scan
- type ScanDetail
- type ScanExportOptions
- type Scanner
- type Scanners
- type ScannersService
- type Scans
- type ScansCreateConfig
- type ScansExportRequest
- type ScansExportStatus
- type ScansLaunch
- type ScansService
- func (s *ScansService) Create(ctx context.Context, config *ScansCreateConfig) error
- func (s *ScansService) Detail(ctx context.Context, scanId int) (*ScanDetail, *Response, error)
- func (s *ScansService) ExportRequest(ctx context.Context, scanId int, format string) (*ScansExportRequest, *Response, error)
- func (s *ScansService) ExportStatus(ctx context.Context, scanId int, fileId int) (*ScansExportStatus, *Response, error)
- func (s *ScansService) Launch(ctx context.Context, scanId int, targets []string) (*ScansLaunch, *Response, error)
- func (s *ScansService) List(ctx context.Context) (*Scans, *Response, error)
- func (s *ScansService) Pause(ctx context.Context, scanId int, targets []string) error
- func (s *ScansService) Resume(ctx context.Context, scanId int, targets []string) error
- func (s *ScansService) Stop(ctx context.Context, scanId int, targets []string) error
- type ServerProperties
- type ServerService
- type ServerStatus
- type Template
- type Templates
- type Vulnerabilities
- type VulnerabilitiesFilters
- type Vulnerability
- type VulnerabilityInfo
- type VulnerabilityOutput
- type VulnerabilityOutputs
- type WbExportRequest
- type WbExportStatus
- type WorkbenchExportRequestOpts
- type WorkbenchesService
- func (s *WorkbenchesService) AssetDelete(ctx context.Context, assetUUID string) (*Response, error)
- func (s *WorkbenchesService) AssetVulnerabilities(ctx context.Context, assetId string) (*AssetVulnerabilities, *Response, error)
- func (s *WorkbenchesService) AssetVulnerabilityInfo(ctx context.Context, assetId string, pluginId string) (*AssetVulnerabilityInfo, *Response, error)
- func (s *WorkbenchesService) AssetVulnerabilityInfoList(ctx context.Context, assetId string) (*AssetVulnerabilityInfoList, error)
- func (s *WorkbenchesService) AssetVulnerabilityOutputs(ctx context.Context, assetId string, pluginId string) (*VulnerabilityOutputs, *Response, error)
- func (s *WorkbenchesService) Assets(ctx context.Context) (*Assets, *Response, error)
- func (s *WorkbenchesService) AssetsInfo(ctx context.Context, assetId string) (*AssetInfo, *Response, error)
- func (s *WorkbenchesService) AssetsVulnerabilities(ctx context.Context) (*AssetsVulnerabilities, *Response, error)
- func (s *WorkbenchesService) ExportDownload(ctx context.Context) (*WbExportRequest, *Response, error)
- func (s *WorkbenchesService) ExportRequest(ctx context.Context) (*WbExportRequest, *Response, error)
- func (s *WorkbenchesService) ExportStatus(ctx context.Context, fileId int) (*WbExportStatus, *Response, error)
- func (s *WorkbenchesService) Vulnerabilities(ctx context.Context) (*Vulnerabilities, *Response, error)
- func (s *WorkbenchesService) VulnerabilitiesFilters(ctx context.Context) (*VulnerabilitiesFilters, *Response, error)
- func (s *WorkbenchesService) VulnerabilitiesInfo(ctx context.Context, pluginId string) (*VulnerabilityInfo, *Response, error)
- func (s *WorkbenchesService) VulnerabilityOutputs(ctx context.Context, pluginId string) (*VulnerabilityOutputs, *Response, error)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Asset ¶
type Asset struct { ID string `json:"id"` HasAgent bool `json:"has_agent"` LastSeen time.Time `json:"last_seen"` Sources []struct { Name string `json:"name"` FirstSeen time.Time `json:"first_seen"` LastSeen time.Time `json:"last_seen"` } `json:"sources"` // NOTE these types are just observed... the API docs don't specify a type Ipv4 []string `json:"ipv4"` Ipv6 []string `json:"ipv6"` Fqdn []string `json:"fqdn"` NetbiosName []string `json:"netbios_name"` OperatingSystem []string `json:"operating_system"` AgentName []string `json:"agent_name"` MacAddress []string `json:"mac_address"` }
type AssetInfo ¶
type AssetInfo struct { Info struct { TimeEnd time.Time `json:"time_end"` TimeStart time.Time `json:"time_start"` ID string `json:"id"` UUID string `json:"uuid"` OperatingSystem []string `json:"operating_system"` Fqdn []string `json:"fqdn"` Counts struct { Vulnerabilities struct { Total int `json:"total"` Severities []struct { Count int `json:"count"` Level int `json:"level"` Name string `json:"name"` } `json:"severities"` } `json:"vulnerabilities"` Audits struct { Total int `json:"total"` Statuses []struct { Count int `json:"count"` Level int `json:"level"` Name string `json:"name"` } `json:"statuses"` } `json:"audits"` } `json:"counts"` HasAgent bool `json:"has_agent"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` FirstSeen time.Time `json:"first_seen"` LastSeen time.Time `json:"last_seen"` LastAuthenticatedScanDate time.Time `json:"last_authenticated_scan_date"` LastLicensedScanDate time.Time `json:"last_licensed_scan_date"` Sources []struct { Name string `json:"name"` FirstSeen time.Time `json:"first_seen"` LastSeen time.Time `json:"last_seen"` } `json:"sources"` Tags []string `json:"tags"` Ipv4 []string `json:"ipv4"` Ipv6 []string `json:"ipv6"` MacAddress []string `json:"mac_address"` NetbiosName []string `json:"netbios_name"` SystemType []string `json:"system_type"` TenableUUID []string `json:"tenable_uuid"` Hostname []string `json:"hostname"` AgentName []string `json:"agent_name"` BiosUUID []string `json:"bios_uuid"` AwsEc2InstanceID []string `json:"aws_ec2_instance_id"` AwsEc2InstanceAmiID []string `json:"aws_ec2_instance_ami_id"` AwsOwnerID []string `json:"aws_owner_id"` AwsAvailabilityZone []string `json:"aws_availability_zone"` AwsRegion []string `json:"aws_region"` AwsVpcID []string `json:"aws_vpc_id"` AwsEc2InstanceGroupName []string `json:"aws_ec2_instance_group_name"` AwsEc2InstanceStateName []string `json:"aws_ec2_instance_state_name"` AwsEc2InstanceType []string `json:"aws_ec2_instance_type"` AwsSubnetID []string `json:"aws_subnet_id"` AwsEc2ProductCode []string `json:"aws_ec2_product_code"` AwsEc2Name []string `json:"aws_ec2_name"` AzureVMID []string `json:"azure_vm_id"` AzureResourceID []string `json:"azure_resource_id"` SSHFingerprint []string `json:"ssh_fingerprint"` McafeeEpoGUID []string `json:"mcafee_epo_guid"` McafeeEpoAgentGUID []string `json:"mcafee_epo_agent_guid"` QualysAssetID []string `json:"qualys_asset_id"` QualysHostID []string `json:"qualys_host_id"` ServicenowSysid []string `json:"servicenow_sysid"` } `json:"info"` }
type AssetVulnerabilities ¶
type AssetVulnerabilities struct { AssetId string Vulnerabilities []Vulnerability `json:"vulnerabilities"` TotalVulnerabilityCount int `json:"total_vulnerability_count"` TotalAssetCount int `json:"total_asset_count"` }
this is a list of vulnerabilities for a specific asset
type AssetVulnerabilityInfo ¶
type AssetVulnerabilityInfo VulnerabilityInfo
this is a list of vulnerabilities for a specific plugin on a specific asset
type AssetVulnerabilityInfoList ¶
type AssetVulnerabilityInfoList struct { AssetId string Asset *AssetInfo // this ideally shouldn't have to be here Vulnerabilities []*AssetVulnerabilityInfo }
Custom, higher level data structure
func (*AssetVulnerabilityInfoList) ToCsvHeader ¶
func (a *AssetVulnerabilityInfoList) ToCsvHeader() []string
so TODO XXX FIXME this stuff should be like, a template file of some kind bad place for this would be nice to
func (*AssetVulnerabilityInfoList) ToCsvRecords ¶
func (a *AssetVulnerabilityInfoList) ToCsvRecords() [][]string
bad place for this, need to make this more generic, somehow, and more customizable...
type AssetsVulnerabilities ¶
type AssetsVulnerabilities struct { Assets []Asset `json:"assets"` TotalAssetCount int `json:"total_asset_count"` }
this is a list of assets that have known vulnerabilities
type AwsTargets ¶
type AwsTargets struct { Targets []struct { ContainerUUID string `json:"container_uuid"` ScannerUUID string `json:"scanner_uuid"` InstanceID string `json:"instance_id"` PrivateIP string `json:"private_ip"` PublicIP string `json:"public_ip,omitempty"` State string `json:"state"` Zone string `json:"zone"` Type string `json:"type"` Name string `json:"name,omitempty"` } `json:"targets"` }
type Client ¶
type Client struct { // turn this on if you want to dump request/response Debug bool // all the service objects defined in lowercaseservicename.go Editor *EditorService Folders *FoldersService Server *ServerService Scans *ScansService Scanners *ScannersService Workbenches *WorkbenchesService // Query parameters struct QueryOpts *QueryOpts // contains filtered or unexported fields }
func (*Client) ImpersonateAs ¶
func (*Client) NewRequest ¶
func (*Client) PlainGet ¶
odd authenticated duck that can be used for arbitrary gets, e.g., for export file downloads... yeah, it's a hack this can get refactored into Get, or really into *Do*
func (*Client) SetBaseUrl ¶
func (*Client) SetHttpClient ¶
type EditorService ¶
type EditorService service
type Filter ¶
type Filter struct { Control struct { ReadableRegex string `json:"readable_regex"` Regex string `json:"regex"` Type string `json:"type"` } `json:"control"` GroupName string `json:"group_name"` Name string `json:"name"` Operators []string `json:"operators"` ReadableName string `json:"readable_name"` }
what's this
type FilterOpts ¶
type FilterOpts struct { // the filter name; get from the filters endpoint or the Tenable API docs Filter string `json:"filter"` Quality string `json:"quality"` Value string `json:"value"` }
For use in query strings
type Filters ¶
type Filters struct {
Opts []FilterOpts
}
type FoldersList ¶
type FoldersList struct {
Folders []Folder `json:"folders"`
}
type FoldersService ¶
type FoldersService service
func (*FoldersService) List ¶
func (s *FoldersService) List(ctx context.Context) (*FoldersList, *Response, error)
type History ¶
type History struct { AltTargetsUsed bool `json:"alt_targets_used"` CreationDate int `json:"creation_date"` HistoryID int `json:"history_id"` LastModificationDate int `json:"last_modification_date"` OwnerID int `json:"owner_id"` Scheduler int `json:"scheduler"` Status string `json:"status"` Type string `json:"type"` UUID string `json:"uuid"` }
type Host ¶
type Host struct { AssetID int `json:"asset_id"` Critical int `json:"critical"` High int `json:"high"` HostID int `json:"host_id"` HostIndex int `json:"host_index"` Hostname string `json:"hostname"` Info int `json:"info"` Low int `json:"low"` Medium int `json:"medium"` Numchecksconsidered int `json:"numchecksconsidered"` Progress string `json:"progress"` Scanprogresscurrent int `json:"scanprogresscurrent"` Scanprogresstotal int `json:"scanprogresstotal"` Score int `json:"score"` Severity int `json:"severity"` Severitycount struct { Item []struct { Count int `json:"count"` Severitylevel int `json:"severitylevel"` } `json:"item"` } `json:"severitycount"` Totalchecksconsidered int `json:"totalchecksconsidered"` }
type NumericBool ¶
type NumericBool bool
NumericBool type because Tenable sometimes returns 1 for what should be boolean
func (NumericBool) MarshalJSON ¶
func (n NumericBool) MarshalJSON() ([]byte, error)
func (NumericBool) UnmarshalJSON ¶
func (n NumericBool) UnmarshalJSON(b []byte) error
type QueryOpts ¶
type QueryOpts struct { // your normal key=value,key=value params Params string // TODO map }
type Remediation ¶
type Response ¶
TODO this doesn't add any utility, and takes up more space just use http.Response and nopcloser to get raw body reuse or just don't even pass the response around; there's really no need
type Scan ¶
type Scan struct { Control bool `json:"control"` CreationDate int `json:"creation_date"` Enabled bool `json:"enabled"` ID int `json:"id"` LastModificationDate int `json:"last_modification_date"` Legacy bool `json:"legacy"` Name string `json:"name"` Owner string `json:"owner"` Permissions int `json:"permissions"` Read NumericBool `json:"read"` Rrules string `json:"rrules"` ScheduleUUID string `json:"schedule_uuid"` Starttime string `json:"starttime"` Status string `json:"status"` Timezone string `json:"timezone"` Type string `json:"type"` UserPermissions int `json:"user_permissions"` UUID string `json:"uuid"` }
type ScanDetail ¶
type ScanDetail struct { Comphosts []Host `json:"comphosts"` Compliance []Vulnerability `json:"compliance"` Filters []Filter `json:"filters"` History []History `json:"history"` Hosts []Host `json:"hosts"` Info struct { Acls []struct { DisplayName interface{} `json:"display_name"` ID interface{} `json:"id"` Name interface{} `json:"name"` Owner interface{} `json:"owner"` Permissions int `json:"permissions"` Type string `json:"type"` } `json:"acls"` AltTargetsUsed bool `json:"alt_targets_used"` Control bool `json:"control"` EditAllowed bool `json:"edit_allowed"` FolderID int `json:"folder_id"` Hasaudittrail bool `json:"hasaudittrail"` Haskb bool `json:"haskb"` Hostcount int `json:"hostcount"` Name string `json:"name"` NoTarget bool `json:"no_target"` ObjectID int `json:"object_id"` Owner string `json:"owner"` Pci_can_upload bool `json:"pci-can-upload"` Policy string `json:"policy"` ScanEnd int `json:"scan_end"` ScanStart int `json:"scan_start"` ScanType string `json:"scan_type"` ScannerEnd interface{} `json:"scanner_end"` ScannerName string `json:"scanner_name"` ScannerStart interface{} `json:"scanner_start"` ScheduleUUID string `json:"schedule_uuid"` Shared interface{} `json:"shared"` Status string `json:"status"` Targets string `json:"targets"` Timestamp int `json:"timestamp"` UserPermissions int `json:"user_permissions"` UUID string `json:"uuid"` } `json:"info"` Notes []Note `json:"notes"` Remediations struct { NumCves int `json:"num_cves"` NumHosts int `json:"num_hosts"` NumImpactedHosts int `json:"num_impacted_hosts"` NumRemediatedCves int `json:"num_remediated_cves"` Remediations []Remediation `json:"remediations"` } `json:"remediations"` Vulnerabilities []Vulnerability `json:"vulnerabilities"` }
type ScanExportOptions ¶
type Scanner ¶
type Scanner struct { CreationDate int `json:"creation_date"` Distro string `json:"distro,omitempty"` EngineVersion string `json:"engine_version,omitempty"` Group bool `json:"group"` ID int `json:"id"` Key string `json:"key"` LastConnect int `json:"last_connect"` LastModificationDate int `json:"last_modification_date"` Linked int `json:"linked"` LoadedPluginSet string `json:"loaded_plugin_set,omitempty"` Name string `json:"name"` EnvironmentName string `json:"environment_name"` NumHosts int `json:"num_hosts,omitempty"` NumScans int `json:"num_scans"` NumSessions int `json:"num_sessions,omitempty"` NumTCPSessions int `json:"num_tcp_sessions,omitempty"` Owner string `json:"owner"` OwnerID int `json:"owner_id"` OwnerName string `json:"owner_name"` OwnerUUID string `json:"owner_uuid"` Platform string `json:"platform,omitempty"` Pool bool `json:"pool"` ScanCount int `json:"scan_count"` Source string `json:"source"` Status string `json:"status"` Timestamp int `json:"timestamp"` Type string `json:"type"` UIBuild string `json:"ui_build,omitempty"` UIVersion string `json:"ui_version,omitempty"` UserPermissions int `json:"user_permissions"` UUID string `json:"uuid"` AwsUpdateInterval int `json:"aws_update_interval,omitempty"` License struct { ActivationCode string `json:"activation_code"` Users int `json:"users"` Evaluation bool `json:"evaluation"` ExpirationDate int `json:"expiration_date"` Agents int `json:"agents"` Ips int `json:"ips"` Apps struct { Pci struct { Mode string `json:"mode"` } `json:"pci"` Consec struct { Mode string `json:"mode"` ExpirationDate int `json:"expiration_date"` } `json:"consec"` Was struct { Mode string `json:"mode"` ExpirationDate int `json:"expiration_date"` } `json:"was"` } `json:"apps"` Scanners int `json:"scanners"` ScannersUsed int `json:"scanners_used"` AgentsUsed int `json:"agents_used"` } `json:"license,omitempty"` }
represents an instance of a scanner
type ScannersService ¶
type ScannersService service
func (*ScannersService) GetAwsTargets ¶
func (s *ScannersService) GetAwsTargets(ctx context.Context, scannerId int) (*AwsTargets, *Response, error)
List targets for a given AWS scanner
type ScansCreateConfig ¶
type ScansCreateConfig struct { // editor template uuid (see api docs for /scans/create, /editor/list) // 'template' refers to the scan types, like "Basic Network Scan", "Advanced Network Scan", etc TemplateUUID string `yaml:"template_uuid,omitempty" json:"uuid,omitempty"` // required Settings struct { Name string `yaml:"name,omitempty" json:"name,omitempty"` // required Description string `yaml:"description,omitempty" json:"description,omitempty"` PolicyId int `yaml:"policy_id,omitempty" json:"policy_id,omitempty"` FolderId int `yaml:"folder_id,omitempty" json:"folder_id,omitempty"` ScannerId int `yaml:"scanner_id,omitempty" json:"scanner_id,omitempty"` // *not* required Enabled bool `yaml:"enabled,omitempty" json:"enabled,omitempty"` // required Launch string `yaml:"launch,omitempty" json:"launch,omitempty"` Starttime string `yaml:"starttime,omitempty" json:"starttime,omitempty"` RRules string `yaml:"rrules,omitempty" json:"rrules,omitempty"` Timezone string `yaml:"timezone,omitempty" json:"timezone,omitempty"` TextTargets []string `yaml:"text_targets,omitempty" json:"text_targets,omitempty"` // required FileTargets string `yaml:"file_targets,omitempty" json:"file_targets,omitempty"` Emails string `yaml:"emails,omitempty" json:"emails,omitempty"` ACLs []interface{} `yaml:"acls,omitempty" json:"acls,omitempty"` // docs don't specify type } `yaml:"settings,omitempty" json:"settings,omitempty"` }
lots of yaml tags on this one because a user likely needs yaml if making scans from the cli. if you're doing just a few targets, or very simple scan setup, I actually recommend using the web UI for this partcular task
func ReadScanConfig ¶
func ReadScanConfig(configFile string) (*ScansCreateConfig, error)
GROSS should not be here. Also see: random YAML tags in the config strut
type ScansExportRequest ¶
type ScansExportStatus ¶
type ScansExportStatus struct {
Status string `json:"status"`
}
type ScansLaunch ¶
type ScansLaunch struct {
ScanUUID string `json:"scan_uuid"`
}
response when a scan is launched
type ScansService ¶
type ScansService service
func (*ScansService) Create ¶
func (s *ScansService) Create(ctx context.Context, config *ScansCreateConfig) error
XXX named return values here. would be best to use that everywhere, or nowhere ;(
func (*ScansService) Detail ¶
func (s *ScansService) Detail(ctx context.Context, scanId int) (*ScanDetail, *Response, error)
func (*ScansService) ExportRequest ¶
func (s *ScansService) ExportRequest(ctx context.Context, scanId int, format string) (*ScansExportRequest, *Response, error)
func (*ScansService) ExportStatus ¶
func (s *ScansService) ExportStatus(ctx context.Context, scanId int, fileId int) (*ScansExportStatus, *Response, error)
I don't know why the types or responses of the export endpoints are different between workbenches and scans. Ask Tenable
func (*ScansService) Launch ¶
func (s *ScansService) Launch(ctx context.Context, scanId int, targets []string) (*ScansLaunch, *Response, error)
type ServerProperties ¶
type ServerProperties struct { Analytics struct { Enabled bool `json:"enabled"` Key string `json:"key"` SiteID string `json:"site_id"` } `json:"analytics"` Capabilities struct { MultiScanner bool `json:"multi_scanner"` MultiUser string `json:"multi_user"` ReportEmailConfig bool `json:"report_email_config"` TwoFactor struct { SMTP bool `json:"smtp"` Twilio bool `json:"twilio"` } `json:"two_factor"` } `json:"capabilities"` ContainerDbVersion string `json:"container_db_version"` Enterprise bool `json:"enterprise"` Evaluation struct { LimitEnabled bool `json:"limitEnabled"` Scans int `json:"scans"` Targets int `json:"targets"` } `json:"evaluation"` Expiration int `json:"expiration"` ExpirationTime int `json:"expiration_time"` ForceUIReload bool `json:"force_ui_reload"` IdleTimeout string `json:"idle_timeout"` License struct { ActivationCode string `json:"activation_code"` Agents int `json:"agents"` AgentsUsed int `json:"agents_used"` Apps struct { Consec struct { ExpirationDate int `json:"expiration_date"` Mode string `json:"mode"` } `json:"consec"` Pci struct { Mode string `json:"mode"` } `json:"pci"` Was struct { ExpirationDate int `json:"expiration_date"` Mode string `json:"mode"` } `json:"was"` } `json:"apps"` Evaluation bool `json:"evaluation"` ExpirationDate int `json:"expiration_date"` Ips int `json:"ips"` Scanners int `json:"scanners"` ScannersUsed int `json:"scanners_used"` Users int `json:"users"` } `json:"license"` LimitEnabled bool `json:"limitEnabled"` LoadedPluginSet string `json:"loaded_plugin_set"` LoginBanner interface{} `json:"login_banner"` Msp bool `json:"msp"` NessusType string `json:"nessus_type"` NessusUIBuild string `json:"nessus_ui_build"` NessusUIVersion string `json:"nessus_ui_version"` Notifications []interface{} `json:"notifications"` PluginSet string `json:"plugin_set"` ScannerBoottime int `json:"scanner_boottime"` ServerBuild string `json:"server_build"` ServerUUID string `json:"server_uuid"` ServerVersion string `json:"server_version"` Update struct { Href interface{} `json:"href"` NewVersion int `json:"new_version"` Restart int `json:"restart"` } `json:"update"` }
type ServerService ¶
type ServerService service
func (*ServerService) Properties ¶
func (s *ServerService) Properties(ctx context.Context) (*ServerProperties, *Response, error)
func (*ServerService) Status ¶
func (s *ServerService) Status(ctx context.Context) (*ServerStatus, *Response, error)
type ServerStatus ¶
type Template ¶
type Template struct { Unsupported bool `json:"unsupported"` CloudOnly bool `json:"cloud_only"` Desc string `json:"desc"` Order interface{} `json:"order"` SubscriptionOnly bool `json:"subscription_only"` IsWas interface{} `json:"is_was"` Title string `json:"title"` IsAgent interface{} `json:"is_agent"` UUID string `json:"uuid"` ManagerOnly bool `json:"manager_only"` Name string `json:"name"` }
type Vulnerabilities ¶
type Vulnerabilities struct { Vulnerabilities []Vulnerability `json:"vulnerabilities"` TotalVulnerabilityCount int `json:"total_vulnerability_count"` TotalAssetCount int `json:"total_asset_count"` }
type VulnerabilitiesFilters ¶
type VulnerabilitiesFilters struct {
Filters []Filter `json:"filters"`
}
type Vulnerability ¶
type Vulnerability struct { Count int `json:"count"` PluginFamily string `json:"plugin_family"` PluginId int `json:"plugin_id"` PluginName string `json:"plugin_name"` VulnerabilityState string `json:"vulnerability_state"` AcceptedCount int `json:"accepted_count"` RecastedCount int `json:"recasted_count"` CountsBySeverity []struct { Count int `json:"count"` Value int `json:"value"` } `json:"counts_by_severity"` Severity int `json:"severity"` }
type VulnerabilityInfo ¶
type VulnerabilityInfo struct { PluginId string // TODO rename Info struct { Count int `json:"count"` Description string `json:"description"` Synopsis string `json:"synopsis"` Solution string `json:"solution"` Discovery struct { SeenFirst time.Time `json:"seen_first"` SeenLast time.Time `json:"seen_last"` } `json:"discovery"` Severity int `json:"severity"` PluginDetails struct { Family string `json:"family"` ModificationDate time.Time `json:"modification_date"` Name string `json:"name"` PublicationDate time.Time `json:"publication_date"` Type string `json:"type"` Version string `json:"version"` Severity int `json:"severity"` } `json:"plugin_details"` ReferenceInformation []struct { Name string `json:"name"` URL string `json:"url,omitempty"` // the API is very inconsistent with the return type here Values []interface{} `json:"values"` } `json:"reference_information"` // NOTE api defines these 'interface' fields as just 'object' RiskInformation struct { RiskFactor string `json:"risk_factor"` CvssVector string `json:"cvss_vector"` CvssBaseScore string `json:"cvss_base_score"` CvssTemporalVector interface{} `json:"cvss_temporal_vector"` CvssTemporalScore interface{} `json:"cvss_temporal_score"` Cvss3Vector string `json:"cvss3_vector"` Cvss3BaseScore string `json:"cvss3_base_score"` Cvss3TemporalVector interface{} `json:"cvss3_temporal_vector"` Cvss3TemporalScore interface{} `json:"cvss3_temporal_score"` StigSeverity string `json:"stig_severity"` } `json:"risk_information"` SeeAlso []string `json:"see_also"` // this name is overloaded VulnerabilityInformation struct { VulnerabilityPublicationDate time.Time `json:"vulnerability_publication_date"` ExploitedByMalware interface{} `json:"exploited_by_malware"` PatchPublicationDate time.Time `json:"patch_publication_date"` ExploitAvailable interface{} `json:"exploit_available"` ExploitabilityEase interface{} `json:"exploitability_ease"` AssetInventory interface{} `json:"asset_inventory"` DefaultAccount interface{} `json:"default_account"` ExploitedByNessus interface{} `json:"exploited_by_nessus"` InTheNews interface{} `json:"in_the_news"` Malware interface{} `json:"malware"` UnsupportedByVendor interface{} `json:"unsupported_by_vendor"` Cpe []string `json:"cpe"` ExploitFrameworks []interface{} `json:"exploit_frameworks"` } `json:"vulnerability_information"` } `json:"info"` }
this is a list of vulnerabilities for a specific plugin (maybe rename to PluginVulnerabilityInfo? I'm keeping the naming consistent with the Tenable docs, which tends to use this kind of ambiguous naming)
type VulnerabilityOutput ¶
type VulnerabilityOutput struct { PluginOutput string `json:"plugin_output"` States []struct { Name string `json:"name"` Results []struct { ApplicationProtocol string `json:"application_protocol"` Port int `json:"port"` TransportProtocol string `json:"transport_protocol"` // not the same as the usual Asset, so no refactor here Assets []struct { Hostname string `json:"hostname"` ID string `json:"id"` UUID string `json:"uuid"` } `json:"assets"` Severity int `json:"severity"` } `json:"results"` } `json:"states"` }
type VulnerabilityOutputs ¶
type VulnerabilityOutputs struct {
Outputs []VulnerabilityOutput `json:"outputs"`
}
type WbExportRequest ¶
type WbExportRequest struct {
File int `json:"file"`
}
type WbExportStatus ¶
type WorkbenchExportRequestOpts ¶
type WorkbenchExportRequestOpts struct { // REQUIRED // valid values are nessus, html, pdf, csv Format string `url:"format"` // only valid value is vulnerabilities Report string `url:"report"` // date given as unix epoch time // semicolon-separated list, valid values are vuln_by_plugin, vuln_by_asset, vuln_hosts_summary, exec_summary, diff // only vuln_by_asset is supported for nessus format Chapter string `url:"chapter"` // NOT REQUIRED StartDate int `url:"start_date,omitempty"` // number of days DateRange int `url:"date_range,omitempty"` Filters string `url:"filters,omitempty"` // TODO // valid values are and, or FilterSearchType string `url:"filter_search_type,omitempty"` MinimumVulnInfo bool `url:"minimum_vuln_info,omitempty"` PluginId int `url:"plugin_id,omitempty"` AssetId string `url:"asset_id,omitempty"` }
unused
type WorkbenchesService ¶
type WorkbenchesService service
func (*WorkbenchesService) AssetDelete ¶
Delete an asset from the workbench This DELETE request in Tenable doesn't have a response body or request
func (*WorkbenchesService) AssetVulnerabilities ¶
func (s *WorkbenchesService) AssetVulnerabilities(ctx context.Context, assetId string) (*AssetVulnerabilities, *Response, error)
List up to the first 5000 vulnerabilities recorded for a single asset . NB this is not `AssetsVulnerabilities` (multiple assets)
func (*WorkbenchesService) AssetVulnerabilityInfo ¶
func (s *WorkbenchesService) AssetVulnerabilityInfo(ctx context.Context, assetId string, pluginId string) (*AssetVulnerabilityInfo, *Response, error)
Get the details for a vulnerability recorded on a given asset
func (*WorkbenchesService) AssetVulnerabilityInfoList ¶
func (s *WorkbenchesService) AssetVulnerabilityInfoList(ctx context.Context, assetId string) (*AssetVulnerabilityInfoList, error)
AssetVulnerabilityInfo for every plugin that detected a vulnerability on the asset
func (*WorkbenchesService) AssetVulnerabilityOutputs ¶
func (s *WorkbenchesService) AssetVulnerabilityOutputs(ctx context.Context, assetId string, pluginId string) (*VulnerabilityOutputs, *Response, error)
Get the vulnerability outputs for a single plugin for a single asset
func (*WorkbenchesService) AssetsInfo ¶
func (s *WorkbenchesService) AssetsInfo(ctx context.Context, assetId string) (*AssetInfo, *Response, error)
Get general information about an asset
func (*WorkbenchesService) AssetsVulnerabilities ¶
func (s *WorkbenchesService) AssetsVulnerabilities(ctx context.Context) (*AssetsVulnerabilities, *Response, error)
List up to 5000 assets with vulnerabilities. NB this is not `AssetVulnerabilities` (one asset)
func (*WorkbenchesService) ExportDownload ¶
func (s *WorkbenchesService) ExportDownload(ctx context.Context) (*WbExportRequest, *Response, error)
Downloads the file, which you likely don't want to do through Go
func (*WorkbenchesService) ExportRequest ¶
func (s *WorkbenchesService) ExportRequest(ctx context.Context) (*WbExportRequest, *Response, error)
FIXME the export struct names will collide with scan exports, BUT they might be the same structure, and thus be common
func (*WorkbenchesService) ExportStatus ¶
func (s *WorkbenchesService) ExportStatus(ctx context.Context, fileId int) (*WbExportStatus, *Response, error)
Query the status for a particular pending export file. When it's ready, the .status field will be "ready" TODO I don't like that it's passed as an int
func (*WorkbenchesService) Vulnerabilities ¶
func (s *WorkbenchesService) Vulnerabilities(ctx context.Context) (*Vulnerabilities, *Response, error)
List up to the first 5000 vulnerabilities recorded. Use the export-request API if you need more than that
func (*WorkbenchesService) VulnerabilitiesFilters ¶
func (s *WorkbenchesService) VulnerabilitiesFilters(ctx context.Context) (*VulnerabilitiesFilters, *Response, error)
Get the available filters for the vulnerabilities workbench
func (*WorkbenchesService) VulnerabilitiesInfo ¶
func (s *WorkbenchesService) VulnerabilitiesInfo(ctx context.Context, pluginId string) (*VulnerabilityInfo, *Response, error)
Get the vulnerability details for a plugin
func (*WorkbenchesService) VulnerabilityOutputs ¶
func (s *WorkbenchesService) VulnerabilityOutputs(ctx context.Context, pluginId string) (*VulnerabilityOutputs, *Response, error)
Get the vulnerability outputs for a given plugin TODO wat mean