
PoC para desencadear estouro de buffer via CVE-2020-0796
./CVE-2020-0796.py servername
Este script conecta-se ao host alvo e comprime a solicitação de autenticação com um campo de offset incorreto definido no cabeçalho de transformação, fazendo com que o descompressor cause um estouro de buffer e derrube o alvo.
Isso contém uma modificação do excelente smbprotocol com suporte adicionado para compressão/descompressão SMB 3.1.1 (apenas LZNT1). A maioria das adições está em smbprotocol/connection.py. Uma versão do lznt1 está incluída, modificada para suportar Python 3.
O cabeçalho de transformação de compressão está na classe SMB2CompressionTransformHeader ali. A função _compress é chamada para comprimir solicitações de árvore. É aqui que o campo de offset é configurado com o valor máximo para acionar a falha.
def _compress(self, b_data, session):
header = SMB2CompressionTransformHeader()
header['original_size'] = len(b_data)
header['offset'] = 4294967295
header['data'] = smbprotocol.lznt1.compress(b_data)
CVE-2020-0796 é uma falha na nova capacidade de compressão SMB3 do Windows 10 1903/1909. O protocolo SMB versão 3.1.1 introduz a capacidade de um cliente ou servidor anunciar capacidades de compressão e comprimir seletivamente mensagens SMB3 conforme benéfico. Para isso, ao negociar uma sessão SMB, tanto o cliente quanto o servidor devem incluir um SMB2_COMPRESSION_CAPABILITIES conforme documentado em MS-SMB2 2.2.3.1.3.
Uma vez que uma sessão é negociada com essa capacidade, tanto o cliente quanto o servidor podem comprimir seletivamente certas mensagens SMB. Para isso, todo o pacote SMB é comprimido, e um cabeçalho transformado é preposto, conforme documentado em MS-SMB2 2.2.42. Este cabeçalho é uma estrutura pequena (16 bytes) com um valor mágico, o tamanho dos dados não comprimidos, o algoritmo de compressão usado e um valor de offset.
CVE-2020-0796 é causado pela falta de verificação de limites no tamanho do offset, que é passado diretamente para várias sub-rotinas. Passar um valor grande causará um estouro de buffer e derrubará o kernel. Com mais trabalho, isso poderia ser desenvolvido em um exploit de RCE.