diff --git a/README.md b/README.md index 97224cf..fda0ada 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,91 @@ -# TruePolyglot +Truepolyglot is polyglot file generator project. This means that the +generated file is composed of several file formats. The same file can be +opened as a ZIP file and as a PDF file for example. The idea of this +project comes from work of [Ange Albertini](https://github.com/corkami), +[International Journal of Proof-of-Concept or Get The Fuck +Out](https://www.alchemistowl.org/pocorgtfo/pocorgtfo07.pdf) and [Julia +Wolf](https://www.troopers.de/wp-content/uploads/2011/04/TR11_Wolf_OMG_PDF.pdf) +that explain how we can build a polyglot file.\ +Polyglot file can be fastidious to build, even more if you want to +respect correctly file format. That's why I decided to build a tool to +generate them.\ +My main motivation was the technical challenge. -See webiste at https://truepolyglot.hackade.org +## Features and versions ## + + Description Version + --------------------------------------------------------------------------------------------------------- ------------- + Build a polyglot file valid as PDF and ZIP format and that can be opened with 7Zip and Windows Explorer POC + Add a stream object in PDF part POC + Polyglot file checked without warning with [pdftocairo](https://poppler.freedesktop.org/) >= 1.0 + Polyglot file checked without warning with [caradoc](https://github.com/ANSSI-FR/caradoc) >= 1.0 + Rebuild PDF Xref Table >= 1.0 + Stream object with correct length header value >= 1.0 + Format "zippdf", file without offset after Zip data >= 1.1 + Polyglot file keep original PDF version >= 1.1.1 + Add "szippdf" format without offset before and after Zip data >= 1.2 + Fix /Length stream object value and PDF offset for szippdf format >= 1.2.1 + PDF object numbers reorder after insertion >= 1.3 + +## Polyglot file compatibility ## + + Software Formats status + ------------------ ------------------------- ----------------------------- + Acrobat Reader pdfzip, zippdf OK + Acrobat Reader szippdf __KO__ + Sumatra PDF pdfzip, zippdf, szippdf OK + Edge pdfzip, zippdf, szippdf OK + Firefox pdfzip, zippdf, szippdf OK + 7zip pdfzip, zippdf __OK with warning__ + 7zip szippdf OK + Explorer Windows pdfzip, zippdf, szippdf OK + Info-ZIP (unzip) pdfzip, zippdf, szippdf OK + Evince pdfzip, zippdf, szippdf OK + pdftocairo -pdf pdfzip, zippdf, szippdf OK + caradoc stats pdfzip OK + java szippdf OK + +## Examples ## + + PDF input file Zip input file Format Polyglot Comment + ---------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------- + [doc.pdf](/samples/pdfzip/poc1/doc.pdf) [archive.zip](/samples/pdfzip/poc1/archive.zip) pdfzip [polyglot.pdf](/samples/pdfzip/poc1/polyglot.pdf) PDF/ZIP polyglot - 122 Ko + [orwell\_1984.pdf](/samples/pdfzip/poc2/orwell_1984.pdf) [file-FILE5\_32.zip](/samples/pdfzip/poc2/file-FILE5_32.zip) pdfzip [polyglot.pdf](/samples/pdfzip/poc2/polyglot.pdf) PDF/ZIP polyglot - 1.3 Mo + [x86asm.pdf](/samples/pdfzip/poc3/x86asm.pdf) [fasmw17304.zip](/samples/pdfzip/poc3/fasmw17304.zip) pdfzip [polyglot.pdf](/samples/pdfzip/poc3/polyglot.pdf) PDF/ZIP polyglot - 1.8 Mo + [doc.pdf](/samples/zippdf/poc4/doc.pdf) [archive.zip](/samples/zippdf/poc4/archive.zip) zippdf [polyglot.pdf](/samples/zippdf/poc4/polyglot.pdf) PDF/ZIP polyglot - 112 Ko + [electronics.pdf](/samples/szippdf/poc5/electronics.pdf) [hello\_world.jar](/samples/szippdf/poc5/hello_world.jar) szippdf [polyglot.pdf](/samples/szippdf/poc5/polyglot.pdf) PDF/JAR polyglot - 778 Ko + [hexinator.pdf](/samples/pdfzip/poc6/hexinator.pdf) [eicar.zip](/samples/pdfzip/poc6/eicar.zip) ([scan virustotal.com](https://www.virustotal.com/#/file/2174e17e6b03bb398666c128e6ab0a27d4ad6f7d7922127fe828e07aa94ab79d/detection)) pdfzip [polyglot.pdf](/samples/pdfzip/poc6/polyglot.pdf) ([scan virustotal.com](https://www.virustotal.com/#/file/f6fef31e3b03164bb3bdf35af0521f9fc0c518a9e0f1aa9f8b60ac936201591a/detection)) PDF/ZIP polyglot with Eicar test in Zip - 2.9 Mo + +## Usage ## + + usage: truepolyglot format [options] output-file + + Generate a polyglot file. + + Formats availables: + * pdfzip: Generate a file valid as PDF and ZIP. The format is closest to PDF. + * zippdf: Generate a file valid as ZIP and PDF. The format is closest to ZIP. + * szippdf: Generate a file valid as ZIP and PDF. The format is strictly a ZIP. Archive is modified. + + positional arguments: + {pdfzip,zippdf,szippdf} + Output polyglot format + output_file Output polyglot file path + + optional arguments: + -h, --help show this help message and exit + --pdffile PDFFILE PDF input file + --zipfile ZIPFILE ZIP input file + --verbose {none,error,info,debug} + Verbosity level (default: info) + + TruePolyglot v1.3 + +## Code ## + + git clone https://git.hackade.org/truepolyglot.git/ + Download [truepolyglot-1.3.tar.gz](https://git.hackade.org/truepolyglot.git/snapshot/truepolyglot-1.3.tar.gz) + +## Contact ## + +[truepolyglot@hackade.org](mailtp:truepolyglot@hackade.org) diff --git a/caradoc b/caradoc deleted file mode 100755 index 97cc119..0000000 Binary files a/caradoc and /dev/null differ diff --git a/pdfcat b/tests/pdfcat similarity index 98% rename from pdfcat rename to tests/pdfcat index 115eda7..68a9c6e 100755 --- a/pdfcat +++ b/tests/pdfcat @@ -23,6 +23,10 @@ EXAMPLES # see https://github.com/mstamy2/PyPDF2/LICENSE from __future__ import print_function + +import sys +sys.path.append("../") + import argparse from PdfFileTransformer.PyPDF2.pagerange import PAGE_RANGE_HELP diff --git a/website/css/styles.css b/website/css/styles.css deleted file mode 100644 index adc9728..0000000 --- a/website/css/styles.css +++ /dev/null @@ -1,63 +0,0 @@ -html { - background-color: black; - font-family: Consolas,monaco,monospace; - color: #92D050; -} -body { - background-color: black; - font-family: Consolas,monaco,monospace; - color: #92D050; -} -td { - background-color: black; - font-family: Consolas,monaco,monospace; - color: #92D050; -} -th { - background-color: black; - font-family: Consolas,monaco,monospace; - color: #92D050; -} -h1 { - color: white; -} -a:link { - color: #47B8C7; -} -a:visited { - color: #47B8C7; -} -a:active { - color: #47B8C7; -} -table { - border-collapse: collapse; -} -table, th, td { - border: 1px solid white; -} -th { - background-color: #92D050; - color: black; -} -th { - padding-left: 0.5em; - padding-right: 0.5em; - padding-top: 0.5em; - padding-bottom: 0.5em; -} -td { - padding-left: 0.5em; - padding-right: 0.5em; - padding-bottom: 0.5em; - padding-top: 0.5em; - text-align: left; -} - -.font_reduce { - font-size: 75%; -} - -.warning { - color: #ffb833; -} diff --git a/website/css/styles2.css b/website/css/styles2.css deleted file mode 100644 index 56ef7e5..0000000 --- a/website/css/styles2.css +++ /dev/null @@ -1,61 +0,0 @@ -html { - background-color: black; - font-family: Consolas,monaco,monospace; - color: #92D050; -} -body { - background-color: black; - font-family: Consolas,monaco,monospace; - color: #92D050; -} -td { - background-color: black; - font-family: Consolas,monaco,monospace; - color: #92D050; -} -th { - background-color: black; - font-family: Consolas,monaco,monospace; - color: #92D050; -} -a:link { - color: #47B8C7; -} -a:visited { - color: #47B8C7; -} -a:active { - color: #47B8C7; -} -table { - border-collapse: collapse; -} -table, th, td { - border: 1px solid white; -} -th { - background-color: #92D050; - color: black; -} -th { - padding-left: 0.5em; - padding-right: 0.5em; - padding-top: 0.5em; - padding-bottom: 0.5em; -} -td { - padding-left: 0.5em; - padding-right: 0.5em; - padding-bottom: 0.5em; - padding-top: 0.5em; - text-align: left; -} -th a:link { - color: black; -} -th a:visited { - color: black; -} -th a:active { - color: black; -} diff --git a/website/favicon.ico b/website/favicon.ico deleted file mode 100644 index 0ea93ea..0000000 Binary files a/website/favicon.ico and /dev/null differ diff --git a/website/gen_pocs.sh b/website/gen_pocs.sh deleted file mode 100755 index a62e112..0000000 --- a/website/gen_pocs.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -find -type f -name 'polyglot.pdf' -delete - -mkdir -p ./samples/pdfzip/poc1/ -../truepolyglot pdfzip --pdffile ./samples/pdfzip/poc1/doc.pdf --zipfile ./samples/pdfzip/poc1/archive.zip ./samples/pdfzip/poc1/polyglot.pdf - -mkdir -p ./samples/pdfzip/poc2/ -../truepolyglot pdfzip --pdffile ./samples/pdfzip/poc2/orwell_1984.pdf --zipfile ./samples/pdfzip/poc2/file-FILE5_32.zip ./samples/pdfzip/poc2/polyglot.pdf - -mkdir -p ./samples/pdfzip/poc3/ -../truepolyglot pdfzip --pdffile ./samples/pdfzip/poc3/x86asm.pdf --zipfile ./samples/pdfzip/poc3/fasmw17304.zip ./samples/pdfzip/poc3/polyglot.pdf - -mkdir -p ./samples/zippdf/poc4/ -../truepolyglot zippdf --pdffile ./samples/zippdf/poc4/doc.pdf --zipfile ./samples/zippdf/poc4/archive.zip ./samples/zippdf/poc4/polyglot.pdf - -mkdir -p ./samples/szippdf/poc5/ -../truepolyglot szippdf --pdffile ./samples/szippdf/poc5/electronics.pdf --zipfile ./samples/szippdf/poc5/hello_world.jar ./samples/szippdf/poc5/polyglot.pdf - -mkdir -p ./samples/pdfzip/poc6/ -../truepolyglot pdfzip --pdffile ./samples/pdfzip/poc6/hexinator.pdf --zipfile ./samples/pdfzip/poc6/eicar.zip ./samples/pdfzip/poc6/polyglot.pdf diff --git a/website/index.html b/website/index.html deleted file mode 100644 index d6861a8..0000000 --- a/website/index.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - TruePolyglot - - - - - - - - - -

TruePolyglot

-Truepolyglot is polyglot file generator project. -This means that the generated file is composed of several file formats. The same file can be opened as a ZIP file and as a PDF file for example. -The idea of this project comes from work of Ange Albertini, International Journal of Proof-of-Concept or Get The Fuck Out and Julia Wolf that explain how we can build a polyglot file.
-Polyglot file can be fastidious to build, even more if you want to respect correctly file format. That's why I decided to build a tool to generate them.
-My main motivation was the technical challenge. -
- -

Features and changelog

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
DescriptionVersion
Build a polyglot file valid as PDF and ZIP format and that can be opened with 7Zip and Windows ExplorerPOC
Add a stream object in PDF partPOC
Polyglot file checked without warning with pdftocairo >= 1.0
Polyglot file checked without warning with caradoc >= 1.0
Rebuild PDF Xref Table>= 1.0
Stream object with correct length header value>= 1.0
Format "zippdf", file without offset after Zip data>= 1.1
Polyglot file keep original PDF version>= 1.1.1
Add "szippdf" format without offset before and after Zip data>= 1.2
Fix /Length stream object value and PDF offset for szippdf format>= 1.2.1
PDF object numbers reorder after insertion>= 1.3
-
- -

Polyglot file compatibility

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SoftwareFormatsstatus
Acrobat Readerpdfzip, zippdfOK
Acrobat ReaderszippdfKO
Sumatra PDFpdfzip, zippdf, szippdfOK
Edgepdfzip, zippdf, szippdfOK
Firefoxpdfzip, zippdf, szippdfOK
7zippdfzip, zippdfOK with warning
7zipszippdfOK
Explorer Windowspdfzip, zippdf, szippdfOK
Info-ZIP (unzip)pdfzip, zippdf, szippdfOK
Evincepdfzip, zippdf, szippdfOK
pdftocairo -pdfpdfzip, zippdf, szippdfOK
caradoc statspdfzipOK
javaszippdfOK
-
- - -

Examples

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PDF input fileZip input fileFormatPolyglotComment
doc.pdfarchive.zippdfzippolyglot.pdfPDF/ZIP polyglot - 122 Ko
orwell_1984.pdffile-FILE5_32.zippdfzippolyglot.pdfPDF/ZIP polyglot - 1.3 Mo
x86asm.pdffasmw17304.zippdfzippolyglot.pdfPDF/ZIP polyglot - 1.8 Mo
doc.pdfarchive.zipzippdfpolyglot.pdfPDF/ZIP polyglot - 112 Ko
electronics.pdfhello_world.jarszippdfpolyglot.pdfPDF/JAR polyglot - 778 Ko
hexinator.pdfeicar.zip (scan virustotal.com)pdfzippolyglot.pdf (scan virustotal.com)PDF/ZIP polyglot with Eicar test in Zip - 2.9 Mo
-
- -

Manual

-
-usage: truepolyglot format [options] output-file
-
-Generate a polyglot file.
-
-Formats availables:
-* pdfzip: Generate a file valid as PDF and ZIP. The format is closest to PDF.
-* zippdf: Generate a file valid as ZIP and PDF. The format is closest to ZIP.
-* szippdf: Generate a file valid as ZIP and PDF. The format is strictly a ZIP. Archive is modified.
-
-positional arguments:
-  {pdfzip,zippdf,szippdf}
-                        Output polyglot format
-  output_file           Output polyglot file path
-
-optional arguments:
-  -h, --help            show this help message and exit
-  --pdffile PDFFILE     PDF input file
-  --zipfile ZIPFILE     ZIP input file
-  --verbose {none,error,info,debug}
-                        Verbosity level  (default: info)
-
-TruePolyglot v1.3
-
- -

Code

- -
-git clone https://git.hackade.org/truepolyglot.git/
-
- -

Contact

-On IRC Freenode my nickname is hackade or by mail at truepolyglot@hackade.org. - - - diff --git a/website/robots.txt b/website/robots.txt deleted file mode 100644 index 77470cb..0000000 --- a/website/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: / \ No newline at end of file diff --git a/website/samples/pdfzip/poc1/archive.zip b/website/samples/pdfzip/poc1/archive.zip deleted file mode 100644 index c1eaa24..0000000 Binary files a/website/samples/pdfzip/poc1/archive.zip and /dev/null differ diff --git a/website/samples/pdfzip/poc1/doc.pdf b/website/samples/pdfzip/poc1/doc.pdf deleted file mode 100644 index b31c420..0000000 Binary files a/website/samples/pdfzip/poc1/doc.pdf and /dev/null differ diff --git a/website/samples/pdfzip/poc1/polyglot.pdf b/website/samples/pdfzip/poc1/polyglot.pdf deleted file mode 100644 index 5943e1c..0000000 Binary files a/website/samples/pdfzip/poc1/polyglot.pdf and /dev/null differ diff --git a/website/samples/pdfzip/poc2/file-FILE5_32.zip b/website/samples/pdfzip/poc2/file-FILE5_32.zip deleted file mode 100644 index 8a4b897..0000000 Binary files a/website/samples/pdfzip/poc2/file-FILE5_32.zip and /dev/null differ diff --git a/website/samples/pdfzip/poc2/orwell_1984.pdf b/website/samples/pdfzip/poc2/orwell_1984.pdf deleted file mode 100644 index 687d12a..0000000 Binary files a/website/samples/pdfzip/poc2/orwell_1984.pdf and /dev/null differ diff --git a/website/samples/pdfzip/poc2/polyglot.pdf b/website/samples/pdfzip/poc2/polyglot.pdf deleted file mode 100644 index 497a427..0000000 Binary files a/website/samples/pdfzip/poc2/polyglot.pdf and /dev/null differ diff --git a/website/samples/pdfzip/poc3/fasmw17304.zip b/website/samples/pdfzip/poc3/fasmw17304.zip deleted file mode 100644 index 8e96137..0000000 Binary files a/website/samples/pdfzip/poc3/fasmw17304.zip and /dev/null differ diff --git a/website/samples/pdfzip/poc3/polyglot.pdf b/website/samples/pdfzip/poc3/polyglot.pdf deleted file mode 100644 index a82491b..0000000 Binary files a/website/samples/pdfzip/poc3/polyglot.pdf and /dev/null differ diff --git a/website/samples/pdfzip/poc3/x86asm.pdf b/website/samples/pdfzip/poc3/x86asm.pdf deleted file mode 100644 index b7b9f4a..0000000 Binary files a/website/samples/pdfzip/poc3/x86asm.pdf and /dev/null differ diff --git a/website/samples/pdfzip/poc6/eicar.zip b/website/samples/pdfzip/poc6/eicar.zip deleted file mode 100644 index 02850ca..0000000 Binary files a/website/samples/pdfzip/poc6/eicar.zip and /dev/null differ diff --git a/website/samples/pdfzip/poc6/hexinator.pdf b/website/samples/pdfzip/poc6/hexinator.pdf deleted file mode 100644 index 0f87b0f..0000000 Binary files a/website/samples/pdfzip/poc6/hexinator.pdf and /dev/null differ diff --git a/website/samples/pdfzip/poc6/polyglot.pdf b/website/samples/pdfzip/poc6/polyglot.pdf deleted file mode 100644 index 7957207..0000000 Binary files a/website/samples/pdfzip/poc6/polyglot.pdf and /dev/null differ diff --git a/website/samples/szippdf/poc5/electronics.pdf b/website/samples/szippdf/poc5/electronics.pdf deleted file mode 100644 index 6582363..0000000 Binary files a/website/samples/szippdf/poc5/electronics.pdf and /dev/null differ diff --git a/website/samples/szippdf/poc5/hello_world.jar b/website/samples/szippdf/poc5/hello_world.jar deleted file mode 100644 index b875e1c..0000000 Binary files a/website/samples/szippdf/poc5/hello_world.jar and /dev/null differ diff --git a/website/samples/szippdf/poc5/polyglot.pdf b/website/samples/szippdf/poc5/polyglot.pdf deleted file mode 100644 index 7733caf..0000000 Binary files a/website/samples/szippdf/poc5/polyglot.pdf and /dev/null differ diff --git a/website/samples/zippdf/poc4/archive.zip b/website/samples/zippdf/poc4/archive.zip deleted file mode 100644 index c1eaa24..0000000 Binary files a/website/samples/zippdf/poc4/archive.zip and /dev/null differ diff --git a/website/samples/zippdf/poc4/doc.pdf b/website/samples/zippdf/poc4/doc.pdf deleted file mode 100644 index b31c420..0000000 Binary files a/website/samples/zippdf/poc4/doc.pdf and /dev/null differ diff --git a/website/samples/zippdf/poc4/polyglot.pdf b/website/samples/zippdf/poc4/polyglot.pdf deleted file mode 100644 index 0993dd4..0000000 Binary files a/website/samples/zippdf/poc4/polyglot.pdf and /dev/null differ diff --git a/website/start_server.sh b/website/start_server.sh deleted file mode 100755 index 0060e39..0000000 --- a/website/start_server.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -echo "http://127.0.0.1:8000" -python -m SimpleHTTPServer 8000 diff --git a/website/update.sh b/website/update.sh deleted file mode 100755 index ed7f515..0000000 --- a/website/update.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -rsync -av --progress ./ -e ssh dragon:/var/www/html/truepolyglot/