Skip to content

Commit d8a4473

Browse files
authored
Merge pull request #7 from wgpsec/dev
feat: support lists qiniu cloud kodo services
2 parents f99684a + e16fc59 commit d8a4473

File tree

22 files changed

+241
-66
lines changed

22 files changed

+241
-66
lines changed

CHANGELOG.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
# Change Log
22

3-
## [v1.0.0](https://github.com/wgpsec/lc/releases/tag/v1.0.0)
3+
## [v1.0.0](https://github.com/wgpsec/lc/releases/tag/v1.0.0) 2024.4.20
44

55
* 支持列出阿里云 RDS 数据库服务
66
* 支持列出腾讯云 COS 对象存储服务
7+
* 支持列出七牛云 Kodo 对象存储服务
78
* 增加详细日志输出
89

910
## [v0.0.1](https://github.com/wgpsec/lc/releases/tag/v0.0.1) 2024.4.6

README.md

+13-12
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,19 @@ LC(List Cloud)是一个多云攻击面资产梳理的工具,使用 LC 可
3636
### 支持列出的云服务
3737

3838
| 序号 | 云服务商 | 服务名称 |
39-
|:--:| :------: |:----------:|
40-
| 1 | 阿里云 | ECS 云服务器 |
41-
| 2 | 阿里云 | OSS 对象存储 |
42-
| 3 | 阿里云 | RDS 数据库 |
43-
| 4 | 腾讯云 | CVM 云服务器 |
44-
| 5 | 腾讯云 | LH 轻量应用服务器 |
45-
| 6 | 腾讯云 | COS 对象存储 |
46-
| 7 | 华为云 | OBS 对象存储 |
47-
| 8 | 天翼云 | OOS 对象存储 |
48-
| 9 | 百度云 | BOS 对象存储 |
49-
| 10 | 百度云 | BCC 云服务器 |
50-
| 11 | 联通云 | OSS 对象存储 |
39+
|:--:|:----:|:----------:|
40+
| 1 | 阿里云 | ECS 云服务器 |
41+
| 2 | 阿里云 | OSS 对象存储 |
42+
| 3 | 阿里云 | RDS 数据库 |
43+
| 4 | 腾讯云 | CVM 云服务器 |
44+
| 5 | 腾讯云 | LH 轻量应用服务器 |
45+
| 6 | 腾讯云 | COS 对象存储 |
46+
| 7 | 华为云 | OBS 对象存储 |
47+
| 8 | 天翼云 | OOS 对象存储 |
48+
| 9 | 百度云 | BOS 对象存储 |
49+
| 10 | 百度云 | BCC 云服务器 |
50+
| 11 | 联通云 | OSS 对象存储 |
51+
| 12 | 七牛云 | Kodo 对象存储 |
5152

5253
## 使用手册
5354

cmd/configFile.go

+14-7
Original file line numberDiff line numberDiff line change
@@ -25,40 +25,47 @@ const defaultConfigFile = `# # lc (list cloud) 的云服务商配置文件
2525
2626
# # 腾讯云
2727
# # 访问凭证获取地址:https://console.cloud.tencent.com/cam
28-
# - provider: tencent cloud
28+
# - provider: tencent
2929
# id: tencent_cloud_default
3030
# access_key:
3131
# secret_key:
3232
# session_token:
3333
3434
# # 华为云
3535
# # 访问凭证获取地址:https://console.huaweicloud.com/iam
36-
# - provider: huawei cloud
36+
# - provider: huawei
3737
# id: huawei_cloud_default
3838
# access_key:
3939
# secret_key:
4040
# session_token:
4141
4242
# # 天翼云
4343
# # 访问凭证获取地址:https://oos-cn.ctyun.cn/oos/ctyun/iam/dist/index.html#/certificate
44-
# - provider: ctyun
45-
# id: ctyun_default
44+
# - provider: tianyi
45+
# id: tianyi_cloud_default
4646
# access_key:
4747
# secret_key:
4848
4949
# # 百度云
5050
# # 访问凭证获取地址:https://console.bce.baidu.com/iam/
51-
# - provider: baidu cloud
51+
# - provider: baidu
5252
# id: baidu_cloud_default
5353
# access_key:
5454
# secret_key:
5555
# session_token:
5656
5757
# # 联通云
5858
# # 访问凭证获取地址:https://console.cucloud.cn/console/uiam
59-
# - provider: cu cloud
60-
# id: cu_cloud_default
59+
# - provider: liantong
60+
# id: liantong_cloud_default
6161
# access_key:
6262
# secret_key:
6363
# session_token:
64+
65+
# # 七牛云
66+
# # 访问凭证获取地址:https://portal.qiniu.com/developer/user/key
67+
# - provider: qiniu
68+
# id: qiniu_cloud_default
69+
# access_key:
70+
# secret_key:
6471
`

go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ require (
1111
github.com/projectdiscovery/goflags v0.1.46
1212
github.com/projectdiscovery/gologger v1.1.12
1313
github.com/projectdiscovery/utils v0.0.87
14+
github.com/qiniu/go-sdk/v7 v7.20.0
1415
github.com/teamssix/oos-go-sdk v0.0.1
1516
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.893
1617
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.893
@@ -26,6 +27,7 @@ require (
2627
github.com/clbanning/mxj v1.8.4 // indirect
2728
github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect
2829
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect
30+
github.com/gofrs/flock v0.8.1 // indirect
2931
github.com/golang/snappy v0.0.4 // indirect
3032
github.com/google/go-querystring v1.1.0 // indirect
3133
github.com/gorilla/css v1.0.0 // indirect
@@ -55,6 +57,7 @@ require (
5557
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect
5658
golang.org/x/mod v0.12.0 // indirect
5759
golang.org/x/net v0.20.0 // indirect
60+
golang.org/x/sync v0.6.0 // indirect
5861
golang.org/x/sys v0.17.0 // indirect
5962
golang.org/x/text v0.14.0 // indirect
6063
golang.org/x/time v0.5.0 // indirect

go.sum

+56-2
Large diffs are not rendered by default.

pkg/inventory/inventory.go

+18-15
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ package inventory
33
import (
44
"fmt"
55
"github.com/wgpsec/lc/pkg/providers/aliyun"
6-
"github.com/wgpsec/lc/pkg/providers/baiducloud"
7-
"github.com/wgpsec/lc/pkg/providers/ctyun"
8-
"github.com/wgpsec/lc/pkg/providers/cucloud"
9-
"github.com/wgpsec/lc/pkg/providers/huaweicloud"
10-
"github.com/wgpsec/lc/pkg/providers/tencentcloud"
6+
"github.com/wgpsec/lc/pkg/providers/baidu"
7+
"github.com/wgpsec/lc/pkg/providers/huawei"
8+
"github.com/wgpsec/lc/pkg/providers/liantong"
9+
"github.com/wgpsec/lc/pkg/providers/qiniu"
10+
"github.com/wgpsec/lc/pkg/providers/tencent"
11+
"github.com/wgpsec/lc/pkg/providers/tianyi"
1112
"github.com/wgpsec/lc/pkg/schema"
1213
"github.com/wgpsec/lc/utils"
1314
)
@@ -37,16 +38,18 @@ func nameToProvider(value string, block schema.OptionBlock) (schema.Provider, er
3738
switch value {
3839
case utils.Aliyun:
3940
return aliyun.New(block)
40-
case utils.TencentCloud:
41-
return tencentcloud.New(block)
42-
case utils.HuaweiCloud:
43-
return huaweicloud.New(block)
44-
case utils.Ctyun:
45-
return ctyun.New(block)
46-
case utils.BaiduCloud:
47-
return baiducloud.New(block)
48-
case utils.CuCloud:
49-
return cucloud.New(block)
41+
case utils.Tencent:
42+
return tencent.New(block)
43+
case utils.Huawei:
44+
return huawei.New(block)
45+
case utils.TianYi:
46+
return tianyi.New(block)
47+
case utils.Baidu:
48+
return baidu.New(block)
49+
case utils.LianTong:
50+
return liantong.New(block)
51+
case utils.QiNiu:
52+
return qiniu.New(block)
5053
default:
5154
return nil, fmt.Errorf("发现无效的云服务商名: %s", value)
5255
}

pkg/providers/baiducloud/baiducloud.go renamed to pkg/providers/baidu/baidu.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package baiducloud
1+
package baidu
22

33
import (
44
"context"
@@ -80,7 +80,7 @@ func New(options schema.OptionBlock) (*Provider, error) {
8080
okST: okST,
8181
}
8282

83-
return &Provider{provider: utils.BaiduCloud, id: id, bosClient: bosClient, config: config}, nil
83+
return &Provider{provider: utils.Baidu, id: id, bosClient: bosClient, config: config}, nil
8484
}
8585

8686
func (p *Provider) Resources(ctx context.Context) (*schema.Resources, error) {

pkg/providers/baiducloud/bcc.go renamed to pkg/providers/baidu/bcc.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package baiducloud
1+
package baidu
22

33
import (
44
"context"
@@ -61,7 +61,6 @@ func (d *instanceProvider) describeInstances(ch <-chan string, wg *sync.WaitGrou
6161
bccClient *bcc.Client
6262
)
6363
for endpoint := range ch {
64-
6564
if d.config.okST {
6665
bccClient, err = bcc.NewClient(d.config.accessKeyID, d.config.accessKeySecret, "")
6766
if err != nil {

pkg/providers/baiducloud/bos.go renamed to pkg/providers/baidu/bos.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
package baiducloud
1+
package baidu
22

33
import (
44
"context"
55
"github.com/baidubce/bce-sdk-go/services/bos"
6+
"github.com/projectdiscovery/gologger"
67
"github.com/wgpsec/lc/pkg/schema"
78
"strings"
89
)
@@ -15,6 +16,7 @@ type bosProvider struct {
1516

1617
func (d *bosProvider) GetResource(ctx context.Context) (*schema.Resources, error) {
1718
var list = schema.NewResources()
19+
gologger.Debug().Msg("正在获取百度云 BOS 资源信息")
1820
response, err := d.bosClient.ListBuckets()
1921
if err != nil {
2022
return nil, err

pkg/providers/huaweicloud/huaweicloud.go renamed to pkg/providers/huawei/huawei.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package huaweicloud
1+
package huawei
22

33
import (
44
"context"
@@ -47,7 +47,7 @@ func New(options schema.OptionBlock) (*Provider, error) {
4747
return nil, err
4848
}
4949

50-
return &Provider{provider: utils.HuaweiCloud, id: id, obsClient: obsClient}, nil
50+
return &Provider{provider: utils.Huawei, id: id, obsClient: obsClient}, nil
5151
}
5252

5353
func (p *Provider) Resources(ctx context.Context) (*schema.Resources, error) {

pkg/providers/huaweicloud/obs.go renamed to pkg/providers/huawei/obs.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package huaweicloud
1+
package huawei
22

33
import (
44
"context"

pkg/providers/cucloud/cucloud.go renamed to pkg/providers/liantong/liantong.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cucloud
1+
package liantong
22

33
import (
44
"context"
@@ -38,7 +38,7 @@ func New(options schema.OptionBlock) (*Provider, error) {
3838
accessKeySecret: accessKeySecret,
3939
sessionToken: sessionToken,
4040
}
41-
return &Provider{id: id, provider: utils.CuCloud, config: config}, nil
41+
return &Provider{id: id, provider: utils.LianTong, config: config}, nil
4242
}
4343

4444
func (p *Provider) Name() string {

pkg/providers/cucloud/oss.go renamed to pkg/providers/liantong/oss.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cucloud
1+
package liantong
22

33
import (
44
"context"

pkg/providers/qiniu/kodo.go

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package qiniu
2+
3+
import (
4+
"context"
5+
"github.com/projectdiscovery/gologger"
6+
"github.com/qiniu/go-sdk/v7/auth"
7+
"github.com/qiniu/go-sdk/v7/storage"
8+
"github.com/wgpsec/lc/pkg/schema"
9+
)
10+
11+
type kodoProvider struct {
12+
id string
13+
provider string
14+
kodoClient *auth.Credentials
15+
}
16+
17+
func (d *kodoProvider) GetResource(ctx context.Context) (*schema.Resources, error) {
18+
var request storage.BucketV4Input
19+
var list = schema.NewResources()
20+
gologger.Debug().Msg("正在获取七牛云 Kodo 对象存储信息")
21+
cfg := storage.Config{
22+
UseHTTPS: true,
23+
}
24+
bucketManager := storage.NewBucketManager(d.kodoClient, &cfg)
25+
for {
26+
response, err := bucketManager.BucketsV4(&request)
27+
if err != nil {
28+
return nil, err
29+
}
30+
for _, bucket := range response.Buckets {
31+
list.Append(&schema.Resource{
32+
ID: d.id,
33+
Public: true,
34+
DNSName: bucket.Name,
35+
Provider: d.provider,
36+
})
37+
}
38+
if response.IsTruncated {
39+
response.NextMarker = request.Marker
40+
} else {
41+
break
42+
}
43+
}
44+
return list, nil
45+
}

pkg/providers/qiniu/qiniu.go

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package qiniu
2+
3+
import (
4+
"context"
5+
"github.com/projectdiscovery/gologger"
6+
"github.com/qiniu/go-sdk/v7/auth"
7+
"github.com/wgpsec/lc/pkg/schema"
8+
"github.com/wgpsec/lc/utils"
9+
)
10+
11+
type Provider struct {
12+
id string
13+
provider string
14+
kodoClient *auth.Credentials
15+
}
16+
17+
func New(options schema.OptionBlock) (*Provider, error) {
18+
var (
19+
kodoClient *auth.Credentials
20+
)
21+
accessKeyID, ok := options.GetMetadata(utils.AccessKey)
22+
if !ok {
23+
return nil, &utils.ErrNoSuchKey{Name: utils.AccessKey}
24+
}
25+
accessKeySecret, ok := options.GetMetadata(utils.SecretKey)
26+
if !ok {
27+
return nil, &utils.ErrNoSuchKey{Name: utils.SecretKey}
28+
}
29+
id, _ := options.GetMetadata(utils.Id)
30+
31+
gologger.Debug().Msg("找到七牛云访问永久访问凭证")
32+
33+
// kodo client
34+
kodoClient = auth.New(accessKeyID, accessKeySecret)
35+
36+
return &Provider{provider: utils.QiNiu, id: id, kodoClient: kodoClient}, nil
37+
}
38+
39+
func (p *Provider) Resources(ctx context.Context) (*schema.Resources, error) {
40+
var err error
41+
kodoProvider := &kodoProvider{kodoClient: p.kodoClient, id: p.id, provider: p.provider}
42+
buckets, err := kodoProvider.GetResource(ctx)
43+
if err != nil {
44+
return nil, err
45+
}
46+
gologger.Info().Msgf("获取到 %d 条七牛云 Kodo 对象存储信息", len(buckets.Items))
47+
finalList := schema.NewResources()
48+
finalList.Merge(buckets)
49+
return finalList, nil
50+
}
51+
52+
func (p *Provider) Name() string {
53+
return p.provider
54+
}
55+
func (p *Provider) ID() string {
56+
return p.id
57+
}

pkg/providers/tencentcloud/cos.go renamed to pkg/providers/tencent/cos.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tencentcloud
1+
package tencent
22

33
import (
44
"context"

pkg/providers/tencentcloud/cvm.go renamed to pkg/providers/tencent/cvm.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tencentcloud
1+
package tencent
22

33
import (
44
"context"

pkg/providers/tencentcloud/lh.go renamed to pkg/providers/tencent/lh.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tencentcloud
1+
package tencent
22

33
import (
44
"context"

pkg/providers/tencentcloud/tencentcloud.go renamed to pkg/providers/tencent/tencent.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tencentcloud
1+
package tencent
22

33
import (
44
"context"
@@ -84,7 +84,7 @@ func New(options schema.OptionBlock) (*Provider, error) {
8484
},
8585
})
8686

87-
return &Provider{id: id, provider: utils.TencentCloud, credential: credential, cvmRegions: cvmRegions, lhRegions: lhRegions, cosClient: cosClient}, nil
87+
return &Provider{id: id, provider: utils.Tencent, credential: credential, cvmRegions: cvmRegions, lhRegions: lhRegions, cosClient: cosClient}, nil
8888
}
8989

9090
func (p *Provider) Name() string {

0 commit comments

Comments
 (0)