
Servidor de exploit PoC para CVE-2015-7547
Para testar na máquina local com uma versão vulnerável do glibc:
user@localhost:/# echo 'nameserver 127.0.0.127' | sudo tee /etc/resolv.conf
user@localhost:/# echo 'nameserver 127.0.0.127' | sudo tee -a /etc/resolv.conf
user@localhost:/# sudo python3 attack-server.py 127.0.0.127
Starting UDP server on 127.0.0.127:53...
Starting TCP server on 127.0.0.127:53...
Em seguida, a partir de outra sessão de terminal, execute os ataques conforme mostrado nos exemplos abaixo.
Requer capacidade de enviar respostas > 2048 bytes via UDP e TCP.
Sequência do ataque:
Resposta UDP, > 2048 bytes, cabeçalho/consulta válido, flag TC definida (desencadeia má gestão de buffer e nova tentativa TCP)
Resposta TCP, cabeçalho/consulta válido (força que a próxima resposta seja armazenada no buffer alocado na pilha)
Resposta TCP, > 2048 bytes (estouro do buffer alocado na pilha)
Exemplo:
user@localhost:/# curl http://attack1
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Requer capacidade de enviar respostas > 2048 bytes via UDP.
Sequência do ataque:
Resposta UDP, > 2048 bytes, cabeçalho inválido (desencadeia má gestão de buffer, não contada como resposta válida)
Ignorar a próxima solicitação (desencadeia nova tentativa UDP devido ao tempo limite de polling)
Resposta UDP, cabeçalho/consulta válido (força que a próxima resposta seja armazenada no buffer alocado na pilha)
Resposta UDP, > 2048 bytes (estouro do buffer alocado na pilha)
Exemplo:
user@localhost:/# curl http://attack2
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Requer capacidade de enviar respostas > 1024 bytes via UDP e > 2048 bytes via TCP.
Sequência do ataque:
Resposta UDP, 1024 bytes, cabeçalho/consulta válido (preenche metade do buffer alocado na pilha)
Resposta UDP, > 1024 bytes, cabeçalho/consulta válido, flag TC definida (desencadeia má gestão de buffer e nova tentativa TCP)
Resposta TCP, cabeçalho/consulta válido (força que a próxima resposta seja armazenada no buffer alocado na pilha)
Resposta TCP, > 2048 bytes (estouro do buffer alocado na pilha)
Exemplo:
user@localhost:/# curl http://attack3
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Requer capacidade de enviar respostas > 2048 bytes via UDP.
Sequência do ataque:
Resposta UDP, 2048 bytes, cabeçalho/consulta válido (preenche o buffer alocado na pilha)
Resposta UDP (desencadeia má gestão de buffer e nova tentativa UDP devido ao recebimento de soquete de 0 bytes)
Resposta UDP, cabeçalho/consulta válido (força que a próxima resposta seja armazenada no buffer alocado na pilha)
Resposta UDP, > 2048 bytes (estouro do buffer alocado na pilha)
Exemplo:
user@localhost:/# curl http://attack4
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
Requer capacidade de enviar respostas > 2048 bytes via TCP e pelo menos duas entradas de nameserver em /etc/resolv.conf.
Sequência do ataque:
Resposta UDP, cabeçalho/consulta válido, flag TC definida (opcional, desencadeia nova tentativa TCP se a consulta inicial for via UDP)
Resposta TCP, > 2048 bytes (desencadeia má gestão de buffer)
Resposta TCP, vazia (desencadeia nova tentativa TCP devido ao recebimento de soquete de 0 bytes)
Resposta TCP, cabeçalho/consulta válido (força que a próxima resposta seja armazenada no buffer alocado na pilha)
Resposta TCP, > 2048 bytes (estouro do buffer alocado na pilha)
Exemplo:
user@localhost:/# curl http://attack5
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)