@@ -143,10 +143,12 @@ def __init__(self, config_dict=None, verbose=False, debug=False, debug_class=Fal
143
143
self .base_curl = []
144
144
self .user_agent_suffix = ""
145
145
self .curl_items = []
146
+ self .curl_ips = []
146
147
self .bypass_results = defaultdict (defaultdict )
147
148
self .to_retry_items = []
148
149
self .clean_output = ""
149
150
self .pbar_queue = Queue (maxsize = 1 )
151
+ self .url_resolved_ip = ""
150
152
151
153
# Init properties
152
154
self .binary_name = Bypasser .DEFAULT_BINARY_NAME
@@ -169,6 +171,27 @@ def __init__(self, config_dict=None, verbose=False, debug=False, debug_class=Fal
169
171
170
172
# *** Protected methods *** #
171
173
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
+
172
195
def _init_debug_level (self , level ):
173
196
if level :
174
197
self .verbose = True
@@ -199,12 +222,18 @@ def _generate_curls(self, url_obj: ParseResult):
199
222
# Reset curl list
200
223
self .curl_items .clear ()
201
224
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 )
204
233
205
234
# Original request
206
235
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 ,
208
237
debug = self .debug , ext_logger = self .logger )
209
238
if item not in self .curl_items :
210
239
self .curl_items .append (item )
@@ -213,8 +242,8 @@ def _generate_curls(self, url_obj: ParseResult):
213
242
if any (mode in ["all" , "http_methods" ] for mode in self .current_bypass_modes ):
214
243
for const_http_method in self .const_http_methods :
215
244
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 )
218
247
if item not in self .curl_items :
219
248
self .curl_items .append (item )
220
249
@@ -223,8 +252,7 @@ def _generate_curls(self, url_obj: ParseResult):
223
252
for http_version in CurlItem .CURL_HTTP_VERSIONS [:- 1 ]:
224
253
cmd = [* self .get_curl_base (forced_http_version = http_version ), target_url ]
225
254
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 )
228
256
if item not in self .curl_items :
229
257
self .curl_items .append (item )
230
258
@@ -234,29 +262,31 @@ def _generate_curls(self, url_obj: ParseResult):
234
262
for const_http_method in self .const_http_methods :
235
263
cmd = [* self .base_curl , "-H" , f"{ const_header_method } : { const_http_method } " , target_url ]
236
264
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 )
238
266
if item not in self .curl_items :
239
267
self .curl_items .append (item )
240
268
241
269
# [http_headers_ip] - Custom host injection headers
242
270
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 )
243
272
commands = set ()
244
273
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 ]))
256
286
# Add items
257
287
for command in commands :
258
288
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 )
260
290
if item not in self .curl_items :
261
291
self .curl_items .append (item )
262
292
@@ -275,7 +305,7 @@ def _generate_curls(self, url_obj: ParseResult):
275
305
# Add items
276
306
for command in commands :
277
307
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 )
279
309
if item not in self .curl_items :
280
310
self .curl_items .append (item )
281
311
@@ -294,7 +324,7 @@ def _generate_curls(self, url_obj: ParseResult):
294
324
# Add items
295
325
for command in commands :
296
326
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 )
298
328
if item not in self .curl_items :
299
329
self .curl_items .append (item )
300
330
@@ -314,7 +344,7 @@ def _generate_curls(self, url_obj: ParseResult):
314
344
# Add items
315
345
for command in commands :
316
346
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 )
318
348
if item not in self .curl_items :
319
349
self .curl_items .append (item )
320
350
@@ -337,7 +367,7 @@ def _generate_curls(self, url_obj: ParseResult):
337
367
# Add items
338
368
for command in commands :
339
369
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 )
341
371
if item not in self .curl_items :
342
372
self .curl_items .append (item )
343
373
@@ -349,8 +379,8 @@ def _generate_curls(self, url_obj: ParseResult):
349
379
char_case = base_path [abc_index ]
350
380
char_case = char_case .upper () if char_case .islower () else char_case .lower ()
351
381
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 )
354
384
if item not in self .curl_items :
355
385
self .curl_items .append (item )
356
386
@@ -359,7 +389,7 @@ def _generate_curls(self, url_obj: ParseResult):
359
389
char_urlencoded = format (ord (base_path [abc_index ]), "02x" )
360
390
cmd = [* self .base_curl ,
361
391
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 ,
363
393
debug = self .debug , ext_logger = self .logger )
364
394
if item not in self .curl_items :
365
395
self .curl_items .append (item )
0 commit comments