huasec 09月12日
通过空间测绘技术发现Havoc Teamserver
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了如何利用空间测绘技术来识别Havoc Teamserver。文章详细分析了Havoc Teamserver与客户端通过WebSocket在默认端口40056进行通信的认证机制,包括用户名、密码的SHA3-256哈希验证过程,以及认证成功和失败后的客户端响应。此外,还总结了Havoc Teamserver的SSL证书特征,如2048位RSA密钥、自签名CA证书、美国地址信息以及随机化的有效期和地理位置详情。同时,文章揭示了HTTP响应中的伪造404页面特征,特别是Server: nginx、Content-Type: text/html和X-Havoc: true等关键标识。最后,作者提出了结合这些特征进行扫描和验证的综合思路,旨在帮助安全研究人员更有效地发现和分析Havoc Teamserver实例。

🕵️‍♂️ **WebSocket通信与认证机制**:Havoc Teamserver默认使用WebSocket协议在40056端口进行通信,其认证过程涉及客户端向Teamserver发送包含用户名和密码SHA3-256哈希值的登录请求。Teamserver会验证用户名是否存在、用户是否已在线,并比对密码哈希值。认证成功后,Teamserver会发送成功认证的响应,并设置客户端的`Authenticated`状态;认证失败则会发送错误信息并断开连接。

🔒 **SSL证书的特征识别**:Havoc Teamserver的SSL证书具有一些可识别的特征,包括使用2048位RSA密钥、自签名CA证书、固定的美国地址信息,以及随机化的有效期起始时间、地理位置详情和组织信息。这些特征可以作为判断Teamserver证书是否符合Havoc标准的依据。

📄 **HTTP响应特征分析**:当Teamserver遇到请求头验证失败、URI不匹配或User-Agent不匹配等情况时,会生成伪造的Nginx 404页面。该页面具有特定的HTTP状态码(404 Not Found)、响应头(Server: nginx, Content-Type: text/html, X-Havoc: true)以及包含“404 Not Found”标题和“nginx”页脚的响应体。这些特征是识别Teamserver的关键线索。

💡 **综合扫描与验证策略**:文章提出了一种多层面的扫描策略。首先,通过WebSocket协议发送登录验证,观察返回的认证成功或失败信息。其次,检测HTTP响应的Header和HTML源码特征,若命中则对IP进行全端口扫描,并尝试方法一进行验证。最后,测试SSL证书特征,若符合要求,则对IP进行全端口扫描并尝试方法一验证。此方法有助于在网络测绘中更准确地发现Havoc Teamserver。

原创 花十一一 2025-08-18 20:04 北京

上篇分析了Havoc上线的三种方式,接下来看看如何从空间测绘侧发现Havoc teamserver。AI提供了如下思路,我们一一验证可行性。

(1) websocket默认端口40056扫描

profiles\havoc.yaotl中teamserver默认配置的监听端口是40056,是Havoc客户端与teamserver进行WebSocket通信的主入口,这个端口承担着客户端连接、命令控制、数据交换和多组件协调的关键作用。配置文件中默认的账号有是5pider/Neo,密码都是password1234。

首先分析下客户端与teamserver的认证逻辑。client\src\Havoc\

Connector.cc文件实现了客户端如何建立连接并进行认证。默认websocket通信的路径是/havoc/,伴有SSL证书加密。构造连接URL为 wss://host:port/havoc/。

在连接建立后,客户端通过SendLogin 方法发送认证请求,构造认证消息包。

1.配置Head.Event = 0x1 (InitConnection.Type)

2.配置Body.SubEvent = 0x3 (OAuthRequest)

3.使用 QCryptographicHash 计算用户密码的SHA3-256 Hash,将结果填充到 Body.Info["Password"] 字段

4.通过 SendPackage 方法发送JSON格式的认证消息

    # 序列成json格式:
    {"Head":{"Event":1,"User":"test","Time":"10:50:54"},"Body":{"SubEvent":1,"Info":{"User":"test","Password":"test"}}}

    teamserver\cmd\server\teamserver.go中handleRequest 方法实现了服务端在接收到请求后处理的过程,teamserver端首先验证用户名是否存在于配置文件中,检查是否已有同名用户在线(防止重复登录),最后调用 ClientAuthenticate 方法进行密码验证:

    - 验证 Head.Event 是否为 InitConnection.Type (0x1)。

    - 验证 Body.SubEvent 是否为 OAuthRequest (0x3)。

    - 从配置文件中查找匹配的用户名 - 使用SHA3-256计算配置文件中存储的密码Hash对比客户端发送的密码Hash与服务端计算的Hash。

    接下来进入认证阶段,认证成功:

      - 服务端设置 client.Authenticated = true

      - 发送 Authenticated(true) 事件给客户端

     - 记录日志: User <username> Authenticated

      - 广播新用户连接事件给所有在线客户端

    认证失败 :

      - 服务端记录错误日志:Client [User: username] failed to Authenticate! (IP地址)

      - 发送 Authenticated(false) 事件给客户端

      - 关闭与客户端的连接

    最后客户端接收到teamserver的认证结果后做如下处理。client\src\Havoc\Packager.cc中的DispatchInitConnection 方法实现。认证成功 :

      - 初始化Havoc UI界面

      - 从配置文件加载脚本

      - 调用 HavocApplication->Start() 启动应用程序

      - 如果是已存在的连接,则创建新的Teamserver标签页

    认证失败 :

     - 显示错误消息框,提示"Couldn't connect to Teamserver"

    理清楚了认证过程,那就可以写脚本来验证登录。如下是账密可用登录成功teamserver返回的信息。

    {
      "Head": {
        "Event": 1,
        "User""",
        "Time""17/08/2025 07:07:07",
        "OneTime"""
      },
      "Body": {
        "SubEvent": 1,
        "Info": {
          "Message": "Successful Authenticated"
        }
      }
    }

    密码错误返回的信息。

    {
      "Head": {
        "Event": 1,
        "User""",
        "Time""17/08/2025 07:10:32",
        "OneTime"""
      },
      "Body": {
        "SubEvent": 2,
        "Info": {
          "Message": "Wrong Password"
        }
      }
    }

    用户名错误返回的信息。

    {
      "Head": {
        "Event": 1,
        "User""",
        "Time""17/08/2025 07:11:31",
        "OneTime"""
      },
      "Body": {
        "SubEvent": 2,
        "Info": {
          "Message": "User doesn't exits"
        }
      }
    }

    基于这些特征,再扫描到havoc teamserver时候可以猜测用户,验证密码。

    (2)SSL证书特征

    关于SSL证书上篇文章有分析,这里总结下证书的几个显著特点。

    - 2048 位 RSA 密钥:使用标准且安全的密钥长度

    - 自签名 CA 证书:证书同时作为 CA 和服务器证书使用

    - 美国地址信息:所有证书的国家代码固定为 "US"

    - 随机化特征:包括有效期起始时间、地理位置详情和组织信息的随机化

    - 有效期设计:基础有效期为3年,但会随机调整起始时间以避免统一到期。

    根据此特征可以验证teamserver 证书是不是符合要求。脚本里需要把预定义的随机特征都覆盖。

    (3)http响应特征

    在teamserver\pkg\handlers\http.go中存 fake404 函数。用于生成伪造的nginx 404页面,该函数在以下情况被调用:

    - 请求头验证失败

    - 请求URI不符合配置

    - User-Agent不匹配

    - 无法解析代理请求

    错误页面的关键特征包括:

    - HTTP状态码 :404 Not Found

    - 响应头 :

    - Server: nginx

    - Content-Type: text/html

    - X-Havoc: true (这是最具辨识度的特征)

    - 响应体 :标准的nginx 404页面,位于teamserver\pkg\handlers\404.html,包含"404 Not Found"标题和"nginx"页脚

    脚本主要验证源码大小、header特征。

    结合上述特征,可以有个思路监控网络测绘中的havoc teamserver。

    1、针对websocket协议发送登录验证逻辑,如果返回了teamserver的响应包,包括"Successful Authenticated"、 "Wrong Password"、"User doesn't exits"三个字符

    2、测绘http协议的header、html源码命中特征后,对IP进行全端口扫描,走方法1验证,如果没有验证,只能说是可疑。

    3、测试ssl证书,命中特征后对IP进行全端口扫描,走方法1验证,如果没有验证,只能说是可疑。

    笔者用此逻辑扫描了一批havoc teamserver,大部分都对默认账密做了修改,当然也扫描到了一些弱口令。

    最后附上teamserver\pkg\packager\types.go中定义了Event、SubEvent全部类型,具体如下。

    Event
    InitConnection (初始化连接) - 0x1
    Listener (监听器操作) - 0x2
    Credentials (凭证管理) - 0x3
    Chat (聊天相关) - 0x4
    Gate (远控相关) - 0x5
    HostFile (主机文件操作) - 0x6
    Session (会话相关) - 0x7
    Module (模块操作) - 0x6
    Misc (杂项) - 0x7 
    Service (服务相关) - 0x9
    Teamserver (团队服务器相关) - 0x10

    每个Event有定义了一些SubEvent。

    1. InitConnection (0x1)
    - Success : 0x1 (认证成功)
    - Error : 0x2 (错误)
    - OAuthRequest : 0x3 (OAuth认证请求)
    - InitInfo : 0x4 (初始化信息)
    - Profile : 0x5 (配置文件)

    2. Listener (0x2)
    - Add : 0x1 (添加监听器)
    - Edit : 0x2 (编辑监听器)
    - Remove : 0x3 (移除监听器)
    - Mark : 0x4 (标记监听器)
    - Error : 0x5 (监听器错误)

    3. Credentials (0x3)
    - Add : 0x1 (添加凭证)
    - Edit : 0x2 (编辑凭证)
    - Remove : 0x3 (移除凭证) 

    4. Chat (0x4)
    - NewMessage : 0x1 (新消息)
    - NewListener : 0x2 (新监听器)
    - NewSession : 0x3 (新会话)
    - NewUser : 0x4 (新用户)
    - UserDisconnected : 0x5 (用户断开连接)

    5. Gate (0x5)
    - Staged : 0x1 (分阶段)
    - Stageless : 0x2 (无阶段)
    - MSOffice : 0x3 (Microsoft Office相关)

    6. HostFile (0x6)
    - Add : 0x1 (添加主机文件)
    - Remove : 0x2 (移除主机文件) 

    7. Session (0x7)
    - NewSession : 0x1 (新会话)
    - Remove : 0x2 (移除会话)
    - Input : 0x3 (输入)
    - Output : 0x4 (输出)
    - MarkAsDead : 0x5 (标记为死亡) 

    8. Module (0x6)
    - Register : 0x1 (注册模块)
    - Unload : 0x2 (卸载模块)
    - Call : 0x3 (调用模块) 
    9. Misc (0x7)
    - MessageBox : 0x1 (消息框) 

    10. Service (0x9)
    - RegisterAgent : 0x1 (注册代理)
    - RegisterListener : 0x2 (注册监听器) 

    11. Teamserver (0x10)
    - Log : 0x1 (日志)
    - Profile : 0x2 (配置文件)

    阅读原文

    跳转微信打开

    Fish AI Reader

    Fish AI Reader

    AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

    FishAI

    FishAI

    鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

    联系邮箱 441953276@qq.com

    相关标签

    Havoc Teamserver 空间测绘 网络安全 渗透测试 WebSocket SSL证书 HTTP响应 网络侦察 Havoc Teamserver Network Reconnaissance Cybersecurity Penetration Testing
    相关文章