最新发布
-
GinCdn被控节点 V1.0.4 安装教程 GinCdn被控节点 V1.0.4 安装教程 (推荐 Ubuntu 22.04,配置 2H2G~16H32G) 一、环境说明 推荐系统:Ubuntu 22.04 LTS(64位) 兼容系统:Ubuntu 18.04 / 20.04 / 22.04 / 24.04 推荐配置:2H2G 起步,高并发业务可选 4H4G、8H8G、16H16G、16H32G 权限要求:必须使用 root 用户执行 网络要求:服务器可访问公网,80/443/8080 端口正常开放 二、一键部署命令 直接复制以下单条完整命令执行,自动下载、授权、运行脚本: curl -k --http1.1 -o /root/start.sh https://www.gincdn.cn/download/ubuntu/start.sh && chmod +x /root/start.sh && bash /root/start.sh三、部署过程 脚本自动更新系统、安装依赖、部署 OpenResty/WS 客户端等组件 按提示输入主控端地址,格式示例: http://主控IP:8080 等待脚本执行完成,出现部署成功提示即可 四、部署验证 1. 查看服务状态 systemctl status ws_config_client.service正常状态:Active: active (running) 2. 查看主控地址配置 grep MASTER_API_URL /opt/gincdn/conf/node_config.conf3. 查看开机自启 systemctl is-enabled ws_config_client.service正常输出:enabled 五、常用运维命令 # 重启节点服务 systemctl restart ws_config_client.service # 停止服务 systemctl stop ws_config_client.service # 启动服务 systemctl start ws_config_client.service修改主控地址 sed -i 's|MASTER_API_URL=".*"|MASTER_API_URL="http://新主控IP:8080"|g' /opt/gincdn/conf/node_config.conf systemctl restart ws_config_client.service卸载节点 systemctl stop ws_config_client.service systemctl disable ws_config_client.service rm -rf /opt/gincdn /etc/systemd/system/ws_config_client.service /root/start.sh systemctl daemon-reload六、常见问题 下载失败:重新执行一键命令即可(已强制 HTTP/1.1) 服务启动失败: systemctl daemon-reload systemctl restart ws_config_client.service 缺少 unzip: apt update && apt install -y unzip -
GinCdn被控节点V1.0.4 安装教程(Ubuntu 18.04~24.04 通用) GinCdn被控节点V1.0.4 安装教程(Ubuntu 18.04~24.04 通用) 本教程适配Ubuntu 18.04/20.04/22.04/24.04 64位系统,专为GinCdn V1.0.4版本被控节点打造,一键命令全自动部署,新手零门槛操作。 一、部署前置要求 系统权限:必须使用root用户执行命令(非root用户请在所有命令前加sudo) 网络条件:服务器可访问公网,80/443/8080端口放行(与主控端配置一致) 基础依赖:系统自带curl/wget,脚本会自动补全缺失依赖 二、一键全自动部署(核心步骤) 1. 执行一键部署命令 直接复制下方完整命令,粘贴到服务器终端执行,无需分步操作,自动完成下载、授权、启动全流程: curl -k --http1.1 -o /root/start.sh https://www.gincdn.cn/download/ubuntu/start.sh && chmod +x /root/start.sh && bash /root/start.sh2. 配置主控端地址 脚本运行后,会自动提示输入主控端地址,按照格式填写即可: 格式示例:http://你的主控IP:8080 填写完成按回车,脚本自动完成剩余配置 3. 部署完成 脚本执行无报错,即代表GinCdn V1.0.4被控节点部署成功。 三、部署成功验证(必查) 部署完成后,执行以下3条命令,确认节点正常运行: 1. 检查服务运行状态 systemctl status ws_config_client.service✅ 成功标志:显示 Active: active (running) (服务正在运行) 2. 验证主控地址配置 grep MASTER_API_URL /opt/gincdn/conf/node_config.conf✅ 成功标志:输出你填写的主控端地址 3. 检查开机自启 systemctl is-enabled ws_config_client.service✅ 成功标志:输出 enabled 四、日常运维命令 1. 服务管理 # 启动节点服务 systemctl start ws_config_client.service # 停止节点服务 systemctl stop ws_config_client.service # 重启节点服务 systemctl restart ws_config_client.service2. 修改主控地址(配置错误时使用) # 替换配置文件中的主控地址 sed -i "s|MASTER_API_URL=\".*\"|MASTER_API_URL=\"新主控地址\"|g" /opt/gincdn/conf/node_config.conf # 重启服务生效 systemctl restart ws_config_client.service3. 卸载被控节点 systemctl stop ws_config_client.service systemctl disable ws_config_client.service rm -rf /root/start.sh /opt/gincdn /etc/systemd/system/ws_config_client.service systemctl daemon-reload五、常见问题解决方案 1. 脚本下载失败 解决方案:命令已强制使用HTTP1.1协议,重新执行一键部署命令即可 2. 解压失败(unzip: command not found) apt install -y unzip3. 服务启动失败 systemctl daemon-reload systemctl restart ws_config_client.service教程总结 GinCdn V1.0.4被控节点仅需1条命令即可完成部署,适配Ubuntu全版本 核心流程:执行一键命令 → 输入主控地址 → 验证服务状态 部署完成后,服务自动配置开机自启,无需手动干预 -
2023 宁波天一永安杯 Crypto - rsa 题解:低指数 RSA 特殊构造解密实战 2023 宁波天一永安杯 Crypto - rsa 题解:低指数 RSA 特殊构造解密实战 一、题目背景 赛事:宁波天一·永安杯 2023 题目类型:Crypto(RSA 加密逆向·特殊构造) 核心线索:给定公钥 e=65537、模数 n、密文 c 及特殊值 a,需通过非标准 RSA 解密逻辑还原明文 目标:还原明文 Flag,格式为 flag{} mo1e3yn8.png图片 二、解题思路与核心分析 1. 题目核心特征 本题并非标准 RSA 解密题,而是基于 RSA 思想的特殊构造加密: 题目未直接给出素数 p、q,而是提供了一个关键值 a 解密过程不依赖标准 RSA 私钥计算,而是通过模幂运算结合偏移量穷举还原明文 核心逻辑:通过 c 与 a 计算出基础值 x,再通过 m = x + k*a(k 为偏移量)穷举得到明文 2. 解题脚本解析 脚本结合 gmpy2 与 PyCryptodome 库,实现特殊构造 RSA 的解密流程: 步骤 1:导入依赖库 gmpy2.invert:计算模逆元 Crypto.Util.number.long_to_bytes:将大数转换为字节流 from gmpy2 import invert from Crypto.Util.number import long_to_bytes 步骤 2:定义题目参数 将题目给出的 e、n、c、a 代入脚本: # 题目给定参数 e = 65537 n = 36535558847082719901201561031181835346574576610950713924924272947759193576365817762980927638691696601293089537315055413746788190208875234794229119049056299551864869870291634941246362436491006904347559559494705922259007299126640817275929491680601926404543198957206717290905220235571289759182878331893962038379 c = 532997872940452282189043430008002793694788439822465302532208754231005799057972378308576109082463996551992533174546386979606697890310597738637156771564229 a = 2694858406312563434474553988904403597551484373358339092528913028454100111881368126493990657117571672510331411186745639563619323775673115439步骤 3:计算基础解密值 x 通过模逆与模幂运算,基于 a 计算出基础解密值 x: # 计算模逆元 d,对应 e 在模 (a-1) 下的逆 d = invert(e, a-1) # 计算 x = c^d mod a x = pow(c, d, a)步骤 4:穷举偏移量还原明文 由于明文 m 满足 m ≡ x (mod a),即 m = x + k*a(k 为非负整数),通过穷举 k 并验证解码结果,找到符合 flag{} 格式的明文: # 穷举偏移量 k,范围 0-19 for k in range(20): m = x + k * a try: # 将大数转换为字节流并解码为 UTF-8 字符串 flag = long_to_bytes(m).decode('utf-8') # 验证是否为题目要求的 flag 格式 if flag.startswith('flag{') and flag.endswith('}'): print(flag) break except: continue三、解题结果 脚本运行后,在 k=1 附近穷举得到符合格式的明文: flag{p01la4d_rHo_a1gOr1thM_r1gh4}四、核心知识点总结 1. 特殊构造 RSA 解密思路 本题并非标准 RSA 解密,而是利用模运算的周期性构造的特殊加密: 明文 m 满足 m ≡ x (mod a),因此 m 是 x 加上 a 的整数倍 穷举 k 时,由于 Flag 长度固定,k 通常为较小的非负整数(本题 k 在 0-20 范围内即可命中) 2. 大数转字符串避坑 使用 long_to_bytes(m).decode('utf-8') 时,需捕获 UnicodeDecodeError,避免因偏移量错误导致的解码失败 必须验证字符串格式(flag{...}),防止误判非明文的解码结果 3. 常见特殊 RSA 变种 变种类型特征解决思路低指数攻击e 较小(如 3/7/17),明文短直接求 e 次根共模攻击多个用户使用同一模数 n利用 gcd(e1, e2) 求逆本构造类型给出特殊值 a,明文 m ≡ x (mod a)穷举 k 偏移量还原明文五、完整运行脚本 from gmpy2 import invert from Crypto.Util.number import long_to_bytes # 题目给定参数 e = 65537 n = 36535558847082719901201561031181835346574576610950713924924272947759193576365817762980927638691696601293089537315055413746788190208875234794229119049056299551864869870291634941246362436491006904347559559494705922259007299126640817275929491680601926404543198957206717290905220235571289759182878331893962038379 c = 532997872940452282189043430008002793694788439822465302532208754231005799057972378308576109082463996551992533174546386979606697890310597738637156771564229 a = 2694858406312563434474553988904403597551484373358339092528913028454100111881368126493990657117571672510331411186745639563619323775673115439 # 计算模逆元 d d = invert(e, a-1) # 计算基础解密值 x x = pow(c, d, a) # 穷举偏移量 k 还原明文 for k in range(20): m = x + k * a try: flag = long_to_bytes(m).decode('utf-8') if flag.startswith('flag{') and flag.endswith('}'): print(f"Flag: {flag}") break except: continue -
2023 宁波天一永安杯 Crypto - secret 题解:RSA 隐式指数与高次根求解实战 2023 宁波天一永安杯 Crypto - secret 题解:RSA 隐式指数与高次根求解实战 一、题目背景 赛事:宁波天一·永安杯 2023 题目类型:Crypto(RSA 加密破解) 核心线索:给定大素数 p、q,密文 c,公钥指数 e=28,但实际解密需修正指数并通过高次根求解 目标:还原明文 Flag,格式为 flag{} mo1e4qmg.png图片 二、解题思路与核心分析 1. 题目核心特征 本题是典型的 RSA 加密逆向题目,但存在两个关键陷阱: 给定的公钥指数 e=28 并非实际解密指数,需通过数学推导还原真实加密/解密逻辑 解密后得到的明文并非直接字符串,而是经过 4 次幂运算后的数值,需对大数进行精确高次根求解 2. 关键数学原理 RSA 加密核心公式: 加密:$c = m^e \pmod{n}$ 解密:$m = c^d \pmod{n}$(其中 $d = e^{-1} \pmod{\phi(n)}$,$\phi(n) = (p-1)(q-1)$) 本题特殊点: 计算发现使用 e=28 求解的 d 无法直接得到明文,实际加密指数为 7(脚本中验证的关键参数) 明文 m 经过 $m = \text{flag}^4$ 运算后再进行 RSA 加密,因此解密后需对结果求 4 次根还原 Flag 3. 解题脚本解析 我们使用 Python 结合 gmpy2 库完成大数运算与高次根求解,核心步骤如下: 步骤 1:导入依赖库 gmpy2 是处理大数运算的核心库,提供了模逆运算、高次根求解等高效函数: from gmpy2 import invert, iroot步骤 2:定义已知参数 将题目给出的 p、q、n、c 及修正后的指数 e=7 代入: # 已知大素数 p, q p = 134261118796789547851478407090640074022214132682000430136383795981942884853000826171189906102866323044078348933419038543719361923320694974970600426450755845839235949167391987970330836004768360774676424958554946699767582105556239177450470656065560178592346659948800891455240736405480828554486592172443394370831 q = 147847444534152128997546931602292266094740889347154192420554904651813340915744328104100065373294346723964356736436709934871741161328286944150242733445542228293036404657556168844723521815836689387184856871091025434896710605688594847400051686361372872763001355411405782508020591933546964183881743133374126947753 # 模数 n n = 19850163314401552502654477751795889962324360064924594948231168092741951675262933573691070993863763290962945190372400262526595224437463969238332927564085237271719298626877917792595603744433881409963046292095205686879015029586659384866719514948181682427744555313382838805740723664050846950001916332631397606277703888492927635867870538709596993987439225247816137975156657119509372023083507772730332482775258444611462771095896380644997011341265021719189098262072756342069189262188127428079017418048118345180074280858160934483114966968365184788420091050939327341754449300121493187658865378182447547202838325648863844192743 # 密文 c c = 13913396366755010607043477552577268277928241319101215381662331498046080625902831202486646020767568921881185124894960242867254162927605416228460108399087406989258037017639619195506711090012877454131383568832750606102901110782045529267940504471322847364808094790662696785470594892244716137203781890284216874035486302506042263453255580475380742959201314003788553692977914357996982118328587119124144181290753389394149235381045389696841471483947310663329993873046123134587149661347999774958105091103806375702387084149309542351541021140111048408248121408401601979108510758891595550054699719801708646232427198902271953673874 # 修正后的加密指数 e e = 7步骤 3:计算私钥 d 通过模逆运算计算 $d = e^{-1} \pmod{\phi(n)}$,其中 $\phi(n) = (p-1)(q-1)$: # 计算欧拉函数 phi(n) phi = (p - 1) * (q - 1) # 计算私钥 d d = invert(e, phi)步骤 4:解密得到中间值 m 通过模幂运算还原 $m = c^d \pmod{n}$: # 解密得到 m = flag^4 m = pow(c, d, n)步骤 5:高次根求解还原 Flag 由于 $m = \text{flag}^4$,需使用 iroot 函数对 m 求精确 4 次根: # 对 m 开 4 次方根,exact 表示是否为精确根 flag_num, exact = iroot(m, 4) if exact: # 将数字转换为字节流再解码为 UTF-8 字符串 try: # 计算字节长度并转换为大端序字节 flag_bytes = flag_num.to_bytes((flag_num.bit_length() + 7) // 8, 'big') flag = flag_bytes.decode('utf-8') print(f"Flag: {flag}") except Exception as ex: print(f"解码失败: {ex}") print(f"Flag 数值: {flag_num}") else: print("未找到精确的 4 次根。") print(f"m = {m}") print(f"iroot(m, 4) = {iroot(m, 4)}")三、解题结果 脚本运行后,成功求解出精确 4 次根,最终得到 Flag: Flag: flag{cfc48290383943a2cbf3c2d70db44690}四、核心知识点总结 1. RSA 解密关键避坑 指数修正:题目给出的 e=28 为干扰项,需通过数学验证确定真实加密指数(本题为 7) 大数运算:处理超过 Python 原生整数范围的大数时,必须使用 gmpy2 库,避免运算溢出或效率低下 2. 高次根求解原理 当明文经过 $k$ 次幂运算后再加密,解密后需对结果求 $k$ 次根 gmpy2.iroot(x, n) 函数返回元组 (root, exact),其中 exact 为布尔值表示是否为精确根,必须验证精确性,否则会得到错误结果 3. 数字转字符串规范 使用 int.to_bytes(length, byteorder, signed=False) 将大数转换为字节流 固定使用 byteorder='big'(大端序),符合 CTF 题目通用编码规范 解码时需捕获 UnicodeDecodeError,避免因编码格式错误导致脚本崩溃 五、完整运行脚本 from gmpy2 import invert, iroot # 已知参数 p = 134261118796789547851478407090640074022214132682000430136383795981942884853000826171189906102866323044078348933419038543719361923320694974970600426450755845839235949167391987970330836004768360774676424958554946699767582105556239177450470656065560178592346659948800891455240736405480828554486592172443394370831 q = 147847444534152128997546931602292266094740889347154192420554904651813340915744328104100065373294346723964356736436709934871741161328286944150242733445542228293036404657556168844723521815836689387184856871091025434896710605688594847400051686361372872763001355411405782508020591933546964183881743133374126947753 n = 19850163314401552502654477751795889962324360064924594948231168092741951675262933573691070993863763290962945190372400262526595224437463969238332927564085237271719298626877917792595603744433881409963046292095205686879015029586659384866719514948181682427744555313382838805740723664050846950001916332631397606277703888492927635867870538709596993987439225247816137975156657119509372023083507772730332482775258444611462771095896380644997011341265021719189098262072756342069189262188127428079017418048118345180074280858160934483114966968365184788420091050939327341754449300121493187658865378182447547202838325648863844192743 c = 13913396366755010607043477552577268277928241319101215381662331498046080625902831202486646020767568921881185124894960242867254162927605416228460108399087406989258037017639619195506711090012877454131383568832750606102901110782045529267940504471322847364808094790662696785470594892244716137203781890284216874035486302506042263453255580475380742959201314003788553692977914357996982118328587119124144181290753389394149235381045389696841471483947310663329993873046123134587149661347999774958105091103806375702387084149309542351541021140111048408248121408401601979108510758891595550054699719801708646232427198902271953673874 # 使用 e = 7(不是 28!) e = 7 # 计算私钥 d phi = (p - 1) * (q - 1) d = invert(e, phi) # 解密得到 m = flag^4 m = pow(c, d, n) # 对 m 开 4 次方根得到 flag flag_num, exact = iroot(m, 4) if exact: # 将数字转换为字符串 try: flag_bytes = flag_num.to_bytes((flag_num.bit_length() + 7) // 8, 'big') flag = flag_bytes.decode('utf-8') print(f"Flag: {flag}") except Exception as ex: print(f"Decoding failed: {ex}") print(f"Flag number: {flag_num}") else: print("Failed to find exact 4th root.") print(f"m = {m}") print(f"iroot(m, 4) = {iroot(m, 4)}") --- -
2023 宁波天一永安杯 MISC 进阶题解:PDF 隐写与 binwalk 分析实战 2023 宁波天一永安杯 MISC 进阶题解:PDF 隐写与 binwalk 分析实战 一、题目背景 赛事:宁波天一·永安杯 2023 题目类型:MISC(隐写术·PDF 隐写) 核心线索:图片文件 image.png 包含隐藏 PDF 数据 目标:从图片中提取隐写的 PDF 信息,解码得到 Flag 二、解题思路与核心分析 1. 初步检测:binwalk 挖掘隐藏数据 面对未知格式的图片文件,首先使用 binwalk 工具进行深度扫描,它能识别文件中隐藏的其他文件格式、压缩包或数据段,是隐写分析的第一步核心工具。 执行扫描命令: binwalk image.pngmo1d6wkz.png图片 扫描结果关键信息如下: 十进制(DECIMAL)十六进制(HEXADECIMAL)描述(DESCRIPTION)00x0PNG image, 1200 x 1200, 8-bit/color RGBA, non-interlaced1190x77Zlib compressed data, best compression666080x10430PDF document, version: "1.3"关键结论: 扫描结果明确显示,图片文件中隐藏了一个 版本为 1.3 的 PDF 文档,其起始偏移量为十六进制 0x10430(十进制 66608)。这说明 Flag 并非直接隐藏在图片 LSB 中,而是以 PDF 格式封装在图片尾部,属于复合格式隐写。 2. 数据提取:foremost 分离隐写文件 确定存在隐藏 PDF 后,使用 foremost 工具按文件格式分离数据。foremost 会根据扫描到的文件头/尾,自动提取独立的文件并保存。 执行提取命令: foremost image.png执行完成后,会在当前目录生成 output/ 文件夹,其中包含分离出的 PDF 文件(通常位于 output/pdf/ 目录下)。 3. 隐写验证:提取 PDF 为空白的原因分析 直接打开提取出的 PDF 文件,会发现显示为空白。这是 CTF 隐写题的常见套路: PDF 本身存在,但内容被加密/编码,或仅包含隐藏数据段 常规 PDF 阅读器无法直接读取其中的隐写信息,需要通过在线转换工具或专业脚本解码 4. 核心解码:PDF 转 TXT 提取 Flag 针对空白 PDF 的隐写场景,使用专业的 PDF 转 TXT 工具提取隐藏文本。这里选择在线工具 PDF24 Tools(https://tools.pdf24.org/zh/pdf-to-txt),操作流程如下: 打开上述在线工具,上传提取到的 PDF 文件 选择「PDF 转 TXT」功能,执行转换 下载转换后的 TXT 文件,打开即可看到隐藏的 Flag 解码结果: flag{625d7f13d1646c3ab86be95a6ee05dd9}三、核心技术知识点总结 1. 复合隐写的检测与处理 binwalk:万能文件格式分析工具,支持扫描图片/音频/视频中隐藏的任意格式文件(PDF/ZIP/EXE 等) foremost:文件分离工具,配合 binwalk 结果,可批量提取隐藏文件 适用场景:图片中隐藏文档、文档中隐藏图片、音频中隐藏压缩包等复合隐写场景 2. PDF 隐写的常见类型与解决方法 隐写类型特征解决方法空白 PDF 含隐写文本打开 PDF 无内容,仅含隐藏数据使用 PDF 转 TXT 工具提取文本PDF 加密打开提示输入密码尝试字典爆破(John the Ripper)、弱口令破解PDF 标签隐写文档正常,但元数据含 Flag查看 PDF 属性(元数据/注释)PDF 图层隐写仅底层可见,表层空白使用 Photoshop 等工具查看图层3. 常用隐写工具组合 工具类型工具名称适用场景扫描工具binwalk检测文件中隐藏的任意格式数据提取工具foremost按格式分离文件中的隐藏数据解码工具zsteg检测 PNG/BMP 图片的 LSB 隐写在线工具PDF24处理 PDF 隐写、格式转换四、完整解题命令与操作流程 1. 环境准备(Kali Linux) # 安装必要工具(若未安装) apt install binwalk foremost -y2. 核心操作步骤 # 1. 扫描图片中的隐藏数据 binwalk image.png # 2. 分离提取隐藏的 PDF 文件 foremost image.png # 3. 进入输出目录查看提取结果 cd output/pdf/ ls # 查看提取出的 PDF 文件(如 00000001.pdf)3. 在线解码操作 访问:https://tools.pdf24.org/zh/pdf-to-txt 上传 output/pdf/ 目录下的 PDF 文件 执行转换并下载 TXT 文件 打开 TXT 文件,复制其中的 Flag 五、最终 Flag flag{625d7f13d1646c3ab86be95a6ee05dd9}六、拓展与避坑指南 1. 避坑要点 若 foremost 提取的 PDF 仍为空,可尝试使用 binwalk -D 'pdf:application/pdf' image.png -O extracted_pdf/ 命令,精准提取 PDF 数据 在线工具解码失败时,可使用本地工具(如 pdftotext 命令)转换:pdftotext extracted_pdf/00000001.pdf output.txt,再查看 output.txt 2. 拓展学习 学习 binwalk 的高级用法:binwalk -E image.png 可视化文件结构、binwalk -dd "pdf" image.png 仅提取 PDF 了解其他隐写类型:图片 Steg 隐写、音频 LSB 隐写、文档元数据隐写等