
एक स्थानीय MITM प्रॉक्सी जो आपको TLS फ़िंगरप्रिंट्स (JA3/JA4), HTTP/2 फ़िंगरप्रिंट्स, HTTP हेडर क्रम, और User-Agent नियंत्रित करने देता है — सब कुछ एक ही YAML कॉन्फ़िग फ़ाइल से।
एक स्थानीय MITM प्रॉक्सी जो आपको TLS फ़िंगरप्रिंट (JA3/JA4), HTTP/2 फ़िंगरप्रिंट, HTTP हेडर क्रम, User-Agent, और स्रोत IP हेडर को नियंत्रित करने देती है — सब कुछ एक ही YAML कॉन्फ़िग फ़ाइल से।
प्रॉक्सी को टॉगल करने और फ़िंगरप्रिंट प्रोफ़ाइल को ब्राउज़र टूलबार से सीधे स्विच करने के लिए एक Chrome एक्सटेंशन शामिल है — बिना प्रॉक्सी को पुनः प्रारंभ किए।
WAF बॉट-डिटेक्शन सिस्टम के अधिकृत सुरक्षा परीक्षण के लिए अभिप्रेत है। curl, ब्राउज़र, या Playwright को प्रॉक्सी के माध्यम से रूट करें और देखें कि विभिन्न फ़िंगरप्रिंट संयोजनों को कैसे वर्गीकृत किया जाता है।
curl / browser / Playwright
│ HTTP CONNECT (to proxy)
▼
┌─────────────────────────────────────────┐
│ impersonate-proxy │
│ │
│ MITM TLS ◄──────────────► uTLS │
│ (our CA cert) (custom JA3/4) │
│ │
│ Header rewriter (UA, order, add/del) │
│ HTTP/2 framer (SETTINGS, WINDOW_UPDATE│
│ pseudo-header order) │
└─────────────────────────────────────────┘
│ Custom TLS ClientHello + HTTP/2
▼
Target server / WAF
| परत | आप क्या नियंत्रित कर सकते हैं |
|---|---|
| TLS | uTLS प्रीसेट या पूरी तरह से कस्टम custom_hello स्पेक के माध्यम से Cipher suites, एक्सटेंशन, उनका क्रम (JA3 / JA4) |
brew install go
डिस्ट्रो-पैकेज्ड Go अक्सर पुराना होता है। आधिकारिक बाइनरी सीधे इंस्टॉल करें:
# Download and extract (replace 1.22.5 with the latest from https://go.dev/dl/)
curl -OL https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
# Add to PATH (add this line to ~/.bashrc or ~/.zshrc to make it permanent)
export PATH=$PATH:/usr/local/go/bin
सत्यापित करें:
go version
# go version go1.22.5 linux/amd64
ARM64 (Raspberry Pi, AWS Graviton, आदि): डाउनलोड URL में
linux-amd64कोlinux-arm64से बदलें।
git clone https://github.com/ytkoka/impersonate-proxy.git
cd impersonate-proxy
make build
CA पहली बार चलाने पर स्वचालित रूप से जनरेट होता है। ca.crt और ca.key बनाने के लिए प्रॉक्सी को एक बार प्रारंभ करें:
make run
# 2026/04/22 12:00:00 generated CA certificate → ca.crt
# 2026/04/22 12:00:00 listening on 127.0.0.1:8080 preset=chrome
इसे Ctrl-C से रोकें।
क्लाइंट्स को आपके MITM CA पर भरोसा करना आवश्यक है ताकि वे प्रॉक्सी-जनरेटेड लीफ प्रमाणपत्रों को अस्वीकार न करें।
macOS सिस्टम keychain (सभी ऐप्स को प्रभावित करता है):
make trust-ca # runs: sudo security add-trusted-cert ...
Linux सिस्टम trust (सभी ऐप्स को प्रभावित करता है; ca-certificates पैकेज की आवश्यकता है):
# Debian / Ubuntu
sudo cp ca.crt /usr/local/share/ca-certificates/impersonate-proxy.crt
sudo update-ca-certificates
# RHEL / Fedora / Amazon Linux
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/impersonate-proxy.crt
sudo update-ca-trust
केवल curl (कोई सिस्टम-व्यापी परिवर्तन नहीं):
curl --cacert ca.crt ...
Playwright / Node.js:
export NODE_EXTRA_CA_CERTS="$(pwd)/ca.crt"
Firefox: Preferences → Privacy & Security → View Certificates → Authorities → ca.crt इम्पोर्ट करें
प्रॉक्सी प्रारंभ करने से पहले config.yaml संपादित करें। सभी फ़ील्ड्स के डिफ़ॉल्ट मान होते हैं — आपको केवल वही निर्दिष्ट करना होता है जिसे आप ओवरराइड करना चाहते हैं।
listen: "127.0.0.1:8080"
mgmt_listen: "127.0.0.1:8081" # management API used by the Chrome extension (empty to disable)
ca_cert: "ca.crt"
ca_key: "ca.key"
tls:
# TLS fingerprint preset (controls JA3 / JA4)
# Options: chrome | firefox | safari | edge | ios | random | golang
preset: "chrome"
http:
# Override User-Agent (leave empty to pass through the client's UA)
user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
# Spoof source IP: sets both X-Forwarded-For and True-Client-IP to this value,
# replacing any values the client may have already set (leave empty to disable)
# client_ip: "1.2.3.4"
# Emit headers in this order; headers not listed are appended after
header_order:
- "Host"
- "User-Agent"
- "Accept"
- "Accept-Language"
- "Accept-Encoding"
- "Connection"
# Add or overwrite headers
add_headers:
Accept-Language: "ja,en-US;q=0.9,en;q=0.8"
# Remove headers before forwarding
remove_headers: []
http2:
enabled: true
# SETTINGS frame entries — id and order both affect the HTTP/2 fingerprint.
# RFC 7540 §11.3 IDs:
# 1=HEADER_TABLE_SIZE 2=ENABLE_PUSH 3=MAX_CONCURRENT_STREAMS
# 4=INITIAL_WINDOW_SIZE 5=MAX_FRAME_SIZE 6=MAX_HEADER_LIST_SIZE
settings:
- { id: 1, val: 65536 } # Chrome defaults shown here
- { id: 2, val: 0 }
- { id: 4, val: 6291456 }
- { id: 6, val: 262144 }
# Connection-level WINDOW_UPDATE increment
window_update: 15663105
# Order of pseudo-headers in the HEADERS frame
pseudo_header_order: [method, authority, scheme, path]
जब प्रॉक्सी प्रारंभ होती है तो यह mgmt_listen (डिफ़ॉल्ट 127.0.0.1:8081) पर एक हल्का HTTP API भी एक्सपोज़ करती है। Chrome एक्सटेंशन इसका उपयोग प्रॉक्सी को पुनः प्रारंभ किए बिना रनटाइम पर सेटिंग्स को पढ़ने और अपडेट करने के लिए करता है। आप इसे सीधे curl के साथ भी कॉल कर सकते हैं:
| एंडपॉइंट | मेथड | विवरण |
|---|---|---|
/api/config |
# Read current settings
curl http://127.0.0.1:8081/api/config
# Switch to Firefox fingerprint and set a spoofed IP
curl -s -X POST http://127.0.0.1:8081/api/config \
-H "Content-Type: application/json" \
-d '{"tls_preset":"firefox","client_ip":"203.0.113.1","user_agent":""}'
# Switch to an arbitrary JA3/JA4 fingerprint at runtime — same fields as the
# config.yaml custom_hello block, sent as JSON (see "Custom TLS fingerprint" below)
curl -s -X POST http://127.0.0.1:8081/api/config \
-H "Content-Type: application/json" \
-d '{
"tls_preset": "custom",
"custom_hello": {
"cipher_suites": [2570, 4865, 4866, 4867, 49195, 49199, 49196, 49200, 52393, 52392, 49171, 49172, 156, 157, 47, 53],
"curves": ["X25519", "P256", "P384"],
"versions": ["1.3", "1.2"],
"extensions": [2570, 0, 23, 65281, 10, 11, 35, 16, 5, 18, 13, 51, 45, 43, 27, 21]
},
"client_ip": "",
"user_agent": ""
}'
परिवर्तन नए कनेक्शनों पर तुरंत प्रभावी होते हैं। API को पूरी तरह से अक्षम करने के लिए mgmt_listen: "" सेट करें।
preset: "custom")बिल्ट-इन प्रीसेट (chrome, firefox, safari, …) अधिकांश सामान्य मामलों को कवर करते हैं। जब आपको किसी विशिष्ट ब्राउज़र संस्करण या उन प्रीसेट से भिन्न फ़िंगरप्रिंट से मेल खाने की आवश्यकता हो, तो preset: "custom" सेट करें और custom_hello ब्लॉक प्रदान करें।
JA3 / JA4 कॉन्फ़िग फ़ील्ड्स से कैसे मैप होते हैं
JA3 और JA4 वन-वे हैश हैं — आप हैश को वापस स्पेक में रिवर्स नहीं कर सकते। tls.peet.ws या Wireshark के साथ लक्षित ब्राउज़र के अंतर्निहित पैरामीटर खोजें, फिर उन्हें
custom_helloमें पेस्ट करें।
Chrome 131 उदाहरण
tls:
preset: "custom"
custom_hello:
cipher_suites: # hex IDs; 0x0a0a = GREASE placeholder (randomised per connection)
- 0x0a0a
- 0x1301 # TLS_AES_128_GCM_SHA256
- 0x1302 # TLS_AES_256_GCM_SHA384
- 0x1303 # TLS_CHACHA20_POLY1305_SHA256
- 0xc02b # ECDHE-ECDSA-AES128-GCM-SHA256
- 0xc02f # ECDHE-RSA-AES128-GCM-SHA256
- 0xc02c # ECDHE-ECDSA-AES256-GCM-SHA384
- 0xc030 # ECDHE-RSA-AES256-GCM-SHA384
- 0xcca9 # ECDHE-ECDSA-CHACHA20-POLY1305
- 0xcca8 # ECDHE-RSA-CHACHA20-POLY1305
- 0xc013 # ECDHE-RSA-AES128-SHA
- 0xc014 # ECDHE-RSA-AES256-SHA
- 0x009c # RSA-AES128-GCM-SHA256
- 0x009d # RSA-AES256-GCM-SHA384
- 0x002f # RSA-AES128-SHA
- 0x0035 # RSA-AES256-SHA
curves: # X25519 | X25519Kyber768 | P256 | P384 | P521
- "X25519Kyber768"
- "X25519"
- "P256"
versions: # TLS versions to advertise
- "1.3"
- "1.2"
extensions: # extension type IDs in order (controls JA3 extensions component)
- 0x0a0a # GREASE
- 0 # server_name (SNI)
- 23 # extended_master_secret
- 65281 # renegotiation_info
- 10 # supported_groups
- 11 # ec_point_formats
- 35 # session_ticket
- 16 # ALPN
- 5 # status_request
- 18 # signed_certificate_timestamp
- 13 # signature_algorithms
- 51 # key_share
- 45 # psk_key_exchange_modes
- 43 # supported_versions
- 27 # compress_certificate
- 17513 # application_settings (ALPS)
- 0x0a0a # GREASE
- 21 # padding
समर्थित एक्सटेंशन टाइप IDs
रनटाइम अपडेट:
preset: "custom"केवलconfig.yamlतक सीमित नहीं है — इसे प्रबंधन API (custom_helloऑब्जेक्ट के साथPOST /api/config, प्रबंधन API देखें) या Chrome एक्सटेंशन के TLS Preset ड्रॉपडाउन से, प्रॉक्सी को पुनः प्रारंभ किए बिना, रनटाइम पर भी स्विच किया जा सकता है।
make run
# Kills any previous instance on port 8080, rebuilds, and starts.
फ़िंगरप्रिंट प्रोफ़ाइल स्विच करने के लिए, config.yaml संपादित करें और make run फिर से चलाएं।
# With CA trusted system-wide (after make trust-ca):
curl --proxy http://127.0.0.1:8080 https://tls.peet.ws/api/all
# Without system trust — pass CA explicitly:
curl --proxy http://127.0.0.1:8080 --cacert ca.crt https://tls.peet.ws/api/all
chrome-extension/ निर्देशिका में एक Manifest V3 एक्सटेंशन है जो ब्राउज़र टूलबार से प्रॉक्सी को नियंत्रित करता है।
इंस्टॉलेशन:
chrome://extensions खोलेंchrome-extension/ फ़ोल्डर चुनेंनियंत्रण:
User-Agent दायरा: एक्सटेंशन केवल HTTP
User-Agentहेडर को बदलता है। JavaScript काnavigator.userAgentChrome द्वारा स्वयं नियंत्रित होता है और प्रभावित नहीं होता। दोनों को एक साथ स्पूफ करने के लिए, प्रॉक्सी सेटिंग्स के साथ Chrome को--user-agent="..."के साथ लॉन्च करें।
const { chromium } = require('playwright');
const browser = await chromium.launch();
const context = await browser.newContext({
proxy: { server: 'http://127.0.0.1:8080' },
});
// If CA is not in the system keychain, set before launching:
// NODE_EXTRA_CA_CERTS=./ca.crt node script.js
const page = await context.newPage();
await page.goto('https://tls.peet.ws/api/all');
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(proxy={"server": "http://127.0.0.1:8080"})
page = context.new_page()
page.goto("https://tls.peet.ws/api/all")
यदि CA सिस्टम-व्यापी रूप से trusted नहीं है तो NODE_EXTRA_CA_CERTS (Node) या REQUESTS_CA_BUNDLE (Python) सेट करें।
tls.peet.ws प्राप्त होने वाले किसी भी अनुरोध के लिए पूर्ण फ़िंगरप्रिंट विवरण लौटाता है। पठनीय दृश्य के लिए आउटपुट को jq या Python के माध्यम से पाइप करें:
curl -s --proxy http://127.0.0.1:8080 --cacert ca.crt \
https://tls.peet.ws/api/all | python3 -m json.tool
जांचने योग्य प्रमुख फ़ील्ड्स:
impersonate-proxy/
├── main.go # Entry point
├── config/config.go # YAML config struct and defaults
├── fp/dialer.go # uTLS dialer — TLS fingerprint presets
├── h2fp/conn.go # HTTP/2 framer — SETTINGS / WINDOW_UPDATE / pseudo-header control
├── mitm/ca.go # MITM CA: generate, cache, and serve leaf certs
├── proxy/proxy.go # Proxy server: CONNECT handling, protocol branch, runtime config
├── rewrite/headers.go # HTTP header rewriting (UA, order, add/remove, IP spoof)
├── mgmt/server.go # Management HTTP API (/api/config GET + POST)
├── chrome-extension/
│ ├── manifest.json # Manifest V3
│ ├── popup.html # Toolbar popup UI
│ ├── popup.css
│ ├── popup.js # Proxy toggle + management API client
│ └── icon.svg
├── config.yaml # Default configuration
└── Makefile
बाइनरी और जनरेटेड CA फ़ाइलें हटाएं:
make clean
यदि आपने CA को macOS सिस्टम keychain में जोड़ा है, तो इसे Keychain Access के माध्यम से हटाएं ("impersonate-proxy CA" खोजें) या:
sudo security delete-certificate -c "impersonate-proxy CA" /Library/Keychains/System.keychain
Transfer-Encoding: chunked निकाय वाले अनुरोध वर्तमान में समर्थित नहीं हैं।User-Agent HTTP हेडर को फिर से लिखती है, लेकिन JavaScript का navigator.userAgent ब्राउज़र द्वारा स्वतंत्र रूप से सेट किया जाता है और प्रभावित नहीं होता। दोनों को एक साथ ओवरराइड करने के लिए Chrome के --user-agent लॉन्च फ़्लैग का उपयोग करें।यह टूल केवल अधिकृत सुरक्षा परीक्षण के लिए अभिप्रेत है — उदाहरण के लिए, उन सिस्टमों पर WAF और बॉट-डिटेक्शन कॉन्फ़िगरेशन का परीक्षण करना जिनके स्वामी आप हैं या जिनके परीक्षण की स्पष्ट लिखित अनुमति आपके पास है।
बिना प्राधिकरण के सिस्टमों के विरुद्ध इस टूल का उपयोग लागू कानूनों (जैसे Computer Fraud and Abuse Act, जापान का Unauthorized Computer Access Law, या आपके क्षेत्राधिकार में समकक्ष विधान) और लक्ष्य की सेवा की शर्तों का उल्लंघन कर सकता है।
लेखक दुरुपयोग के लिए कोई दायित्व स्वीकार नहीं करते हैं।
| HTTP/1.1 | हेडर क्रम, User-Agent, किसी भी हेडर को जोड़ना/हटाना, IP स्पूफिंग (X-Forwarded-For / True-Client-IP) |
| HTTP/2 | SETTINGS मान और क्रम, WINDOW_UPDATE, स्यूडो-हेडर क्रम (HTTP/2 फ़िंगरप्रिंट) |
GETसक्रिय सेटिंग्स को JSON के रूप में लौटाएं, जिसमें वर्तमान custom_hello भी शामिल है |
/api/config | POST | TLS प्रीसेट (पूरी तरह से कस्टम custom_hello सहित), क्लाइंट IP, और User-Agent अपडेट करें |
| ब्राउज़र | TLS प्रीसेट | HTTP/2 SETTINGS | WINDOW_UPDATE |
|---|
| Chrome | chrome | 1:65536,2:0,4:6291456,6:262144 | 15663105 |
| Firefox | firefox | 1:65536,4:131072,5:16384 | 12517377 |
| Safari | safari | 1:4096,3:100,4:2097152,6:16384 | 10485760 |
| फ़िंगरप्रिंट घटक | कॉन्फ़िग फ़ील्ड | नोट्स |
|---|
| TLS संस्करण सीमा | versions | Min/max स्वचालित रूप से प्राप्त होते हैं |
| Cipher suite सूची + क्रम | cipher_suites | GREASE प्लेसहोल्डर के रूप में 0x0a0a उपयोग करें; uTLS इसे प्रति कनेक्शन रैंडमाइज़ करता है |
| एक्सटेंशन टाइप IDs + क्रम | extensions | क्रम सीधे JA3 एक्सटेंशन घटक को नियंत्रित करता है; GREASE पैटर्न (0xXAXA) से मेल खाने वाले मान प्रति कनेक्शन रैंडमाइज़ होते हैं |
| समर्थित समूह (curves) | curves | यह भी नियंत्रित करता है कि कौन से key shares भेजे जाते हैं |
| ID | नाम | नोट्स |
|---|
0xXAXA (कोई भी GREASE पैटर्न) | GREASE | प्रति कनेक्शन रैंडमाइज़ किया जाता है |
0 | server_name (SNI) | |
5 | status_request | OCSP स्टेपलिंग |
10 | supported_groups | curves सूची का उपयोग करता है |
11 | ec_point_formats | फिक्स्ड: uncompressed (0) |
13 | signature_algorithms | Chrome-जैसे डिफ़ॉल्ट |
16 | ALPN | h2, http/1.1 का विज्ञापन करता है |
18 | signed_certificate_timestamp | |
21 | padding | BoringSSL-शैली पैडिंग |
23 | extended_master_secret | |
27 | compress_certificate | |
28 | record_size_limit | फिक्स्ड: 0x4001 |
35 | session_ticket | |
43 | supported_versions | versions सूची का उपयोग करता है |
45 | psk_key_exchange_modes | DHE के साथ PSK |
50 | signature_algorithms_cert | Chrome-जैसे डिफ़ॉल्ट |
51 | key_share | X25519 और P256 के लिए key shares (curves से) |
17513 | application_settings (ALPS) | h2 का विज्ञापन करता है |
65281 | renegotiation_info | |
| अन्य | GenericExtension | खाली पेलोड के साथ भेजा जाता है |
| नियंत्रण | यह क्या करता है |
|---|
| Proxy toggle | Chrome की प्रॉक्सी सेटिंग सक्षम / अक्षम करता है (ट्रैफ़िक को :8080 के माध्यम से रूट करता है) |
| TLS Preset | uTLS फ़िंगरप्रिंट प्रीसेट स्विच करता है (chrome / firefox / safari / edge / ios / random / golang / custom) |
| Cipher Suites / Curves / TLS Versions / Extensions | जब Custom (JA3/JA4) चुना जाता है तो दिखाए जाते हैं — config.yaml में custom_hello के समान फ़ील्ड्स, जिससे आप YAML संपादित किए या प्रॉक्सी को पुनः प्रारंभ किए बिना कोई भी JA3/JA4 फ़िंगरप्रिंट सेट कर सकते हैं |
| Client IP | हर अनुरोध पर X-Forwarded-For और True-Client-IP सेट करता है |
| User-Agent | HTTP User-Agent हेडर को ओवरराइड करता है |
| Apply बटन | नई सेटिंग्स को प्रबंधन API पर POST करता है; तुरंत प्रभावी होता है |
| API फ़ील्ड | प्रबंधन API का पता (डिफ़ॉल्ट http://127.0.0.1:8081) |
| फ़ील्ड | विवरण |
|---|
tls.ja3_hash | JA3 फ़िंगरप्रिंट हैश |
tls.ja4 | JA4 फ़िंगरप्रिंट स्ट्रिंग |
http2.akamai_fingerprint | HTTP/2 फ़िंगरप्रिंट स्ट्रिंग (SETTINGS + WINDOW_UPDATE + स्यूडो-हेडर क्रम) — फ़ील्ड नाम tls.peet.ws API द्वारा परिभाषित है |
http1.headers | सर्वर द्वारा प्राप्त क्रम में हेडर नाम |
user_agent | सर्वर द्वारा देखा गया User-Agent |
ip | सर्वर द्वारा देखा गया स्रोत IP — यहां X-Forwarded-For / True-Client-IP स्पूफिंग सत्यापित करें |
| टारगेट | विवरण |
|---|
make build | बाइनरी कंपाइल करें |
make run | बिल्ड करें, किसी भी मौजूदा इंस्टेंस को बंद करें, और प्रारंभ करें |
make trust-ca | ca.crt को macOS सिस्टम keychain में जोड़ें (sudo आवश्यक है) |
make clean | बाइनरी, ca.crt, और ca.key हटाएं |