ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

curl SMTP EXPN 收件人 CRLF 命令注入:Exploitarium 复现实验与 lib/smtp.c 根源分析

curl SMTP EXPN 收件人 CRLF 命令注入:Exploitarium 复现实验与 lib/smtp.c 根源分析 网络安全渗透测试示例工程【免费下载链接】exploitariumA single archive of public exploit PoCs and vulnerability research writeups. At the time I post these, none have been reported. Feel free to report them yourself and take credit for the CVE if handed out lulz. Please do not abuse these. I do this so to allure people into the field, and Ive always found this is the most efficient way.项目地址https://gitcode.com/GitHub_Trending/ex/exploitarium点击查看免费下载本篇技术指南围绕 Exploitarium 仓库中的curl-smtp-expn-recipient-crlf-injection直接研究条目展开完整讲解如何利用 curl 的CURLOPT_MAIL_RCPT配置文件mail-rcpt选项与自定义 SMTP 请求EXPN/VRFY组合通过收件人操作数中的 CRLF 分隔符向同一已认证 SMTP 会话注入额外命令并投递一封完整邮件。读完本文你将掌握该 PoC 的运行与验证方法、线上会话证据的逐项解读方式以及 curllib/smtp.c中自定义收件人分支的根源分析与补丁方向。一、漏洞本质配置驱动的 SMTP 命令注入1.1 攻击面在哪里curl 对 SMTP 协议的支持允许调用方通过CURLOPT_MAIL_RCPT指定收件人列表。当配合自定义 SMTP 请求如EXPN、VRFY使用时收件人操作数会被直接序列化进协议命令行。本 PoC 证明股票版stockcurl 在收到包含 CRLF 的收件人操作数后会把换行后的内容当作新的 SMTP 命令逐行发送从而在同一个已认证会话中执行任意 SMTP 事务。该条目说明的核心事实是配置为单个已认证的EXPN Friends请求收件人操作数中包含 CRLF 分隔符以及一段完整的 SMTP 事务MAIL FROM→RCPT TO→DATA→ 邮件正文 →.curl 先以AUTH PLAIN完成认证、发出EXPN行随后在同一会话中发送被注入的事务本地 SMTP 对端记录到一封完整邮件后运行脚本写出VULNERABILITY_CONFIRMED.marker。这意味着任何能够控制 curl 配置文件例如通过curl -K加载不可信.curlrc或能影响CURLOPT_MAIL_RCPT取值的应用都有机会把原本单条的EXPN/VRFY请求升级为在同一认证会话内的任意 SMTP 命令执行。1.2 为什么收件人操作数能成为注入点从 README.md 的 “Source Path” 一节可知在 curl 的lib/smtp.c自定义收件人分支中自定义请求字符串在写入前有控制字节检查但收件人操作数被直接拼进 SMTP 命令行未做 CR/LF 过滤。正是这一不对称的处理使得EXPN Friends\r\nMAIL FROM:...这类操作数得以把后续内容解释为新的协议行详见第七节源码分析。二、PoC 架构本地 SMTP 对端 配置驱动运行本条目仓库内仅含复现所需的两个文件README.md 与 run_demo.py其中run_demo.py是完整的运行器实现。2.1 三阶段运行流程运行器 run_demo.py 的执行分为三步启动本地 SMTP 对端SmtpPeer类run_demo.py在本地绑定 TCP 端口并监听单个连接模拟一个最小但合规的 SMTP 服务端生成 curl 配置文件write_configrun_demo.py按--modeexpn/vrfy把载荷写入smtp-crlf-injection.curlrc调用股票版 curl 并记录线上会话以curl -K config方式运行run_demo.py同时把 SMTP 对端收到的每条命令、原始字节与完成消息全部写入事件日志。2.2 本地 SMTP 对端状态机SmtpPeer并非简单回显而是完整实现了 PoC 所需的 SMTP 交互状态机客户端命令对端响应说明EHLO/HELO250-localhost、250-AUTH PLAIN、250 HELP宣告支持AUTH PLAINAUTH PLAIN两段式334后235 2.7.0 authenticated完成认证握手EXPN250 expanded自定义请求被确认到达VRFY250 verified对应--mode vrfy分支MAIL FROM:250 2.1.0 sender ok进入事务发送端阶段RCPT TO:250 2.1.5 recipient ok进入事务收件端阶段DATA354 end with dot进入正文收集模式正文行 .250 2.0.0 queued点终结消息被判定为完成QUIT221 bye结束会话实现细节run_demo.py显示对端在DATA模式下持续收集正文行直到遇到单独一行的.才把完整正文追加到completed_messages并记录message_completed事件所有收到的命令行都会以command事件、收到的原始字节以recv_raw事件含 hex 与文本两种形式写入events列表为后续证据解析提供完整原始数据。2.3 curl 配置文件生成与转义write_config与config_quoterun_demo.py共同保证载荷中的回车换行被转义为\r/\n文本写入.curlrc由 curl 自身的配置文件解析器在加载时还原为真实 CRLF。运行器还会在子进程环境中设置NO_PROXY*与no_proxy*run_demo.py避免本地代理拦截 SMTP 流量curl 子进程带 20 秒超时run_demo.py。三、注入载荷与预期线上会话3.1 载荷结构收件人操作数在Friends之后依次携带 CRLF 与一段完整 SMTP 事务MAIL FROM:probe-senderexample.com RCPT TO:probe-recipientexample.com DATA Subject: injected curl-smtp-injection-marker-v1 .其中curl-smtp-injection-marker-v1是定义于 run_demo.py 的标记常量.用于点终结DATA模式。注意载荷第 4 行是空行\r\n\r\n用于结束邮件头、开始正文。3.2 生成的 curl 配置运行器生成的smtp-crlf-injection.curlrc具有如下形态url smtp://127.0.0.1:port/probe request EXPN mail-rcpt Friends\r\nMAIL FROM:probe-senderexample.com\r\nRCPT TO:probe-recipientexample.com\r\nDATA\r\nSubject: injected\r\n\r\ncurl-smtp-injection-marker-v1\r\n. user alice:secret login-options AUTHPLAIN verbose max-time 10各选项含义与对应 curl API/CLI 语义urlSMTP 会话目标地址与探测路径request EXPN设置自定义请求方法对应CURLOPT_CUSTOMREQUESTCLI 为--request--mode vrfy时此处为VRFYmail-rcpt对应CURLOPT_MAIL_RCPT即被注入的收件人操作数其 CRLF 在配置加载后被还原为真实换行user alice:secretSMTP 认证凭据login-options AUTHPLAIN指定认证机制为 PLAIN对应--login-optionsverbose开启详细输出便于留存 stderr 证据max-time 1010 秒总超时防止会话挂死。3.3 预期线上会话与标记正文在股票版 curl 上预期线上会话wire transcript为EHLO probe AUTH PLAIN AGFsaWNlAHNlY3JldA EXPN Friends MAIL FROM:probe-senderexample.com RCPT TO:probe-recipientexample.com DATA Subject: injected curl-smtp-injection-marker-v1 .其中AGFsaWNlAHNlY3JldA是AUTH PLAIN响应体的 Base64 编码\0alice\0secret由 curl 在user alice:secret与login-options AUTHPLAIN组合下自动生成。可以看到EXPN Friends之后紧跟注入的完整事务证明命令注入发生在同一已认证会话内。对端最终接受message_completed的标记正文为Subject: injected curl-smtp-injection-marker-v1四、环境要求与快速复现4.1 运行前提Python 3带 SMTP 支持的 curl股票版即可无需补丁或自定义构建。使用系统 curl 直接运行python run_demo.py如需指定特定 curl 二进制python run_demo.py --curl /path/to/curl脚本内部会先执行curl --version并把首行版本信息写入证据run_demo.py因此无需手动确认版本若系统 curl 缺少 SMTP 支持可从其版本输出的协议列表中进行确认。4.2 快速运行在条目目录下执行python run_demo.py期望的终端证据输出为curl_exit0 auth_seentrue custom_request_seentrue injected_mail_seentrue injected_rcpt_seentrue injected_data_seentrue message_completedtrue marker_in_messagetrue confirmedtrue marker_filework-dir/VULNERABILITY_CONFIRMED.marker evidence_jsonwork-dir/logs/evidence.jsonconfirmedtrue意味着全部八项检查均通过。marker 文件内容为confirmedtrue command_injectedtrue message_completedtrue recipientprobe-recipientexample.com markercurl-smtp-injection-marker-v1补充说明实际代码写出的 markerrun_demo.py还会额外包含curl_version与mode两行且仅在所有检查通过confirmed时才写入若复现失败例如 curl 版本已修复脚本以退出码 1 结束且不生成 marker。五、自定义参数与生成文件5.1 命令行参数运行器默认把生成文件写入run/stock-curl-smtp-expn常用自定义参数run_demo.py参数默认值说明--curlcurl指定 curl 二进制路径--work-dirrun/stock-curl-smtp-expn生成文件输出目录--host127.0.0.1SMTP 对端监听地址--port0自动分配SMTP 对端监听端口--modeexpn自定义请求类型可选expn/vrfy示例换工作目录、换端口、用VRFY复测同一收件人注入路径python run_demo.py --work-dir /tmp/curl-smtp-expn-poc python run_demo.py --port 2525 python run_demo.py --mode vrfy--mode vrfy时配置文件request VRFY线上会话中custom_request_seen将匹配VRFY Friends其余注入事务完全一致。5.2 生成文件清单每次运行在 work 目录下生成smtp-crlf-injection.curlrc logs/evidence.json VULNERABILITY_CONFIRMED.markersmtp-crlf-injection.curlrc本次使用的 curl 配置文件含转义后的注入载荷logs/evidence.json结构化证据包含 curl 路径与版本、配置文件原文、curl stdout/stderr、解析后的命令会话、对端事件列表及全部布尔检查结果run_demo.pyVULNERABILITY_CONFIRMED.marker确认文件仅在所有检查通过时生成。条目目录本身只包含复现所需的最小源文件不携带预生成的工件。六、证据字段逐项解读auth_seentruecurl 在注入命令被观察到之前已向 SMTP 对端完成AUTH PLAIN认证custom_request_seentrue配置的自定义收件人命令确实以EXPN Friends或VRFY Friends形式到达 SMTP 对端injected_mail_seentrue、injected_rcpt_seentrue、injected_data_seentrue收件人操作数中的 CRLF 在线上产生了额外的MAIL FROM、RCPT TO与DATA命令行message_completedtrue本地 SMTP 对端进入DATA模式并接收到一条以.点终结的完整消息marker_in_messagetrue被接受的消息正文中包含curl-smtp-injection-marker-v1confirmedtrue以上全部条件同时成立即注入链路完整闭环。检查逻辑与confirmed聚合实现在 run_demo.py全部基于对端command事件的命令行前缀匹配与完成消息正文比对可审计、可复现。七、根源分析lib/smtp.c 自定义收件人分支7.1 相关代码注入点位于 curl 的lib/smtp.c自定义收件人分支result Curl_pp_sendf(data, smtpc-pp, %s %s%s, smtp-custom, smtp-rcpt-data, utf8 ? SMTPUTF8 : );该分支把smtp-custom自定义请求串与smtp-rcpt-data收件人操作数直接格式化进协议行。README 明确指出自定义请求字符串在使用前经过了控制字节检查而该分支中的收件人操作数被直接写入 SMTP 命令行。也就是说EXPN/VRFY这类自定义请求的请求体本身有防御但同一条命令里的收件人操作数缺少同等校验CR 与 LF 得以原样进入协议流被服务端解析为命令分隔。7.2 补丁方向修复思路是在把自定义 SMTP 收件人操作数序列化进协议行之前拒绝其中出现的 CR 与 LFif(strpbrk(smtp-rcpt-data, \r\n)) { failf(data, Refusing to send SMTP command operand with a CR or LF); return CURLE_BAD_FUNCTION_ARGUMENT; }该检查在Curl_pp_sendf之前生效遇到含 CR/LF 的操作数直接以CURLE_BAD_FUNCTION_ARGUMENT失败返回从而在协议层杜绝注入。读者可用--mode vrfy复测同一路径以验证修复是否覆盖自定义请求的所有分支。八、清理与使用边界8.1 清理生成的工件默认运行会在仓库内留下run/stock-curl-smtp-expn目录验证完毕后可删除rm -rf run/stock-curl-smtp-expn若使用了自定义--work-dir则清理对应路径即可。8.2 使用边界本 PoC 属于 Exploitarium 仓库中的直接研究条目direct entry, July 1, 2026见仓库根 README.md 条目表发布时相关缺陷尚未见公开报告旨在以最小可复现样例吸引更多人进入漏洞研究领域仓库根 README.md 的 ABUSE 一节明确声明严禁以任何恶意方式使用本仓库内容本文及该条目均仅用于授权环境下的安全研究与验证。小结curl-smtp-expn-recipient-crlf-injection用极简的“本地 SMTP 对端 配置文件驱动”结构把一个配置层面的 CRLF 注入问题压缩为一行可审计的线上会话证据EXPN Friends之后紧跟完整的MAIL FROM/RCPT TO/DATA事务全部发生在同一已认证会话内。其根源与修复都落在 curllib/smtp.c的自定义收件人分支——对CURLOPT_MAIL_RCPT操作数在序列化前做 CR/LF 拒绝即可闭环。对于任何在代码中动态拼接CURLOPT_MAIL_RCPT并搭配EXPN/VRFY的集成方本文提供的复现脚本、证据字段与补丁片段可作为回归测试与修复落地的直接参考。赞分享网络安全渗透测试示例工程【免费下载链接】exploitariumA single archive of public exploit PoCs and vulnerability research writeups. At the time I post these, none have been reported. Feel free to report them yourself and take credit for the CVE if handed out lulz. Please do not abuse these. I do this so to allure people into the field, and Ive always found this is the most efficient way.项目地址https://gitcode.com/GitHub_Trending/ex/exploitarium点击查看免费下载相关推荐curl --mail-rcpt 完全指南SMTP 多收件人发送、VRFY 地址验证与 EXPN 列表展开curl mail rcpt 完全指南SMTP 多收件人发送、VRFY 地址验证与 EXPN 列表展开 mail rcpt 是 curl 命令行工具面向 SMCLI网络通信ImageMagick Imagetragick 命令注入漏洞CVE-2016-3714复现与原理分析ImageMagick Imagetragick 命令注入漏洞CVE 2016 3714复现与原理分析 ImageMagick 是一款使用范围极广的图片处理网络安全应用安全渗透测试Zabbix Server Trapper 命令注入漏洞CVE-2017-2824复现与原理分析Zabbix Server Trapper 命令注入漏洞CVE 2017 2824复现与原理分析 Zabbix 是一款基于 Server Client 架构网络安全应用安全渗透测试上一篇Termshark快捷键自定义打造你的专属网络分析工作流下一篇微前端架构下的aws-amplify集成方案隔离与共享的完美平衡创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表