diff --git a/pkg/providers/gcp/gcp.go b/pkg/providers/gcp/gcp.go index 2dfedddb..0b57e119 100644 --- a/pkg/providers/gcp/gcp.go +++ b/pkg/providers/gcp/gcp.go @@ -6,6 +6,7 @@ import ( "github.com/projectdiscovery/cloudlist/pkg/schema" errorutil "github.com/projectdiscovery/utils/errors" "google.golang.org/api/cloudresourcemanager/v1" + "google.golang.org/api/compute/v1" container "google.golang.org/api/container/v1beta1" "google.golang.org/api/dns/v1" ) @@ -14,6 +15,7 @@ import ( type Provider struct { dns *dns.Service gke *container.Service + compute *compute.Service id string projects []string } @@ -47,7 +49,10 @@ func New(options schema.OptionBlock) (*Provider, error) { if err != nil { return nil, errorutil.NewWithErr(err).Msgf("could not create dns service with api key") } - + computeService, err := compute.NewService(context.Background(), creds) + if err != nil { + return nil, errorutil.NewWithErr(err).Msgf("could not create compute service with api key") + } containerService, err := container.NewService(context.Background(), creds) if err != nil { return nil, errorutil.NewWithErr(err).Msgf("could not create container service with api key") @@ -65,23 +70,33 @@ func New(options schema.OptionBlock) (*Provider, error) { } return nil }) - return &Provider{dns: dnsService, gke: containerService, projects: projects, id: id}, err + return &Provider{dns: dnsService, gke: containerService, projects: projects, id: id, compute: computeService}, err } // Resources returns the provider for an resource deployment source. func (p *Provider) Resources(ctx context.Context) (*schema.Resources, error) { finalList := schema.NewResources() + cloudDNSProvider := &cloudDNSProvider{dns: p.dns, id: p.id, projects: p.projects} zones, err := cloudDNSProvider.GetResource(ctx) if err != nil { return nil, err } finalList.Merge(zones) + GKEProvider := &gkeProvider{svc: p.gke, id: p.id, projects: p.projects} gkeData, err := GKEProvider.GetResource(ctx) if err != nil { return nil, err } finalList.Merge(gkeData) + + VMProvider := &cloudVMProvider{compute: p.compute, id: p.id, projects: p.projects} + vmData, err := VMProvider.GetResource(ctx) + if err != nil { + return nil, err + } + finalList.Merge(vmData) + return finalList, nil } diff --git a/pkg/providers/gcp/vms.go b/pkg/providers/gcp/vms.go new file mode 100644 index 00000000..d9d65fb5 --- /dev/null +++ b/pkg/providers/gcp/vms.go @@ -0,0 +1,53 @@ +package gcp + +import ( + "context" + "log" + + "github.com/projectdiscovery/cloudlist/pkg/schema" + "google.golang.org/api/compute/v1" +) + +type cloudVMProvider struct { + id string + compute *compute.Service + projects []string +} + +// GetResource returns all the resources in the store for a provider. +func (d *cloudVMProvider) GetResource(ctx context.Context) (*schema.Resources, error) { + list := schema.NewResources() + + for _, project := range d.projects { + instances := d.compute.Instances.AggregatedList(project) + err := instances.Pages(context.Background(), func(ial *compute.InstanceAggregatedList) error { + for _, instancesScopedList := range ial.Items { + for _, instance := range instancesScopedList.Instances { + instance := instance + + if len(instance.NetworkInterfaces) == 0 { + continue + } + nic := instance.NetworkInterfaces[0] + if len(nic.AccessConfigs) == 0 { + continue + } + cfg := nic.AccessConfigs[0] + + list.Append(&schema.Resource{ + ID: d.id, + Public: true, + Provider: providerName, + PublicIPv4: cfg.NatIP, + }) + } + } + return nil + }) + if err != nil { + log.Printf("Could not get all instances for project %s: %s\n", project, err) + continue + } + } + return list, nil +}