Skip to main content
Glama

fuzzing_directories

Discover hidden directories and files on web servers using ffuf or wfuzz to identify potential security vulnerabilities during penetration testing.

Instructions

Fuzz directories and files using ffuf/wfuzz

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
targetYesTarget base URL
toolNoFuzzing tool to use
extensionsNoFile extensions to test

Implementation Reference

  • Main execution logic for the fuzzing_directories tool. Configures ffuf/wfuzz for directory bruteforcing, runs the scan, analyzes results for interesting directories/files, and returns structured ScanResult.
    async fuzzDirectories(baseUrl: string, config: Partial<FuzzingConfiguration> = {}): Promise<ScanResult> {
      try {
        const defaultConfig: FuzzingConfiguration = {
          tool: 'ffuf',
          threads: 20,
          timeout: 10,
          delay: 50,
          wordlist: this.getDefaultWordlist('directories'),
          extensions: ['php', 'asp', 'aspx', 'jsp', 'html', 'txt', 'xml', 'json'],
          filter_codes: [404],
          ...config
        };
        
        console.error(`🔍 Directory fuzzing on ${baseUrl}`);
        
        let results: FuzzingResult[] = [];
        
        if (defaultConfig.tool === 'ffuf') {
          results = await this.runFFUFDirectories(baseUrl, defaultConfig);
        } else if (defaultConfig.tool === 'wfuzz') {
          results = await this.runWfuzzDirectories(baseUrl, defaultConfig);
        }
        
        const analyzedResults = this.analyzeDirectoryResults(results);
        const interestingFindings = analyzedResults.filter(r => r.vulnerability_detected || r.response_code === 200);
        
        return {
          target: baseUrl,
          timestamp: new Date().toISOString(),
          tool: 'directory_fuzzing',
          results: {
            total_requests: results.length,
            found_directories: interestingFindings.length,
            accessible_paths: interestingFindings.filter(r => r.response_code === 200).length,
            sensitive_files: interestingFindings.filter(r => this.isSensitiveFile(r.url)).length,
            fuzzing_results: results,
            interesting_findings: interestingFindings
          },
          status: 'success'
        };
        
      } catch (error) {
        return {
          target: baseUrl,
          timestamp: new Date().toISOString(),
          tool: 'directory_fuzzing',
          results: {},
          status: 'error',
          error: error instanceof Error ? error.message : String(error)
        };
      }
    }
  • src/index.ts:555-559 (registration)
    Tool dispatch in the main server handler switch statement, calling the FuzzingEngine.fuzzDirectories method.
    case "fuzzing_directories":
      return respond(await this.fuzzingEngine.fuzzDirectories(args.target, { 
        tool: args.tool || 'ffuf',
        extensions: args.extensions 
      }));
  • Input schema definition for the fuzzing_directories tool, listed in the tools array returned by ListToolsRequest.
    {
      name: "fuzzing_directories",
      description: "Fuzz directories and files using ffuf/wfuzz",
      inputSchema: {
        type: "object",
        properties: {
          target: { type: "string", description: "Target base URL" },
          tool: { 
            type: "string", 
            enum: ["ffuf", "wfuzz"],
            description: "Fuzzing tool to use" 
          },
          extensions: { 
            type: "array", 
            items: { type: "string" },
            description: "File extensions to test" 
          }
        },
        required: ["target"]
      }
    },
  • Core helper executing ffuf commands for both directory and file extension fuzzing, parsing output into results.
    private async runFFUFDirectories(baseUrl: string, config: FuzzingConfiguration): Promise<FuzzingResult[]> {
      try {
        const results: FuzzingResult[] = [];
        
        // Directory fuzzing
        const dirCommand = `ffuf -u ${baseUrl}/FUZZ -w ${config.wordlist} -t ${config.threads} -timeout ${config.timeout} -fc ${config.filter_codes?.join(',')} -o /dev/null -s`;
        
        const { stdout: dirOutput } = await execAsync(dirCommand, { 
          timeout: 120000,
          maxBuffer: 1024 * 1024 * 5 
        });
        
        // Parse directory results
        this.parseFFUFOutput(dirOutput, baseUrl, results);
        
        // File extension fuzzing
        if (config.extensions) {
          for (const ext of config.extensions) {
            const extCommand = `ffuf -u ${baseUrl}/FUZZ.${ext} -w ${config.wordlist} -t ${config.threads} -timeout ${config.timeout} -fc ${config.filter_codes?.join(',')} -o /dev/null -s`;
            
            try {
              const { stdout: extOutput } = await execAsync(extCommand, { 
                timeout: 60000,
                maxBuffer: 1024 * 1024 
              });
              
              this.parseFFUFOutput(extOutput, baseUrl, results, ext);
              
            } catch {
              // Continue with other extensions
            }
          }
        }
        
        return results;
        
      } catch (error) {
        console.error('FFuf directory fuzzing error:', error);
        return [];
      }
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/adriyansyah-mf/mcp-pentest'

If you have feedback or need assistance with the MCP directory API, please join our Discord server