Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ headerpwn allows you to test various headers on a target URL and analyze the res
Example usage:
```sh
headerpwn -url https://example.com -headers my_headers.txt
headerpwn -url https://example.com -headers my_headers.txt -rua
headerpwn -url https://example.com -headers my_headers.txt -user-agent "Mozilla/4.0"
```

- Format of `my_headers.txt` should be like below:
Expand Down Expand Up @@ -84,3 +86,4 @@ headerpwn -url https://example.com -headers my_headers.txt -proxy 127.0.0.1:8080
## Credits
The `headers.txt` file is compiled from various sources, including the [Seclists project](https://github.com/danielmiessler/SecLists). These headers are used for testing purposes and provide a variety of scenarios for analyzing how servers respond to different headers.

The `useragents.txt` file is the one used by [SQLMap](https://github.com/sqlmapproject/sqlmap/).
43 changes: 41 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ func main() {
urlPtr := flag.String("url", "", "URL to make requests to")
headersFilePtr := flag.String("headers", "", "File containing headers for requests")
proxyPtr := flag.String("proxy", "", "Proxy server IP:PORT (e.g., 127.0.0.1:8080)")
userAgentPtr := flag.String("user-agent", "", "User-Agent (e.g. Mozilla/4.0)")
randomUserAgentPtr := flag.Bool("rua", false, "Use a random User-Agent for each request")
quietPtr := flag.Bool("q", false, "Suppress banner")
flag.Parse()
log.SetFlags(0)
Expand Down Expand Up @@ -70,7 +72,7 @@ func main() {
go func(header string) {
defer wg.Done()

response, err := makeRequest(*urlPtr, header, *proxyPtr)
response, err := makeRequest(*urlPtr, header, *proxyPtr, *userAgentPtr, *randomUserAgentPtr)
if err != nil {
return
}
Expand Down Expand Up @@ -113,7 +115,7 @@ func readHeadersFromFile(filename string) ([]string, error) {
return headers, nil
}

func makeRequest(baseURL, header, proxy string) (*http.Response, error) {
func makeRequest(baseURL, header, proxy string, userAgent string, randomUserAgent bool) (*http.Response, error) {
urlWithBuster := baseURL + "?cachebuster=" + generateCacheBuster()
headers := parseHeaders(header)

Expand All @@ -140,6 +142,23 @@ func makeRequest(baseURL, header, proxy string) (*http.Response, error) {
client = &http.Client{Transport: transport}
}

if userAgent != "" {
req.Header.Set("User-Agent", userAgent)
}

if randomUserAgent == true {
userAgents, err := loadUserAgents("useragents.txt")

if err != nil {
fmt.Println("Error loading user agents:", err)
return nil, err
}

rand.Seed(time.Now().UnixNano())
randomAgent := userAgents[rand.Intn(len(userAgents))]
req.Header.Set("User-Agent", randomAgent)
}

response, err := client.Do(req)
if err != nil {
return nil, err
Expand Down Expand Up @@ -197,3 +216,23 @@ func printResults(results <-chan Result) {
fmt.Println(resultOutput)
}
}

func loadUserAgents(filePath string) ([]string, error) {
file, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer file.Close()

var userAgents []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
userAgents = append(userAgents, scanner.Text())
}

if err := scanner.Err(); err != nil {
return nil, err
}

return userAgents, nil
}
Loading