แ แแแแกแแช แแ แแแแแแแแแจแ แกแแแฃแจแแแ แแแแแแ, แฃแแแ แแฅแแแแ IP แแแฌแงแแแแแแแแแแก แแแแแชแแแแ แแแแ, แ แแแแแแแแ แกแแ แแแ แ แแแ แกแแแแแแแ แแ แแแขแฉแ FreeBPX-แแก แกแแฎแแ. แแแ แแ แแแแกแ, แแแ แแแแแฃแ แแ แแฃแจแแแแแ แแแแแแแฃแ แ PBX Samsung IDCS500 แแ, แแแแแแแ, แแแแแแแแแก แแแแแแ แ แกแแแแแฃแแแแแชแแ แกแแกแขแแแ แแงแ, IP แขแแแแคแแแ แแฎแแแแ แแแงแแแแแแแก แแแแงแแคแแแแแแจแ แแฃแจแแแแแ. แแ แงแแแแแคแแ แ แแกแ แแแแ แซแแแแแแแแ, แแแแ แแ แแ แ แแจแแแแแแ แแฆแแก แแแแฆแแก แแแแแแ แแฃแแแแ แงแแแแแก IP แขแแแแคแแแจแ แแแแแงแแแแแก แจแแกแแฎแแ, แจแแแแแฎแแแแฃแแ แแฅแแ แแแแแแ, แจแแแซแแแแก แแฆแญแฃแ แแแแแแ แแ แแแแฌแงแ แกแแฌแแ แแแก 21-แ แกแแฃแแฃแแแจแ แแแแแขแแแแก แแแแแ.
แแแ แแแแ, แ แแช แแกแแ แกแแขแฃแแชแแแจแ แจแแจแคแแแแแแก แแฌแงแแแก, แแ แแก แขแแแแคแแแแแแก แกแฌแ แแคแแ แแแแ แแ แ แแแแแแแแ, แ แแแแแแ แแแ แแแ แ แแแแ แแ แฃแแแ แแแฎแแแก, แแแแ แ, แ แแช แซแแแแแ แจแแแแจแคแแแแแแแ แแงแ, แแงแ แกแแขแแแแคแแแ แฌแแแแ. แแฃ Endpoint Manager-แแ แแแแแแฎแแแ แ แแแ แแแแจแ (แ แแแแแแช, แกแฎแแแแ แจแแ แแก, แแแแฆแแแฃแแแ FreePBX-แแก แฃแแฎแแแกแ แแแ แกแแแแแแแ), แแแจแแ แฌแแแแแแ แแแแแแจแแ แแแแ แแแฉแแแ แ แแแแแแแแ แแแแฎแแ:
- แแแ แแแ แ แแแจแ, แ แแแแ แฃแแ แฃแแแแแแงแแ แแแกแ แกแแแฃแกแขแ, แ แแแแกแแช แแแแฎแแแ แแแแแแแก แแแแแแ แแแแ/แกแแแฎแ แแฃแแแแแแ แแชแแแแแ?
- แแแแ แแช, แ แแแแ แแแแแฎแแแแแ แขแแแแคแแแแแแก แกแ แฃแแ แแแแแ แกแแแแแแแแชแแ. แแ แงแแแแ แฏแแ แแ แแ แจแแแแกแแ แกแแแแแขแแฅแขแ แกแแฎแแแ?
แแ แแแแแแ แกแแแแขแแ แแกแ แแงแ, แแแแแกแแแแแก แแแแ แแ แ แแ แแแกแญแแ แแแแแ. แแฎแแ แแ แแแแชแแแ แกแ แฃแ แฉแแแแแแแแแแก แแ แจแแแแแ แแแแแแฎแแแแแ แแแก แแแแแแแแแแ แแแแ.
from scapy.all import sniff
from scapy.layers.inet import IP
import mysql.connector
import ldap
import getpass
import tftpy
import requests
import os
import time
from string import replace
def conn_ldap(login):
ad = ldap.initialize('ldap://***.local')
ad.simple_bind_s('voip@***.local', 'password')
basedn = 'OU=IT,DC=***,DC=LOCAL'
basedn_user = 'OU=***,OU=***,DC=***,DC=LOCAL'
scope = ldap.SCOPE_SUBTREE
filterexp = "(&(sAMAccountName=" + login + ")(ObjectClass=person))"
filterexp2 = "(&(ObjectClass=organizationUnit))"
attrlist = ['cn']
attrlist2 = ['OU']
search = ad.search_s(basedn, scope, filterexp, attrlist)
adname = search[0][1]['cn'][0].decode('utf-8')
if adname == ' ':
search = ad.search_s(basedn_user, scope, filterexp2, attrlist2)
for i in range(1, len(search)+1):
group = search[i][1]['ou'][0]
basedn_user2 = 'OU='+group+','+basedn_user
search = ad.search_s(basedn_user2, scope, filterexp, attrlist)
adname = search[0][1]['cn'][0].decode('utf-8')
if adname != ' ':
return adname
adname = search[0][1]['cn'][0].decode('utf-8')
ad.unbind_s()
return adname
def tftp_file_change(config,place,adname,current_account,current_account_password):
client = tftpy.TftpClient("192.168.0.3", 69)
client.download('template.cfg', place)
fileread = open(place, 'r')
line = fileread.readlines()
fileread.close()
line[5] = (('account.1.label = ').encode('utf-8') + adname.encode('utf-8') + 'n')
line[2] = (('account.1.auth_name = ').encode('utf-8') + current_account.encode('utf-8') + 'n')
line[3] = (('account.1.display_name = ').encode('utf-8') + current_account.encode('utf-8') + 'n')
line[6] = (('account.1.password = ').encode('utf-8') + current_account_password[0][0] + 'n')
filewrite = open(place, 'w')
for i in line:
filewrite.write(i)
filewrite.close()
print place
print config
client.upload(config,place)
def get_phone_inform(ipaddr):
fileconf = requests.get('http://admin:admin@'+ipaddr+'/servlet?phonecfg=get[&accounts=1]')
conf = fileconf.text.split('|')
current_account = conf[2]
return current_account
def sniff_frame():
pcapf = sniff(count=1, timeout=70, filter="dst host 192.168.0.3 and port 5060")
if len(pcapf) == 0:
exit()
frame = pcapf[0]
macaddr = frame.src
print macaddr[:8]
if macaddr[:8] != '80:5e:c0':
exit()
ipaddr = frame[0][IP].src
return macaddr, ipaddr
def conn_mysql(query,fquery,macaddr,qwery2):
connect = mysql.connector.connect(host='192.168.0.3', database='voip', user='voip_wr', password='***')
cursor = connect.cursor()
cursor.execute(fquery)
state = cursor.fetchall()
state = bool(state[0][0])
if state == True:
cursor.execute(qwery2)
connect.commit()
connect.close()
else:
cursor.execute(query)
connect.commit()
connect.close()
def check_account(current_account):
connect = mysql.connector.connect(host='192.168.0.3', database='asterisk', user='voip_wr', password='***')
cursor = connect.cursor()
qwery = 'select data from sip where id=' + current_account + ' and keyword="secret";'
cursor.execute(qwery)
password = cursor.fetchall()
if password == ' ':
exit()
else:
return password
if __name__ == '__main__':
macaddr, ipaddr = sniff_frame()
current_account = get_phone_inform(ipaddr)
current_account_password = check_account(current_account)
macaddr = macaddr.replace(':', '')
ipaddr = ipaddr.decode('utf-8')
adname = conn_ldap(getpass.getuser())
query = 'INSERT INTO station (mac, ip, name, number) VALUES (' + '"' + macaddr + '",' + '"' + ipaddr + '",' + '"' + adname + '",' + '"' + get_phone_inform(ipaddr) + '"' + ')'
qwery2 = 'UPDATE station SET ip=' + '"' + ipaddr + '"' + ', name=' + '"' + adname + '"' + ', number=' + '"' + get_phone_inform(ipaddr) + '"' + ' WHERE mac=' + '"' + macaddr + '"'
fquery = 'SELECT EXISTS(SELECT mac FROM voip.station WHERE mac=' + '"' + macaddr + '")'
query = query.encode('utf-8')
fquery = fquery.encode('utf-8')
config = macaddr + '.cfg'
place = os.path.expanduser("~") + "" + "AppDataLocal" + config
conn_mysql(query,fquery,macaddr,qwery2)
tftp_file_change(config,place,adname,current_account,current_account_password)
requests.get('http://admin:admin@'+ipaddr+'/cgi-bin/ConfigManApp.com?key=AutoP')
requests.get('http://admin:admin@'+ipaddr+'/cgi-bin/ConfigManApp.com?key=Reboot')
แแ แแแ แแแ แแฃแจแแแแก แแแแฎแแแ แแแแแก แแแแแแฃแขแแ แแ แแ แแฃแจแแแแก แแ แแแ แแแแ, แ แแ แแแแแแฃแขแแ แ แแแแแแจแแ แแแฃแแแ แฅแกแแแแแ แขแแแแคแแแแก แกแแจแฃแแแแแแ, แแแแแแแแ Yealink T19 แแแ แแฃแจแแแแก แ แแแแ แช แแแ แแแญแ.
แแแ แแแ แ แแแจแ, แฃแแแ แแแแแแแ แแ แแก แแฃ แแ แ แแก แแแแแแจแแ แแแฃแแ? แแ แ แ mac แแ ip แแฅแแก แฉแแแแก แขแแแแคแแแก.
def sniff_frame():
pcapf = sniff(count=1, timeout=70, filter="dst host 192.168.0.3 and port 5060")
if len(pcapf) == 0:
exit()
frame = pcapf[0]
macaddr = frame.src
print macaddr[:8]
if macaddr[:8] != '80:5e:c0':
exit()
ipaddr = frame[0][IP].src
return macaddr, ipaddr
แแฅ แแแงแแแแแ sniff แคแฃแแฅแชแแแก scapy frame-แแแ, แแแกแ แแแฎแแแ แแแแ แแแฆแแแ แฌแแแแกแฌแแ แแแแกแแแฆแแ แฃแ udp แแแแแขแก, แแแแแแแแแ 70 แฌแแแก แแ แแฃ แแแ แแคแแ แก แแแแแญแแ แ, แแแแแแแแแแ แ.
count=1, timeout=70, filter="dst host 192.168.0.3 and port 5060"
แจแแแแแแ, แฉแแแ แแแแ แฌแแฃแแแแแแ, แ แแ แแแฌแงแแแแแแแ แแแแแแแแแ แแ แแก Yealink แแ แแแแ แฃแแแแ แกแแญแแ แ แแแแจแแแแแแแแแก (ip แแ mac).
แกแแแชแแแแฃแ แ แแแแฎแแแแแก แแแแแงแแแแแแ, แฉแแแ แแแแแแ แแแแแแแแ แ แแแแแ แแจแก แขแแแแคแแแแ. แแแแกแแแแแก แแแแแแแแ แ แแแแคแแแฃแ แแชแแ แแแแแแฌแแ แแแแ แขแแแแคแแแแแแ แแ แแแแแแแแแแ.
def get_phone_inform(ipaddr):
fileconf = requests.get('http://admin:admin@'+ipaddr+'/servlet?phonecfg=get[&accounts=1]')
conf = fileconf.text.split('|')
current_account = conf[2]
return current_account
แจแแแขแงแแแ แแ แแแแแ แแจแแก แแแ แแแ. แแแแกแแแแแก แแแแแแ แแแแ asterisk.sip แชแฎแ แแแก แแ แแแกแจแ แแ แกแแแฃแ แแแแแชแแแแ แแแแก.
def check_account(current_account):
connect = mysql.connector.connect(host='192.168.0.3', database='asterisk', user='voip_wr', password='***')
cursor = connect.cursor()
qwery = 'select data from sip where id=' + current_account + ' and keyword="secret";'
cursor.execute(qwery)
password = cursor.fetchall()
if password == ' ':
exit()
else:
return password
แแกแ, แกแแแแแแ แแขแแแแกแแแแก แฉแแแ แแฃแแแแจแแ แแแแแ ldap AD-แก แแ แแแงแแแแแ แคแฃแแฅแชแแแ แแแฆแแแฃแแ sAMAccountName-แก getpass.getuser() แแแฆแแ แแแแแแแแ แ แแแแฎแแแ แแแแแก cn (แ แแแแแแช แฉแแแฃแแแแ แแ แจแแแชแแแก แแแแฎแแแ แแแแแก แกแ แฃแ แกแแฎแแแก).
def conn_ldap(login):
ad = ldap.initialize('ldap://***.local')
ad.simple_bind_s('voip@***.local', 'password')
basedn = 'OU=***,DC=***,DC=LOCAL'
basedn_user = 'OU=***,OU=***,DC=***,DC=LOCAL'
scope = ldap.SCOPE_SUBTREE
filterexp = "(&(sAMAccountName=" + login + ")(ObjectClass=person))"
filterexp2 = "(&(ObjectClass=organizationUnit))"
attrlist = ['cn']
attrlist2 = ['OU']
search = ad.search_s(basedn, scope, filterexp, attrlist)
adname = search[0][1]['cn'][0].decode('utf-8')
if adname == ' ':
search = ad.search_s(basedn_user, scope, filterexp2, attrlist2)
for i in range(1, len(search)+1):
group = search[i][1]['ou'][0]
basedn_user2 = 'OU='+group+','+basedn_user
search = ad.search_s(basedn_user2, scope, filterexp, attrlist)
adname = search[0][1]['cn'][0].decode('utf-8')
if adname != ' ':
return adname
adname = search[0][1]['cn'][0].decode('utf-8')
ad.unbind_s()
return adname
แฉแแแ แแฃแแแแจแแ แแแแแ แแแแแชแแแแ แแแแแจแ แฌแแแแกแฌแแ แจแแฅแแแแ แชแฎแ แแแก (แแ แแฅ แจแแแฅแแแแ) แแ แจแแแแงแแแแ แงแแแแแคแแ แก, แ แแช แแแกแฌแแแแแ, แแแ แซแแ: ip, mac, แแแแฎแแแ แแแแแก แกแแฎแแแ.
def conn_mysql(query,fquery,macaddr,qwery2):
connect = mysql.connector.connect(host='192.168.0.3', database='voip', user='voip_wr', password='***')
cursor = connect.cursor()
cursor.execute(fquery)
state = cursor.fetchall()
state = bool(state[0][0])
if state == True:
cursor.execute(qwery2)
connect.commit()
connect.close()
else:
cursor.execute(query)
connect.commit()
connect.close()
แจแแแแแซแแ แแฅ แแแฉแแ แแแ, แ แแแแแ แฃแแแ แจแแแฅแแแแแ แแแแแแแฃแ แ แแแกแแแแ แแแแแก แฌแแแแ, แจแแแซแแแแ แแแแแฎแแ, แแแแ แแ แแ แฃแคแ แ แจแแ แก แฌแแแแแ แแ แแฅ แแแแแแแขแ แแแฌแงแแแแแแแแแแก แแแขแแแแขแฃแ แ แฃแแ แฃแแแแแงแแคแ.
แแแแกแแแแแก แฉแแแแขแแแ แแฃแแแ แจแแแแแแแก แแแแคแแแฃแ แแชแแ แฌแแแแกแฌแแ แแแแคแแแฃแ แแ แแแฃแแ tftp แกแแ แแแ แแแแ, แ แแแแแจแแช แแแแแแแแ แชแแแแแแแแแก แแ แแแแแฎแแแ แแแก แ แแแแ แช mac.cfg. แแแฃ Yealink-แแกแแแแก แแ แกแแแแแก แแ แ แกแแฎแแก แแแแคแแแฃแ แแชแแ, แแ แแ แแ แแก แแแแแแแฃแ แ แแ แแแแ แ แแฎแแแ แแแแแ แแขแฃแ แขแแแแคแแแก แแ แฃแแแ แแงแแก mac_phone.cfg แคแแ แแแก.
แคแแแแจแ แงแแแแ แชแแแแแแแแก แแ tftp แกแแ แแแ แแ แจแแแแฎแแแก แจแแแแแ, แขแแแแคแแแก แแแซแแแแ แแ แซแแแแแแก, แ แแ แฃแแ แฃแแแแแงแแก แแ แแแแแขแแแ แแแก แแแฌแงแแแแแแแ.
def tftp_file_change(config,place,adname,current_account,current_account_password):
client = tftpy.TftpClient("192.168.0.3", 69)
client.download('template.cfg', place)
fileread = open(place, 'r')
line = fileread.readlines()
fileread.close()
line[5] = (('account.1.label = ').encode('utf-8') + adname.encode('utf-8') + 'n')
line[2] = (('account.1.auth_name = ').encode('utf-8') + current_account.encode('utf-8') + 'n')
line[3] = (('account.1.display_name = ').encode('utf-8') + current_account.encode('utf-8') + 'n')
line[6] = (('account.1.password = ').encode('utf-8') + current_account_password[0][0] + 'n')
filewrite = open(place, 'w')
for i in line:
filewrite.write(i)
filewrite.close()
print place
print config
client.upload(config,place)
requests.get('http://admin:admin@'+ipaddr+'/cgi-bin/ConfigManApp.com?key=AutoP')
requests.get('http://admin:admin@'+ipaddr+'/cgi-bin/ConfigManApp.com?key=Reboot')
แแแฌแงแแแแแแแแก แแแแแขแแแ แแแแก แจแแแแแ, แขแแแแคแแแแก แแแ แแแแ แแแฆแแแ แฉแแแแก แกแ แฃแ แกแแฎแแแก + แงแแแแแแแแก แกแฌแแ แแ แจแแแกแแแฃแ แแแกแแแแ แแแแแก แฌแแแแก แแแแแชแแแแ แแแแแก แกแแฎแแ, แจแแแแแ แ แฉแแแ แแฎแแแแ XML แแ แชแแขแ PHP แแแแแขแแแ, แ แแ แจแแแแแ แกแ แแแแแแแฃแ แแ แแแแแฉแแแแก. แแกแแแ แแแแแแแแแแ แแแแ แแ, แแแแ YEALINK-แกแแช แแ แแฅแแก.
PS: แฃแคแ แ แแแกแจแขแแแฃแ แแแแกแแแแก, แจแแแแซแแแแ แแแแแแขแแแแ แซแแ แแแแแ แแแ แแแแขแ แแแ (แชแแแแแแแ) แชแแแแ แคแแแแจแ.
แฌแงแแ แ: www.habr.com