Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitHubGitHub/google/hashr
Forensia de DiscoAnálise de HashAnálise ForenseForensia DigitalResposta a Incidentes
GitHubgoogle/hashr

hashr

Gera conjuntos de hashes forenses de arquivos a partir de imagens de disco, pacotes e arquivos em GCP, AWS e fontes locais, com deduplicação e exportação para PostgreSQL/Spanner para fluxos de trabalho de DFIR.

Ver Repositório
130910há 6 mesesRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

HashR: Gere o seu próprio conjunto de hashes



Índice

  • HashR: Gere o seu próprio conjunto de hashes
    • Índice
    • Sobre
    • Requisitos
    • Compilando o binário do HashR e executando testes
    • Configurando o HashR
      • HashR usando docker
      • Configuração do SO & ferramentas de terceiros necessárias
      • Configurando armazenamento para tarefas de processamento
        • Configurando armazenamento PostgreSQL
        • Configurando Cloud Spanner
      • Configurando importadores
        • GCP (Google Cloud Platform)
        • AWS (Amazon Web Services)
        • GCR (Google Container Registry)
        • Windows
        • WSUS
        • TarGz
        • Deb
        • RPM
        • Zip (e outros formatos semelhantes a zip)
        • ISO 9660
      • Configurando exportadores
        • Configurando o exportador Postgres
        • Configurando o exportador GCP
      • Flags adicionais

Sobre

O HashR permite que você crie seus próprios conjuntos de hashes com base nas suas fontes de dados. É uma ferramenta que extrai arquivos e hashes de fontes de entrada (por exemplo, imagem de disco bruta, imagem de disco do GCE, arquivo ISO, pacote de atualização do Windows, arquivo .tar.gz, etc.).

O HashR consiste nos seguintes componentes:

  1. Importadores, responsáveis por copiar a fonte para o armazenamento local e realizar qualquer pré-processamento necessário.
  2. Núcleo, que cuida da extração do conteúdo da fonte usando image_export.py (Plaso), cache e deduplicação em nível de repositório e prepara os arquivos extraídos para os exportadores.
  3. Exportadores, responsáveis por exportar arquivos, metadados e hashes para os destinos de dados fornecidos.

Importadores atualmente implementados:

  1. GCP, que extrai arquivos das imagens de disco base do GCP.
  2. Windows, que extrai arquivos de mídia de instalação do Windows em formato ISO-13346.
  3. WSUS, que extrai arquivos de pacotes do Windows Update.
  4. GCR, que extrai arquivos de imagens de contêiner armazenadas no Google Container Registry.
  5. TarGz, que extrai arquivos de arquivos .tar.gz.
  6. Deb, que extrai arquivos de pacotes de software Debian.
  7. RPM, que extrai arquivos de pacotes de software RPM.
  8. Zip, que extrai arquivos de arquivos .zip (e formatos semelhantes a zip).

Depois que os arquivos são extraídos e o hash é calculado, os resultados são passados aos exportadores, atualmente implementados:

  1. PostgreSQL, que faz o upload dos dados para uma instância PostgreSQL.
  2. Cloud Spanner, que faz o upload dos dados para uma instância Spanner do GCP.

Você pode escolher quais importadores deseja executar; cada um tem requisitos diferentes. Mais informações sobre isso podem ser encontradas nas seções abaixo.

Requisitos

O HashR requer Linux para ser executado, podendo ser uma máquina física, virtual ou na nuvem. Abaixo estão os requisitos de hardware ideais:

  1. 8-16 núcleos
  2. 128GB de memória
  3. 2TB de armazenamento local rápido (SSDs preferidos)

O HashR provavelmente pode rodar em máquinas com especificações inferiores, porém isso não foi testado de forma completa.

Compilando o binário do HashR e executando testes

Para compilar um binário hashr, execute o seguinte comando:``` shell env GOOS=linux GOARCH=amd64 go build hashr.go

root@kitploit:~
Para executar testes para o pacote hashR principal, você precisa executar o emulador do Spanner:``` shell
gcloud emulators spanner start

Em seguida, para executar todos os testes, execute o seguinte comando:``` shell go test -timeout 2m ./...

root@kitploit:~
## Configurando o HashR

### HashR na infraestrutura OSDFIR

Você pode implantar o HashR como parte do [projeto OSDFIR Infrastructure](https://github.com/google/osdfir-infrastructure/tree/main/charts/hashr)
Essa implantação executará o HashR como cronjobs do Kubernetes e permite uma fácil
integração com o Timesketch.

### HashR usando docker

Para executar o HashR em um contêiner docker, visite o [guia específico do docker](https://github.com/google/hashr/blob/main/docker/README.md)

### Configuração do SO e ferramentas de terceiros necessárias

O HashR cuida do trabalho pesado (análise de imagens de disco, volumes, sistemas de arquivos) usando o Plaso. Você precisa baixar o contêiner docker do Plaso usando o seguinte comando:``` shell
docker pull log2timeline/plaso

Também precisamos que o 7z, usado pelo importador WSUS para extração recursiva de pacotes do Windows Update, esteja instalado na máquina que executa o HashR:``` shell sudo apt install p7zip-full

root@kitploit:~
Você precisa permitir que o usuário, sob o qual o HashR será executado, execute determinados comandos via sudo. Supondo que seu usuário seja `hashr`, crie um arquivo `/etc/sudoers.d/hashr` e coloque:``` shell
hashr ALL = (root) NOPASSWD: /bin/mount,/bin/umount,/sbin/losetup,/bin/rm

O usuário sob o qual o HashR será executado também precisará conseguir executar o docker. Supondo que seu usuário seja hashr, adicione-o ao grupo docker assim:``` shell sudo usermod -aG docker hashr

root@kitploit:~
### Configurando armazenamento para tarefas de processamento

O HashR precisa armazenar informações sobre fontes processadas. Ele também armazena telemetria adicional sobre tarefas de processamento: tempos de processamento, número de arquivos extraídos, etc. Você pode escolher entre usar:

1. PostgreSQL
1. Cloud (GCP) Spanner

#### Configurando armazenamento PostgreSQL

Existem muitas maneiras de executar e manter sua instância PostgreSQL; uma das mais simples seria executá-la em um contêiner Docker. Siga as etapas abaixo para configurar um contêiner Docker PostgreSQL.

Etapa 1: Baixe a imagem Docker do PostgreSQL.``` shell
docker pull postgres

Passo 2: Inicialize e execute o contêiner PostgreSQL em segundo plano. Certifique-se de ajustar a senha.``` shell docker run -itd -e POSTGRES_DB=hashr -e POSTGRES_USER=hashr -e POSTGRES_PASSWORD=hashr -p 5432:5432 -v /data:/var/lib/postgresql/data --name hashr_postgresql postgres

root@kitploit:~
Passo 3: Crie uma tabela que será usada para armazenar tarefas de processamento.``` shell
cat scripts/CreateJobsTable.sql | docker exec -i hashr_postgresql psql -U hashr -d hashr

Para usar o PostgreSQL para armazenar informações sobre tarefas de processamento, você precisa especificar as seguintes flags: -storage postgres -postgres_host <host> -postgres_port <port> -postgres_user <user> -postgres_password <pass> -postgres_db <db_name>

Configurando o Cloud Spanner

Você pode optar por armazenar os dados sobre os trabalhos de processamento no Cloud Spanner. Você precisará de um projeto do Google Cloud para isso. A principal vantagem dessa configuração é que você pode criar facilmente painéis (dashboards) usando o Google Data Studio e conectar-se diretamente à instância do Cloud Spanner, o que permite monitoramento e depuração sem executar consultas na sua instância do PostgreSQL.

Supondo que a ferramenta gcloud esteja configurada com o seu projeto GCP hashr de destino, você precisará seguir as etapas abaixo para habilitar o Cloud Spanner.

Crie a conta de serviço do HashR:``` shell gcloud iam service-accounts create hashr --description="HashR SA key." --display-name="hashr"

root@kitploit:~
Crie uma chave de conta de serviço e armazene-a no seu diretório pessoal. Defina *<project_name>* como o nome do seu projeto.``` shell
gcloud iam service-accounts keys create ~/hashr-sa-private-key.json --iam-account=hashr-sa@<project_name>.iam.gserviceaccount.com

Aponte a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS para a chave da sua conta de serviço:``` shell export GOOGLE_APPLICATION_CREDENTIALS=/home/hashr/hashr-sa-private-key.json

root@kitploit:~
Crie uma instância do Spanner, ajuste a configuração e o valor de processing-units, se necessário:``` shell
gcloud spanner instances create hashr --config=regional-us-central1 --description="hashr" --processing-units=100

Criar banco de dados Spanner:``` shell gcloud spanner databases create hashr --instance=hashr

root@kitploit:~
Permita que a conta de serviço use o banco de dados Spanner, defina *<project_name>* para o nome do seu projeto:``` shell
gcloud spanner databases add-iam-policy-binding hashr --instance hashr --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="roles/spanner.databaseUser"

Atualize o esquema do banco de dados Spanner:``` shell gcloud spanner databases ddl update hashr --instance=hashr --ddl-file=scripts/CreateJobsTable.ddl

root@kitploit:~
Para usar o Cloud Spanner para armazenar informações sobre tarefas de processamento, você precisa especificar as seguintes flags: `-jobStorage cloudspanner -spannerDBPath <spanner_db_path>`

### Configurando importadores

Para especificar qual importador você deseja executar, use a flag `-importers`. Valores possíveis: `GCP,targz,windows,wsus,deb,rpm,zip,gcr,iso9660`

#### GCP (Google Cloud Platform)```shell
-importers GCP

Este importador pode extrair arquivos de imagens de disco do GCP. Isso é feito em poucos passos:

  1. Verificar se há novas imagens no projeto de destino (por exemplo, ubuntu-os-cloud)
  2. Copiar a imagem nova/não processada para o projeto GCP do hashR
  3. Executar o Cloud Build, que cria uma VM temporária, executa dd na imagem copiada e salva a saída em um arquivo .tar.gz.
  4. Exportar raw_disk.tar.gz para o bucket do GCS no projeto GCP do hashR
  5. Copiar raw_disk.tar.gz do GCS para o armazenamento local do hashR
  6. Extrair raw_disk.tar.gz e passar a imagem de disco para o Plaso

Uma lista de projetos GCP que contêm imagens públicas do GCP pode ser encontrada aqui. Para usar este importador, você precisa ter um projeto GCP e seguir estes passos:

Etapa 1: Crie a conta de serviço do HashR. Se isso foi feito durante a configuração do Cloud Spanner, vá para a etapa 4.``` shell gcloud iam service-accounts create hashr-sa --description="HashR SA key." --display-name="hashr"

root@kitploit:~
Passo 2: Crie a chave da conta de serviço e armazene no seu diretório inicial. Certifique-se de  definir *<project_name>* para o nome do seu projeto:``` shell
gcloud iam service-accounts keys create ~/hashr-sa-private-key.json --iam-account=hashr-sa@<project_name>.iam.gserviceaccount.com

Passo 3: Aponte a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS para a chave da sua conta de serviço:``` shell export GOOGLE_APPLICATION_CREDENTIALS=~/hashr-sa-private-key.json

root@kitploit:~
Passo 4: Crie o bucket GCS que será usado para armazenar imagens de disco no formato .tar.gz, defina *<project_name>* para o nome do seu projeto e *<gcs_bucket_name>* para o nome do novo bucket GCS do seu projeto:``` shell
gcloud storage buckets create gs://<gcs_bucket_name> --project=<project_name>

Step 5: Torne a conta de serviço administradora deste bucket:``` shell gcloud storage buckets add-iam-policy-binding gs://<gcs_bucket_name> --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="roles/storage.objectAdmin"

root@kitploit:~
Passo 6: Ative a API Compute:``` shell
gcloud services enable compute.googleapis.com cloudbuild.googleapis.com

Passo 7: Crie a função do IAM e atribua a ela as permissões necessárias:``` shell gcloud iam roles create hashr --project=<project_name> --title=hashr --description="Permissions required to run hashR" --permissions compute.images.create,compute.images.delete,compute.globalOperations.get

root@kitploit:~
Passo 8: Vincular a função IAM à conta de serviço:``` shell
gcloud projects add-iam-policy-binding <project_name> --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="projects/<project_name>/roles/hashr"

Passo 9a: Ative a API cloudbuild``` shell gcloud services enable cloudbuild.googleapis.com --project <project_name>

root@kitploit:~
Passo 9b: Obtenha seu project_number```shell
gcloud projects list --filter="mlegin-testing-things" --format="value(PROJECT_NUMBER)"

Etapa 9c: Conceda às contas de serviço o acesso necessário para executar o Cloud Build e certifique-se de alterar os valores de <project_name> e <project_number>:``` shell gcloud projects add-iam-policy-binding <project_name> --member='serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com' --role='roles/storage.admin'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com'
--role='roles/viewer'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com'
--role='roles/resourcemanager.projectIamAdmin'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com'
--role='roles/cloudbuild.builds.editor'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>@cloudbuild.gserviceaccount.com'
--role='roles/compute.admin'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>@cloudbuild.gserviceaccount.com'
--role='roles/iam.serviceAccountUser'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>@cloudbuild.gserviceaccount.com'
--role='roles/iam.serviceAccountTokenCreator'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>@cloudbuild.gserviceaccount.com'
--role='roles/compute.networkUser'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>[email protected]'
--role='roles/compute.storageAdmin'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>[email protected]'
--role='roles/storage.objectViewer'

gcloud projects add-iam-policy-binding <project_name>
--member='serviceAccount:<project_number>[email protected]'
--role='roles/storage.objectAdmin'

root@kitploit:~
Para usar este importador, você precisa especificar a(s) seguinte(s) flag(s):

1. `-gcp_projects` que é uma lista separada por vírgulas de projetos cloud contendo imagens de disco. Se você quiser importar imagens públicas, dê uma olhada [aqui](https://cloud.google.com/compute/docs/images/os-details#general-info)
1. `-hashr_gcp_project` projeto GCP que será usado para armazenar uma cópia das imagens de disco para processamento e também para executar o Cloud Build
1. `-hashr_gcs_bucket` bucket GCS que será usado para armazenar a saída do Cloud Build (imagens de disco no formato .tar.gz)

#### AWS

Este importador processa AMIs de propriedade da Amazon e gera hashes. O importador requer pelo menos um worker HashR (uma instância EC2).

##### Workers HashR AWS

O worker HashR AWS é uma instância EC2 onde o volume da AMI é anexado, o arquivo de disco é criado e, em seguida, enviado para o bucket S3. Recomenda-se ter pelo menos dois workers HashR AWS. Se a sua configuração usa um único worker AWS, use `-processing_worker_count 1`.

Um worker HashR AWS precisa atender aos seguintes requisitos:

- As instâncias EC2 devem ter a tag `InUse: false`. Se o valor for `true`, o worker não é usado para processamento.```shell
aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].Tags’
  • O sistema que executa o hashr deve ser capaz de usar SSH para a instância EC2 usando:

    • Chave SSH conforme descrito em Keyname. ```shell aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].Keyname’
    root@kitploit:~
  • Para FQDN conforme descrito em PublicDnsName. ```shell aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].PublicDnsName’

    root@kitploit:~
  • scripts/hashr-archive deve ser copiado para o worker AWS HashR em /usr/local/sbin/hashr-archive

  • Uma conta AWS com permissão para enviar arquivos para o bucket HashR. A configuração e as credenciais da AWS devem ser armazenadas no diretório $HOME/.aws/.```shell aws configure

root@kitploit:~
##### Aplicação HashR

No sistema que executa o `hashr`, é necessário o seguinte.

- Uma conta AWS com permissões para chamar as seguintes APIs:
  - EC2
    - AttachVolume
    - CopyImage
    - CreateTags
    - CreateVolume
    - DeleteVolume
    - DescribeAvailabilityZones
    - DescribeImages
    - DescribeInstances
    - DescribeSnapshots
    - DescribeVolumes
    - DetachVolume
  - S3
    - DeleteObject
- A configuração da conta AWS e o arquivo de credenciais devem estar localizados no diretório `$HOME/.aws/`.
- A chave privada SSH usada para o HashR na AWS deve estar localizada no diretório `$HOME/.ssh/`. Ela deve corresponder ao valor de `Keyname` conforme descrito em `aws ec2 describe-instances --instance-id INSTANCE_ID | jq -r ‘.Reservations[].Instances[0].Keyname’`

##### Configurando a instância EC2 da AWS

Esta seção descreve como criar instâncias EC2 para usar com o HashR. Idealmente, queremos duas contas AWS: `hashr.uploader` e `hashr.worker`.

`hashr.uploader` é usada em instâncias EC2 e precisa de permissões para enviar imagens de disco arquivadas para o bucket S3. `scripts/aws/AwsHashrUploaderPolicy.json` contém uma política de exemplo para o bucket S3 `hashr-bucket`.

`hashr.worker` é usada no computador que executa os comandos do HashR. A conta precisa de permissões para EC2 e S3. `scripts/aws/AwsHashrWorkerPolicy.json` contém uma política de exemplo para a conta `hashr.worker`.

O `hashr_setup.sh` é um script que ajuda a criar instâncias EC2. Edite o `hashr_setup.sh` e revise e atualize os seguintes campos conforme necessário:
- `AWS_PROFILE`
- `AWS_REGION`
- `SECURITY_SOURCE_CIDR`
- `WORKER_AWS_CONFIG_FILE`

**Nota**: O arquivo especificado em `WORKER_AWS_CONFIG_FILE` deve existir no diretório junto com `hashr_setup.sh`.

**Nota**: O `hashr_setup.sh` deve ser executado a partir do mesmo diretório em que o `hashr_setup.sh` está localizado.

Execute os seguintes comandos para criar e configurar as instâncias EC2.```shell
$ git clone https://github.com/google/hashr
$ cd hashr/scripts/aws
$ aws configure
$ cp -r ~/.aws ./
$ tar -zcf hashr.uploader.tar.gz .aws
$ hash_setup.sh setup
HashR AWS Importer Workflow

O importador AWS segue os seguintes passos de alto nível:

  1. Copia uma AMI da Amazon nova/não processada para o projeto HashR
  2. Cria um volume baseado na AMI copiada
  3. Anexa o volume a um worker AWS HashR disponível
  4. Em um worker AWS HashR a. Cria um arquivo de disco (tar.gz) no worker AWS HashR b. Envia o arquivo de disco para o bucket S3 do HashR
  5. Baixa o arquivo de disco do bucket S3 do HashR
  6. Desarquiva a imagem de disco
  7. Processa o disco bruto usando Plaso
HashR AWS Importer Command

O comando abaixo processa imagens debian-12 e as armazena em um banco de dados PostgreSQL.```shell hashr -storage postgres -exporters postgres -importers aws -aws_bucket aws-hashr-bucket -aws_os_filter debian-12

root@kitploit:~
**Nota**: O Amazon Linux (al2023-*) foi usado como worker durante o desenvolvimento do importador. Assim, o valor padrão para `-aws_ssh_user` está definido como `ec2-user`. Uma distro diferente pode ter um usuário SSH padrão diferente; use `-aws_ssh_user` para definir o usuário SSH apropriado.

#### GCR (Google Container Registry)
Este importador extrai arquivos de imagens de contêiner armazenadas em repositórios GCR. Para configurá-lo, siga estas etapas:

Etapa 1: Crie a conta de serviço HashR. Pule para a etapa 4 se isso foi feito durante a configuração de outros componentes dependentes do GCP.``` shell
gcloud iam service-accounts create hashr-sa --description="HashR SA key." --display-name="hashr"

Passo 2: Crie a chave da conta de serviço e armazene-a no seu diretório inicial. Certifique-se de definir <project_name> para o nome do seu projeto:``` shell gcloud iam service-accounts keys create ~/hashr-sa-private-key.json --iam-account=hashr-sa@<project_name>.iam.gserviceaccount.com

root@kitploit:~
Passo 3: Aponte a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS para a chave da sua conta de serviço:``` shell
export GOOGLE_APPLICATION_CREDENTIALS=~/hashr-sa-private-key.json

Passo 4: Conceda à chave da conta de serviço do hashR as permissões necessárias para acessar o repositório GCR fornecido.``` shell gcloud storage buckets add-iam-policy-binding gs://artifacts.<project_name_hosting_gcr_repo>.appspot.com --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="roles/storage.objectViewer"

root@kitploit:~
Para usar este importador, você precisa especificar a(s) seguinte(s) flag(s):

1. `-gcr_repos`, que deve conter uma lista separada por vírgulas dos repositórios GCR dos quais você deseja importar as imagens de contêiner.

#### Windows

Este importador extrai arquivos de mídias oficiais de instalação do Windows no formato ISO-13346, por exemplo, as que você pode baixar do [site](https://www.microsoft.com/en-gb/software-download/windows10ISO) oficial da Microsoft.
Um arquivo ISO pode conter várias imagens WIM:

1. Windows10ProEducation
1. Windows10Education
1. Windows10EducationN
1. Windows10ProN
1. etc.

Este importador extrairá arquivos de todas as imagens que encontrar no arquivo `install.wim`.

#### WSUS

Este importador utiliza 7z para extrair recursivamente o conteúdo dos pacotes do Windows Update. Ele procurará arquivos do Windows Update no bucket GCS fornecido; a maneira mais fácil de atualizar automaticamente o bucket GCS com novas atualizações seria fazer o seguinte:

1. Configure uma VM GCE executando Windows Server no projeto GCP hashr.
1. Configure-a com a função WSUS, selecione os pacotes do Windows Update que deseja processar
1. Configure o WSUS para aprovar e baixar automaticamente as atualizações para o armazenamento local
1. Configure uma tarefa do Windows para sincronizar automaticamente o conteúdo do armazenamento local com o bucket GCS: `gcloud storage rsync --recursive D:/WSUS/WsusContent gs://hashr-wsus/` (lembre-se de ajustar os caminhos)
1. Se você deseja ter o nome do arquivo do pacote de atualização (que geralmente contém o número KB) como o ID (por padrão é sha1, é assim que a MS armazena atualizações do WSUS) e sua descrição, isso é algo que pode ser extraído do banco de dados WID WSUS interno. Você pode usar o seguinte script do Power Shell e executá-lo como uma tarefa:```
#SQL Query
$delimiter = ";"
$SqlQuery = 'select DISTINCT CONVERT([varchar](https://github.com/google/hashr/blob/main/512), tbfile.FileDigest, 2) as sha1, tbfile.[FileName], vu.[KnowledgebaseArticle], vu.[DefaultTitle]  from [SUSDB].[dbo].[tbFile] tbfile
  left join [SUSDB].[dbo].[tbFileForRevision] ffrev
  on tbfile.FileDigest = ffrev.FileDigest
  left join [SUSDB].[dbo].[tbRevision] rev
  on ffrev.RevisionID = rev.RevisionID
  left join [SUSDB].[dbo].[tbUpdate] u
  on rev.LocalUpdateID = u.LocalUpdateID
  left join [SUSDB].[PUBLIC_VIEWS].[vUpdate] vu
  on u.UpdateID = vu.UpdateId'
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = 'server=\\.\pipe\MICROSOFT##WID\tsql\query;database=SUSDB;trusted_connection=true;'
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandTimeout = 0
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
#Creating Dataset
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$DataSet.Tables[0] | export-csv -Delimiter $delimiter -Path "D:\WSUS\WsusContent\export.csv" -NoTypeInformation

gcloud storage rsync --recursive D:/WSUS/WsusContent gs://hashr-wsus/

Isso irá despejar as informações relevantes do banco de dados do WSUS, armazená-las no arquivo export.csv e sincronizar o conteúdo da pasta do WSUS com o bucket do GCS. O importador WSUS verificará se o arquivo export.csv está presente na raiz do repositório do WSUS e, se estiver, o utilizará.

TarGz

Este é um importador simples que percorre repositórios e procura por arquivos .tar.gz. Quando encontrado, ele irá gerar o hash dos primeiros e dos últimos 10MB do arquivo para verificar se já foi processado. Isso é feito para evitar o hash do arquivo inteiro toda vez que o repositório é verificado em busca de novas fontes. Para usar este importador, você precisa especificar a(s) seguinte(s) flag(s):

  1. -targz_repo_path que deve apontar para o caminho no sistema de arquivos local que contém arquivos .tar.gz

Deb

Este é muito semelhante ao importador TarGz, exceto que procura por pacotes .deb. Quando encontrado, ele irá gerar o hash dos primeiros e dos últimos 10MB do arquivo para verificar se já foi processado. Isso é feito para evitar o hash do arquivo inteiro toda vez que o repositório é verificado em busca de novas fontes. Para usar este importador, você precisa especificar a(s) seguinte(s) flag(s):

  1. -deb_repo_path que deve apontar para o caminho no sistema de arquivos local que contém arquivos .deb

RPM

Este é muito semelhante ao importador TarGz, exceto que procura por pacotes .rpm. Quando encontrado, ele irá gerar o hash dos primeiros e dos últimos 10MB do arquivo para verificar se já foi processado. Isso é feito para evitar o hash do arquivo inteiro toda vez que o repositório é verificado em busca de novas fontes. Para usar este importador, você precisa especificar a(s) seguinte(s) flag(s):

  1. -rpm_repo_path que deve apontar para o caminho no sistema de arquivos local que contém arquivos .rpm

Zip (e outros formatos semelhantes a zip)

Este é muito semelhante ao importador TarGz, exceto que procura por arquivos .zip. Quando encontrado, ele irá gerar o hash dos primeiros e dos últimos 10MB do arquivo para verificar se já foi processado. Isso é feito para evitar o hash do arquivo inteiro toda vez que o repositório é verificado em busca de novas fontes. Para usar este importador, você precisa especificar a(s) seguinte(s) flag(s):

  1. -zip_repo_path que deve apontar para o caminho no sistema de arquivos local que contém arquivos .zip

Opcionalmente, você também pode definir a(s) seguinte(s) flag(s):

  1. -zip_file_exts lista separada por vírgulas de extensões de arquivo a serem tratadas como arquivos zip, ex.: "zip,whl,jar". Padrão: "zip"

ISO 9660

Este é muito semelhante ao importador TarGz, exceto que procura por arquivos .iso. Quando encontrado, ele irá gerar o hash dos primeiros e dos últimos 10MB do arquivo para verificar se já foi processado. Isso é feito para evitar o hash do arquivo inteiro toda vez que o repositório é verificado em busca de novas fontes. Para usar este importador, você precisa especificar a(s) seguinte(s) flag(s):

  1. -iso_repo_path que deve apontar para o caminho no sistema de arquivos local que contém arquivos .iso

Configurando exportadores

Configurando o exportador Postgres

O exportador Postgres permite o envio de hashes, metadados de arquivos e o conteúdo real do arquivo para uma instância PostgreSQL. Para obter o melhor desempenho, é recomendado configurá-lo em uma máquina separada e dedicada. Se você configurou o PostgreSQL ao escolher o armazenamento de trabalhos de processamento, você já está quase pronto; basta executar o seguinte comando para criar as tabelas necessárias:``` shell cat scripts/CreatePostgresExporterTables.sql | docker exec -i hashr_postgresql psql -U hashr -d hashr

root@kitploit:~
Se você não escolheu o Postgres para o armazenamento de trabalhos de processamento, siga os passos 1 e 2 da seção [Configurando o armazenamento PostgreSQL](####setting-up-postgresql-storage).

Este é atualmente o exportador padrão, você não precisa habilitá-lo explicitamente. Por padrão, o conteúdo dos arquivos reais não será enviado para o banco de dados PostgreSQL; se você desejar alterar isso, use a flag `-upload_payloads true`.

Para que o exportador Postgres funcione, você precisa definir as seguintes flags: `-exporters postgres -postgresHost <host> -postgresPort <port> -postgresUser <user> -postgresPassword <pass> -postgresDBName <db_name>`

#### Configurando o exportador GCP

O exportador GCP permite o envio de hashes e metadados de arquivos para a instância GCP Spanner. Opcionalmente, você pode enviar os arquivos extraídos para o bucket GCS. Se você ainda não configurou o Cloud Spanner para armazenar trabalhos de processamento, siga os passos em [Configurando o Cloud Spanner](####setting-up-cloud-spanner) e, em vez da última etapa, execute o seguinte comando para criar as tabelas necessárias:``` shell
gcloud spanner databases ddl update hashr --instance=hashr --ddl-file=scripts/CreateCloudSpannerExporterTables.ddl

Se você já configurou o Cloud Spanner para armazenar dados de jobs, basta executar o comando acima e estará pronto para começar.

Se você deseja enviar os arquivos extraídos para o GCS, é necessário criar o bucket do GCS:

Passo 1: Defina a conta de serviço como administradora deste bucket:``` shell gcloud storage buckets create gs://<gcs_bucket_name> --project=project_name>

root@kitploit:~
Passo 2: Torne a conta de serviço administradora deste bucket:``` shell
gcloud storage buckets add-iam-policy-binding gs://<gcs_bucket_name> --member="serviceAccount:hashr-sa@<project_name>.iam.gserviceaccount.com" --role="roles/storage.objectAdmin"

Para usar este exportador, você precisa fornecer as seguintes flags: -exporters GCP -gcp_exporter_gcs_bucket <gcs_bucket_name>

Flags adicionais

  1. -processing_worker_count: Esta flag controla o número de workers de processamento paralelo. O processamento consome muita CPU e I/O; durante meus testes, descobri que ter 2 workers é a solução mais otimizada.
  2. -cache_dir: Localização do cache local usado para deduplicação; é recomendado alterá-la de /tmp para, por exemplo, o diretório home do usuário que executará o hashr.
  3. -export: Quando definido como false, o hashr salvará os resultados em disco, ignorando o exportador.
  4. -export_path: Se export estiver definido como false, esta é a pasta onde as amostras serão salvas.
  5. -reprocess: Permite reprocessar uma determinada fonte (caso ela, por exemplo, tenha falhado) com base no valor sha256 armazenado na tabela de jobs.
  6. -upload_payloads: Controla se o conteúdo real do arquivo será enviado pelos exportadores definidos.
  7. -gcp_exporter_worker_count: Número de workers/goroutines que o exportador GCP usará para enviar os dados.

Este não é um produto oficialmente suportado pelo Google.

Baixar ferramenta