添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
爱搭讪的木瓜  ·  Django 4.2 + Psycopg3 ...·  1 月前    · 
眼睛小的肉夹馍  ·  TLS Client Hello ...·  3 月前    · 
独立的书签  ·  Docker|--E: gnupg, ...·  4 月前    · 
勤奋的鸭蛋  ·  F5 AWAF/ASM support ...·  5 月前    · 
阅读时间:10 分钟

HTTP 代理这个名词对于安全从业人员应该都是熟知的,我们常用的抓包工具 burp 就是通过配置 HTTP 代理来实现请求的截获修改等。然而国内对这一功能的原理类文章很少,有的甚至有错误。笔者在做 xray 被动代理时研究了一下这部分内容,并整理成了这篇文章,这篇文章我们从小白的角度粗略的聊聊 HTTP 代理到底是如何工作的,在实现被动扫描功能时有哪些细节需要注意以及如何科学的处理这些细节。

开始之前我先来一波灵魂6问,读者可以先自行思考下,这些问题将是本文的关键点,并将在文章中一一解答:

  • http_proxy https_proxy 有什么区别?
  • 为什么需要信任证书才能扫描 HTTPS 的站点?
  • 代理 HTTPS 的站点一定需要信任证书吗?
  • 代理的隧道模式下如何区分是不是 TLS 的流量?
  • 代理应如何处理 Websocket 和 HTTP2 的流量?
  • 是否应该复用连接以及如何复用连接?

知识储备

1
RootCA >  Intermediates CA > End-User Cert

1
http://127.0.0.1:7777
https://127.0.0.1:7777
socks5://127.0.0.1:7777

1
GET http://example.com/ HTTP/1.1
Host: example.com
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) 
Accept: text/html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
<!-- more -->

 1
package main
import (
	"bufio"
	"log"
	"net"
	"net/http"
var client = http.Client{}
func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:7777")
	if err != nil {
		log.Fatal(err)
	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Fatal(err)
		go handleConn(conn)
func handleConn(conn net.Conn) {
	// 读取代理中的请求
	req, err := http.ReadRequest(bufio.NewReader(conn))
	if err != nil {
		log.Println(err)
		return
	req.RequestURI = ""
	// 发送请求获取响应
	resp, err := client.Do(req)
	if err != nil {
		log.Println(err)
		return
	// 将响应返还给客户端
	_ = resp.Write(conn)
	_ = conn.Close()

1
http_proxy=http://127.0.0.1:7777  curl -v http://example.com

1
CONNECT baidu.com:443 HTTP/1.1
Host: baidu.com:443
User-Agent: curl/7.54.0
Proxy-Connection: Keep-Alive

1
b = conn.Read(1)
if b == "0x16" {
	tlsHandShake(conn)
req = readRequest(conn)
handleReq(conn, req)

1
"Proxy-Authenticate",
"Proxy-Authorization",
"Connection",
"Keep-Alive",
"Proxy-Connection", 
"Te",
"Trailer",
"Transfer-Encoding",
"Upgrade",

1
go io.Copy(conn1, conn2)
io.Copy(conn2, conn1)