package main import ( "bytes" "context" "crypto/rand" "encoding/hex" "fmt" "io/ioutil" "net" "net/http" "net/url" "regexp" "strconv" "sync/atomic" "time" "github.com/PuerkitoBio/goquery" "golang.org/x/net/proxy" ) const ( torProxyAddr = "127.0.0.1:9050" byteRoadURL = "http://557hzs2x3bkzn7mtojx65a3umk7gne6gmaudpft5plijaed4q6u4uuid.onion" nbThreads = 100 ) var success uint32 // Get http client that uses tor proxy func getHttpClient() *http.Client { dialer, err := proxy.SOCKS5("tcp", torProxyAddr, nil, proxy.Direct) if err != nil { panic("failed to connect to tor proxy : " + err.Error()) } transport := &http.Transport{ DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { return dialer.Dial(network, addr) }, } return &http.Client{Transport: transport} } func generateToken() string { b := make([]byte, 12) _, _ = rand.Read(b) return hex.EncodeToString(b) } func work(c *http.Client) { for { resp, err := c.Get(byteRoadURL + "/registration") if err != nil { fmt.Println("1", err.Error()) time.Sleep(time.Second) continue } by, _ := ioutil.ReadAll(resp.Body) doc, _ := goquery.NewDocumentFromReader(bytes.NewReader(by)) s := doc.Find("h4") rgx := regexp.MustCompile(`(\d+) \+ (\d+)`) m := rgx.FindStringSubmatch(s.First().Text()) if len(m) != 3 { fmt.Println("did not find math expression") time.Sleep(time.Second) continue } num1, _ := strconv.Atoi(m[1]) num2, _ := strconv.Atoi(m[2]) ans := num1 + num2 username := generateToken() password := generateToken() if _, err = c.PostForm(byteRoadURL+"/captcha", url.Values{"captcha": {strconv.Itoa(ans)}}); err != nil { fmt.Println("2", err.Error()) time.Sleep(time.Second) continue } resp, err = c.PostForm(byteRoadURL+"/register", url.Values{"username": {username}, "password": {password}}) if err != nil { fmt.Println("3", err.Error()) time.Sleep(time.Second) continue } by, _ = ioutil.ReadAll(resp.Body) if bytes.Contains(by, []byte("Your have been registered!")) { newSuccess := atomic.AddUint32(&success, 1) if newSuccess%10 == 0 { fmt.Printf("accounts created : %d\n", newSuccess) } } else { fmt.Println("failed to create account") } } } func main() { c := getHttpClient() for i := 0; i < nbThreads; i++ { go work(c) } fmt.Printf("Done spawning %d threads\n", nbThreads) never := make(chan struct{}) <-never }