Skip to content

Latest commit

 

History

History
159 lines (117 loc) · 7.34 KB

File metadata and controls

159 lines (117 loc) · 7.34 KB

spdmfuzzer: um fuzzer baseado em gramática para o SPDM

O spdmfuzzeré um fuzzer baseado em gramática orientado a objetos que assume o papel de Responderem uma comunicação do protocolo SPDM. Seu objetivo é enviar mensagens semi-aleatórias para o Requester de forma a explorar respostas inesperadas para análise.

O binário automaticamente inicia o Requester, já que a comunicação pode ser encerrada em certos momentos caso o Requesternão tenha achado a mensagem recebida favorável à continuidade da comunicação. Para isso funcionar, é necessário que todos as pastas e arquivos sejam mantidos da maneira que estão organizadas no repositório.

Os fuzzer, caso receba uma resposta ineseperada, guarda aquela mensagem utilizada e começa a utilizá-la até encontrar uma conexão completa.

Compilação e execução

A partir de agora, é considerado que você possua um sistema Linux bem atualizado. De preferência, uma distribuição com gerenciador de pacotes apt

Recomendamos fortemente que utilize o spdm-wid listado na seção de Projetos Relacionados abaixo, que é um dissecador para entender os pacotes no tcpdump ou Wireshark.

Vale ressaltar que o fuzzer envia mensagens de forma individual (header, command, buffer, size), então, talvez haja diferença no envio dependendo da forma que o protocolo TCP resolva unir os pacotes enviados em um só, deixando o spdm-wid difícil de se utilizar pois os bytes não são formatados exatamente como em uma comunicação real, já que se trata de uma emulação, com erros como falta de tamanho, etc. Caso isso aconteça, basta executá-lo novamente ou esperar para outro pacote bem montado surgir.

Basta colocar o filtro de pacotes:

tcp.port == 2323 && tcp.flags.push == 1

Aqui é possível seguir dois caminhos:

  1. Compilar na sua própria máquina
  2. Compilar automaticamente em contêiner docker

Independente do processo, é necessário clonar o repositório. Para isso, basta:

foo@<pasta-atual>: ~$ git clone https://github.com/th-duvanel/spdmfuzzer.git
    https://github.com/th-duvanel/spdmfuzzer.git
foo@<pasta-atual>: ~$ cd spdmfuzzer

Agora você pode escolher um dos caminhos descritos acima.

Compilar na sua própria máquina

Caso a instalação de bibliotecas e dependências não seja um problema para você, sinta-se livre para instalar localmente em sua máquina. Não será necessário executar nada com privilégios elevados, apenas dar permissão de execução ao bash script.

Ele vai executar e checar algumas dependências em seu sistema (não são muitas), listar e pedir para instalar. Para não ter necessidade de executar sudo com um script, ele não instala automaticamente. Caso não deseje executar o script, abaixo estão as dependências necessárias e suas versões.

Não é necessário seguir a versão específica utilizada. De preferência utilize a versão mais recente que o gerenciador de pacotes do seu sistema possui ou utilize o tutorial automatizado em contêiner.

g++ 11.4.0
gawk 5.1.0
tar 1.34
gcc 11.4.0
git 2.34.1
wget 1.21.2
make 4.3
cmake 3.22.1
moreutils 0.66-1 # sponge
xz-utils 5.2.5

Para isso, basta executar na pasta atual:

foo@spdmfuzzer:~$ sudo +x compile.sh

foo@spdmfuzzer:~$ ./compile.sh

Se quiser acompanhar a troca de mensagens, execute seu sniffer de preferência agora (de preferência com o spdm-wid).

Para executar, basta:

foo@spdmfuzzer:~$ ./spdmfuzzer

Todas as informações necessárias para entendimento serão exibidas em seu terminal.

Compilar automaticamente em contêiner docker

A depêndencia mais importante nesse caso é possuir o docker instalado em seu sistema

Essa forma é mais automática, com menos passos e mais visualização. Além de ser instalado e executado em um ambiente virtual, será gerado um .pcapng para estudo dos pacotes trocados automaticamente, diferente do passo anterior, que necessita que seja executado o sniffer de forma manual.

foo@spdmfuzzer:~$ docker build -t spdmfuzzer .      # montar a imagem

foo@spdmfuzzer:~$ docker run -ti spdmfuzzer         # executá-la por meio do contêiner

O fuzzer vai rodar automaticamente e não vai parar até que você pressione ctrl + c. Após pressionar ambas teclas, o contêiner será fechado. Nos arquivos do contêiner, terá um .pcapng coletado com todos os pacotes trocados. Para recuperá-lo, basta:

foo@spdmfuzzer:~$ docker ps -a   # para capturar o id do contêiner
container ID        IMAGE        NAMES      ...
<container-id>      spdmfuzzer   <name>     ...

foo@spdmfuzzer:~$ docker cp <container-id>:/home/spdmfuzzer/spdmfuzzer.pcapng .     # copiar o .pcapng na pasta atual

Ao aplicar esse .pcapng no Wireshark, você terá a visualização completa da troca de pacotes. Recomenda-se novamente usar o spdm-wide o filtro de pacotes listado acima para melhor visualização.

Execução (ajuda)

O spdmfuzzerpossui algumas funções passadas por argumento de linha de comando. Uma delas é, quando você encontra uma resposta inesperada, ele pode aguardar alguns segundos para o utilizador observar o que aconteceu. Por padrão, é usado 3 segundos. Para setar a flag, basta:

foo@spdmfuzzer:~$ ./spdmfuzzer -t <tempo(s)>

Exemplo

foo@spdmfuzzer:~$ ./spdmfuzzer
# [+] => Responder (server) listening on port 2323
# [+] => Requester (client) started in the background
# [+] => Requester (client) connected

# [+] => Received command: 00 00 00 01 
# [+] => Received transport type: 00 00 00 01 
# [+] => Received buffer size: 00 00 00 05 
# [+] => Received buffer: 05 10 84 00 00 

# [+] => Sent command: 00 00 00 01 
# [+] => Sent transport type: 00 00 00 01 
# [+] => Sent buffer size: 00 00 00 0b 
# [+] => Sent buffer: 05 50 04 00 05 00 02 07 b7 0c 65 

# [+] => Received command: 00 00 00 01 
# [+] => Received transport type: 00 00 00 01 
# [+] => Received buffer size: 00 00 00 05 
# [+] => Received buffer: 05 10 e1 00 00 
# [+] => wow! this is not expected.

Nessa execução, é possível observar que o fuzzer recebeu uma resposta inesperada. Como não foi informada nenhuma flag de tempo, a cada resposta inesperada são dados 3 segundos para o usuário observar a resposta inesperada.

Geração de Documentação

São necessárias duas dependências para visualização completa:

doxygen
graphviz

Esse repositório tem suporte à documentação a partir do doxygen. Caso deseje, basta executar:

foo@spdmfuzzer:~$ make doxygen

Acesse o index.html em seu navegador dentro da pasta doxygen que toda documentação estará disponível. Caso deseje, é possível acessá-la em latex também. Vale ressaltar que a documentação está em inglês.

Especificações do ambiente utilizado

OS: Ubuntu 22.04.4 LTS x86_64
Kernel: 6.5.0-41-generic
Shell: zsh 5.8.1
CPU: AMD Ryzen 7 5800H with Radeon Graphics (16) @ 4.463GHz 
GPU: AMD ATI 05:00.0 Cezanne 
GPU: NVIDIA GeForce RTX 3060 Mobile / Max-Q 
Memory: 15328MiB 

Projetos relacionados

Autor