SOCKS5 tunel přes WebRTC TURN Wildberries: implementace v Go
Vyvinutý nástroj pro skrytí SOCKS5 provozu uvnitř WebRTC TURN sezení platformy WB Stream. Provoz je maskován jako videokonference pomocí LiveKit SFU. Kompletní cyklus: reverzní HTTP API, parsování protobuf, KCP přes TURN-relay, yamux multiplexování. Funguje bez prohlížeče, s jedním spouštěcím příkazem.
Reverzní inženýrství API stream.wb.ru
Zachytávání provozu přes puppeteer ukázalo sekvenci čtyř HTTP požadavků a WebSocket připojení. Hlavní stránka blokuje požadavky bez prohlížeče (kód 498), ale API koncové body jsou dostupné.
Sekvence:
- POST /auth/api/v1/auth/user/guest-register — JWT token hosta s displayName.
- POST /api-room/api/v2/room — vytvoření místnosti s
roomType: ROOM_TYPE_ALL_ON_SCREEN,roomPrivacy: ROOM_PRIVACY_FREE. - POST /api-room/api/v1/room/{id}/join — vstup (GET vrací 501).
- GET /api-room-manager/api/v1/room/{id}/token — LiveKit token (zohlednit gzip v Accept-Encoding).
WebSocket: wss://wbstream01-el.wb.ru:7880/rtc?access_token=...&sdk=js&version=2.15.3&protocol=16. ICE servery: turn:wb-stream-turn-1.wb.ru:3478.
Implementováno na net/http bez cookies/CSRF.
rr, _ := wb(cl, "POST", "/auth/api/v1/auth/user/guest-register",
[]byte(`{"displayName":"lh_42"}`), "")
Parser protobuf pro LiveKit SignalResponse
LiveKit přenáší ICE servery v SignalResponse > JoinResponse > ICEServer (fields 1>5/9). Plný google.golang.org/protobuf je nadbytečný — napsán minimální parser na 40 řádků.
Varint dekódování:
func pbVar(d []byte, o int) (uint64, int) {
var v uint64
for s := 0; o < len(d) && s < 64; s += 7 {
b := d[o]; o++
v |= uint64(b&0x7f) << s
if b < 0x80 { return v, o }
}
return 0, o
}
Extrakce length-delimited polí:
func pbAll(d []byte, f uint64) (r [][]byte) {
for o := 0; o < len(d); {
t, n := pbVar(d, o)
if n == o { break }
o = n
switch t & 7 {
case 2:
l, n := pbVar(d, o); o = n
e := o + int(l)
if e > len(d) || e < o { return }
if t>>3 == f { r = append(r, d[o:e]) }
o = e
// ...
}
}
return
}
Parser hledá ICE servery ve field 5 (WB fork) a 9 (standard), extrahuje urls, username, credential.
Architektura tunelu: KCP + TURN + yamux
TCP od SOCKS5 → yamux-stream → KCP (AES-256) → TURN-relay → VPS → internet.
Klíčové komponenty:
- TURN-allocate přes
pion/turn:tc.Allocate()vracínet.PacketConn. - KCP přes relay:
kcp.NewConn(peerVPS, blk, 10, 3, relay). - Yamux pro multiplexování streamů.
- SOCKS5-server na VPS.
uc, _ := net.ListenUDP("udp", nil)
tc, _ := turn.NewClient(&turn.ClientConfig{...})
relay, _ := tc.Allocate()
kc, _ := kcp.NewConn(peerVPS, blk, 10, 3, relay)
Server: KCP-listener + yamux-server + SOCKS5.
Automatizace a odolnost proti selhání
- Smart-klíč: base64(
IP|SHA256(password)). - Připojení: yamux ping/15s, backoff 2-60s, cache TURN creds 5min.
- Samovyčištění:
pgrep+ kill předchozích instancí, systemd přepsání. - Graceful shutdown: Ctrl+C → 2s cleanup.
Spuštění a omezení
go build -o lionheart .
# Server
./lionheart # zkopírujte klíč
# Klient
./lionheart # vložte klíč → 127.0.0.1:1080
Omezení: závislost na WB Stream API, hardcoded wbstream01-el.wb.ru. Plány: gomobile pro Android/iOS (VpnService/NEPacketTunnelProvider).
Co je důležité
- Maskování jako WebRTC provoz DPI/firewally na gigabitech.
- Minimální protobuf-parser bez závislostí.
- TURN-relay jako
net.PacketConnpro KCP. - Kompletní automatizace bez prohlížeče/API klíčů.
- Čisté Go, gomobile-ready.
— Editorial Team
Zatím žádné komentáře.