Skip to content

Commit b03f730

Browse files
authored
Merge pull request #282 from projectdiscovery/fix/axfr-force-tcp
Fixing axfr
2 parents 428c4a1 + 8103a9b commit b03f730

2 files changed

Lines changed: 23 additions & 1 deletion

File tree

client.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,11 @@ func (c *Client) axfr(host string) (*AXFRData, error) {
681681
}
682682
}
683683

684-
resolvers = append(resolvers, c.resolvers...)
684+
for _, r := range c.resolvers {
685+
if nr, ok := r.(*NetworkResolver); ok {
686+
resolvers = append(resolvers, &NetworkResolver{Protocol: TCP, Host: nr.Host, Port: nr.Port})
687+
}
688+
}
685689

686690
var data []*DNSData
687691
// perform zone transfer for each ns

client_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,24 @@ func TestTrace(t *testing.T) {
171171
require.Nil(t, err, "could not resolve dns")
172172
}
173173

174+
func TestAXFRWithUDPResolvers(t *testing.T) {
175+
// Resolver configured without tcp: prefix defaults to UDP.
176+
// AXFR requires TCP, so axfr() must force TCP on fallback resolvers.
177+
client, err := New([]string{"81.4.108.41:53"}, 3)
178+
require.NoError(t, err)
179+
180+
axfrData, err := client.AXFR("zonetransfer.me")
181+
require.NoError(t, err)
182+
require.NotNil(t, axfrData)
183+
require.True(t, len(axfrData.DNSData) > 0, "expected AXFR records but got none")
184+
185+
var totalRecords int
186+
for _, d := range axfrData.DNSData {
187+
totalRecords += len(d.AllRecords)
188+
}
189+
require.True(t, totalRecords > 0, "expected non-empty AXFR records")
190+
}
191+
174192
func TestParseFromMsgIgnoresExtraAndNsSections(t *testing.T) {
175193
msg := new(dns.Msg)
176194
msg.SetQuestion("example.com.", dns.TypeA)

0 commit comments

Comments
 (0)