研究本地服务系列文章:

  1. 图一乐研究之初识Yakit
  2. 图一乐研究之本地服务猎手(本文)
  3. 本地服务猎手终章

前言

上篇回顾

上篇文章“图一乐研究之初识Yakit”有的师傅不明白为啥巴斯要搞个grpc和yak engine通信。现如今有些桌面软件,特别是非原生开发的桌面软件,会将核心部分与gui分离,通过网络接口通信,虽然是监听本地的 localhost 但也不安全。

上篇文中的 gRPC 不能在浏览器中跑起来,假设暴露是 http 协议,就能诱导用户访问构造的恶意页面,在用户浏览器对本地服务发送恶意payload,相关案例:https://xlab.tencent.com/cn/2018/10/23/weixin-cheater-risks/

关于gRPC

gRPC是基于HTTP2协议,默认使用H2C(H2C和H2都是HTTP/2协议的版本,其中H2C是不加密的版本,而H2是加密的版本。)

Yak默认也是使用的h2c,只可惜Chrome和Firefox浏览器虽然支持HTTP/2协议,但是它们都不支持非加密的H2C版本。

实践 分别用 net 或者 h2c 写客户端请求服务,编译为wasm后运行请求均无效:

// example.go
// net.dial
c, err := net.Dial("tcp", "127.0.0.1:8233")
if err != nil {
	fmt.Println(err)
	return
}
defer c.Close()
fmt.Println(c.LocalAddr(), c.RemoteAddr())
// ...
// h2c
client := http.Client{
	// Skip TLS dial
	Transport: &http2.Transport{
		AllowHTTP: true,
		DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) {
			return net.Dial(network, addr)
		},
	},
}
resp, err := client.Get("<http://127.0.0.1:49024>")
if err != nil {
	log.Fatal(fmt.Errorf("error making request: %v", err))
}
fmt.Println(resp.StatusCode, resp.Proto)

找 AI 给我润色一下标准答案:

Untitled

Go Wasm

还有哪些注意事项呢🤔️:

Untitled

Web客户端的本地服务探测

Powered by Kali-Team