### Install EasyEASM via Go Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Use the Go module system to install the latest binary and verify the installation. ```bash # Install EasyEASM binary go install github.com/g0ldencybersec/EasyEASM/easyeasm@latest # Verify installation easyeasm --help ``` -------------------------------- ### Install EasyEASM Source: https://github.com/g0ldencybersec/easyeasm/blob/main/README.md Use the Go toolchain to install the latest version of the EasyEASM binary. ```sh go install github.com/g0ldencybersec/EasyEASM/easyeasm@latest ``` -------------------------------- ### Utility Functions for EasyEASM Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Provides helper functions for installing external tools, removing duplicate entries from a list of domains, and sending webhook notifications. The `InstallTools` function automatically installs necessary external tools. ```go package main import ( "fmt" "github.com/g0ldencybersec/EasyEASM/pkg/utils" ) func main() { // Install required external tools automatically // Installs: alterx, amass, dnsx, httpx, oam_subs, subfinder utils.InstallTools() // Remove duplicate entries from subdomain list domains := []string{ "api.example.com", "www.example.com", "api.example.com", // duplicate "mail.example.com", "www.example.com", // duplicate } unique := utils.RemoveDuplicates(domains) fmt.Println(unique) // Output: [api.example.com www.example.com mail.example.com] } ``` -------------------------------- ### Execute EasyEASM Source: https://github.com/g0ldencybersec/easyeasm/blob/main/README.md Run the tool after configuring the required config.yml file. ```sh ./easyeasm ``` -------------------------------- ### Set Up Scheduled Daily Scans with Cron Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Automate daily scans by configuring a cron job. This includes creating a directory for scans, setting up a configuration file, and adding the cron job to run EasyEASM daily at 6 AM. ```bash # Create a directory for EasyEASM scans mkdir -p ~/easyeasm-scans cd ~/easyeasm-scans ``` ```bash # Create config.yml cat > config.yml << 'EOF' runConfig: domains: - mycompany.com - mycompany.io slack: https://hooks.slack.com/services/YOUR/WEBHOOK/URL runType: fast EOF ``` ```bash # Add cron job for daily scan at 6 AM crontab -e # Add this line: # 0 6 * * * cd ~/easyeasm-scans && /home/user/go/bin/easyeasm >> scan.log 2>&1 ``` ```bash # View cron logs tail -f ~/easyeasm-scans/scan.log ``` ```bash # Daily notifications will be sent to Slack/Discord when: # - New subdomains are discovered # - Previously live domains go offline ``` -------------------------------- ### Run EasyEASM Scan and View Output Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Execute a scan using the EasyEASM binary and view the generated CSV output. The CSV contains detailed information about live assets, including URL, status code, and web server details. ```bash # Run a scan ./easyeasm ``` ```bash # View output CSV cat EasyEASM.csv ``` ```bash # Sample output columns (extracted from httpx scan): # timestamp,url,port,host,input,method,scheme,content-type,status-code,title,webserver,tech,cname,a,aaaa,cdn,cdn-name ``` ```bash # Example row: # 2024-01-15T10:30:00Z,https://api.example.com,443,api.example.com,api.example.com,GET,https,application/json,200,API Gateway,nginx,nginx,api.cdn.example.com,192.0.2.1,,true,cloudflare ``` ```bash # Import into spreadsheet or asset management system for tracking ``` -------------------------------- ### Configure EasyEASM with config.yml Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Define target domains, notification webhooks, and scan parameters in a YAML configuration file. ```yaml # EasyEASM configurations runConfig: # List of root domains to scan for subdomains domains: - example.com - mydomain.com - corp.io # Slack webhook URL for notifications (optional) slack: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # Discord webhook URL for notifications (optional) discord: https://discord.com/api/webhooks/1234567890/abcdefghijklmnop # Run type: "fast" (passive only) or "complete" (passive + active) runType: fast # Wordlist for active DNS brute-forcing (required for "complete" mode) activeWordList: /path/to/subdomains.txt # Number of concurrent threads for active scanning activeThreads: 100 ``` -------------------------------- ### Run Active DNS Enumeration with EasyEASM Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Performs active DNS brute-forcing with a wordlist and permutation-based subdomain discovery. Requires a wordlist file and specifies the number of concurrent threads. ```go package main import ( "fmt" "github.com/g0ldencybersec/EasyEASM/pkg/active" "github.com/g0ldencybersec/EasyEASM/pkg/utils" ) func main() { // Create ActiveRunner with target domains runner := active.ActiveRunner{ SeedDomains: []string{"target.com"}, } // Run DNS brute-force with wordlist wordlist := "/path/to/subdomains.txt" threads := 100 activeResults := runner.RunActiveEnum(wordlist, threads) // Deduplicate and store results runner.Subdomains = utils.RemoveDuplicates(activeResults) // Run permutation scan on discovered subdomains permResults := runner.RunPermutationScan(threads) runner.Subdomains = append(runner.Subdomains, permResults...) runner.Subdomains = utils.RemoveDuplicates(runner.Subdomains) runner.Results = len(runner.Subdomains) fmt.Printf("Found %d subdomains via active scanning\n", runner.Results) // Validate live hosts and generate output runner.RunHttpx() } ``` -------------------------------- ### Configure EasyEASM Source: https://github.com/g0ldencybersec/easyeasm/blob/main/README.md Define target domains, notification webhooks, and scan intensity in the config.yml file. ```yaml # EasyEASM configurations runConfig: domains: # List root domains here. - example.com - mydomain.com slack: https://hooks.slack.com/services/DUMMYDATA/DUMMYDATA/RANDOM # Slack webhook url for Slack notifications. discord: https://discord.com/api/webhooks/DUMMYURL/Dasdfsdf # Discord webhook for Discord notifications. runType: fast # Set to either fast (passive enum) or complete (active enumeration). activeWordList: subdomainWordlist.txt activeThreads: 100 ``` -------------------------------- ### Parse YAML Configuration with EasyEASM Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Parses the 'config.yml' file into a strongly-typed Config struct. Assumes 'config.yml' is in the current directory. ```go package main import ( "fmt" "github.com/g0ldencybersec/EasyEASM/pkg/configparser" ) func main() { // Parse config.yml from current directory cfg := configparser.ParseConfig() // Access configuration values fmt.Println("Target domains:", cfg.RunConfig.Domains) fmt.Println("Run type:", cfg.RunConfig.RunType) fmt.Println("Slack webhook:", cfg.RunConfig.SlackWebhook) fmt.Println("Discord webhook:", cfg.RunConfig.DiscordWebhook) fmt.Println("Active wordlist:", cfg.RunConfig.ActiveWordlist) fmt.Println("Active threads:", cfg.RunConfig.ActiveThreads) } // Config struct definition: // type Config struct { // RunConfig struct { // Domains []string `yaml:"domains"` // SlackWebhook string `yaml:"slack"` // DiscordWebhook string `yaml:"discord"` // RunType string `yaml:"runType"` // ActiveWordlist string `yaml:"activeWordList"` // ActiveThreads int `yaml:"activeThreads"` // } `yaml:"runConfig"` // } ``` -------------------------------- ### Execute Complete Mode Active Enumeration Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Perform active DNS brute-forcing and permutation scanning to discover additional subdomains. ```bash # Create config.yml with complete mode settings cat > config.yml << 'EOF' runConfig: domains: - target.com discord: https://discord.com/api/webhooks/YOUR/WEBHOOK runType: complete activeWordList: /usr/share/wordlists/subdomains-top1mil.txt activeThreads: 200 EOF # Run EasyEASM ./easyeasm # Expected output: # **************** # EASY EASM # *************** # Running Passive Sources # Finding domains for target.com # Runing Subfinder on target.com # Running Amass on target.com # Subfinder run completed for target.com # Amass Run completed for target.com # Runing Bruteforce! # ACTIVE RESULTS # [admin.target.com dev.target.com staging.target.com ...] # Starting permuatation scan! # ALTERX RESULTS # [api-dev.target.com api-staging.target.com ...] # Found 892 subdomains # Checking which domains are live and generating assets csv... # Httpx run completed ``` -------------------------------- ### Send Slack Notifications with EasyEASM Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Compares newly discovered domains with previous scan results and sends notifications to Slack via a webhook URL. Requires a list of new domains and the Slack webhook URL. ```go package main import ( "github.com/g0ldencybersec/EasyEASM/pkg/utils" ) func main() { // Discovered subdomains from current scan newDomains := []string{ "api.example.com", "admin.example.com", "staging.example.com", } // Slack webhook URL from config slackWebhook := "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXX" // Compare with previous scan and notify on changes // Reads old_EasyEASM.csv to find differences utils.NotifyNewDomainsSlack(newDomains, slackWebhook) // Slack receives messages like: // "New live domains found: [staging.example.com]" // "Domains that were not to be now longer live: [old.example.com]" } ``` -------------------------------- ### Send Discord Notifications with EasyEASM Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Compares discovered subdomains with previous scan results and sends notifications to Discord via a webhook URL. Requires a list of new domains and the Discord webhook URL. ```go package main import ( "github.com/g0ldencybersec/EasyEASM/pkg/utils" ) func main() { // Discovered subdomains from current scan newDomains := []string{ "api.example.com", "dev.example.com", "prod.example.com", } // Discord webhook URL from config discordWebhook := "https://discord.com/api/webhooks/1234567890/abcdefghijk" // Compare with previous scan and notify on changes utils.NotifyNewDomainsDiscord(newDomains, discordWebhook) // Discord receives messages like: // "New live domains found: [dev.example.com]" // "Domains that were not to be now longer live: [deprecated.example.com]" } ``` -------------------------------- ### Orchestrate Passive Enumeration with PassiveRunner Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Use the PassiveRunner struct to programmatically execute Subfinder and Amass concurrently. ```go package main import ( "fmt" "github.com/g0ldencybersec/EasyEASM/pkg/passive" "github.com/g0ldencybersec/EasyEASM/pkg/utils" ) func main() { // Create PassiveRunner with target domains runner := passive.PassiveRunner{ SeedDomains: []string{"example.com", "corp.io"}, } // Run passive enumeration (Subfinder + Amass in parallel) results := runner.RunPassiveEnum() // Remove duplicates from combined results runner.Subdomains = utils.RemoveDuplicates(results) runner.Results = len(runner.Subdomains) fmt.Printf("Found %d unique subdomains\n", runner.Results) // Check which domains are live and generate CSV runner.RunHttpx() // Output written to EasyEASM.csv } ``` -------------------------------- ### Execute Fast Mode Passive Enumeration Source: https://context7.com/g0ldencybersec/easyeasm/llms.txt Run passive enumeration using Subfinder and Amass without generating traffic to target infrastructure. ```bash # Create config.yml with fast mode settings cat > config.yml << 'EOF' runConfig: domains: - target.com slack: https://hooks.slack.com/services/YOUR/WEBHOOK/URL runType: fast EOF # Run EasyEASM ./easyeasm # Expected output: # **************** # EASY EASM # *************** # Running Passive Sources # Finding domains for target.com # Runing Subfinder on target.com # Running Amass on target.com # Subfinder run completed for target.com # Amass Run completed for target.com # Found 156 subdomains # [api.target.com mail.target.com www.target.com ...] # Checking which domains are live and generating assets csv... # Httpx run completed # Output file: EasyEASM.csv ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.