mirror of
https://github.com/projectdiscovery/httpx.git
synced 2024-12-01 04:08:53 +03:00
AS input support +asnmap integration (#821)
* Add asnmap integration - Use PD's asnmap lib to get asn details * Add AS input support [WIP] * Add AS input support - Add AS Number input support - Update README.md to add AS input example - Add test cases to test `targets()` function - Refactor target function remove if-else with switch case * Resolve merge conflicts * Replace - with _ in asnResponse for json * Replace - with _ in asnResponse for csv
This commit is contained in:
parent
12fee4f3ee
commit
bab68a487f
27
README.md
27
README.md
@ -289,7 +289,16 @@ https://173.0.84.6
|
|||||||
https://173.0.84.16
|
https://173.0.84.16
|
||||||
https://173.0.84.34
|
https://173.0.84.34
|
||||||
```
|
```
|
||||||
|
### AS Number Input
|
||||||
|
```console
|
||||||
|
echo AS14421 | httpx -silent
|
||||||
|
|
||||||
|
https://216.101.17.248
|
||||||
|
https://216.101.17.249
|
||||||
|
https://216.101.17.250
|
||||||
|
https://216.101.17.251
|
||||||
|
https://216.101.17.252
|
||||||
|
```
|
||||||
|
|
||||||
### Tool Chain
|
### Tool Chain
|
||||||
|
|
||||||
@ -387,15 +396,15 @@ subfinder -d hackerone.com -silent | httpx -asn
|
|||||||
|
|
||||||
Use with caution. You are responsible for your actions.
|
Use with caution. You are responsible for your actions.
|
||||||
Developers assume no liability and are not responsible for any misuse or damage.
|
Developers assume no liability and are not responsible for any misuse or damage.
|
||||||
https://mta-sts.managed.hackerone.com [AS54113, FASTLY, US, 185.199.108.0/24]
|
https://mta-sts.managed.hackerone.com [AS54113, FASTLY, US]
|
||||||
https://gslink.hackerone.com [AS16509, AMAZON-02, US, 13.33.168.0/22]
|
https://gslink.hackerone.com [AS16509, AMAZON-02, US]
|
||||||
https://www.hackerone.com [AS13335, CLOUDFLARENET, US, 104.16.96.0/20]
|
https://www.hackerone.com [AS13335, CLOUDFLARENET, US]
|
||||||
https://mta-sts.forwarding.hackerone.com [AS54113, FASTLY, US, 185.199.108.0/24]
|
https://mta-sts.forwarding.hackerone.com [AS54113, FASTLY, US]
|
||||||
https://resources.hackerone.com [AS16509, AMAZON-02, US, 3.98.0.0/15]
|
https://resources.hackerone.com [AS16509, AMAZON-02, US]
|
||||||
https://support.hackerone.com [AS13335, CLOUDFLARENET, US, 104.16.48.0/20]
|
https://support.hackerone.com [AS13335, CLOUDFLARENET, US]
|
||||||
https://mta-sts.hackerone.com [AS54113, FASTLY, US, 185.199.111.0/24]
|
https://mta-sts.hackerone.com [AS54113, FASTLY, US]
|
||||||
https://docs.hackerone.com [AS54113, FASTLY, US, 185.199.109.0/24]
|
https://docs.hackerone.com [AS54113, FASTLY, US]
|
||||||
https://api.hackerone.com [AS13335, CLOUDFLARENET, US, 104.16.96.0/20]
|
https://api.hackerone.com [AS13335, CLOUDFLARENET, US]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
5
go.mod
5
go.mod
@ -46,15 +46,16 @@ require github.com/spaolacci/murmur3 v1.1.0
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/PuerkitoBio/goquery v1.8.0
|
github.com/PuerkitoBio/goquery v1.8.0
|
||||||
github.com/ammario/ipisp/v2 v2.0.0
|
|
||||||
github.com/bxcodec/faker/v4 v4.0.0-beta.3
|
github.com/bxcodec/faker/v4 v4.0.0-beta.3
|
||||||
github.com/hdm/jarm-go v0.0.7
|
github.com/hdm/jarm-go v0.0.7
|
||||||
github.com/mfonda/simhash v0.0.0-20151007195837-79f94a1100d6
|
github.com/mfonda/simhash v0.0.0-20151007195837-79f94a1100d6
|
||||||
github.com/mitchellh/mapstructure v1.5.0
|
github.com/mitchellh/mapstructure v1.5.0
|
||||||
|
github.com/projectdiscovery/asnmap v0.0.1
|
||||||
github.com/projectdiscovery/dsl v0.0.3
|
github.com/projectdiscovery/dsl v0.0.3
|
||||||
github.com/projectdiscovery/mapsutil v0.0.2-0.20221020054123-d68d6f24a655
|
github.com/projectdiscovery/mapsutil v0.0.2-0.20221020054123-d68d6f24a655
|
||||||
github.com/projectdiscovery/ratelimit v0.0.0-20221004232058-7b82379157fa
|
github.com/projectdiscovery/ratelimit v0.0.0-20221004232058-7b82379157fa
|
||||||
github.com/projectdiscovery/tlsx v0.0.9
|
github.com/projectdiscovery/tlsx v0.0.9
|
||||||
|
github.com/stretchr/testify v1.8.0
|
||||||
go.uber.org/multierr v1.8.0
|
go.uber.org/multierr v1.8.0
|
||||||
golang.org/x/exp v0.0.0-20220907003533-145caa8ea1d0
|
golang.org/x/exp v0.0.0-20220907003533-145caa8ea1d0
|
||||||
)
|
)
|
||||||
@ -75,6 +76,7 @@ require (
|
|||||||
github.com/cockroachdb/pebble v0.0.0-20210728210723-48179f1d4dae // indirect
|
github.com/cockroachdb/pebble v0.0.0-20210728210723-48179f1d4dae // indirect
|
||||||
github.com/cockroachdb/redact v1.0.8 // indirect
|
github.com/cockroachdb/redact v1.0.8 // indirect
|
||||||
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect
|
github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/dgraph-io/badger v1.6.2 // indirect
|
github.com/dgraph-io/badger v1.6.2 // indirect
|
||||||
github.com/dgraph-io/ristretto v0.0.3 // indirect
|
github.com/dgraph-io/ristretto v0.0.3 // indirect
|
||||||
github.com/dimchansky/utfbom v1.1.1 // indirect
|
github.com/dimchansky/utfbom v1.1.1 // indirect
|
||||||
@ -88,6 +90,7 @@ require (
|
|||||||
github.com/kr/text v0.2.0 // indirect
|
github.com/kr/text v0.2.0 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/projectdiscovery/blackrock v0.0.0-20220628111055-35616c71b2dc // indirect
|
github.com/projectdiscovery/blackrock v0.0.0-20220628111055-35616c71b2dc // indirect
|
||||||
github.com/projectdiscovery/networkpolicy v0.0.2-0.20220525172507-b844eafc878d // indirect
|
github.com/projectdiscovery/networkpolicy v0.0.2-0.20220525172507-b844eafc878d // indirect
|
||||||
github.com/projectdiscovery/reflectutil v0.0.0-20210804085554-4d90952bf92f // indirect
|
github.com/projectdiscovery/reflectutil v0.0.0-20210804085554-4d90952bf92f // indirect
|
||||||
|
4
go.sum
4
go.sum
@ -26,8 +26,6 @@ github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY
|
|||||||
github.com/akrylysov/pogreb v0.10.0/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI=
|
github.com/akrylysov/pogreb v0.10.0/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI=
|
||||||
github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK4w=
|
github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK4w=
|
||||||
github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI=
|
github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI=
|
||||||
github.com/ammario/ipisp/v2 v2.0.0 h1:/aRMp5srZViiBfOUGzl/Esqae4s0MDDzm9buhGcZ0XU=
|
|
||||||
github.com/ammario/ipisp/v2 v2.0.0/go.mod h1:bQ6KAL5LnYYEj6olUn+Bzv/im/4Esa5oGkbv9b+uOjo=
|
|
||||||
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
|
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
|
||||||
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
|
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
|
||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
@ -265,6 +263,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/projectdiscovery/asnmap v0.0.1 h1:n4YCz1ljUaDA3dOUCkjI/bUOtiS7ge1KJ39qpURCd/o=
|
||||||
|
github.com/projectdiscovery/asnmap v0.0.1/go.mod h1:CjCVDhQPVtmlE247L6YFeIVX9c4m8pOX8V8BmB0JkX8=
|
||||||
github.com/projectdiscovery/blackrock v0.0.0-20210415162320-b38689ae3a2e/go.mod h1:/IsapnEYiWG+yEDPXp0e8NWj3npzB9Ccy9lXEUJwMZs=
|
github.com/projectdiscovery/blackrock v0.0.0-20210415162320-b38689ae3a2e/go.mod h1:/IsapnEYiWG+yEDPXp0e8NWj3npzB9Ccy9lXEUJwMZs=
|
||||||
github.com/projectdiscovery/blackrock v0.0.0-20220628111055-35616c71b2dc h1:jqZK68yPOnNNRmwuXqytl+T9EbwneEUCvMDRjLe0J04=
|
github.com/projectdiscovery/blackrock v0.0.0-20220628111055-35616c71b2dc h1:jqZK68yPOnNNRmwuXqytl+T9EbwneEUCvMDRjLe0J04=
|
||||||
github.com/projectdiscovery/blackrock v0.0.0-20220628111055-35616c71b2dc/go.mod h1:5tNGQP9kOfW+X5+40pZP8aqPYLHs45nJkFaSHLxdeH8=
|
github.com/projectdiscovery/blackrock v0.0.0-20220628111055-35616c71b2dc/go.mod h1:5tNGQP9kOfW+X5+40pZP8aqPYLHs45nJkFaSHLxdeH8=
|
||||||
|
@ -24,13 +24,14 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/exp/maps"
|
"golang.org/x/exp/maps"
|
||||||
|
|
||||||
|
asnmap "github.com/projectdiscovery/asnmap/libs"
|
||||||
dsl "github.com/projectdiscovery/dsl"
|
dsl "github.com/projectdiscovery/dsl"
|
||||||
"github.com/projectdiscovery/fastdialer/fastdialer"
|
"github.com/projectdiscovery/fastdialer/fastdialer"
|
||||||
"github.com/projectdiscovery/httpx/common/customextract"
|
"github.com/projectdiscovery/httpx/common/customextract"
|
||||||
"github.com/projectdiscovery/httpx/common/hashes/jarm"
|
"github.com/projectdiscovery/httpx/common/hashes/jarm"
|
||||||
|
"github.com/projectdiscovery/mapcidr/asn"
|
||||||
"github.com/projectdiscovery/mapsutil"
|
"github.com/projectdiscovery/mapsutil"
|
||||||
|
|
||||||
"github.com/ammario/ipisp/v2"
|
|
||||||
"github.com/bluele/gcache"
|
"github.com/bluele/gcache"
|
||||||
"github.com/logrusorgru/aurora"
|
"github.com/logrusorgru/aurora"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
@ -75,12 +76,14 @@ type Runner struct {
|
|||||||
stats clistats.StatisticsClient
|
stats clistats.StatisticsClient
|
||||||
ratelimiter ratelimit.Limiter
|
ratelimiter ratelimit.Limiter
|
||||||
HostErrorsCache gcache.Cache
|
HostErrorsCache gcache.Cache
|
||||||
|
asnClinet asn.ASNClient
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new client for running enumeration process.
|
// New creates a new client for running enumeration process.
|
||||||
func New(options *Options) (*Runner, error) {
|
func New(options *Options) (*Runner, error) {
|
||||||
runner := &Runner{
|
runner := &Runner{
|
||||||
options: options,
|
options: options,
|
||||||
|
asnClinet: asn.New(),
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
if options.TechDetect {
|
if options.TechDetect {
|
||||||
@ -475,11 +478,20 @@ func (r *Runner) countTargetFromRawTarget(rawTarget string) (numTargets int) {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
expandedTarget := 1
|
expandedTarget := 0
|
||||||
if iputil.IsCIDR(rawTarget) {
|
switch {
|
||||||
|
case iputil.IsCIDR(rawTarget):
|
||||||
if ipsCount, err := mapcidr.AddressCount(rawTarget); err == nil && ipsCount > 0 {
|
if ipsCount, err := mapcidr.AddressCount(rawTarget); err == nil && ipsCount > 0 {
|
||||||
expandedTarget = int(ipsCount)
|
expandedTarget = int(ipsCount)
|
||||||
}
|
}
|
||||||
|
case asn.IsASN(rawTarget):
|
||||||
|
asn := asn.New()
|
||||||
|
cidrs, _ := asn.GetCIDRsForASNNum(rawTarget)
|
||||||
|
for _, cidr := range cidrs {
|
||||||
|
expandedTarget += int(mapcidr.AddressCountIpnet(cidr))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
expandedTarget = 1
|
||||||
}
|
}
|
||||||
return expandedTarget
|
return expandedTarget
|
||||||
}
|
}
|
||||||
@ -910,28 +922,34 @@ func (r *Runner) targets(hp *httpx.HTTPX, target string) chan httpx.Target {
|
|||||||
results := make(chan httpx.Target)
|
results := make(chan httpx.Target)
|
||||||
go func() {
|
go func() {
|
||||||
defer close(results)
|
defer close(results)
|
||||||
|
switch {
|
||||||
// A valid target does not contain:
|
case strings.ContainsAny(target, "*") || strings.HasPrefix(target, "."):
|
||||||
// *
|
// A valid target does not contain:
|
||||||
// spaces
|
// *
|
||||||
if strings.ContainsAny(target, "*") || strings.HasPrefix(target, ".") {
|
// spaces
|
||||||
// trim * and/or . (prefix) from the target to return the domain instead of wilcard
|
// trim * and/or . (prefix) from the target to return the domain instead of wilcard
|
||||||
target = strings.TrimPrefix(strings.Trim(target, "*"), ".")
|
target = strings.TrimPrefix(strings.Trim(target, "*"), ".")
|
||||||
if !r.testAndSet(target) {
|
if !r.testAndSet(target) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
results <- httpx.Target{Host: target}
|
||||||
|
case asn.IsASN(target):
|
||||||
// test if the target is a cidr
|
cidrIps, err := r.asnClinet.GetIPAddressesAsStream(target)
|
||||||
if iputil.IsCIDR(target) {
|
|
||||||
cidrIps, err := mapcidr.IPAddresses(target)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, ip := range cidrIps {
|
for ip := range cidrIps {
|
||||||
results <- httpx.Target{Host: ip}
|
results <- httpx.Target{Host: ip}
|
||||||
}
|
}
|
||||||
} else if r.options.ProbeAllIPS {
|
case iputil.IsCIDR(target):
|
||||||
|
cidrIps, err := mapcidr.IPAddressesAsStream(target)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for ip := range cidrIps {
|
||||||
|
results <- httpx.Target{Host: ip}
|
||||||
|
}
|
||||||
|
case r.options.ProbeAllIPS:
|
||||||
URL, err := urlutil.Parse(target)
|
URL, err := urlutil.Parse(target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
results <- httpx.Target{Host: target}
|
results <- httpx.Target{Host: target}
|
||||||
@ -943,9 +961,10 @@ func (r *Runner) targets(hp *httpx.HTTPX, target string) chan httpx.Target {
|
|||||||
for _, ip := range ips {
|
for _, ip := range ips {
|
||||||
results <- httpx.Target{Host: target, CustomIP: ip}
|
results <- httpx.Target{Host: target, CustomIP: ip}
|
||||||
}
|
}
|
||||||
} else if idxComma := strings.Index(target, ","); idxComma > 0 {
|
case strings.Index(target, ",") > 0:
|
||||||
|
idxComma := strings.Index(target, ",")
|
||||||
results <- httpx.Target{Host: target[idxComma+1:], CustomHost: target[:idxComma]}
|
results <- httpx.Target{Host: target[idxComma+1:], CustomHost: target[:idxComma]}
|
||||||
} else {
|
default:
|
||||||
results <- httpx.Target{Host: target}
|
results <- httpx.Target{Host: target}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@ -1300,17 +1319,17 @@ retry:
|
|||||||
|
|
||||||
var asnResponse *AsnResponse
|
var asnResponse *AsnResponse
|
||||||
if r.options.Asn {
|
if r.options.Asn {
|
||||||
lookupResult, err := ipisp.LookupIP(context.Background(), net.ParseIP(ip))
|
results := asnmap.NewClient().GetData(asnmap.IP(ip))
|
||||||
if err != nil {
|
if len(results) > 0 {
|
||||||
gologger.Warning().Msg(err.Error())
|
var cidrs []string
|
||||||
}
|
for _, cidr := range asnmap.GetCIDR(results) {
|
||||||
if lookupResult != nil {
|
cidrs = append(cidrs, cidr.String())
|
||||||
lookupResult.ISPName = stringsutil.TrimSuffixAny(strings.ReplaceAll(lookupResult.ISPName, lookupResult.Country, ""), ", ", " ")
|
}
|
||||||
asnResponse = &AsnResponse{
|
asnResponse = &AsnResponse{
|
||||||
AsNumber: lookupResult.ASN.String(),
|
AsNumber: fmt.Sprintf("AS%v", results[0].ASN),
|
||||||
AsName: lookupResult.ISPName,
|
AsName: results[0].Org,
|
||||||
AsCountry: lookupResult.Country,
|
AsCountry: results[0].Country,
|
||||||
AsRange: lookupResult.Range.String(),
|
AsRange: cidrs,
|
||||||
}
|
}
|
||||||
builder.WriteString(" [")
|
builder.WriteString(" [")
|
||||||
if !scanopts.OutputWithNoColor {
|
if !scanopts.OutputWithNoColor {
|
||||||
|
148
runner/runner_test.go
Normal file
148
runner/runner_test.go
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
package runner
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
_ "github.com/projectdiscovery/fdmax/autofdmax"
|
||||||
|
"github.com/projectdiscovery/httpx/common/httpx"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRunner_domain_targets(t *testing.T) {
|
||||||
|
options := &Options{}
|
||||||
|
r, err := New(options)
|
||||||
|
require.Nil(t, err, "could not create httpx runner")
|
||||||
|
input := []string{"example.com", "*.example.com", "example.com,one.one.one.one"}
|
||||||
|
expected := []httpx.Target{{
|
||||||
|
Host: "example.com",
|
||||||
|
}, {
|
||||||
|
Host: "example.com",
|
||||||
|
}, {
|
||||||
|
Host: "one.one.one.one",
|
||||||
|
CustomHost: "example.com",
|
||||||
|
}}
|
||||||
|
got := []httpx.Target{}
|
||||||
|
for _, inp := range input {
|
||||||
|
for target := range r.targets(r.hp, inp) {
|
||||||
|
got = append(got, target)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require.ElementsMatch(t, expected, got, "could not exepcted output")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRunner_probeall_targets(t *testing.T) {
|
||||||
|
options := &Options{
|
||||||
|
ProbeAllIPS: true,
|
||||||
|
}
|
||||||
|
r, err := New(options)
|
||||||
|
require.Nil(t, err, "could not create httpx runner")
|
||||||
|
input := "one.one.one.one"
|
||||||
|
expected := []httpx.Target{{
|
||||||
|
Host: "one.one.one.one",
|
||||||
|
CustomIP: "2606:4700:4700::1111",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Host: "one.one.one.one",
|
||||||
|
CustomIP: "2606:4700:4700::1001",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Host: "one.one.one.one",
|
||||||
|
CustomIP: "1.0.0.1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Host: "one.one.one.one",
|
||||||
|
CustomIP: "1.1.1.1",
|
||||||
|
}}
|
||||||
|
got := []httpx.Target{}
|
||||||
|
for target := range r.targets(r.hp, input) {
|
||||||
|
got = append(got, target)
|
||||||
|
}
|
||||||
|
|
||||||
|
require.ElementsMatch(t, expected, got, "could not exepcted output")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRunner_cidr_targets(t *testing.T) {
|
||||||
|
options := &Options{}
|
||||||
|
r, err := New(options)
|
||||||
|
require.Nil(t, err, "could not create httpx runner")
|
||||||
|
input := "173.0.84.0/30"
|
||||||
|
expected := []httpx.Target{
|
||||||
|
{
|
||||||
|
Host: "173.0.84.0",
|
||||||
|
}, {
|
||||||
|
Host: "173.0.84.1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Host: "173.0.84.2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Host: "173.0.84.3",
|
||||||
|
}}
|
||||||
|
got := []httpx.Target{}
|
||||||
|
for target := range r.targets(r.hp, input) {
|
||||||
|
got = append(got, target)
|
||||||
|
}
|
||||||
|
|
||||||
|
require.ElementsMatch(t, expected, got, "could not exepcted output")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRunner_asn_targets(t *testing.T) {
|
||||||
|
options := &Options{}
|
||||||
|
r, err := New(options)
|
||||||
|
require.Nil(t, err, "could not create httpx runner")
|
||||||
|
input := "AS14421"
|
||||||
|
expected := []httpx.Target{}
|
||||||
|
expectedOutputFile := "tests/AS14421.txt"
|
||||||
|
// read the expected IPs from the file
|
||||||
|
fileContent, err := os.ReadFile(expectedOutputFile)
|
||||||
|
require.Nil(t, err, "could not read the expectedOutputFile file")
|
||||||
|
ips := strings.Split(strings.ReplaceAll(string(fileContent), "\r\n", "\n"), "\n")
|
||||||
|
for _, ip := range ips {
|
||||||
|
expected = append(expected, httpx.Target{Host: ip})
|
||||||
|
}
|
||||||
|
got := []httpx.Target{}
|
||||||
|
for target := range r.targets(r.hp, input) {
|
||||||
|
got = append(got, target)
|
||||||
|
}
|
||||||
|
require.ElementsMatch(t, expected, got, "could not exepcted output")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRunner_countTargetFromRawTarget(t *testing.T) {
|
||||||
|
options := &Options{}
|
||||||
|
r, err := New(options)
|
||||||
|
require.Nil(t, err, "could not create httpx runner")
|
||||||
|
|
||||||
|
input := "example.com"
|
||||||
|
expected := 1
|
||||||
|
got := r.countTargetFromRawTarget(input)
|
||||||
|
require.Equal(t, expected, got, "got wrong output")
|
||||||
|
|
||||||
|
input = "example.com"
|
||||||
|
expected = 0
|
||||||
|
err = r.hm.Set(input, nil)
|
||||||
|
require.Nil(t, err, "could not set value to hm")
|
||||||
|
got = r.countTargetFromRawTarget(input)
|
||||||
|
require.Equal(t, expected, got, "got wrong output")
|
||||||
|
|
||||||
|
input = ""
|
||||||
|
expected = 0
|
||||||
|
got = r.countTargetFromRawTarget(input)
|
||||||
|
require.Equal(t, expected, got, "got wrong output")
|
||||||
|
|
||||||
|
input = "AS14421"
|
||||||
|
expected = 256
|
||||||
|
got = r.countTargetFromRawTarget(input)
|
||||||
|
require.Equal(t, expected, got, "got wrong output")
|
||||||
|
|
||||||
|
input = "AS15133"
|
||||||
|
expected = 153088
|
||||||
|
got = r.countTargetFromRawTarget(input)
|
||||||
|
require.Equal(t, expected, got, "got wrong output")
|
||||||
|
|
||||||
|
input = "173.0.84.0/24"
|
||||||
|
expected = 256
|
||||||
|
got = r.countTargetFromRawTarget(input)
|
||||||
|
require.Equal(t, expected, got, "got wrong output")
|
||||||
|
}
|
256
runner/tests/AS14421.txt
Normal file
256
runner/tests/AS14421.txt
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
216.101.17.0
|
||||||
|
216.101.17.1
|
||||||
|
216.101.17.2
|
||||||
|
216.101.17.3
|
||||||
|
216.101.17.4
|
||||||
|
216.101.17.5
|
||||||
|
216.101.17.6
|
||||||
|
216.101.17.7
|
||||||
|
216.101.17.8
|
||||||
|
216.101.17.9
|
||||||
|
216.101.17.10
|
||||||
|
216.101.17.11
|
||||||
|
216.101.17.12
|
||||||
|
216.101.17.13
|
||||||
|
216.101.17.14
|
||||||
|
216.101.17.15
|
||||||
|
216.101.17.16
|
||||||
|
216.101.17.17
|
||||||
|
216.101.17.18
|
||||||
|
216.101.17.19
|
||||||
|
216.101.17.20
|
||||||
|
216.101.17.21
|
||||||
|
216.101.17.22
|
||||||
|
216.101.17.23
|
||||||
|
216.101.17.24
|
||||||
|
216.101.17.25
|
||||||
|
216.101.17.26
|
||||||
|
216.101.17.27
|
||||||
|
216.101.17.28
|
||||||
|
216.101.17.29
|
||||||
|
216.101.17.30
|
||||||
|
216.101.17.31
|
||||||
|
216.101.17.32
|
||||||
|
216.101.17.33
|
||||||
|
216.101.17.34
|
||||||
|
216.101.17.35
|
||||||
|
216.101.17.36
|
||||||
|
216.101.17.37
|
||||||
|
216.101.17.38
|
||||||
|
216.101.17.39
|
||||||
|
216.101.17.40
|
||||||
|
216.101.17.41
|
||||||
|
216.101.17.42
|
||||||
|
216.101.17.43
|
||||||
|
216.101.17.44
|
||||||
|
216.101.17.45
|
||||||
|
216.101.17.46
|
||||||
|
216.101.17.47
|
||||||
|
216.101.17.48
|
||||||
|
216.101.17.49
|
||||||
|
216.101.17.50
|
||||||
|
216.101.17.51
|
||||||
|
216.101.17.52
|
||||||
|
216.101.17.53
|
||||||
|
216.101.17.54
|
||||||
|
216.101.17.55
|
||||||
|
216.101.17.56
|
||||||
|
216.101.17.57
|
||||||
|
216.101.17.58
|
||||||
|
216.101.17.59
|
||||||
|
216.101.17.60
|
||||||
|
216.101.17.61
|
||||||
|
216.101.17.62
|
||||||
|
216.101.17.63
|
||||||
|
216.101.17.64
|
||||||
|
216.101.17.65
|
||||||
|
216.101.17.66
|
||||||
|
216.101.17.67
|
||||||
|
216.101.17.68
|
||||||
|
216.101.17.69
|
||||||
|
216.101.17.70
|
||||||
|
216.101.17.71
|
||||||
|
216.101.17.72
|
||||||
|
216.101.17.73
|
||||||
|
216.101.17.74
|
||||||
|
216.101.17.75
|
||||||
|
216.101.17.76
|
||||||
|
216.101.17.77
|
||||||
|
216.101.17.78
|
||||||
|
216.101.17.79
|
||||||
|
216.101.17.80
|
||||||
|
216.101.17.81
|
||||||
|
216.101.17.82
|
||||||
|
216.101.17.83
|
||||||
|
216.101.17.84
|
||||||
|
216.101.17.85
|
||||||
|
216.101.17.86
|
||||||
|
216.101.17.87
|
||||||
|
216.101.17.88
|
||||||
|
216.101.17.89
|
||||||
|
216.101.17.90
|
||||||
|
216.101.17.91
|
||||||
|
216.101.17.92
|
||||||
|
216.101.17.93
|
||||||
|
216.101.17.94
|
||||||
|
216.101.17.95
|
||||||
|
216.101.17.96
|
||||||
|
216.101.17.97
|
||||||
|
216.101.17.98
|
||||||
|
216.101.17.99
|
||||||
|
216.101.17.100
|
||||||
|
216.101.17.101
|
||||||
|
216.101.17.102
|
||||||
|
216.101.17.103
|
||||||
|
216.101.17.104
|
||||||
|
216.101.17.105
|
||||||
|
216.101.17.106
|
||||||
|
216.101.17.107
|
||||||
|
216.101.17.108
|
||||||
|
216.101.17.109
|
||||||
|
216.101.17.110
|
||||||
|
216.101.17.111
|
||||||
|
216.101.17.112
|
||||||
|
216.101.17.113
|
||||||
|
216.101.17.114
|
||||||
|
216.101.17.115
|
||||||
|
216.101.17.116
|
||||||
|
216.101.17.117
|
||||||
|
216.101.17.118
|
||||||
|
216.101.17.119
|
||||||
|
216.101.17.120
|
||||||
|
216.101.17.121
|
||||||
|
216.101.17.122
|
||||||
|
216.101.17.123
|
||||||
|
216.101.17.124
|
||||||
|
216.101.17.125
|
||||||
|
216.101.17.126
|
||||||
|
216.101.17.127
|
||||||
|
216.101.17.128
|
||||||
|
216.101.17.129
|
||||||
|
216.101.17.130
|
||||||
|
216.101.17.131
|
||||||
|
216.101.17.132
|
||||||
|
216.101.17.133
|
||||||
|
216.101.17.134
|
||||||
|
216.101.17.135
|
||||||
|
216.101.17.136
|
||||||
|
216.101.17.137
|
||||||
|
216.101.17.138
|
||||||
|
216.101.17.139
|
||||||
|
216.101.17.140
|
||||||
|
216.101.17.141
|
||||||
|
216.101.17.142
|
||||||
|
216.101.17.143
|
||||||
|
216.101.17.144
|
||||||
|
216.101.17.145
|
||||||
|
216.101.17.146
|
||||||
|
216.101.17.147
|
||||||
|
216.101.17.148
|
||||||
|
216.101.17.149
|
||||||
|
216.101.17.150
|
||||||
|
216.101.17.151
|
||||||
|
216.101.17.152
|
||||||
|
216.101.17.153
|
||||||
|
216.101.17.154
|
||||||
|
216.101.17.155
|
||||||
|
216.101.17.156
|
||||||
|
216.101.17.157
|
||||||
|
216.101.17.158
|
||||||
|
216.101.17.159
|
||||||
|
216.101.17.160
|
||||||
|
216.101.17.161
|
||||||
|
216.101.17.162
|
||||||
|
216.101.17.163
|
||||||
|
216.101.17.164
|
||||||
|
216.101.17.165
|
||||||
|
216.101.17.166
|
||||||
|
216.101.17.167
|
||||||
|
216.101.17.168
|
||||||
|
216.101.17.169
|
||||||
|
216.101.17.170
|
||||||
|
216.101.17.171
|
||||||
|
216.101.17.172
|
||||||
|
216.101.17.173
|
||||||
|
216.101.17.174
|
||||||
|
216.101.17.175
|
||||||
|
216.101.17.176
|
||||||
|
216.101.17.177
|
||||||
|
216.101.17.178
|
||||||
|
216.101.17.179
|
||||||
|
216.101.17.180
|
||||||
|
216.101.17.181
|
||||||
|
216.101.17.182
|
||||||
|
216.101.17.183
|
||||||
|
216.101.17.184
|
||||||
|
216.101.17.185
|
||||||
|
216.101.17.186
|
||||||
|
216.101.17.187
|
||||||
|
216.101.17.188
|
||||||
|
216.101.17.189
|
||||||
|
216.101.17.190
|
||||||
|
216.101.17.191
|
||||||
|
216.101.17.192
|
||||||
|
216.101.17.193
|
||||||
|
216.101.17.194
|
||||||
|
216.101.17.195
|
||||||
|
216.101.17.196
|
||||||
|
216.101.17.197
|
||||||
|
216.101.17.198
|
||||||
|
216.101.17.199
|
||||||
|
216.101.17.200
|
||||||
|
216.101.17.201
|
||||||
|
216.101.17.202
|
||||||
|
216.101.17.203
|
||||||
|
216.101.17.204
|
||||||
|
216.101.17.205
|
||||||
|
216.101.17.206
|
||||||
|
216.101.17.207
|
||||||
|
216.101.17.208
|
||||||
|
216.101.17.209
|
||||||
|
216.101.17.210
|
||||||
|
216.101.17.211
|
||||||
|
216.101.17.212
|
||||||
|
216.101.17.213
|
||||||
|
216.101.17.214
|
||||||
|
216.101.17.215
|
||||||
|
216.101.17.216
|
||||||
|
216.101.17.217
|
||||||
|
216.101.17.218
|
||||||
|
216.101.17.219
|
||||||
|
216.101.17.220
|
||||||
|
216.101.17.221
|
||||||
|
216.101.17.222
|
||||||
|
216.101.17.223
|
||||||
|
216.101.17.224
|
||||||
|
216.101.17.225
|
||||||
|
216.101.17.226
|
||||||
|
216.101.17.227
|
||||||
|
216.101.17.228
|
||||||
|
216.101.17.229
|
||||||
|
216.101.17.230
|
||||||
|
216.101.17.231
|
||||||
|
216.101.17.232
|
||||||
|
216.101.17.233
|
||||||
|
216.101.17.234
|
||||||
|
216.101.17.235
|
||||||
|
216.101.17.236
|
||||||
|
216.101.17.237
|
||||||
|
216.101.17.238
|
||||||
|
216.101.17.239
|
||||||
|
216.101.17.240
|
||||||
|
216.101.17.241
|
||||||
|
216.101.17.242
|
||||||
|
216.101.17.243
|
||||||
|
216.101.17.244
|
||||||
|
216.101.17.245
|
||||||
|
216.101.17.246
|
||||||
|
216.101.17.247
|
||||||
|
216.101.17.248
|
||||||
|
216.101.17.249
|
||||||
|
216.101.17.250
|
||||||
|
216.101.17.251
|
||||||
|
216.101.17.252
|
||||||
|
216.101.17.253
|
||||||
|
216.101.17.254
|
||||||
|
216.101.17.255
|
@ -13,14 +13,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type AsnResponse struct {
|
type AsnResponse struct {
|
||||||
AsNumber string `json:"as_number" csv:"as_number"`
|
AsNumber string `json:"as_number" csv:"as_number"`
|
||||||
AsName string `json:"as_name" csv:"as_name"`
|
AsName string `json:"as_name" csv:"as_name"`
|
||||||
AsCountry string `json:"as_country" csv:"as_country"`
|
AsCountry string `json:"as_country" csv:"as_country"`
|
||||||
AsRange string `json:"as_range" csv:"as_range"`
|
AsRange []string `json:"as_range" csv:"as_range"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o AsnResponse) String() string {
|
func (o AsnResponse) String() string {
|
||||||
return fmt.Sprintf("%v, %v, %v, %v", o.AsNumber, o.AsName, o.AsCountry, o.AsRange)
|
return fmt.Sprintf("%v, %v, %v", o.AsNumber, o.AsName, o.AsCountry)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Result of a scan
|
// Result of a scan
|
||||||
|
Loading…
Reference in New Issue
Block a user