Skip to content

Commit ece915e

Browse files
authored
Merge pull request #11 from laluka/jtof-fap-headers-ip
Add new IP/Host headers and improve http_headers_ip mode
2 parents 2ab32d2 + 5286544 commit ece915e

File tree

3 files changed

+3215
-53
lines changed

3 files changed

+3215
-53
lines changed

bypass_url_parser.py

+57-27
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,12 @@ def __init__(self, config_dict=None, verbose=False, debug=False, debug_class=Fal
143143
self.base_curl = []
144144
self.user_agent_suffix = ""
145145
self.curl_items = []
146+
self.curl_ips = []
146147
self.bypass_results = defaultdict(defaultdict)
147148
self.to_retry_items = []
148149
self.clean_output = ""
149150
self.pbar_queue = Queue(maxsize=1)
151+
self.url_resolved_ip = ""
150152

151153
# Init properties
152154
self.binary_name = Bypasser.DEFAULT_BINARY_NAME
@@ -169,6 +171,27 @@ def __init__(self, config_dict=None, verbose=False, debug=False, debug_class=Fal
169171

170172
# *** Protected methods *** #
171173

174+
def _build_curl_ips(self, resolved_ip=None):
175+
""" Build internal IP list from spoof_ips, const_internal_ip and the resolved target IP address.
176+
:param str resolved_ip: Public (or private) IP address related to the url subdomain
177+
"""
178+
self.curl_ips.clear()
179+
# Adds user's custom IP addresses (-s, --spoof-ip)
180+
if self.spoof_ips:
181+
for spoof_ip in self.spoof_ips:
182+
if spoof_ip not in self.curl_ips:
183+
self.curl_ips.append(spoof_ip)
184+
185+
# Append mode (by default and in any case if self.spoof_ips is empty)
186+
if not self.spoof_ip_replace:
187+
# Internal IP addresses
188+
for const_internal_ip in self.const_internal_ips:
189+
if const_internal_ip not in self.curl_ips:
190+
self.curl_ips.append(const_internal_ip)
191+
# Public (or private) IP address
192+
if resolved_ip and resolved_ip not in self.curl_ips:
193+
self.curl_ips.append(resolved_ip)
194+
172195
def _init_debug_level(self, level):
173196
if level:
174197
self.verbose = True
@@ -199,12 +222,18 @@ def _generate_curls(self, url_obj: ParseResult):
199222
# Reset curl list
200223
self.curl_items.clear()
201224

202-
# Get the public IP of this URL
203-
url_public_ip = socket.gethostbyname(str(url_obj.hostname))
225+
# Resolves public (or private) IP of target URL
226+
try:
227+
self.url_resolved_ip = socket.gethostbyname(str(url_obj.hostname))
228+
except (socket.error, socket.gaierror):
229+
error_msg = f"Unable to resolve the subdomain '{url_obj.hostname}'. Please check the url or your " \
230+
f"host's DNS resolvers"
231+
self.logger.error(error_msg)
232+
raise ValueError(error_msg)
204233

205234
# Original request
206235
cmd = [*self.base_curl, target_url]
207-
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="original_request", target_ip=url_public_ip,
236+
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="original_request", target_ip=self.url_resolved_ip,
208237
debug=self.debug, ext_logger=self.logger)
209238
if item not in self.curl_items:
210239
self.curl_items.append(item)
@@ -213,8 +242,8 @@ def _generate_curls(self, url_obj: ParseResult):
213242
if any(mode in ["all", "http_methods"] for mode in self.current_bypass_modes):
214243
for const_http_method in self.const_http_methods:
215244
cmd = [*self.base_curl, "-X", const_http_method, target_url]
216-
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="http_methods", target_ip=url_public_ip,
217-
debug=self.debug, ext_logger=self.logger)
245+
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="http_methods",
246+
target_ip=self.url_resolved_ip, debug=self.debug, ext_logger=self.logger)
218247
if item not in self.curl_items:
219248
self.curl_items.append(item)
220249

@@ -223,8 +252,7 @@ def _generate_curls(self, url_obj: ParseResult):
223252
for http_version in CurlItem.CURL_HTTP_VERSIONS[:-1]:
224253
cmd = [*self.get_curl_base(forced_http_version=http_version), target_url]
225254
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="http_versions",
226-
target_ip=url_public_ip,
227-
debug=self.debug, ext_logger=self.logger)
255+
target_ip=self.url_resolved_ip, debug=self.debug, ext_logger=self.logger)
228256
if item not in self.curl_items:
229257
self.curl_items.append(item)
230258

@@ -234,29 +262,31 @@ def _generate_curls(self, url_obj: ParseResult):
234262
for const_http_method in self.const_http_methods:
235263
cmd = [*self.base_curl, "-H", f"{const_header_method}: {const_http_method}", target_url]
236264
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="http_headers_method",
237-
target_ip=url_public_ip, debug=self.debug, ext_logger=self.logger)
265+
target_ip=self.url_resolved_ip, debug=self.debug, ext_logger=self.logger)
238266
if item not in self.curl_items:
239267
self.curl_items.append(item)
240268

241269
# [http_headers_ip] - Custom host injection headers
242270
if any(mode in ["all", "http_headers_ip"] for mode in self.current_bypass_modes):
271+
self._build_curl_ips(resolved_ip=self.url_resolved_ip)
243272
commands = set()
244273
for const_header_host in self.const_header_hosts:
245-
if self.spoof_ips:
246-
# Custom IP addresses
247-
for spoof_ip in self.spoof_ips:
248-
commands.add(tuple([*self.base_curl, "-H", f"{const_header_host}: {spoof_ip}", target_url]))
249-
if not self.spoof_ip_replace: # False in any case if self.spoof_ips is empty
250-
# Internal IP addresses
251-
for const_internal_ip in self.const_internal_ips:
252-
commands.add(
253-
tuple([*self.base_curl, "-H", f"{const_header_host}: {const_internal_ip}", target_url]))
254-
# Public IP address related to the url subdomain
255-
commands.add(tuple([*self.base_curl, "-H", f"{const_header_host}: {url_public_ip}", target_url]))
274+
# Header which takes 1 as value
275+
if const_header_host == "X-AppEngine-Trusted-IP-Request":
276+
commands.add(tuple([*self.base_curl, "-H", f"{const_header_host}: 1", target_url]))
277+
continue
278+
# Specific rule for header 'Forwarded: for='
279+
for ip in self.curl_ips:
280+
if const_header_host == "Forwarded":
281+
commands.add(tuple([*self.base_curl, "-H", f"{const_header_host}: by={ip}", target_url]))
282+
commands.add(tuple([*self.base_curl, "-H", f"{const_header_host}: for={ip}", target_url]))
283+
commands.add(tuple([*self.base_curl, "-H", f"{const_header_host}: host={ip}", target_url]))
284+
else:
285+
commands.add(tuple([*self.base_curl, "-H", f"{const_header_host}: {ip}", target_url]))
256286
# Add items
257287
for command in commands:
258288
item = CurlItem(url_obj, self.base_curl, list(command), bypass_mode="http_headers_ip",
259-
target_ip=url_public_ip, debug=self.debug, ext_logger=self.logger)
289+
target_ip=self.url_resolved_ip, debug=self.debug, ext_logger=self.logger)
260290
if item not in self.curl_items:
261291
self.curl_items.append(item)
262292

@@ -275,7 +305,7 @@ def _generate_curls(self, url_obj: ParseResult):
275305
# Add items
276306
for command in commands:
277307
item = CurlItem(url_obj, self.base_curl, list(command), bypass_mode="http_headers_scheme",
278-
target_ip=url_public_ip, debug=self.debug, ext_logger=self.logger)
308+
target_ip=self.url_resolved_ip, debug=self.debug, ext_logger=self.logger)
279309
if item not in self.curl_items:
280310
self.curl_items.append(item)
281311

@@ -294,7 +324,7 @@ def _generate_curls(self, url_obj: ParseResult):
294324
# Add items
295325
for command in commands:
296326
item = CurlItem(url_obj, self.base_curl, list(command), bypass_mode="http_headers_port",
297-
target_ip=url_public_ip, debug=self.debug, ext_logger=self.logger)
327+
target_ip=self.url_resolved_ip, debug=self.debug, ext_logger=self.logger)
298328
if item not in self.curl_items:
299329
self.curl_items.append(item)
300330

@@ -314,7 +344,7 @@ def _generate_curls(self, url_obj: ParseResult):
314344
# Add items
315345
for command in commands:
316346
item = CurlItem(url_obj, self.base_curl, list(command), bypass_mode="mid_paths",
317-
target_ip=url_public_ip, debug=self.debug, ext_logger=self.logger)
347+
target_ip=self.url_resolved_ip, debug=self.debug, ext_logger=self.logger)
318348
if item not in self.curl_items:
319349
self.curl_items.append(item)
320350

@@ -337,7 +367,7 @@ def _generate_curls(self, url_obj: ParseResult):
337367
# Add items
338368
for command in commands:
339369
item = CurlItem(url_obj, self.base_curl, list(command), bypass_mode="end_paths",
340-
target_ip=url_public_ip, debug=self.debug, ext_logger=self.logger)
370+
target_ip=self.url_resolved_ip, debug=self.debug, ext_logger=self.logger)
341371
if item not in self.curl_items:
342372
self.curl_items.append(item)
343373

@@ -349,8 +379,8 @@ def _generate_curls(self, url_obj: ParseResult):
349379
char_case = base_path[abc_index]
350380
char_case = char_case.upper() if char_case.islower() else char_case.lower()
351381
cmd = [*self.base_curl, f"{base_url}{base_path[:abc_index]}{char_case}{base_path[abc_index + 1:]}"]
352-
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="case_substitution", target_ip=url_public_ip,
353-
debug=self.debug, ext_logger=self.logger)
382+
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="case_substitution",
383+
target_ip=self.url_resolved_ip, debug=self.debug, ext_logger=self.logger)
354384
if item not in self.curl_items:
355385
self.curl_items.append(item)
356386

@@ -359,7 +389,7 @@ def _generate_curls(self, url_obj: ParseResult):
359389
char_urlencoded = format(ord(base_path[abc_index]), "02x")
360390
cmd = [*self.base_curl,
361391
f"{base_url}{base_path[:abc_index]}%{char_urlencoded}{base_path[abc_index + 1:]}"]
362-
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="char_encode", target_ip=url_public_ip,
392+
item = CurlItem(url_obj, self.base_curl, cmd, bypass_mode="char_encode", target_ip=self.url_resolved_ip,
363393
debug=self.debug, ext_logger=self.logger)
364394
if item not in self.curl_items:
365395
self.curl_items.append(item)

payloads/const_header_hosts.lst

+112-26
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,139 @@
1-
Access-Control-Allow-Origin
2-
Base-Url
3-
CF-Connecting_IP
1+
Ali-CDN-Real-IP
42
CF-Connecting-IP
3+
Cdn-Real-IP
4+
Cdn-Src-IP
5+
Cf-Pseudo-IPv4
56
Client-IP
7+
Cluster-Client-IP
8+
Cluster-IP
9+
Connection
10+
Contact
611
Destination
7-
Forwarded-For-IP
8-
Forwarded-For
12+
Fastly-Client-IP
913
Forwarded
14+
Forwarded-For
15+
Forwarded-For-IP
16+
Forwarded-Host
17+
Forwarder
18+
Forwarder-For
19+
Forwarder-Host
20+
Forwarding
21+
Forwarding-For
22+
Forwarding-Host
23+
From
24+
HTTP-Host
1025
Host
11-
Http-Url
26+
Host-IP
27+
IP
28+
Incap-Client-IP
1229
Origin
30+
Origin-Host
31+
Origin-IP
32+
Originating-IP
33+
Override-IP
1334
Profile
14-
Proxy-Host
15-
Proxy-Url
1635
Proxy
17-
Real-Ip
36+
Proxy-Client-IP
37+
Proxy-Host
38+
Proxy-IP
39+
Real-Client-IP
40+
Real-IP
1841
Redirect
19-
Referer
20-
Referrer
42+
Remote-Addr
43+
Remote-Host
44+
Remote-IP
2145
Request-Uri
46+
Server
47+
Server-IP
48+
Server-Name
49+
Source-IP
50+
True-Client
2251
True-Client-IP
23-
Uri
24-
Url
52+
Via
53+
WL-Proxy-Client-IP
54+
X-AppEngine-Trusted-IP-Request
55+
X-Appengine-User-IP
2556
X-Arbitrary
57+
X-Backend-Host
58+
X-Backend-Server
59+
X-BlueCoat-Via
60+
X-C-IP
61+
X-Cache-Info
62+
X-Client-Host
2663
X-Client-IP
64+
X-Cluster-Client-IP
65+
X-Cluster-IP
2766
X-Custom-IP-Authorization
67+
X-Dev-Host
68+
X-Ebay-Client-IP
69+
X-Fake-IP
70+
X-Fb-Host
71+
X-Fb-User-Remote-Addr
72+
X-Forward
2873
X-Forward-For
74+
X-Forwarded
2975
X-Forwarded-By
30-
X-Forwarded-For-Original
3176
X-Forwarded-For
77+
X-Forwarded-For-IP
78+
X-Forwarded-For-Original
79+
X-Forwarded-From
3280
X-Forwarded-Host
33-
X-Forwarded-Proto
3481
X-Forwarded-Server
35-
X-Forwarded
82+
X-Forwarder
3683
X-Forwarder-For
84+
X-Forwarder-Host
85+
X-Forwarding
86+
X-Forwarding-For
87+
X-Forwarding-Host
88+
X-Forwared-Host
89+
X-From
90+
X-From-IP
91+
X-Gateway-Host
92+
X-HTTP-Host-Override
3793
X-Host
38-
X-Http-Destinationurl
39-
X-HTTP-DestinationURL
94+
X-Host-IP
95+
X-Host-Override
4096
X-Http-Host-Override
97+
X-Http-Method-Override
98+
X-IP
99+
X-IP-Addr
100+
X-IP-Address
101+
X-IP-Trail
102+
X-MS-ADFS-Proxy-Client-IP
103+
X-MS-Forwarded-Client-IP
104+
X-Nokia-ipaddress
105+
X-Origin
106+
X-Origin-Host
107+
X-Origin-IP
108+
X-Original-For
109+
X-Original-Forwarded-For
110+
X-Original-Host
111+
X-Original-Hostname
112+
X-Original-IP
41113
X-Original-Remote-Addr
42-
X-Original-URL
43114
X-Originally-Forwarded-For
44-
X-Originating-
115+
X-Originating
116+
X-Originating-Host
45117
X-Originating-IP
46-
X-Proxy-Url
47-
X-ProxyUser-Ip
48-
X-Real-Ip
49-
X-Referrer
118+
X-Proxy
119+
X-Proxy-IP
120+
X-ProxyMesh-IP
121+
X-ProxyUser-IP
122+
X-Real-Client-IP
123+
X-Real-IP
50124
X-Remote-Addr
125+
X-Remote-Host
51126
X-Remote-IP
52-
X-Rewrite-URL
53-
X-WAP-Profile
127+
X-Served-By
128+
X-Server
129+
X-Server-IP
130+
X-Server-Name
131+
X-Sp-Edge-Host
132+
X-Sp-Forwarded-IP
133+
X-True-Client
134+
X-True-Client-IP
135+
X-True-IP
136+
X-WAP-Network-Client-IP
137+
X-Wap-Profile
138+
X-YWBCLO-UIP
139+
Z-Forwarded-For

0 commit comments

Comments
 (0)