یکی از مشکلات موجود در voip نسبت به سیستم تلفن ستنی موارد امنیتی میباشد که بی توجهی نسبت به آن، باعث بالا رفتن هزینهها میشود. از این رو قصد داریم تا با بررسی یک سری از حفرههای امنیتی رایج در voip به راه های مقابله با آن بپردازیم.
نکته: قطعا در این مقاله نمیتوانیم تمام مشکلات امنیتی موجود در voip را بیان کنیم ولی امید است که شخص با خواندن این مقاله تا حد زیادی از این حملات جلوگیری کند.
لازم است قبل از این که به بررسی پروتکلهای موجود در voip و لایه application بپردازیم حملات رایج در شبکه را بشناسیم و با طراحی درست شبکه از حملات در لایه های بالایی جلوگیری کنیم.
ARP POISONING
با استفاده از روش arp poisoning هکر می تواند خود را به عنوان یک شخص میانی در مسیر دو دستگاه قرار گیرد و به راحتی تمامی اطلاعات رد وبدل بین دو دستگاه را با استفاده از نرم افزارهایی مانند Cain و ettercap گوش کند.
در این روش هکر آدرس mac خود را به عنوان آدرس mac سرور در شبکه ارسال میکند و از این به بعد هر شخصی که میخواهد به سرور وصل شود در واقع به سیستم هکر وصل شده است و میتواند اطلاعات مورد نیاز خود را بردارد و خود اطلاعات را به سرور ارسال کند.
برای جلوگیری از arp poisoning در شبکه راه های زیادی وجود دارد
- استفاده از static arp
-
استفاده از نرم افزارهای ArpON، AntiARP، ArpWatch
-
استفاده از سوئیچ های manage برای مثال استفاده از port security در سوئیچ های cisco
در voip شما میتوانید با جدا کردن voip از data و تعریف تمام IPphone ها در یک vlan مجزا از این نوع حملات جلوگیری کنید.
SIP
برای مقابله با مشکلات امنیتی در پروتکل SIP نیاز به داشتن امنیت درلایه های Application و Network می باشد.SIP از پروتکلهای UDP, TCP برای signalling استفاده می کند و در نتیجه تمام مشکلات موجود در این پروتکل ها را نیز شامل میشود. text-based بودن پروتکل SIP باعث بالا بردن دسترسی افراد عیر مجاز به اطلاعات تبادل شده در پروتکل SIP میشود.
به همین دلیل است که راه کار های امنیتی از قبیل (فایروال، encryption و authentication ) مورد استفاده قرار می گیرد. در ضمن استفاده از پروتکل های TLSو IPSec میتواند باعث افزایش سطح امنیتی در SIP شود.
بعضی تنظیمات موجود در asterisk:
- بسیاری از هکرها برای پیدا کردن username و password در asterisk از روش brute force استفاده میکنند، چنانچه username ارسالی توسط هکر در سیستم باشد asterisk جواب ۴۰۱ “UNAUTHORIZED” یا ۴۰۷ “PROXY AUTHENTICATION REQUIRED” را بر می گرداند و اگر username ارسالی توسط هکر در سیستم یافت نشود asterisk جواب ۴۰۴ “NOT FOUND” را بر می گرداند و این به هکر کمک می کند تا براحتی username های موجود در سیستم را پیدا کند. برای این منظور alwaysauthreject را در تنظیمات sip.conf خود برابر با yes قرار دهید تا asterisk به تمامی درخواست ها جواب ۴۰۱ یا ۴۰۷ را برگرداند.
- استفاده نکردن از شماره به عنوان username
- راه اندازی tls
- محدود کردن IP های مجاز برای یک داخلی
پروتکل sip به صورت پیش فرض از روش HTTP Digest برای احرازهویت کاربران خود استفاده می کند
احراز هویت در SIP:
-
ابتدا client یک در خواست REGISTER به sip سرور ارسال می کند
-
سپس sip سرور پاسخ ۴۰۱ یا ۴۰۷ را بر میگرداند
-
سپس client درخواست REGISTER خود را به همراه secret خود را ارسال میکند
1-
REGISTER sip:192.168.1.138;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.1.138:5061;branch=z9hG4bK-d8754z-84186a35f1e76cd2-1—d8754z-
Max-Forwards: 70
Contact: <sip:[email protected]:5061;rinstance=991c8af008b63d90;transport=UDP>
To: <sip:[email protected];transport=UDP>
From: <sip:[email protected];transport=UDP>;tag=2059497e
Call-ID: OTBkOGJhMmYwNTQ4M2U0ODBmOTU0YmQzODViOWVmM2U.
CSeq: 1 REGISTER
Expires: 3600
Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE
Supported: replaces, norefersub, extended-refer, X-cisco-serviceuri
User-Agent: Zoiper rev.11619
Allow-Events: presence, kpml
Content-Length: 0
2-
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.138:5061;branch=z9hG4bK-d8754z-84186a35f1e76cd2-1—d8754z-;received=192.168.1.138;rport=5061
From: <sip:[email protected];transport=UDP>;tag=2059497e
To: <sip:[email protected];transport=UDP>;tag=as503e8ab6
Call-ID: OTBkOGJhMmYwNTQ4M2U0ODBmOTU0YmQzODViOWVmM2U.
CSeq: 1 REGISTER
Server: Asterisk PBX 10.0.0
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm=”abdi“, nonce=”4674f014“
Content-Length: 0
3-
REGISTER sip:192.168.1.138;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.1.138:5061;branch=z9hG4bK-d8754z-f372cbe708a324d0-1—d8754z-
Max-Forwards: 70
Contact: <sip:[email protected]:5061;rinstance=991c8af008b63d90;transport=UDP>
To: <sip:[email protected];transport=UDP>
From: <sip:[email protected];transport=UDP>;tag=2059497e
Call-ID: OTBkOGJhMmYwNTQ4M2U0ODBmOTU0YmQzODViOWVmM2U.
CSeq: 2 REGISTER
Expires: 3600
Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE
Supported: replaces, norefersub, extended-refer, X-cisco-serviceuri
User-Agent: Zoiper rev.11619
Authorization: Digest username=”200“,realm=”abdi“,nonce=”4674f014“,uri=”sip:192.168.1.138;transport=UDP“,response=”0b84db8e33d6f961b8f8e17c5a2bf420“,algorithm=MD5
Allow-Events: presence, kpml
Content-Length: 0
محاسبه response توسط client :
string1 = md5(username+”:”+realm+”:”+secret)
string2 = md5(method+”:”+req_uri)
response = md5(string1+”:”+nonce+”:”+string2)
همانطور که میبینید در SIP هیچگاه secret ارسال نمیشود، در واقع client با استفاده از realm و nonce که از سرور دریافت میکند(مرحله ۲) مقدار response را با استفاده از فرمول بالا به دست میآورد و آن را ارسال میکند و سرور نیز به همین روش مقدار response را محاسبه میکند و اگر response خود و client یکی بود authentication با موفقیت انجام میشود.
با توجه به یک طرفه بودن الگوریتم MD5 با داشتن response، رسیدن به secret تقریبا غیر ممکن است اما اگر پسورد انتخاب شده به سادگی قابل حدس زدن باشد هکر به راحتی میتواند response خود را تولید کند و آن را با response فرستاده شده از سوی client مقایسه کند و پسورد را به دست آورد.
Encryption در media :
به دلیل وجود نداشتن هیچ مکانزیم امنیتی در rtp payload، امکان استراق سمع و حتی فهمیدن dtmf های ارسالی توسط شخص ارسال کننده بسیار راحت خواهد بود، اگر شبکه مورد نظر مسائل امنیتی را رعایت نکرده باشد.
SRTP مشخصات RTP تعریف شده در RFC3711 را فراهم می کند که رمزنگاری و احراز هویتهای صوتی داده ها را در یک جریان RTP مشخص می کند. کلید رمزگذاری و گزینه ها در پیام های INVITE رد و بدل شده، به این منظور ترجیحا از SIPS استفاده شود
برای encryption و decryption در SRTP از AES استفاده می شود.
Asterisk Dialplan Injection
یکی از رایج ترین از مشکلات امنیتی در asterisk قبول کردن wildcard در {EXTEN}$ است. با داشتن wildcard در dialplan ممکن است شخص با تزریق کردن string، اجازه گرفتن تماس های ناخواسته از نظر سیستم، مورد قبول قرار گیرد.
مانند زیر:
exten => _X.,1,Dial(SIP/${EXTEN})
در این حالت شخص با تماس گرفتن به
۳۰۰&DAHDI/g1/00146165551212
می تواند یک تماس بین اللملی ایجاد در حالی که در Dialplan قصد ما فقط اجازه گرفتن تماس داخلی بوده است.
البته این مشکل امنیتی فقط در تکنولوژی هایی قابل اجرا است که قابلیت ارسال string را داشته باشند مانند SIP.
برای جلوگیری از این گونه تماس ها استفاده از تابع filter در Dialplan است به مثال زیر توجه کنید:
exten => _X.,1,Set(SAFE_EXTEN=${FILTER(0-9,${EXTEN:1})})
same => n,GotoIf($[${EXTEN:1} != ${SAFE_EXTEN}]?error_match,1)
same => n,Dial(SIP/${SAFE_EXTEN})
exten => error_match,1,Verbose(2,Values of EXTEN and SAFE_EXTEN did not match.)
same => n,Verbose(2,EXTEN: “${EXTEN}” — SAFE_EXTEN: “${SAFE_EXTEN}”)
same => n,Playback(silence/1&invalid)
same => n,Hangup()
یکی دیگر از مسائلی که باید مورد توجه قرار گیرد استفاده از فایروال و محدود کردن دسترسی ها می باشد.
هنگامی که تمامی داخلی قرار است از درون شبکه داخلی به سرور متصل شوند نیازی نیست پورت های مانند SIP و IAX در در اینترنت باز گذاشت.
در صورت نیاز به استفاده از پروتکل SIP و IAX از اینترنت استفاده از VPN می تواند گزینه مناسبی باشد، البته به دلیل داشتن overhead بر روی شبکه و تاثیر بر روی کیفیت مکالمه، امکان اجرای VPN نباشد که در این صورت باید راه کارهای امنیتی مناسب به کار گرفته شود.
برای مثال در asterisk با نگاه به فایل var/log/asterisk/messages/ میتوانید با نوشتن یک اسکریپت، ip هایی را که چند بار برای register شدن failed شده اند را برای مدتی یا برای همیشه block کنید.
در زیر نمونه ای از این فایل را مشاهده می کنید.
[Jun 19 13:59:54] NOTICE[24287] chan_sip.c: Registration from ‘<sip:[email protected];transport=UDP>’ failed for ’192.168.1.138:5061′ – Wrong password
[Jul 29 17:19:11] NOTICE[4646] chan_sip.c: Registration from ‘”200″<sip:[email protected]:5060>’ failed for ’192.168.88.100:5060′ – Username/auth name mismatch
[Jul 29 17:19:11] NOTICE[4646] chan_sip.c: Registration from ‘”500″<sip:[email protected]:5060>’ failed for ’192.168.88.100:5060′ – No matching peer found