Merge remote-tracking branch 'upstream/master' into magic

This commit is contained in:
n1073645 2019-12-10 09:25:56 +00:00
commit e5fb5e0b31
8 changed files with 2141 additions and 1271 deletions

3163
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"name": "cyberchef", "name": "cyberchef",
"version": "9.11.7", "version": "9.11.12",
"description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.", "description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.",
"author": "n1474335 <n1474335@gmail.com>", "author": "n1474335 <n1474335@gmail.com>",
"homepage": "https://gchq.github.io/CyberChef", "homepage": "https://gchq.github.io/CyberChef",
@ -36,20 +36,20 @@
"node >= 10" "node >= 10"
], ],
"devDependencies": { "devDependencies": {
"@babel/core": "^7.7.2", "@babel/core": "^7.7.5",
"@babel/plugin-transform-runtime": "^7.6.2", "@babel/plugin-transform-runtime": "^7.7.6",
"@babel/preset-env": "^7.7.1", "@babel/preset-env": "^7.7.6",
"autoprefixer": "^9.7.2", "autoprefixer": "^9.7.3",
"babel-eslint": "^10.0.3", "babel-eslint": "^10.0.3",
"babel-loader": "^8.0.6", "babel-loader": "^8.0.6",
"babel-plugin-dynamic-import-node": "^2.3.0", "babel-plugin-dynamic-import-node": "^2.3.0",
"chromedriver": "^78.0.1", "chromedriver": "^78.0.1",
"colors": "^1.4.0", "colors": "^1.4.0",
"copy-webpack-plugin": "^5.0.5", "copy-webpack-plugin": "^5.0.5",
"css-loader": "^3.2.0", "css-loader": "^3.2.1",
"eslint": "^6.6.0", "eslint": "^6.7.2",
"exports-loader": "^0.7.0", "exports-loader": "^0.7.0",
"file-loader": "^4.2.0", "file-loader": "^5.0.2",
"grunt": "^1.0.4", "grunt": "^1.0.4",
"grunt-accessibility": "~6.0.0", "grunt-accessibility": "~6.0.0",
"grunt-chmod": "~1.1.1", "grunt-chmod": "~1.1.1",
@ -65,17 +65,17 @@
"html-webpack-plugin": "^3.2.0", "html-webpack-plugin": "^3.2.0",
"imports-loader": "^0.8.0", "imports-loader": "^0.8.0",
"mini-css-extract-plugin": "^0.8.0", "mini-css-extract-plugin": "^0.8.0",
"nightwatch": "^1.2.4", "nightwatch": "^1.3.2",
"node-sass": "^4.13.0", "node-sass": "^4.13.0",
"postcss-css-variables": "^0.13.0", "postcss-css-variables": "^0.14.0",
"postcss-import": "^12.0.1", "postcss-import": "^12.0.1",
"postcss-loader": "^3.0.0", "postcss-loader": "^3.0.0",
"prompt": "^1.0.0", "prompt": "^1.0.0",
"sass-loader": "^8.0.0", "sass-loader": "^8.0.0",
"sitemap": "^5.1.0", "sitemap": "^5.1.0",
"style-loader": "^1.0.0", "style-loader": "^1.0.1",
"svg-url-loader": "^3.0.2", "svg-url-loader": "^3.0.3",
"url-loader": "^2.2.0", "url-loader": "^3.0.0",
"webpack": "^4.41.2", "webpack": "^4.41.2",
"webpack-bundle-analyzer": "^3.6.0", "webpack-bundle-analyzer": "^3.6.0",
"webpack-dev-server": "^3.9.0", "webpack-dev-server": "^3.9.0",
@ -84,20 +84,20 @@
}, },
"dependencies": { "dependencies": {
"@babel/polyfill": "^7.7.0", "@babel/polyfill": "^7.7.0",
"@babel/runtime": "^7.7.2", "@babel/runtime": "^7.7.6",
"arrive": "^2.4.1", "arrive": "^2.4.1",
"avsc": "^5.4.16", "avsc": "^5.4.16",
"babel-plugin-transform-builtin-extend": "1.1.2", "babel-plugin-transform-builtin-extend": "1.1.2",
"bcryptjs": "^2.4.3", "bcryptjs": "^2.4.3",
"bignumber.js": "^9.0.0", "bignumber.js": "^9.0.0",
"blakejs": "^1.1.0", "blakejs": "^1.1.0",
"bootstrap": "4.3.1", "bootstrap": "4.4.1",
"bootstrap-colorpicker": "^3.1.2", "bootstrap-colorpicker": "^3.2.0",
"bootstrap-material-design": "^4.1.2", "bootstrap-material-design": "^4.1.2",
"bson": "^4.0.2", "bson": "^4.0.2",
"chi-squared": "^1.1.0", "chi-squared": "^1.1.0",
"codepage": "^1.14.0", "codepage": "^1.14.0",
"core-js": "^3.4.1", "core-js": "^3.4.8",
"crypto-api": "^0.8.5", "crypto-api": "^0.8.5",
"crypto-js": "^3.1.9-1", "crypto-js": "^3.1.9-1",
"ctph.js": "0.0.5", "ctph.js": "0.0.5",
@ -113,7 +113,7 @@
"file-saver": "^2.0.2", "file-saver": "^2.0.2",
"geodesy": "^1.1.3", "geodesy": "^1.1.3",
"highlight.js": "^9.16.2", "highlight.js": "^9.16.2",
"jimp": "^0.8.5", "jimp": "^0.9.3",
"jquery": "3.4.1", "jquery": "3.4.1",
"js-crc": "^0.2.0", "js-crc": "^0.2.0",
"js-sha3": "^0.8.0", "js-sha3": "^0.8.0",

View file

@ -20,7 +20,7 @@ export const ALPHABET_OPTIONS = [
}, },
{ {
name: "IPv6", name: "IPv6",
value: "0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|~}", value: "0-9A-Za-z!#$%&()*+\\-;<=>?@^_`{|}~",
} }
]; ];

View file

@ -1282,17 +1282,30 @@ export const FILE_SIGNATURES = {
extension: "dylib", extension: "dylib",
mime: "application/octet-stream", mime: "application/octet-stream",
description: "", description: "",
signature: { signature: [
0: 0xca, {
1: 0xfe, 0: 0xca,
2: 0xba, 1: 0xfe,
3: 0xbe, 2: 0xba,
4: 0x00, 3: 0xbe,
5: 0x00, 4: 0x00,
6: 0x00, 5: 0x00,
7: [0x01, 0x02, 0x03] 6: 0x00,
}, 7: [0x01, 0x02, 0x03]
extractor: null },
{
0: 0xce,
1: 0xfa,
2: 0xed,
3: 0xfe,
4: 0x07,
5: 0x00,
6: 0x00,
7: 0x00,
8: [0x01, 0x02, 0x03]
}
],
extractor: extractMACHO
}, },
{ {
name: "MacOS Mach-O 64-bit object", name: "MacOS Mach-O 64-bit object",
@ -1305,7 +1318,7 @@ export const FILE_SIGNATURES = {
2: 0xed, 2: 0xed,
3: 0xfe 3: 0xfe
}, },
extractor: null extractor: extractMACHO
}, },
{ {
name: "Adobe Flash", name: "Adobe Flash",
@ -1404,7 +1417,7 @@ export const FILE_SIGNATURES = {
260: 0x61, 260: 0x61,
261: 0x72 261: 0x72
}, },
extractor: null extractor: extractTAR
}, },
{ {
name: "Roshal Archive", name: "Roshal Archive",
@ -2720,6 +2733,154 @@ export function extractZIP(bytes, offset) {
} }
/**
* MACHO extractor
*
* @param {Uint8Array} bytes
* @param {number} offset
* @returns {Uint8Array}
*/
export function extractMACHO(bytes, offset) {
// Magic bytes.
const MHCIGAM64 = "207250237254";
const MHMAGIC64 = "254237250207";
const MHCIGAM = "206250237254";
/**
* Checks to see if the file is 64-bit.
*
* @param {string} magic
* @returns {bool}
*/
function isMagic64(magic) {
return magic === MHCIGAM64 || magic === MHMAGIC64;
}
/**
* Checks the endianness of the file.
*
* @param {string} magic
* @returns {bool}
*/
function shouldSwapBytes(magic) {
return magic === MHCIGAM || magic === MHCIGAM64;
}
/**
* Jumps through segment information and calculates the sum of the segement sizes.
*
* @param {Stream} stream
* @param {number} offset
* @param {string} isSwap
* @param {number} ncmds
* @returns {number}
*/
function dumpSegmentCommands(stream, offset, isSwap, ncmds) {
let total = 0;
const LCSEGEMENT64 = 0x19;
const LCSEGEMENT = 0x1;
for (let i = 0; i < ncmds; i++) {
// Move to start of segment.
stream.moveTo(offset);
const cmd = stream.readInt(4, isSwap);
if (cmd === LCSEGEMENT64) {
// Move to size of segment field.
stream.moveTo(offset + 48);
// Extract size of segement.
total += stream.readInt(8, isSwap);
stream.moveTo(offset + 4);
// Move to offset of next segment.
offset += stream.readInt(4, isSwap);
} else if (cmd === LCSEGEMENT) {
stream.moveTo(offset + 36);
// Extract size of segement.
total += stream.readInt(4, isSwap);
stream.moveTo(offset + 4);
offset += stream.readInt(4, isSwap);
}
}
return total;
}
/**
* Reads the number of command segments.
*
* @param {Stream} stream
* @param {bool} is64
* @param {string} isSwap
* @returns {number}
*/
function dumpMachHeader(stream, is64, isSwap) {
let loadCommandsOffset = 28;
if (is64)
loadCommandsOffset += 4;
// Move to number of commands field.
stream.moveTo(16);
const ncmds = stream.readInt(4, isSwap);
return dumpSegmentCommands(stream, loadCommandsOffset, isSwap, ncmds);
}
const stream = new Stream(bytes.slice(offset));
const magic = stream.getBytes(4).join("");
// Move to the end of the final segment.
stream.moveTo(dumpMachHeader(stream, isMagic64(magic), shouldSwapBytes(magic) ? "le" : "be"));
return stream.carve();
}
/**
* TAR extractor.
*
* @param {Uint8Array} bytes
* @param {number} offset
* @returns {Uint8Array}
*/
export function extractTAR(bytes, offset) {
const stream = new Stream(bytes.slice(offset));
while (stream.hasMore()) {
// Move to ustar identifier.
stream.moveForwardsBy(0x101);
if (stream.getBytes(5).join("") !== [0x75, 0x73, 0x74, 0x61, 0x72].join("")) {
// Reverse back to the end of the last section.
stream.moveBackwardsBy(0x106);
break;
}
// Move back to file size field.
stream.moveBackwardsBy(0x8a);
let fsize = 0;
// Read file size field.
stream.getBytes(11).forEach((element, index) => {
fsize += (element - 48).toString();
});
// Round number up from octet to nearest 512.
fsize = (Math.ceil(parseInt(fsize, 8) / 512) * 512);
// Move forwards to the end of that file.
stream.moveForwardsBy(fsize + 0x179);
}
stream.consumeWhile(0x00);
return stream.carve();
}
/** /**
* PNG extractor. * PNG extractor.
* *

View file

@ -63,9 +63,9 @@ class DNSOverHTTPS extends Operation {
value: false value: false
}, },
{ {
name: "Validate DNSSEC", name: "Disable DNSSEC validation",
type: "boolean", type: "boolean",
value: true value: false
} }
]; ];
} }

View file

@ -149,7 +149,8 @@ const MORSE_TABLE = {
"=": "<dash><dot><dot><dot><dash>", "=": "<dash><dot><dot><dot><dash>",
"&": "<dot><dash><dot><dot><dot>", "&": "<dot><dash><dot><dot><dot>",
"_": "<dot><dot><dash><dash><dot><dash>", "_": "<dot><dot><dash><dash><dot><dash>",
"$": "<dot><dot><dot><dash><dot><dot><dash>" "$": "<dot><dot><dot><dash><dot><dot><dash>",
" ": "<dot><dot><dot><dot><dot><dot><dot>"
}; };
export default FromMorseCode; export default FromMorseCode;

View file

@ -148,7 +148,8 @@ const MORSE_TABLE = {
"=": "<dash><dot><dot><dot><dash>", "=": "<dash><dot><dot><dot><dash>",
"&": "<dot><dash><dot><dot><dot>", "&": "<dot><dash><dot><dot><dot>",
"_": "<dot><dot><dash><dash><dot><dash>", "_": "<dot><dot><dash><dash><dot><dash>",
"$": "<dot><dot><dot><dash><dot><dot><dash>" "$": "<dot><dot><dot><dash><dot><dot><dash>",
" ": "<dot><dot><dot><dot><dot><dot><dot>"
}; };
export default ToMorseCode; export default ToMorseCode;

View file

@ -29,7 +29,7 @@
<meta name="description" content="The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis" /> <meta name="description" content="The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis" />
<meta name="keywords" content="base64, hex, decode, encode, encrypt, decrypt, compress, decompress, regex, regular expressions, hash, crypt, hexadecimal, user agent, url, certificate, x.509, parser, JSON, gzip, md5, sha1, aes, des, blowfish, xor" /> <meta name="keywords" content="base64, hex, decode, encode, encrypt, decrypt, compress, decompress, regex, regular expressions, hash, crypt, hexadecimal, user agent, url, certificate, x.509, parser, JSON, gzip, md5, sha1, aes, des, blowfish, xor" />
<link rel="icon" type="image/ico" href="<%- require('../static/images/favicon.ico') %>" /> <link rel="icon" type="image/ico" href="<%- require('../static/images/favicon.ico').default %>" />
<script type="application/javascript"> <script type="application/javascript">
"use strict"; "use strict";
@ -197,7 +197,7 @@
</button> </button>
<button type="button" class="mx-2 btn btn-lg btn-success btn-raised btn-block" id="bake"> <button type="button" class="mx-2 btn btn-lg btn-success btn-raised btn-block" id="bake">
<img aria-hidden="true" src="<%- require('../static/images/cook_male-32x32.png') %>" alt="Chef Icon"/> <img aria-hidden="true" src="<%- require('../static/images/cook_male-32x32.png').default %>" alt="Chef Icon"/>
<span>Bake!</span> <span>Bake!</span>
</button> </button>
@ -271,7 +271,7 @@
<div class="file-overlay" id="file-overlay"></div> <div class="file-overlay" id="file-overlay"></div>
<div style="position: relative; height: 100%;"> <div style="position: relative; height: 100%;">
<div class="io-card card"> <div class="io-card card">
<img aria-hidden="true" src="<%- require('../static/images/file-128x128.png') %>" alt="File icon" id="input-file-thumbnail"/> <img aria-hidden="true" src="<%- require('../static/images/file-128x128.png').default %>" alt="File icon" id="input-file-thumbnail"/>
<div class="card-body"> <div class="card-body">
<button type="button" class="close" id="input-file-close">&times;</button> <button type="button" class="close" id="input-file-close">&times;</button>
Name: <span id="input-file-name"></span><br> Name: <span id="input-file-name"></span><br>
@ -346,12 +346,12 @@
<div id="output-highlighter" class="no-select"></div> <div id="output-highlighter" class="no-select"></div>
<div id="output-html"></div> <div id="output-html"></div>
<textarea id="output-text" readonly="readonly" spellcheck="false"></textarea> <textarea id="output-text" readonly="readonly" spellcheck="false"></textarea>
<img id="show-file-overlay" aria-hidden="true" src="<%- require('../static/images/file-32x32.png') %>" alt="Show file overlay" title="Show file overlay"/> <img id="show-file-overlay" aria-hidden="true" src="<%- require('../static/images/file-32x32.png').default %>" alt="Show file overlay" title="Show file overlay"/>
<div id="output-file"> <div id="output-file">
<div class="file-overlay"></div> <div class="file-overlay"></div>
<div style="position: relative; height: 100%;"> <div style="position: relative; height: 100%;">
<div class="io-card card"> <div class="io-card card">
<img aria-hidden="true" src="<%- require('../static/images/file-128x128.png') %>" alt="File icon"/> <img aria-hidden="true" src="<%- require('../static/images/file-128x128.png').default %>" alt="File icon"/>
<div class="card-body"> <div class="card-body">
Size: <span id="output-file-size"></span><br> Size: <span id="output-file-size"></span><br>
<button id="output-file-download" type="button" class="btn btn-primary btn-outline">Download</button> <button id="output-file-download" type="button" class="btn btn-primary btn-outline">Download</button>
@ -622,7 +622,7 @@
<h5 class="modal-title">CyberChef - The Cyber Swiss Army Knife</h5> <h5 class="modal-title">CyberChef - The Cyber Swiss Army Knife</h5>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<img aria-hidden="true" class="about-img-left" src="<%- require('../static/images/cyberchef-128x128.png') %>" alt="CyberChef Logo"/> <img aria-hidden="true" class="about-img-left" src="<%- require('../static/images/cyberchef-128x128.png').default %>" alt="CyberChef Logo"/>
<p class="subtext"> <p class="subtext">
Version <%= htmlWebpackPlugin.options.version %><br> Version <%= htmlWebpackPlugin.options.version %><br>
Compile time: <%= htmlWebpackPlugin.options.compileTime %> Compile time: <%= htmlWebpackPlugin.options.compileTime %>
@ -745,7 +745,7 @@
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div> </div>
<a href="https://github.com/gchq/CyberChef"> <a href="https://github.com/gchq/CyberChef">
<img aria-hidden="true" style="position: absolute; top: 0; right: 0; border: 0;" src="<%- require('../static/images/fork_me.png') %>" alt="Fork me on GitHub"> <img aria-hidden="true" style="position: absolute; top: 0; right: 0; border: 0;" src="<%- require('../static/images/fork_me.png').default %>" alt="Fork me on GitHub">
</a> </a>
</div> </div>
</div> </div>