Skip to content

Commit 1b760f5

Browse files
committed
fixed #1107
1 parent d019201 commit 1b760f5

File tree

3 files changed

+49
-47
lines changed

3 files changed

+49
-47
lines changed

engine/plugins/service_discovery/http_probes/plugin.go

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import (
88
"context"
99
"crypto/x509"
1010
"fmt"
11-
"hash/maphash"
1211
"log/slog"
13-
"sync"
1412
"time"
1513

1614
"github.com/owasp-amass/amass/v5/engine/plugins/support"
@@ -19,18 +17,16 @@ import (
1917
dbt "github.com/owasp-amass/asset-db/types"
2018
oam "github.com/owasp-amass/open-asset-model"
2119
oamcert "github.com/owasp-amass/open-asset-model/certificate"
22-
"github.com/owasp-amass/open-asset-model/general"
23-
"github.com/owasp-amass/open-asset-model/platform"
20+
oamgen "github.com/owasp-amass/open-asset-model/general"
21+
oamplat "github.com/owasp-amass/open-asset-model/platform"
2422
)
2523

2624
type httpProbing struct {
27-
name string
28-
log *slog.Logger
29-
fqdnend *fqdnEndpoint
30-
ipaddr *ipaddrEndpoint
31-
source *et.Source
32-
hash maphash.Hash
33-
servlock sync.Mutex
25+
name string
26+
log *slog.Logger
27+
fqdnend *fqdnEndpoint
28+
ipaddr *ipaddrEndpoint
29+
source *et.Source
3430
}
3531

3632
func NewHTTPProbing() et.Plugin {
@@ -48,7 +44,6 @@ func (hp *httpProbing) Name() string {
4844
}
4945

5046
func (hp *httpProbing) Start(r et.Registry) error {
51-
hp.hash.SetSeed(maphash.MakeSeed())
5247
hp.log = r.Log().WithGroup("plugin").With("name", hp.name)
5348

5449
hp.fqdnend = &fqdnEndpoint{
@@ -117,10 +112,8 @@ func (hp *httpProbing) query(e *et.Event, entity *dbt.Entity, target string, por
117112

118113
func (hp *httpProbing) store(e *et.Event, resp *amasshttp.Response, entity *dbt.Entity, port int) []*support.Finding {
119114
addr := entity.Asset.Key()
115+
serv := support.ServiceWithIdentifier(addr, port)
120116

121-
hp.servlock.Lock()
122-
serv := support.ServiceWithIdentifier(&hp.hash, e.Session.ID().String(), addr)
123-
hp.servlock.Unlock()
124117
serv.Type = "web-service"
125118
serv.Output = resp.Body
126119
serv.OutputLen = int(resp.Length)
@@ -136,7 +129,7 @@ func (hp *httpProbing) store(e *et.Event, resp *amasshttp.Response, entity *dbt.
136129
}
137130
}
138131

139-
portrel := &general.PortRelation{
132+
portrel := &oamgen.PortRelation{
140133
Name: fmt.Sprintf("tcp_port_%d", port),
141134
PortNumber: port,
142135
Protocol: "TCP",
@@ -147,7 +140,7 @@ func (hp *httpProbing) store(e *et.Event, resp *amasshttp.Response, entity *dbt.
147140
return findings
148141
}
149142

150-
serv, valid := s.Asset.(*platform.Service)
143+
serv, valid := s.Asset.(*oamplat.Service)
151144
if !valid {
152145
return findings
153146
}
@@ -168,7 +161,7 @@ func (hp *httpProbing) store(e *et.Event, resp *amasshttp.Response, entity *dbt.
168161
To: firstAsset,
169162
ToName: c.SerialNumber,
170163
ToMeta: firstCert,
171-
Rel: &general.SimpleRelation{Name: "certificate"},
164+
Rel: &oamgen.SimpleRelation{Name: "certificate"},
172165
})
173166
}
174167
return findings
@@ -215,7 +208,7 @@ func (hp *httpProbing) createCertificates(sess et.Session, resp *amasshttp.Respo
215208
To: a,
216209
ToName: c.SerialNumber,
217210
ToMeta: cert,
218-
Rel: &general.SimpleRelation{Name: "issuing_certificate"},
211+
Rel: &oamgen.SimpleRelation{Name: "issuing_certificate"},
219212
})
220213
}
221214
prev = a

engine/plugins/support/database.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ import (
1717
oam "github.com/owasp-amass/open-asset-model"
1818
oamcert "github.com/owasp-amass/open-asset-model/certificate"
1919
oamdns "github.com/owasp-amass/open-asset-model/dns"
20-
"github.com/owasp-amass/open-asset-model/general"
20+
oamgen "github.com/owasp-amass/open-asset-model/general"
2121
oamnet "github.com/owasp-amass/open-asset-model/network"
22-
"github.com/owasp-amass/open-asset-model/platform"
22+
oamplat "github.com/owasp-amass/open-asset-model/platform"
2323
)
2424

2525
func StoreFQDNsWithSource(session et.Session, names []string, src *et.Source, plugin, handler string) []*dbt.Entity {
@@ -35,7 +35,7 @@ func StoreFQDNsWithSource(session et.Session, names []string, src *et.Source, pl
3535
for _, name := range names {
3636
if a, err := session.DB().CreateAsset(ctx, &oamdns.FQDN{Name: name}); err == nil && a != nil {
3737
results = append(results, a)
38-
_, _ = session.DB().CreateEntityProperty(ctx, a, &general.SourceProperty{
38+
_, _ = session.DB().CreateEntityProperty(ctx, a, &oamgen.SourceProperty{
3939
Source: src.Name,
4040
Confidence: src.Confidence,
4141
})
@@ -60,13 +60,13 @@ func StoreEmailsWithSource(session et.Session, emails []string, src *et.Source,
6060
for _, e := range emails {
6161
email := strings.ToLower(e)
6262

63-
if a, err := session.DB().CreateAsset(ctx, &general.Identifier{
64-
UniqueID: fmt.Sprintf("%s:%s", general.EmailAddress, email),
63+
if a, err := session.DB().CreateAsset(ctx, &oamgen.Identifier{
64+
UniqueID: fmt.Sprintf("%s:%s", oamgen.EmailAddress, email),
6565
ID: email,
66-
Type: general.EmailAddress,
66+
Type: oamgen.EmailAddress,
6767
}); err == nil && a != nil {
6868
results = append(results, a)
69-
_, _ = session.DB().CreateEntityProperty(ctx, a, &general.SourceProperty{
69+
_, _ = session.DB().CreateEntityProperty(ctx, a, &oamgen.SourceProperty{
7070
Source: src.Name,
7171
Confidence: src.Confidence,
7272
})
@@ -86,7 +86,7 @@ func MarkAssetMonitored(session et.Session, asset *dbt.Entity, src *et.Source) {
8686
ctx, cancel := context.WithTimeout(session.Ctx(), 3*time.Second)
8787
defer cancel()
8888

89-
_, _ = session.DB().CreateEntityProperty(ctx, asset, general.SimpleProperty{
89+
_, _ = session.DB().CreateEntityProperty(ctx, asset, oamgen.SimpleProperty{
9090
PropertyName: "last_monitored",
9191
PropertyValue: src.Name,
9292
})
@@ -111,13 +111,13 @@ func AssetMonitoredWithinTTL(session et.Session, asset *dbt.Entity, src *et.Sour
111111
return false
112112
}
113113

114-
func CreateServiceAsset(session et.Session, src *dbt.Entity, rel oam.Relation, serv *platform.Service, cert *oamcert.TLSCertificate) (*dbt.Entity, error) {
114+
func CreateServiceAsset(session et.Session, src *dbt.Entity, rel oam.Relation, serv *oamplat.Service, cert *oamcert.TLSCertificate) (*dbt.Entity, error) {
115115
var srvs []*dbt.Entity
116116

117117
ctx, cancel := context.WithTimeout(session.Ctx(), 30*time.Second)
118118
defer cancel()
119119

120-
if rport, ok := rel.(*general.PortRelation); ok && src != nil && serv != nil {
120+
if rport, ok := rel.(*oamgen.PortRelation); ok && src != nil && serv != nil {
121121
srcs := []*dbt.Entity{src}
122122

123123
if _, ok := src.Asset.(*oamdns.FQDN); ok {
@@ -137,10 +137,10 @@ func CreateServiceAsset(session et.Session, src *dbt.Entity, rel oam.Relation, s
137137
for _, s := range srcs {
138138
if edges, err := session.DB().OutgoingEdges(ctx, s, time.Time{}); err == nil && len(edges) > 0 {
139139
for _, edge := range edges {
140-
if eport, ok := edge.Relation.(*general.PortRelation); ok &&
140+
if eport, ok := edge.Relation.(*oamgen.PortRelation); ok &&
141141
eport.PortNumber == rport.PortNumber && strings.EqualFold(eport.Protocol, rport.Protocol) {
142142
if to, err := session.DB().FindEntityById(ctx, edge.ToEntity.ID); err == nil && to != nil {
143-
if srv, ok := to.Asset.(*platform.Service); ok && srv.OutputLen != 0 && srv.OutputLen == serv.OutputLen {
143+
if srv, ok := to.Asset.(*oamplat.Service); ok && srv.OutputLen != 0 && srv.OutputLen == serv.OutputLen {
144144
srvs = append(srvs, to)
145145
}
146146
}
@@ -154,7 +154,7 @@ func CreateServiceAsset(session et.Session, src *dbt.Entity, rel oam.Relation, s
154154
for _, srv := range srvs {
155155
var num int
156156

157-
s, valid := srv.Asset.(*platform.Service)
157+
s, valid := srv.Asset.(*oamplat.Service)
158158
if !valid {
159159
continue
160160
}

engine/plugins/support/normalization.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ package support
66

77
import (
88
"crypto/x509"
9-
"hash/maphash"
9+
"encoding/hex"
10+
"hash/fnv"
1011
"net/url"
1112
"strconv"
1213
"strings"
@@ -16,13 +17,13 @@ import (
1617
fnparser "github.com/caffix/fullname_parser"
1718
"github.com/nyaruka/phonenumbers"
1819
oamcert "github.com/owasp-amass/open-asset-model/certificate"
19-
"github.com/owasp-amass/open-asset-model/contact"
20-
"github.com/owasp-amass/open-asset-model/people"
21-
"github.com/owasp-amass/open-asset-model/platform"
20+
oamcon "github.com/owasp-amass/open-asset-model/contact"
21+
oampeop "github.com/owasp-amass/open-asset-model/people"
22+
oamplat "github.com/owasp-amass/open-asset-model/platform"
2223
oamurl "github.com/owasp-amass/open-asset-model/url"
2324
)
2425

25-
func FullNameToPerson(raw string) *people.Person {
26+
func FullNameToPerson(raw string) *oampeop.Person {
2627
if raw == "" {
2728
return nil
2829
}
@@ -51,7 +52,7 @@ func FullNameToPerson(raw string) *people.Person {
5152
fullname += ", " + name.Suffix
5253
}
5354

54-
return &people.Person{
55+
return &oampeop.Person{
5556
ID: fullname,
5657
FullName: fullname,
5758
FirstName: name.First,
@@ -60,7 +61,7 @@ func FullNameToPerson(raw string) *people.Person {
6061
}
6162
}
6263

63-
func PhoneToOAMPhone(phone, ext, country string) *contact.Phone {
64+
func PhoneToOAMPhone(phone, ext, country string) *oamcon.Phone {
6465
if phone == "" {
6566
return nil
6667
}
@@ -82,7 +83,7 @@ func PhoneToOAMPhone(phone, ext, country string) *contact.Phone {
8283
raw += " Ext. " + ext
8384
}
8485

85-
return &contact.Phone{
86+
return &oamcon.Phone{
8687
Raw: raw,
8788
E164: e164,
8889
CountryAbbrev: strings.ToUpper(country),
@@ -200,13 +201,21 @@ func TimeToJSONString(t *time.Time) string {
200201
return t.UTC().Format("2006-01-02T15:04:05Z07:00")
201202
}
202203

203-
func ServiceWithIdentifier(h *maphash.Hash, sessionid, address string) *platform.Service {
204-
_, _ = h.WriteString(sessionid + address)
205-
serv := &platform.Service{
206-
ID: address + strconv.Itoa(int(h.Sum64())),
207-
}
208-
h.Reset()
209-
return serv
204+
func ServiceWithIdentifier(address string, port int) *oamplat.Service {
205+
pstr := strconv.Itoa(port)
206+
name := address + ":" + pstr
207+
hashstr := Hash64Hex(name)
208+
209+
return &oamplat.Service{ID: name + ":" + hashstr}
210+
}
211+
212+
func Hash64Hex(s string) string {
213+
h := fnv.New64a()
214+
_, _ = h.Write([]byte(s))
215+
var b [8]byte
216+
sum := h.Sum(nil) // 8 bytes
217+
copy(b[:], sum)
218+
return hex.EncodeToString(b[:]) // 16 hex chars
210219
}
211220

212221
func X509ToOAMTLSCertificate(cert *x509.Certificate) *oamcert.TLSCertificate {

0 commit comments

Comments
 (0)