Consumo de Internet no Windows 10

Assim que atualizei os computadores da rede para o Windows 10 comecei a enfrentar problemas com o consumo de banda. Durante longos períodos o consumo era absurdo. Então comecei a investigar e descobri que eu tinha mais que um problema.

O ambiente analisado era o seguinte:

  • Cerca de 30 computadores rodando Windows 10;
  • 2 links de Internet;
  • Windows Server 2012 com Windows Server Update Service (WSUS);
  • pfSense.

Notei que a maioria das máquinas conectavam ao endereço a seguir e efetuavam o download de quantidades absurdas de dados.

http://*.tlu.dl.delivery.mp.microsoft.com/

Pesquisando a respeito cheguei a esse artigo e compreendi que:

  • No Windows 10 1511, 50% dos computadores usaram o Delivery Optimization e 50% usaram o antigo BITS;
  • No Windows 10 1607, 100% dos computadores usaram o Delivery Optimization.

O pfSense/Squid parecem não suportar o HTTP Range Request, conforme recomendação da Microsoft, por isso tentei fazer cache do Windows Updade, configurando o Squid assim:

acl windowsupdate dstdomain windowsupdate.microsoft.com
acl windowsupdate dstdomain .update.microsoft.com
acl windowsupdate dstdomain download.windowsupdate.com
acl windowsupdate dstdomain redir.metaservices.microsoft.com
acl windowsupdate dstdomain images.metaservices.microsoft.com
acl windowsupdate dstdomain c.microsoft.com
acl windowsupdate dstdomain www.download.windowsupdate.com
acl windowsupdate dstdomain wustat.windows.com
acl windowsupdate dstdomain crl.microsoft.com
acl windowsupdate dstdomain sls.microsoft.com
acl windowsupdate dstdomain productactivation.one.microsoft.com
acl windowsupdate dstdomain ntservicepack.microsoft.com

range_offset_limit 6 GB windowsupdate
maximum_object_size 6 GB
quick_abort_min -1

refresh_pattern -i microsoft.com/.*\.(cab|exe|ms[i|u|f]|[ap]sf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims

refresh_pattern -i windowsupdate.com/.*\.(cab|exe|ms[i|u|f]|[ap]sf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims

refresh_pattern -i windows.com/.*\.(cab|exe|ms[i|u|f]|[ap]sf|wm[v|a]|dat|zip) 4320 80% 43200 reload-into-ims

Marquei a opção Cache Dynamic Content em Local Cache no pfSense.

Mesmo usando o WSUS os computadores estavam conectando à Internet para baixar atualizações, porque estas máquinas estavam configuradas para usar o Microsoft Update ao invés do Windows Update. Portanto, o que esses computadores estavam fazendo era baixar atualizações do Windows Store App, que não é suportado pelo WSUS. Tive certeza disso quando monitorei o que estava sendo baixado. Por exemplo, uma atualização do Solitarie Collection (Paciência), tinha 227MB.

Assim, o que realmente resolveu o problema foi desativar a atualização automática dos apps do Windows Store. Fiz isso por GPO:

Policies, Administrative Templates, Windows Components, Store, Turn off Automatic Download and Install of Updates

Depois da GPO aplicada, ao acessar a loja vemos que as atualizações estão desativadas.

Pode ser necessário executar o comando wsreset.exe para que as atualizações em andamento sejam finalizadas.

Portanto, desativar as atualizações automáticas dos apps do Windows Store evita que os computadores da rede se conectem à Internet e efetuem grandes downloads.

Windows Store

Wargame – Leviathan – Level 6

De posse da senha do usuário leviathan6 fazemos o login no servidor leviathan.labs.overthewire.org e procuramos por arquivos:

Vamos testar o executável leviathan6:

Informando um código de 4 dígitos:

Depurando:

O que será que a função atoi faz? Pesquisando: http://linux.die.net/man/3/atoi

atoi converte uma string em um inteiro.

Como não consegui resolver sozinho o problema, pesquisei e encontrei duas formas de passar esse nível: força bruta ou usar um depurador. Como a ideia é aprender, vamos pelo caminho mais complicado.

Para isso vamos usar o depurador gdb:

Iremos transformar o código em assembler:

O que nos importa é a seguinte linha:

Nela o programa faz uma comparação dos registradores esp e eax. Vamos colocar um breakpoint no programa bem na hora da comparação:

E então executamos o programa passando como código 0000:

Agora vamos ver o que temos no registrado esp:

Pronto, o código que é comparado ao código informado será exibido. Depois é só executar o programa com o código correto.

Referências

http://cplusperks.com/leviathan/#level6

http://www.unknownroad.com/rtfm/gdbtut/gdbtoc.html

Wargame – Leviathan – Level 5

De posse da senha do usuário leviathan5 fazemos o login no servidor leviathan.labs.overthewire.org e procuramos por arquivos:

Vamos ver o que o arquivo leviathan5 faz:

Parece que ele procura por um arquivo em /tmp/file.log. Neste caso pensei em criar um link simbólico para o arquivo da senha, assim:

Depois executamos o programa de novo:

Pronto, temos a senha do leviathan6!

Wargame – Leviathan – Level 4

De posse da senha do usuário leviathan4 fazemos o login no servidor leviathan.labs.overthewire.org e procuramos por arquivos:

Chama atenção o diretório .trash. Vamos ver o que tem nele:

Encontramos um arquivo chamado bin. Vamos executá-lo:

A saída parece ser um código binário, então procurei um conversor de binário para texto online e pronto, temos a senha!

Wargame – Leviathan – Level 3

De posse da senha do usuário leviathan3 fazemos o login no servidor leviathan.labs.overthewire.org e procuramos por arquivos:

Encontramos o arquivo level3. Vamos executá-lo:

O programa espera que seja informada uma senha. Informei abc, mas parece que era a senha errada.

Vamos depurar:

Primeiro é feita uma comparação com o comando strcmp, mas parece que ela não serve pra nada, porque mais adiante é feita outra comparação, da senha que digitamos com a string snlprintf. snlprintf é um comando do Linux, mas neste caso está aqui só pra confundir mesmo. Vamos testar:

Conseguimos o shell, basta pegar a senha para o nível 4.

Wargame – Leviathan – Level 2

De posse da senha do usuário leviathan2 fazemos o login no servidor leviathan.labs.overthewire.org e procuramos por arquivos:

Chama a atenção o arquivo printfile. Ao executá-lo ele mostra a saída do arquivo passado como parâmetro.

Vamos tentar:

Como eu não fazia a menor ideia de como continuar, fui pesquisar.

Encontrei uma pessoa que já completou o desafio usando o comando ltrace.

ltrace é uma ferramenta de depuração (debug) usada no Linux.

Primeiro vamos criar um arquivo temporário:

O programa printfile usa o comando cat para carregar o arquivo, então vamos tentar carregar o arquivo com a senha:

A saída é um pouco diferente que o comando anterior. Note a diferença na linha que checa as permissões do arquivo:

Segundo a documentação do access (http://linux.about.com/library/cmd/blcmdl2_access.htm)

A verificação é feita com uid e gid reais do processo, em vez de com os uid e gid efetivos como é feito geralmente.

A ideia é usar um arquivo com espaço no nome para que o comando cat seja executado com outros privilégios:

Podemos ver que foi executado o comando /bin/cat: two, ou seja, o sistema tentou abrir o arquivo. Por isso vamos criar um link simbólico para o arquivo:

E depois:

Pronto, temos a senha para o próximo nível!

Referências:

http://blog.moz-code.org/2012/07/leviathan-level-2-walkthrough.html

 

 

 

Wargame – Leviathan – Level 1

Depois de conseguir a senha do usuário leviathan1, efetuamos o login no servidor leviathan.labs.overthewire.org

Procurando arquivos:

O arquivo check é um executável. Vamos executá-lo:

É provável que a senha esteja dentro do executável. Para procurar a senha podemos usar algumas ferramentas. A primeira é o xxd. O comando xxd irá criar um hex dump do executável:

Procurando nas strings encontramos algumas palavras: sex, love, god. O próximo passo é testar essas strings.

Outra forma é usar o comando ltrace. O ltrace é uma ferramenta para debug. Vamos usá-la:

Na saída do debug podemos ver que o check compara a string informada com uma outra string. Assim temos a senha. Ao executar o check e informar a senha correta obtemos a shell do usuário leviathan2. Agora basta ir ao diretório /etc/leviathan_pass e recuperar a senha.

 

 

 

 

 

 

Wargame – Leviathan – Level 0

Resolução do desafio Leviathan

Acessar leviathan.labs.overthewire.org por ssh com o usuário leviathan0 e senha leviathan0.

Depois que o login foi efetuado procurar por arquivos:

A listagem mostrou um diretório oculto chamado .backup. Ao acessá-lo encontramos o arquivo bookmarks.htm

Vamos analisar o arquivo procurando a senha:

Desta forma encontramos a senha do usuário leviathan1.

 

 

 

 

Bandit – Level 23

Estamos agora no nível 23 do desafio Bandit. Desta vez um programa está rodando automaticamente em intervalos regulares no cron. Analise o arquivo /etc/cron.d/ para ver qual comando está sendo executado.

Este nível vai requerer que você crie seu primeiro shell-script. Este é um grande passo. Tenha em mente que seu shell-script será removido assim que for executado, então mantenha uma cópia em algum lugar.

Os seguintes comandos podem ser úteis: cron, crontab, crontab(5) (use “man 5 crontab” para acessar esse)

Começaremos analisando as configurações do cron:

Vemos o seguinte:

Todo o minuto o comando /usr/bin/cronjob_bandit24.sh é executado. Vamos ver o que tem nesse arquivo:

Analisando o script podemos ver o seguinte:

  • Ele será executado com as permissões do usuário bandit24;
  • O diretório de execução do script é /var/spool/bandit24;
  • Não importa o nome do script criado.

Então sabemos que podemos executar algum script como o usuário bandit24. Mas onde está a senha?

No nível anterior a senha estava em /etc/bandit_pass/bandit23. Não é diferente desta vez. Assim, o que precisamos fazer é criar um script que leia o conteúdo do arquivo que só o usuário bandit24 pode ler em algum lugar onde o usuário bandit23 tenha acesso.

Sabemos que no diretório /tmp/ podemos salvar arquivos, então é lá que vamos salvar nosso script temporariamente.

Vamos criar um arquivo para receber a senha:

Vamos dar permissão ao arquivo para que o usuário bandit24 possa alterar o arquivo. Vamos dar todas as permissões possíveis:

Vamos criar o script em /tmp/shell-script-15092014.sh:

Agora vamos jogar no diretório que o script do cron procura:

Devemos esperar um minuto e ver se a senha foi salva no arquivo:

Esperei e nada… até que lembrei que é preciso dar permissão de execução para o arquivo:

E então sim, esperar um minuto e ver a senha:

Com a senha do usuário bandit24 acesse o servidor e leia o conteúdo do arquivo README.txt.

Infelizmente este é o último nível do desafio Bandit. Acesse o site original: http://overthewire.org/wargames/bandit/bandit0.html

 

 

Bandit – Level 22

Estamos próximos do final do desafio Bandit. Agora no nível 22 a misão é parecida com a do desafio anterior. Existe um programa que é executado automaticamente em intervalos regulares pelo cron. Verifique no diretório /etc/cron.d a configuração e veja que comando é executado.

Nota: Entender os scripts escritos por outras pessoas é uma habilidade muito útil. O script deste nível foi intencionalmente feito para ser fácil de entender. Se você tiver problemas para entender o que ele faz, tente executar e ver que informação é exibida.

Os comandos que podem ser úteis são: cron, crontab, crontab(5) (use “man 5 crontab” para acessar).

Começamos indo para o diretório /etc/cron.d:

Encontramos um arquivo chamado cronjob_bandit23. Vamos ver o que este arquivo contém:

Ele vai executar o arquivo /usr/bin/cronjob_bandit23.sh. Vamos ver o que tem nesse artigo:

É mostrado o seguinte:

Vamos entender o script: a variável $myname recebe o valor de whoami. Como somos o usuário bandit22, este é o valor da variável.

A variável $mytarget vai receber o resultado do seguinte comando:

Devemos trocar $myname por bandit22:

A saída vai ser 8169b67bd894ddbb4412f91573b38db3

Então digitamos:

A saída é a senha do usuário bandit22, mas queremos a senha do usuário bandit23. Então mudamos o usuário para bandit23

E pronto! Desafio concluído!