hacktricks/network-services-pentesting/pentesting-voip/basic-voip-protocols/sip-session-initiation-protocol.md
2023-06-03 13:10:46 +00:00

18 KiB

SIP (Session Initiation Protocol)

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Informations de base

SIP (Session Initiation Protocol) est un protocole de signalisation et de contrôle d'appel largement utilisé pour établir, modifier et terminer des sessions multimédias, y compris la voix, la vidéo et la messagerie instantanée, sur des réseaux IP. Développé par le Internet Engineering Task Force (IETF), SIP est défini dans RFC 3261 et est devenu la norme de facto pour la VoIP et les communications unifiées.

Certaines caractéristiques clés de SIP comprennent :

  1. Protocole basé sur le texte : SIP est un protocole basé sur le texte, ce qui le rend lisible par l'homme et plus facile à déboguer. Il est basé sur un modèle de demande-réponse, similaire à HTTP, et utilise des méthodes telles que INVITE, ACK, BYE et CANCEL pour contrôler les sessions d'appel.
  2. Scalabilité et flexibilité : SIP est hautement scalable et peut être utilisé dans des déploiements de petite échelle ainsi que dans des environnements d'entreprise et de transporteur de grande envergure. Il peut être facilement étendu avec de nouvelles fonctionnalités, ce qui le rend adaptable à divers cas d'utilisation et exigences.
  3. Interopérabilité : L'adoption généralisée et la normalisation de SIP garantissent une meilleure interopérabilité entre différents appareils, applications et fournisseurs de services, favorisant une communication transparente sur diverses plateformes.
  4. Conception modulaire : SIP fonctionne avec d'autres protocoles tels que RTP (Real-time Transport Protocol) pour la transmission multimédia et SDP (Session Description Protocol) pour décrire les sessions multimédias. Cette conception modulaire permet une plus grande flexibilité et compatibilité avec différents types de médias et codecs.
  5. Serveurs proxy et de redirection : SIP peut utiliser des serveurs proxy et de redirection pour faciliter le routage des appels et fournir des fonctionnalités avancées telles que le renvoi d'appel, le transfert d'appel et les services de messagerie vocale.
  6. Présence et messagerie instantanée : SIP n'est pas limité à la communication vocale et vidéo. Il prend également en charge la présence et la messagerie instantanée, permettant une large gamme d'applications de communication unifiée.

Malgré ses nombreux avantages, SIP peut être complexe à configurer et à gérer, en particulier lorsqu'il s'agit de problèmes de traversée NAT et de pare-feu. Cependant, sa polyvalence, sa scalabilité et son soutien étendu dans l'industrie en font un choix populaire pour la communication VoIP et multimédia.

Méthodes SIP

Les méthodes SIP de base définies dans RFC 3261 comprennent :

  1. INVITE : Utilisé pour initier une nouvelle session (appel) ou modifier une session existante. La méthode INVITE transporte la description de session (généralement en utilisant SDP) pour informer le destinataire des détails de la session proposée, tels que les types de médias, les codecs et les protocoles de transport.
  2. ACK : Envoyé pour confirmer la réception d'une réponse finale à une demande INVITE. La méthode ACK assure la fiabilité des transactions INVITE en fournissant une confirmation de bout en bout.
  3. BYE : Utilisé pour mettre fin à une session établie (appel). La méthode BYE est envoyée par l'une ou l'autre partie de la session pour indiquer qu'elle souhaite mettre fin à la communication.
  4. CANCEL : Envoyé pour annuler une demande INVITE en attente avant que la session ne soit établie. La méthode CANCEL permet à l'expéditeur d'annuler une transaction INVITE s'il change d'avis ou s'il n'y a pas de réponse du destinataire.
  5. OPTIONS : Utilisé pour interroger les capacités d'un serveur ou d'un agent utilisateur SIP. La méthode OPTIONS peut être envoyée pour demander des informations sur les méthodes prises en charge, les types de médias ou d'autres extensions sans établir réellement une session.
  6. REGISTER : Utilisé par un agent utilisateur pour enregistrer son emplacement actuel auprès d'un serveur d'enregistrement SIP. La méthode REGISTER aide à maintenir une correspondance à jour entre l'URI SIP d'un utilisateur et son adresse IP actuelle, permettant le routage et la livraison des appels.

{% hint style="warning" %} Notez que pour appeler quelqu'un, il n'est pas nécessaire d'utiliser le REGISTER pour quoi que ce soit.
Cependant, il est possible qu'avant de réaliser un INVITE, l'appelant doit s'authentifier ou il recevra une réponse 401 Unauthorized. {% endhint %}

En plus de ces méthodes de base, il existe plusieurs méthodes d'extension SIP définies dans d'autres RFC, telles que :

  1. SUBSCRIBE : Définie dans RFC 6665, la méthode SUBSCRIBE est utilisée pour demander des notifications sur l'état d'une ressource spécifique, telle que la présence ou l'état d
INVITE sip:jdoe@example.com SIP/2.0
Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds
Max-Forwards: 70
To: John Doe <sip:jdoe@example.com>
From: Jane Smith <sip:jsmith@example.org>;tag=1928301774
Call-ID: a84b4c76e66710
CSeq: 314159 INVITE
Contact: <sip:jsmith@pc33.example.com>
User-Agent: ExampleSIPClient/1.0
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO
Content-Type: application/sdp
Content-Length: 142

v=0
o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com
s=-
c=IN IP4 pc33.example.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000te
Explication de chaque paramètre
  1. Request-Line: INVITE sip:jdoe@example.com SIP/2.0 - Cette ligne indique la méthode (INVITE), l'URI de la requête (sip:jdoe@example.com), et la version SIP (SIP/2.0).
  2. Via: Via: SIP/2.0/UDP pc33.example.com;branch=z9hG4bK776asdhds - L'en-tête Via spécifie le protocole de transport (UDP) et l'adresse du client (pc33.example.com). Le paramètre "branch" est utilisé pour la détection de boucle et la correspondance de transaction.
  3. Max-Forwards: Max-Forwards: 70 - Ce champ d'en-tête limite le nombre de fois que la requête peut être transmise par des proxies pour éviter les boucles infinies.
  4. To: To: John Doe <sip:jdoe@example.com> - L'en-tête To spécifie le destinataire de l'appel, y compris son nom d'affichage (John Doe) et son URI SIP (sip:jdoe@example.com).
  5. From: From: Jane Smith <sip:jsmith@example.org>;tag=1928301774 - L'en-tête From spécifie l'expéditeur de l'appel, y compris son nom d'affichage (Jane Smith) et son URI SIP (sip:jsmith@example.org). Le paramètre "tag" est utilisé pour identifier de manière unique le rôle de l'expéditeur dans le dialogue.
  6. Call-ID: Call-ID: a84b4c76e66710 - L'en-tête Call-ID identifie de manière unique une session d'appel entre deux agents utilisateurs.
  7. CSeq: CSeq: 314159 INVITE - L'en-tête CSeq contient un numéro de séquence et la méthode utilisée dans la requête. Il est utilisé pour faire correspondre les réponses aux demandes et détecter les messages hors séquence.
  8. Contact: Contact: <sip:jsmith@pc33.example.com> - L'en-tête Contact fournit une route directe vers l'expéditeur, qui peut être utilisée pour les demandes et les réponses ultérieures.
  9. User-Agent: User-Agent: ExampleSIPClient/1.0 - L'en-tête User-Agent fournit des informations sur le logiciel ou le matériel de l'expéditeur, y compris son nom et sa version.
  10. Allow: Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO - L'en-tête Allow répertorie les méthodes SIP prises en charge par l'expéditeur. Cela aide le destinataire à comprendre quelles méthodes peuvent être utilisées pendant la communication.
  11. Content-Type: Content-Type: application/sdp - L'en-tête Content-Type spécifie le type de support du corps du message, dans ce cas, SDP (Session Description Protocol).
  12. Content-Length: Content-Length: 142 - L'en-tête Content-Length indique la taille du corps du message en octets.
  13. Corps du message: Le corps du message contient la description de session SDP, qui comprend des informations sur les types de supports, les codecs et les protocoles de transport pour la session proposée.
  • v=0 - Version du protocole (0 pour SDP)
  • o=jsmith 2890844526 2890842807 IN IP4 pc33.example.com - Identifiant de l'originateur et de la session
  • s=- - Nom de la session (un simple trait d'union indique qu'il n'y a pas de nom de session)
  • c=IN IP4 pc33.example.com - Informations de connexion (type de réseau, type d'adresse et adresse)
  • t=0 0 - Informations de synchronisation (heures de début et de fin, 0 0 signifie que la session n'est pas bornée)
  • m=audio 49170 RTP/AVP 0 - Description des supports (type de support, numéro de port, protocole de transport et liste de formats). Dans ce cas, il spécifie un flux audio utilisant RTP/AVP (Real-time Transport Protocol / Audio Video Profile) et le format 0 (PCMU/8000).
  • a=rtpmap:0 PCMU/8000 - Attribut faisant correspondre le format (0) au codec (PCMU) et à sa fréquence d'horloge (8000 Hz).

Exemple d'enregistrement SIP

La méthode REGISTER est utilisée dans le protocole d'initiation de session (SIP) pour permettre à un agent utilisateur (UA), tel qu'un téléphone VoIP ou un téléphone logiciel, de enregistrer son emplacement auprès d'un serveur d'enregistrement SIP. Ce processus permet au serveur de savoir où acheminer les demandes SIP entrantes destinées à l'utilisateur enregistré. Le serveur d'enregistrement fait généralement partie d'un serveur proxy SIP ou d'un serveur d'enregistrement dédié.

Voici un exemple détaillé des messages SIP impliqués dans un processus d'authentification REGISTER :

  1. Requête REGISTER initiale de l'UA vers le serveur d'enregistrement :
REGISTER sip:example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds
Max-Forwards: 70
From: Alice <sip:alice@example.com>;tag=565656
To: Alice <sip:alice@example.com>
Call-ID: 1234567890@192.168.1.100
CSeq: 1 REGISTER
Contact: <sip:alice@192.168.1.100:5060>;expires=3600
Expires: 3600
Content-Length: 0

Ce message REGISTER initial est envoyé par l'UA (Alice) au serveur d'enregistrement. Il inclut des informations importantes telles que la durée d'enregistrement souhaitée (Expires), l'URI SIP de l'utilisateur (sip:alice@example.com), et l'adresse de contact de l'utilisateur (sip:alice@192.168.1.100:5060).

  1. Réponse 401 Unauthorized du serveur d'enregistrement :
cssCopy codeSIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds
From: Alice <sip:alice@example.com>;tag=565656
To: Alice <sip:alice@example.com>;tag=7878744
Call-ID: 1234567890@192.168.1.100
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="example.com", nonce="abcdefghijk", algorithm=MD5, qop="auth"
Content-Length: 0

Le serveur de registre répond avec un message "401 Unauthorized", qui inclut un en-tête "WWW-Authenticate". Cet en-tête contient des informations requises pour que l'UA s'authentifie elle-même, telles que le domaine d'authentification, le nonce et l'algorithme.

  1. Demande REGISTER avec des informations d'authentification:
REGISTER sip:example.com SIP/2.0
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds
Max-Forwards: 70
From: Alice <sip:alice@example.com>;tag=565656
To: Alice <sip:alice@example.com>
Call-ID: 1234567890@192.168.1.100
CSeq: 2 REGISTER
Contact: <sip:alice@192.168.1.100:5060>;expires=3600
Expires: 3600
Authorization: Digest username="alice", realm="example.com", nonce="abcdefghijk", uri="sip:example.com", response="65a8e2285879283831b664bd8b7f14d4", algorithm=MD5, cnonce="lmnopqrst", qop=auth, nc=00000001
Content-Length: 0

Le UA envoie une autre requête REGISTER, cette fois en incluant l'en-tête "Authorization" avec les informations d'identification nécessaires, telles que le nom d'utilisateur, le domaine, le nonce et une valeur de réponse calculée à l'aide des informations fournies et du mot de passe de l'utilisateur.

Voici comment est calculée la réponse d'autorisation :

import hashlib

def calculate_sip_md5_response(username, password, realm, method, uri, nonce, nc, cnonce, qop):
    # 1. Calculate HA1 (concatenation of username, realm, and password)
    ha1_input = f"{username}:{realm}:{password}"
    ha1 = hashlib.md5(ha1_input.encode()).hexdigest()

    # 2. Calculate HA2 (concatenation of method and uri)
    ha2_input = f"{method}:{uri}"
    ha2 = hashlib.md5(ha2_input.encode()).hexdigest()

    # 3. Calculate the final response value (concatenation of h1, stuff and h2)
    response_input = f"{ha1}:{nonce}:{nc}:{cnonce}:{qop}:{ha2}"
    response = hashlib.md5(response_input.encode()).hexdigest()

    return response

# Example usage
username = "alice"
password = "mysecretpassword"
realm = "example.com"
method = "REGISTER"
uri = "sip:example.com"
nonce = "abcdefghijk"
nc = "00000001"
cnonce = "lmnopqrst"
qop = "auth"

response = calculate_sip_md5_response(username, password, realm, method, uri, nonce, nc, cnonce, qop)
print(f"MD5 response value: {response}")
  1. Réponse de enregistrement réussi du serveur de registre :
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.100:5060;branch=z9hG4bK776asdhds
From: Alice <sip:alice@example.com>;tag=565656
To: Alice <sip:alice@example.com>;tag=7878744
Call-ID: 1234567890@192.168.1.100
CSeq: 2 REGISTER
Contact: <sip:alice@192.168.1.100:5060>;expires=3600
Expires: 3600
Content-Length: 0

Après que le serveur d'enregistrement a vérifié les informations d'identification fournies, il envoie une réponse "200 OK" pour indiquer que l'enregistrement a réussi. La réponse inclut les informations de contact enregistrées et l'heure d'expiration de l'enregistrement. À ce stade, l'agent utilisateur (Alice) est enregistré avec succès auprès du serveur d'enregistrement SIP, et les demandes SIP entrantes pour Alice peuvent être acheminées vers l'adresse de contact appropriée.

Exemple d'appel

{% hint style="info" %} Il n'est pas mentionné, mais l'utilisateur B doit avoir envoyé un message REGISTER à Proxy 2 avant de pouvoir recevoir des appels. {% endhint %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥