OpenSSL 命令注入(CVE-2022-1292)浅浅析

admin 2025年2月15日09:24:17评论53 views字数 3685阅读12分17秒阅读模式

OpenSSL 命令注入(CVE-2022-1292)浅浅析

0x01  前言

前几日看到各厂商发布了OpenSSL命令注入漏洞 (CVE-2022-1292) 安全风险通告,深夜无眠的我决定研究复现一下。从各通告中了解到漏洞位于c_rehash脚本文件,通过漏洞描述了解到是脚本未验证传入参数导致命令注入,基于以上信息开始这次漏洞研究复现之旅。

0x02  漏洞分析

首先查看一下c_rehash脚本的内容。

通过以下命令查找文件位置,通常是在/usr/bin目录下

whereis c_rehashfind / -name c_rehash

OpenSSL 命令注入(CVE-2022-1292)浅浅析

查看脚本文件内容,找到漏洞位置,漏洞位于link_hash_crl()link_hash_cert()两个函数

sub link_hash_cert {                my $fname = $_[0];                my $x509hash = $_[1] || '-subject_hash';                $fname =~ s/'/'\''/g;                my ($hash, $fprint) = `"$openssl" x509 $x509hash -fingerprint -noout -in "$fname"`;                chomp $hash;                chomp $fprint;                $fprint =~ s/^.*=//;                $fprint =~ tr/://d;                my $suffix = 0;                # Search for an unused hash filename                while(exists $hashlist{"$hash.$suffix"}) {                        # Hash matches: if fingerprint matches its a duplicate cert                        if ($hashlist{"$hash.$suffix"} eq $fprint) {                                print STDERR "WARNING: Skipping duplicate certificate $fnamen";                                return;                        }                        $suffix++;                }                $hash .= ".$suffix";                if ($symlink_exists) {                        print "link $fname -> $hashn" if $verbose;                        symlink $fname, $hash || warn "Can't symlink, $!";                } else {                        print "copy $fname -> $hashn" if $verbose;                        if (open($in, "<", $fname)) {                            if (open($out,">", $hash)) {                                print $out $_ while (<$in>);                                close $out;                            } else {                                warn "can't open $hash for write, $!";                            }                            close $in;                        } else {                            warn "can't open $fname for read, $!";                        }                }                $hashlist{$hash} = $fprint;}///////////////////////////////sub link_hash_crl {                my $fname = $_[0];                my $crlhash = $_[1] || "-hash";                $fname =~ s/'/'\''/g;                my ($hash, $fprint) = `"$openssl" crl $crlhash -fingerprint -noout -in '$fname'`;                chomp $hash;                chomp $fprint;                $fprint =~ s/^.*=//;                $fprint =~ tr/://d;                my $suffix = 0;                # Search for an unused hash filename                while(exists $hashlist{"$hash.r$suffix"}) {                        # Hash matches: if fingerprint matches its a duplicate cert                        if ($hashlist{"$hash.r$suffix"} eq $fprint) {                                print STDERR "WARNING: Skipping duplicate CRL $fnamen";                                return;                        }                        $suffix++;                }                $hash .= ".r$suffix";                if ($symlink_exists) {                        print "link $fname -> $hashn" if $verbose;                        symlink $fname, $hash || warn "Can't symlink, $!";                } else {                        print "cp $fname -> $hashn" if $verbose;                        system ("cp", $fname, $hash);                        warn "Can't copy, $!" if ($? >> 8) != 0;                }                $hashlist{$hash} = $fprint;}

$fname参数的传入是关键点,通过回溯发现hash_dir()check_file()函数分别对文件名和文件内容做了一个验证,不符合的文件不会进入到上述漏洞函数。

sub hash_dir {        my %hashlist;        print "Doing $_[0]n";        chdir $_[0];        opendir(DIR, ".");        my @flist = sort readdir(DIR);        closedir DIR;        if ( $removelinks ) {                # Delete any existing symbolic links                foreach (grep {/^[da-f]+.r{0,1}d+$/} @flist) {                        if (-l $_) {                                print "unlink $_" if $verbose;                                unlink $_ || warn "Can't unlink $_, $!n";                        }                }        }        FILE: foreach $fname (grep {/.(pem)|(crt)|(cer)|(crl)$/} @flist) {                # Check to see if certificates and/or CRLs present.                my ($cert, $crl) = check_file($fname);                if (!$cert && !$crl) {                        print STDERR "WARNING: $fname does not contain a certificate or CRL: skippingn";                        next;                }                link_hash_cert($fname) if ($cert);                link_hash_cert_old($fname) if ($cert);                link_hash_crl($fname) if ($crl);                link_hash_crl_old($fname) if ($crl);        }}///////////////////////sub check_file {        my ($is_cert, $is_crl) = (0,0);        my $fname = $_[0];        open IN, $fname;        while(<IN>) {                if (/^-----BEGIN (.*)-----/) {                        my $hdr = $1;                        if ($hdr =~ /^(X509 |TRUSTED |)CERTIFICATE$/) {                                $is_cert = 1;                                last if ($is_crl);                        } elsif ($hdr eq "X509 CRL") {                                $is_crl = 1;                                last if ($is_cert);                        }                }        }        close IN;        return ($is_cert, $is_crl);}

基于以上分析,得到两个要素:

  • 文件是一个证书文件

  • 通过操控证书文件名来达到命令注入

0x03  漏洞复现

首先建立一个测试文件夹使用openssl生成证书文件

openssl req -x509 -sha512 -nodes -days 730 -newkey rsa:2048 -keyout custom.key -out custom.pem

OpenSSL 命令注入(CVE-2022-1292)浅浅析

接下来就是构造恶意文件,然后执行c_rehash脚本触发漏洞。

OpenSSL 命令注入(CVE-2022-1292)浅浅析

通过不断地尝试,在耗尽电脑最后一丝电量前终于是达到了命令执行的效果,在执行成功后目录下会生成一个链接文件,其文件名则是执行命令的结果。

个人感觉比较鸡肋,还没有想到利用场景,命令执行权限为当前执行用户权限,能力有限,不足之处还望指正。

0x04  修复建议

前,官方已发布可更新版本,用户可升级OpenSSL版本:

OpenSSL 1.0.2 升级至 1.0.2ze (仅针对高级用户);

OpenSSL 1.1.1 升级至 1.1.1o;

OpenSSL 3.0 升级至 3.0.3;

参照:https://www.openssl.org/source/

    • 缓解措施:

    使用OpenSSL rehash代替c_rehash。

    • 自查脚本:

    公众号后台回复 CVE-2022-1292 获取自查脚本。

0x05  免责声明

本文仅限于技术研究学习,切勿将文中技术细节用作非法用途,如有违者后果自负。

关于我们

“TERRA星环”安全团队正式成立于2020年,是贵州泰若数字科技有限公司旗下以互联网攻防技术研究为目标的安全团队。团队核心成员长期从事渗透测试、代码审计、应急响应等安服工作,多次参与国家、省级攻防演练行动,具备丰富的安服及攻防对抗经验。

团队专注于漏洞挖掘、漏洞研究、红蓝对抗、CTF夺旗、溯源取证、威胁情报、代码审计、逆向分析等研究。对外提供安全评估、安全培训、安全咨询、安全集成、应急响应等服务。

原文始发于微信公众号(TERRA星环安全团队):OpenSSL 命令注入(CVE-2022-1292)浅浅析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月15日09:24:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   OpenSSL 命令注入(CVE-2022-1292)浅浅析https://cn-sec.com/archives/1053255.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息