fuck_byte_road/main.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
}