2000P's Blog

最初のページ

17059:サイバーは、oam ssl vpn aes rceを無視します

著者 walkden 時間 2020-04-16
all

私たちは多くの安全研究者と協力して、各大S SL VPNとファイアウォールの重大な脆弱性を発掘してきました。Cyberram、Fortigate、Csco vpnなどは私たちの研究対象です。本論文は、Cyboeram SSL VPN(CyboeramOSともいうことができる)に影響を与えた遠隔コマンド実行の脆弱性についての基本的な説明である。

このCyboeram・ホールはCVE-2019-17059としてマークされています。これはハイリスク・ホールであり、攻撃者は許可なしにCyberramデバイスを直接制御することができます。最も重要なのは、攻撃者へのアクセス権限はrootであり、これは攻撃者にCyberramデバイスを完全に制御することができるという意味です。

CVE-2019-17059 root

ほとんどのネットワーク環境では、CyboeramデバイスはファイアウォールまたはSSL VPNとして使用されているので、攻撃者が完全にデバイスを制御すると、ターゲット内ネットワークを大面積攻撃することができる。また、一般的には、Cyboeramの設備は安全な「ホワイトリスト」の中にあります。これは攻撃者が他の安全防護をよりよく回り道するのを助けます。

Shotdanのデータによると、世界中で96000を超えるインターネットにあるCyberramデバイスがあります。これらの設備の多くは企業や大学、世界的に有名な銀行のネットワークにあります。

Sophosセキュリティチームと協力することはとても楽しいことです。彼らは報告を受けてすぐに深刻さを意識してパッチを発表しました。

Cyber oamOSリモートコマンド実行

CyboeramOSは、Linuxベースの改良版オペレーティングシステムであり、主にCyberramデバイスに使われています。このオペレーティングシステムは、ウェブベースの構成インターフェースと一つのSSL VPN入口を有する。

ホームページの画面は主に二つの部分に分かれています。

Javaで作成したフロントエンド

CとPerlを使って作成したバックエンド

ここではフロントエンドまたはバックエンドコードの内部機構を深く研究するのではなく、この脆弱性をどのようにトリガするかを簡単に議論します。

設定インターフェースとSSL VPN入口には、主な操作を扱うservletがあります。これらの動作はパラメータmodeによって定義される。

mode

ほとんどの操作は身分認証が必要ですが、身分認証が不要な場合に行うことができます。

我々が発見した穴は電子メールアンチウイルス/迷惑メールモジュールにある。このモジュールの要求コードは458です。

电子邮件防病毒/反垃圾邮件

注意したいのは、オペレーティングコードは、Cyberramデバイスデータベース(内部データベースPostgres)のデータに対応します。したがって、458を検索することで、対応するオペレーションコードの名前を見つけることができます。

以下はデータベース初期化SQLスクリプトの一行で、458の対応する操作名を示している。

insert into tblcrevent(opcode,desc ription,mode,requesttype) values('RELEASEQUARANTINEMAILFROMMAIL','RELEASE QUARANTINE MAIL FROM MAIL','458',2);

動作を実行する関数は、/_conf/csc/cscconf/ディレクトリに格納される。欠陥のある関数の全部のコードは明らかにしないが,いくつかのコードセグメントを提供して,脆弱性の位置とそれがどのようにトリガされるかを示す。

/_conf/csc/cscconf/

操作コード458を処理するJavaフロントエンドコード:

if ((jsonob ject.getString("hdnSender").equals("") || validateEmail(jsonob ject.getString("hdnSender"))) && validateEmail(jsonob ject.getString("hdnRecipient")) && isSafeFilePath(jsonob ject.getString("hdnFilePath")) && b) { httpServletResponse.setContentType("text/html"); CyberoamLogger.debug("Antivirus/AntiSpam", "CSC Constant value " + CSCConstants.isCCC);

上のコードが示すように、いくつかのパラメータの有効性を調べた。有効であることを確認したら、次のような場合があります。

final EventBean eventByMode = EventBean.getEventByMode(363); ...redacted. final int sendWizardEvent = cscClient.sendWizardEvent(eventByMode, hashMap, sqlReader);

この時、私たちは新しいイベントコードを持っています。バックエンドに送信されます。バグはバックエンドがこのイベントを処理するコードに存在する。

この操作コードの対応名はsendmailです。直接的にバグが出ないように、一部のコードだけを示します。

sendmail

sendailの処理プログラムです。

send_mail ...redacted... <code>$param = $request->{release};</code> param = DLOPEN(ba se64_decode,param) LOG applog " Decode values :: $param \n" <code>%requestData = split(/[&=]/, $param); $mailServerHost = $requestData{hdnDestDomain}; $mailFrom = $requestData{hdnSender}; $mailTo = $requestData{hdnRecipient}; $file = $QUARANTINE_PATH."/".$requestData{hdnFilePath}; $mailfile=$requestData{hdnFilePath}; $validate_email="false"; my $email_regex='^([\.]?[_\-\!\#\{\}\$\%\^\&\*\+\=\|\?\'\\\\\\/a-zA-Z0-9])*@([a-zA-Z0-9]([-]?[a-zA-Z0-9]+)*\.)+([a-zA-Z0-9]{0,6})$'; if($requestData{hdnRecipient} =~ /$email_regex/ && ((defined $requestData{hdnSender} && $requestData{hdnSender} eq '') || $requestData{hdnSender} =~ /$email_regex/) && index($requestData{hdnFilePath},'../') == -1){ $validate_email="true"; } ....redacted....

上のコードから見たように、疑似perlコードはバックエンドがどのように入力を受信するかを示しています。また、それはどのように受け入れられたパラメータを検証するかを試みています。

検証後、私たちのパラメータが有効であれば、以下のコードを実行します。

%mailreq=("mailaction"=>"$MAIL_FORWARD","subject"=>"$strSubject","toEmail"=>"$mailTo","attachmentfile"=>"$file","smtpserverhost"=>"$mailServerHost","fromaddress"=>"$mailFrom"); </code> out = OPCODE mail_sender json %mailreq

以上のコードは、変数mail reqを受け入れる値に設定し、mail ender関数を呼び出します。これに関連する操作を見ます。RCEはどこでトリガされますか?

mailreq mail_sender <code> #mailaction 0=mail_with_var,1=mail_forward,2=mail_attachment $mailaction=$request->{mailaction}; $subject=$request->{subject}; $mailbody=''; $attachmentfile=$request->{attachmentfile}; $toEmail=$request->{toEmail}; </code> #mail body IF("defined $request->{mailbody} && '' ne $request->{mailbody}"){ <code>$mailbody=$request->{mailbody};</code> } #SMTP server host IF("defined $request->{smtpserverhost} && '' ne $request->{smtpserverhost}"){ <code>$smtpserverhost=$request->{smtpserverhost};</code> }ELSE{ result = QUERY "select servicevalue from tblclientservices where servicekey='MailServer'" IF("defined $result->{output}->{servicevalue}[0] && '' ne $result->{output}->{servicevalue}[0]"){ <code>$smtpserverhost=$result->{output}->{servicevalue}[0];</code> }ELSE{ <code>$smtpserverhost="127.0.0.1";</code> } } #SMTP server port IF("defined $request->{smtpserverport} && '' ne $request->{smtpserverport}"){ <code>$smtpserverport=$request->{smtpserverport};</code> }ELSE{ result = QUERY "select servicevalue from tblclientservices where servicekey='MailServerPort'" IF("defined $result->{output}->{servicevalue}[0] && '' ne $result->{output}->{servicevalue}[0]"){ <code>$smtpserverport=$result->{output}->{servicevalue}[0];</code> }ELSE{ <code>$smtpserverport="25";</code> } } #SMTP auth flag <code>$smtpauthflag="0";</code> IF("defined $request->{smtpauthflag} && '' ne $request->{smtpauthflag}"){ <code>$smtpauthflag=$request->{smtpauthflag};</code> }ELSE{ result = QUERY "select servicevalue from tblclientservices where servicekey='SMTPAuthenticationFlag'" IF("defined $result->{output}->{servicevalue}[0] && '' ne $result->{output}->{servicevalue}[0]"){ <code>$smtpauthflag=$result->{output}->{servicevalue}[0];</code> } } IF("$smtpauthflag == 1"){ IF("defined $request->{mailusername} && '' ne $request->{mailusername}"){ <code> $mailusername=$request->{mailusername}; $mailpassword=$request->{mailpassword}; </code> }ELSE{ result = QUERY "select servicevalue from tblclientservices where servicekey = 'MailServerUsername'" <code>$mailusername = $result->{output}->{servicevalue}[0];</code> result = QUERY "select servicevalue from tblclientservices where servicekey = 'MailServerPassword'" <code>$mailpassword = $result->{output}->{servicevalue}[0];</code> } }ELSE{ <code> $mailusername = ""; $mailpassword = ""; </code> } IF("defined $request->{fromaddress} && '' ne $request->{fromaddress}"){ <code>$fromaddress=$request->{fromaddress};</code> }ELSE{ result = QUERY "select servicevalue from tblclientservices where servicekey = 'FromAddress'" <code>$fromaddress = $result->{output}->{servicevalue}[0];</code> } #Security Mode IF("defined $request->{smtpsecurity} && '' ne $request->{smtpsecurity}"){ <code>$smtpsecurity=$request->{smtpsecurity};</code> }ELSE{ result = QUERY "select servicevalue from tblclientservices where servicekey = 'smtpsecurity'" <code>$smtpsecurity = $result->{output}->{servicevalue}[0];</code> } <code>$smtpsecuritymode=0;</code> IF("$smtpsecurity eq 'STARTTLS'"){ <code>$smtpsecuritymode=1;</code> }ELSE IF("$smtpsecurity eq 'SSL/TLS'"){ <code>$smtpsecuritymode=2;</code> } #SMTP Certificate <code> $smtpcertificate = ''; $certpassword=''; </code> IF("$smtpsecuritymode!=0"){ IF("defined $request->{smtpcertificate} && '' ne $request->{smtpcertificate}"){ result = QUERY "select certname,password from tblvpncertificate where certid=$request->{smtpcertificate}" }ELSE{ result = QUERY "select certname,password from tblvpncertificate where certid=(select servicevalue::int from tblclientservices where servicekey = 'smtpcertificate')" } <code> $smtpcertificate = $result->{output}->{certname}[0]; $certpassword=$result->{output}->{password}[0]; </code> } #From Address with Name IF("defined $request->{fromaddresswithname} && '' ne $request->{fromaddresswithname}"){ <code>$fromaddresswithname=$request->{fromaddresswithname};</code> }ELSE{ <code>$fromaddresswithname = $OEMNAME . " <" . $fromaddress . ">";</code> }

上のコードは運転開始時にすべてのコードが実行される操作を行います。初期化変数(いくつかの変数が指定されていない場合は、直接にデバイスから取得します。)

変数の割り当て後、以下のコードが実行されます。

out = EXECSH "/bin/cschelper mail_send '$fromaddress' '$fromaddresswithname' '$toEmail' '$toEmail' '$subject' '$mailbody' '$smtpserverhost' '$smtpserverport' '$mailusername' '$mailpassword' '$mailaction' '$smtpsecuritymode' '$smtpcertificate' '$certpassword' '1' '$attachmentfile'"

はい、これは命令実行です。ここで使うのはEXECSHです。/bin/sh-c「ARGUMENTS」を呼びます。実行する変数を制御することで、認証なしでリモートコマンドの実行が簡単に行えます。

EXECSH /bin/sh -c “ARGUMENTS”

数ヶ月以内に完全なレポートとPoCを発表し、より詳細な説明をします。

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场 来源:https://thebestvpn.com/cyberoam-preauth-rce/?=cve-2019-17059-flaw