0x01 前言
前几日看到各厂商发布了OpenSSL命令注入漏洞 (CVE-2022-1292) 安全风险通告,深夜无眠的我决定研究复现一下。从各通告中了解到漏洞位于c_rehash脚本文件,通过漏洞描述了解到是脚本未验证传入参数导致命令注入,基于以上信息开始这次漏洞研究复现之旅。
0x02 漏洞分析
首先查看一下c_rehash脚本的内容。
通过以下命令查找文件位置,通常是在/usr/bin目录下
whereis c_rehash
find / -name c_rehash
查看脚本文件内容,找到漏洞位置,漏洞位于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
接下来就是构造恶意文件,然后执行c_rehash脚本触发漏洞。
通过不断地尝试,在耗尽电脑最后一丝电量前终于是达到了命令执行的效果,在执行成功后目录下会生成一个链接文件,其文件名则是执行命令的结果。
个人感觉比较鸡肋,还没有想到利用场景,命令执行权限为当前执行用户权限,能力有限,不足之处还望指正。
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)浅浅析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论