about summary refs log tree commit diff
path: root/src/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.go')
-rw-r--r--src/main.go114
1 files changed, 95 insertions, 19 deletions
diff --git a/src/main.go b/src/main.go
index 3b6ef05..f64df59 100644
--- a/src/main.go
+++ b/src/main.go
@@ -1,42 +1,118 @@
 package main
 
 import (
-	"bufio"
 	"fmt"
 	"log"
-	"os"
+	"net/http"
+	"strings"
 )
 
 func main() {
 	// pase the command line aguments
 	registerFlags()
 
-	// read the wordlist
-	lines, err := readWordlist(wordlist)
+	fmt.Printf(red("asd"))
+	fmt.Printf(boldRed("asd"))
+	fmt.Printf(green("asd"))
+	fmt.Printf(boldGreen("asd"))
+	fmt.Printf(yellow("asd"))
+	fmt.Printf(boldYellow("asd"))
+	fmt.Printf(blue("asd"))
+	fmt.Printf(boldBlue("asd"))
+	fmt.Printf(magenta("asd"))
+	fmt.Printf(boldMagenta("asd"))
+	fmt.Printf(cyan("asd"))
+	fmt.Printf(boldCyan("asd") + "\n")
+
+	// read the wordlist from a file
+	log.Println("reading the wordlist from a file")
+	wordlist, err := readWordlist(wordlist)
 	if err != nil {
 		log.Println(err)
 	}
+	log.Println(green("[+] ") + "done reading the wordlist from a file")
+
+	// define a channel to store the wordlist in
+	wordlistChannel := make(chan string)
+
+	// define a channel in which the response gets written into from the go
+	// routines
+	printChannel := make(chan Response)
+
+	// write all the words from the wordlist into the wordlistChannel
+	go func() {
+		for _, line := range wordlist {
+			wordlistChannel <- line
+		}
+	}()
+
+	fmt.Println(url)
+
+	go func() {
+		var i int
+		for {
+			// read a response from the printChannel for further usage
+			response := <-printChannel
+
+			// define a postfix: a string attached to the end of all printed
+			// string set in the section filtering the status code cases
+			var postfix string
+			var prefix string
 
-	for i, line := range lines {
-		fmt.Printf("%d %s\n", i, string(line))
+			// define what color should be used to print the individual status
+			// codes
+			var statusCode string
+			switch response.StatusCode {
+			case 200:
+				prefix = "\r\033[K"
+				statusCode = green(fmt.Sprintf("%d", response.StatusCode))
+				postfix = "\n"
+			case 404:
+				statusCode = red(fmt.Sprintf("%d", response.StatusCode))
+				postfix = "\033[K\r"
+			}
+
+			// print the foo
+			fmt.Printf("%s%.7d:   %s    %s%s", prefix, i, statusCode, response.FuzzWord, postfix)
+			i++
+		}
+	}()
+
+	if threads > 1 {
+		fmt.Println("threaded")
+		httpRequest(wordlistChannel, printChannel)
+	} else {
+
+		// loop over all the threads starting a go routine fetching a word from
+		// the wordlistChannel, making the request and inserting the result into
+		// the printChannel
+		for i := 0; i < threads; i++ {
+			go httpRequest(wordlistChannel, printChannel)
+		}
 	}
+
 }
 
-func readWordlist(wordlistPath string) ([]string, error) {
-	file, err := os.Open(wordlistPath)
-	if err != nil {
-		return nil, err
-	}
-	defer file.Close()
+func httpRequest(wordlistChannel chan string, printChannel chan Response) {
+	for {
+		// replace the first instance of "FUZZ" in the given url by the next
+		// value from the wordlistChannel
+		fuzzWord := <-wordlistChannel
+		requestURL := strings.Replace(url, "FUZZ", fuzzWord, 1)
 
-	scanner := bufio.NewScanner(file)
-	scanner.Split(bufio.ScanLines)
+		// make the http get request
+		resp, err := http.Get("https://" + requestURL)
+		if err != nil {
+			log.Println(err)
+		}
 
-	var lines []string
+		// define the response
+		var response = Response{
+			StatusCode: resp.StatusCode,
+			FuzzWord:   fuzzWord,
+		}
 
-	for scanner.Scan() {
-		lines = append(lines, scanner.Text())
+		// insert the response into the print channel for further printing
+		printChannel <- response
 	}
-
-	return lines, nil
 }