Skip to content

Commit 9057faa

Browse files
committed
updates to DNS plugin handlers
1 parent 7477f2d commit 9057faa

File tree

4 files changed

+140
-120
lines changed

4 files changed

+140
-120
lines changed

engine/plugins/dns/cname.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
type dnsCNAME struct {
2323
name string
2424
plugin *dnsPlugin
25+
source *et.Source
2526
}
2627

2728
type relAlias struct {
@@ -41,8 +42,7 @@ func (d *dnsCNAME) check(e *et.Event) error {
4142
}
4243

4344
var alias []*relAlias
44-
src := d.plugin.source
45-
if support.AssetMonitoredWithinTTL(e.Session, e.Entity, src, since) {
45+
if support.AssetMonitoredWithinTTL(e.Session, e.Entity, d.source, since) {
4646
alias = append(alias, d.lookup(e, e.Entity, since)...)
4747
} else {
4848
alias = append(alias, d.query(e, e.Entity)...)
@@ -77,7 +77,7 @@ func (d *dnsCNAME) query(e *et.Event, name *dbt.Entity) []*relAlias {
7777
if rr, err := support.PerformQuery(fqdn.Name, dns.TypeCNAME); err == nil {
7878
if records := d.store(e, name, rr); len(records) > 0 {
7979
alias = append(alias, records...)
80-
support.MarkAssetMonitored(e.Session, name, d.plugin.source)
80+
support.MarkAssetMonitored(e.Session, name, d.source)
8181
}
8282
}
8383

@@ -106,8 +106,8 @@ func (d *dnsCNAME) store(e *et.Event, fqdn *dbt.Entity, rr []*resolve.ExtractedA
106106
}); err == nil && edge != nil {
107107
alias = append(alias, &relAlias{alias: fqdn, target: cname})
108108
_, _ = e.Session.Cache().CreateEdgeProperty(edge, &general.SourceProperty{
109-
Source: d.plugin.source.Name,
110-
Confidence: d.plugin.source.Confidence,
109+
Source: d.source.Name,
110+
Confidence: d.source.Confidence,
111111
})
112112
}
113113
}

engine/plugins/dns/ip.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type dnsIP struct {
2525
name string
2626
queries []uint16
2727
plugin *dnsPlugin
28+
source *et.Source
2829
}
2930

3031
type relIP struct {
@@ -48,11 +49,10 @@ func (d *dnsIP) check(e *et.Event) error {
4849
}
4950

5051
var ips []*relIP
51-
src := d.plugin.source
52-
if support.AssetMonitoredWithinTTL(e.Session, e.Entity, src, since) {
52+
if support.AssetMonitoredWithinTTL(e.Session, e.Entity, d.source, since) {
5353
ips = append(ips, d.lookup(e, fqdn.Name, since)...)
5454
} else {
55-
ips = append(ips, d.query(e, e.Entity, src)...)
55+
ips = append(ips, d.query(e, e.Entity)...)
5656
}
5757

5858
if len(ips) > 0 {
@@ -74,7 +74,7 @@ func (d *dnsIP) check(e *et.Event) error {
7474
size = d.plugin.firstSweepSize
7575
}
7676
if size > 0 {
77-
support.IPAddressSweep(e, ip, src, size, sweepCallback)
77+
support.IPAddressSweep(e, ip, d.source, size, sweepCallback)
7878
}
7979
}
8080
}
@@ -98,23 +98,23 @@ func (d *dnsIP) lookup(e *et.Event, fqdn string, since time.Time) []*relIP {
9898
return ips
9999
}
100100

101-
func (d *dnsIP) query(e *et.Event, name *dbt.Entity, src *et.Source) []*relIP {
101+
func (d *dnsIP) query(e *et.Event, name *dbt.Entity) []*relIP {
102102
var ips []*relIP
103103

104104
fqdn := name.Asset.(*oamdns.FQDN)
105105
for _, qtype := range d.queries {
106106
if rr, err := support.PerformQuery(fqdn.Name, qtype); err == nil {
107-
if records := d.store(e, name, src, rr); len(records) > 0 {
107+
if records := d.store(e, name, rr); len(records) > 0 {
108108
ips = append(ips, records...)
109-
support.MarkAssetMonitored(e.Session, name, src)
109+
support.MarkAssetMonitored(e.Session, name, d.source)
110110
}
111111
}
112112
}
113113

114114
return ips
115115
}
116116

117-
func (d *dnsIP) store(e *et.Event, fqdn *dbt.Entity, src *et.Source, rr []*resolve.ExtractedAnswer) []*relIP {
117+
func (d *dnsIP) store(e *et.Event, fqdn *dbt.Entity, rr []*resolve.ExtractedAnswer) []*relIP {
118118
var ips []*relIP
119119

120120
for _, record := range rr {
@@ -133,8 +133,8 @@ func (d *dnsIP) store(e *et.Event, fqdn *dbt.Entity, src *et.Source, rr []*resol
133133
}); err == nil && edge != nil {
134134
ips = append(ips, &relIP{rtype: "dns_record", ip: ip})
135135
_, _ = e.Session.Cache().CreateEdgeProperty(edge, &general.SourceProperty{
136-
Source: src.Name,
137-
Confidence: src.Confidence,
136+
Source: d.source.Name,
137+
Confidence: d.source.Confidence,
138138
})
139139
}
140140
} else {
@@ -155,8 +155,8 @@ func (d *dnsIP) store(e *et.Event, fqdn *dbt.Entity, src *et.Source, rr []*resol
155155
}); err == nil && edge != nil {
156156
ips = append(ips, &relIP{rtype: "dns_record", ip: ip})
157157
_, _ = e.Session.Cache().CreateEdgeProperty(edge, &general.SourceProperty{
158-
Source: src.Name,
159-
Confidence: src.Confidence,
158+
Source: d.source.Name,
159+
Confidence: d.source.Confidence,
160160
})
161161
}
162162
} else {

engine/plugins/dns/plugin.go

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,15 @@ func (d *dnsPlugin) Start(r et.Registry) error {
6969
return err
7070
}
7171

72-
d.cname = &dnsCNAME{name: d.name + "-CNAME", plugin: d}
72+
cname := d.name + "-CNAME"
73+
d.cname = &dnsCNAME{
74+
name: cname,
75+
plugin: d,
76+
source: &et.Source{
77+
Name: cname,
78+
Confidence: 100,
79+
},
80+
}
7381
if err := r.RegisterHandler(&et.Handler{
7482
Plugin: d,
7583
Name: d.cname.name,
@@ -82,10 +90,15 @@ func (d *dnsPlugin) Start(r et.Registry) error {
8290
return err
8391
}
8492

93+
ipname := d.name + "-IP"
8594
d.ip = &dnsIP{
86-
name: d.name + "-IP",
95+
name: ipname,
8796
queries: []uint16{dns.TypeA, dns.TypeAAAA},
8897
plugin: d,
98+
source: &et.Source{
99+
Name: ipname,
100+
Confidence: 100,
101+
},
89102
}
90103
if err := r.RegisterHandler(&et.Handler{
91104
Plugin: d,
@@ -126,7 +139,15 @@ func (d *dnsPlugin) Start(r et.Registry) error {
126139
}
127140
go d.subs.releaseSessions()
128141

129-
d.txt = &dnsTXT{name: d.name + "-TXT", plugin: d}
142+
txtname := d.name + "-TXT"
143+
d.txt = &dnsTXT{
144+
name: d.name + "-TXT",
145+
plugin: d,
146+
source: &et.Source{
147+
Name: txtname,
148+
Confidence: 100,
149+
},
150+
}
130151
if err := r.RegisterHandler(&et.Handler{
131152
Plugin: d,
132153
Name: d.txt.name,

engine/plugins/dns/txt.go

Lines changed: 99 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,120 @@
1+
// Copyright © by Jeff Foley 2017-2025. All rights reserved.
2+
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
3+
// SPDX-License-Identifier: Apache-2.0
4+
15
package dns
26

37
import (
4-
"errors"
5-
"log/slog"
6-
"time"
7-
8-
"github.com/miekg/dns"
9-
"github.com/owasp-amass/amass/v4/engine/plugins/support"
10-
et "github.com/owasp-amass/amass/v4/engine/types"
11-
dbt "github.com/owasp-amass/asset-db/types"
12-
oam "github.com/owasp-amass/open-asset-model"
13-
oamdns "github.com/owasp-amass/open-asset-model/dns"
14-
"github.com/owasp-amass/resolve"
8+
"errors"
9+
"fmt"
10+
"log/slog"
11+
"time"
12+
13+
"github.com/miekg/dns"
14+
"github.com/owasp-amass/amass/v4/engine/plugins/support"
15+
et "github.com/owasp-amass/amass/v4/engine/types"
16+
dbt "github.com/owasp-amass/asset-db/types"
17+
oamdns "github.com/owasp-amass/open-asset-model/dns"
18+
"github.com/owasp-amass/resolve"
1519
)
1620

1721
type dnsTXT struct {
18-
name string
19-
plugin *dnsPlugin
22+
name string
23+
plugin *dnsPlugin
24+
source *et.Source
2025
}
2126

2227
func (d *dnsTXT) check(e *et.Event) error {
23-
_, ok := e.Entity.Asset.(*oamdns.FQDN)
24-
if !ok {
25-
slog.Error("failed to extract the FQDN asset", "event", e)
26-
return errors.New("failed to extract the FQDN asset")
27-
}
28-
29-
since, err := support.TTLStartTime(e.Session.Config(), "FQDN", "FQDN", d.plugin.name)
30-
if err != nil {
31-
slog.Error("failed to get TTL start time", "error", err, "event", e)
32-
return err
33-
}
34-
35-
var txtRecords []*resolve.ExtractedAnswer
36-
src := d.plugin.source
37-
if support.AssetMonitoredWithinTTL(e.Session, e.Entity, src, since) {
38-
txtRecords = d.lookup(e, e.Entity, since)
39-
} else {
40-
txtRecords = d.query(e, e.Entity)
41-
}
42-
43-
if len(txtRecords) > 0 {
44-
d.process(e, e.Entity, txtRecords)
45-
} else {
46-
slog.Warn("no TXT records found", "event", e)
47-
}
48-
return nil
28+
_, ok := e.Entity.Asset.(*oamdns.FQDN)
29+
if !ok {
30+
return errors.New("failed to extract the FQDN asset")
31+
}
32+
33+
since, err := support.TTLStartTime(e.Session.Config(), "FQDN", "FQDN", d.plugin.name)
34+
if err != nil {
35+
return err
36+
}
37+
38+
var txtRecords []*resolve.ExtractedAnswer
39+
if support.AssetMonitoredWithinTTL(e.Session, e.Entity, d.source, since) {
40+
txtRecords = d.lookup(e, e.Entity, since)
41+
} else {
42+
txtRecords = d.query(e, e.Entity)
43+
d.store(e, e.Entity, txtRecords)
44+
}
45+
46+
if len(txtRecords) > 0 {
47+
d.process(e, e.Entity, txtRecords)
48+
}
49+
return nil
4950
}
5051

5152
func (d *dnsTXT) lookup(e *et.Event, fqdn *dbt.Entity, since time.Time) []*resolve.ExtractedAnswer {
52-
var txtRecords []*resolve.ExtractedAnswer
53-
54-
n, ok := fqdn.Asset.(*oamdns.FQDN)
55-
if !ok || n == nil {
56-
slog.Error("Failed to cast asset to FQDN", "event", e, "fqdn", fqdn)
57-
return txtRecords
58-
}
59-
60-
if assets := d.plugin.lookupWithinTTL(e.Session, n.Name, oam.FQDN, since, oam.BasicDNSRelation, int(dns.TypeTXT)); len(assets) > 0 {
61-
for _, a := range assets {
62-
txtRecords = append(txtRecords, &resolve.ExtractedAnswer{
63-
Type: dns.TypeTXT,
64-
Data: a.Asset.(*oamdns.FQDN).Name,
65-
})
66-
}
67-
} else {
68-
slog.Warn("No assets found within TTL", "event", e, "fqdn", fqdn)
69-
}
70-
return txtRecords
53+
var txtRecords []*resolve.ExtractedAnswer
54+
55+
n, ok := fqdn.Asset.(*oamdns.FQDN)
56+
if !ok || n == nil {
57+
return txtRecords
58+
}
59+
60+
if tags, err := e.Session.Cache().GetEntityTags(fqdn, since, "dns_record"); err == nil {
61+
for _, tag := range tags {
62+
if prop, ok := tag.Property.(*oamdns.DNSRecordProperty); ok && prop.Header.RRType == int(dns.TypeTXT) {
63+
txtRecords = append(txtRecords, &resolve.ExtractedAnswer{
64+
Name: n.Name,
65+
Type: dns.TypeTXT,
66+
Data: prop.Data,
67+
})
68+
}
69+
}
70+
}
71+
72+
return txtRecords
7173
}
7274

7375
func (d *dnsTXT) query(e *et.Event, name *dbt.Entity) []*resolve.ExtractedAnswer {
74-
var txtRecords []*resolve.ExtractedAnswer
75-
76-
fqdn, ok := name.Asset.(*oamdns.FQDN)
77-
if !ok {
78-
slog.Error("Failed to cast asset to FQDN in query", "event", e, "name", name)
79-
return txtRecords
80-
}
81-
82-
if rr, err := support.PerformQuery(fqdn.Name, dns.TypeTXT); err == nil {
83-
txtRecords = append(txtRecords, rr...)
84-
support.MarkAssetMonitored(e.Session, name, d.plugin.source)
85-
} else {
86-
slog.Error("Failed to perform DNS query", "error", err, "event", e, "fqdn", fqdn)
87-
}
88-
89-
return txtRecords
76+
var txtRecords []*resolve.ExtractedAnswer
77+
78+
fqdn, ok := name.Asset.(*oamdns.FQDN)
79+
if !ok {
80+
return txtRecords
81+
}
82+
83+
if rr, err := support.PerformQuery(fqdn.Name, dns.TypeTXT); err == nil {
84+
txtRecords = append(txtRecords, rr...)
85+
support.MarkAssetMonitored(e.Session, name, d.source)
86+
}
87+
88+
return txtRecords
9089
}
9190

9291
func (d *dnsTXT) store(e *et.Event, fqdn *dbt.Entity, rr []*resolve.ExtractedAnswer) {
93-
for _, record := range rr {
94-
if record.Type != dns.TypeTXT {
95-
continue
96-
}
97-
98-
txtValue := record.Data
99-
100-
_, err := e.Session.Cache().CreateEntityProperty(fqdn, &oamdns.DNSRecordProperty{
101-
PropertyName: "dns_record",
102-
Header: oamdns.RRHeader{
103-
RRType: 16,
104-
Class: 1,
105-
TTL: 300,
106-
},
107-
Data: txtValue,
108-
})
109-
if err != nil {
110-
slog.Error("failed to create entity property", "error", err, "event", e, "fqdn", fqdn, "txtValue", txtValue)
111-
}
112-
}
92+
for _, record := range rr {
93+
if record.Type != dns.TypeTXT {
94+
continue
95+
}
96+
97+
txtValue := record.Data
98+
_, err := e.Session.Cache().CreateEntityProperty(fqdn, &oamdns.DNSRecordProperty{
99+
PropertyName: "dns_record",
100+
Header: oamdns.RRHeader{
101+
RRType: int(dns.TypeTXT),
102+
Class: 1,
103+
},
104+
Data: txtValue,
105+
})
106+
if err != nil {
107+
msg := fmt.Sprintf("failed to create entity property for %s: %s", txtValue, err)
108+
e.Session.Log().Error(msg, "error", err.Error(),
109+
slog.Group("plugin", "name", d.plugin.name, "handler", d.name))
110+
}
111+
}
113112
}
114113

115114
func (d *dnsTXT) process(e *et.Event, fqdn *dbt.Entity, txtRecords []*resolve.ExtractedAnswer) {
116-
d.store(e, fqdn, txtRecords)
117-
118-
for _, record := range txtRecords {
119-
e.Session.Log().Info("TXT record discovered", "fqdn", fqdn.Asset.(*oamdns.FQDN).Name, "txt", record.Data, slog.Group("plugin", "name", d.plugin.name, "handler", d.name))
120-
}
121-
}
115+
for _, record := range txtRecords {
116+
e.Session.Log().Info("TXT record discovered", "fqdn",
117+
fqdn.Asset.(*oamdns.FQDN).Name, "txt", record.Data,
118+
slog.Group("plugin", "name", d.plugin.name, "handler", d.name))
119+
}
120+
}

0 commit comments

Comments
 (0)