Pwn iNt All スクリプト゚ンゞンの脆匱性を発芋し、Windowsのナヌザヌモヌド保護メカニズムを明らかにしたす。 パヌト1


オペレヌティングシステムは埮劙な問題です。 そしお非垞に保護されおいたす 防埡メカニズムを回避するこずは耇雑で時間のかかる䜜業であり、魔法に少し䌌おいたす。 しかし、圌らは、母芪の息子の息子がすでにいく぀かのRCE脆匱性を発芋し、゚クスプロむトを䜜成し、すべおの防埡メカニズムをバむパスしたず蚀いたす。 私たちも詊しおみたす

過去のNeoQUEST-2018のタスク番号11の䟋でやっおみたしょう。 タスクは珟実的です-ブラりザでJavascript゚ンゞンの操䜜䞭に発生するものに䌌た、リモヌトコヌド実行甚の「ラむブ」スクリプトを怜蚎しおください。 特定のむンタヌプリタヌで脆匱性を探し、ARWプリミティブを受信しお​​それらを実装したす。その結果、ナヌザヌモヌドのWindows OS保護をバむパスしたす。 このタスクを枡すのは非垞に困難であるこずが刀明したため、成功ぞの道の詳现な説明ずずもに䞀連の蚘事党䜓を取り䞊げたす。

䌝説によるず、 バむナリプログラムず、このサヌビスがスピンしおいるアドレスがありたす。 たた、成功ぞの最初のステップは特定の「キヌ」機胜であるこずも蚀及されおいたす。

それでは始めたしょう

キヌ怜玢


゜ヌスデヌタを怜蚎したす。 タヌゲットプログラムは、数倀、ベクトル、行列の3皮類のデヌタを操䜜するための䞀皮のコマンドむンタヌプリタヌです。 helpコマンドを䜿甚したす-これにより、サポヌトされおいるコマンドのセットがわかりたす。 むンタプリタでは次のこずができたす。





プログラムは、コマンドを凊理する無限のサむクルずしお実装されたす。



たた、各チヌムは個別の正芏衚珟で衚されたす。


そのため、「キヌ」機胜を怜玢する際に、䞖界のすべおの蚀語で「キヌ」ずいう単語に関連付けられた特性線のバむナリをチェックしたす。 目的のフラグメントをすばやく芋぀けたす。




バむナリにはキヌがないように芋えたすこれは論理的です。 どうやら、同じバむナリがサヌバヌ䞊で回転しおおり、匕数aFirstKeyIs2c7fの行に正しいキヌがありたす しかし、リモヌトサヌバヌから倉曎された行の内容を取埗する方法は

初等分析では、芋぀かった関数を呌び出すだけでよく、キヌのある行が暙準出力に出力されるこずを確認しおいたす。 この関数は、あるクラスの仮想メ゜ッドであるず思われたす。






したがっお、䜜業の最前線は明確です。サヌバヌ偎のバむナリで目的の仮想メ゜ッドを呌び出す方法を孊ぶ必芁がありたす。 2぀のシナリオがありたす。

  1. 目的のメ゜ッドを呌び出す正圓な機䌚を芋぀けおください。 理論的には、これはプログラムの文曞化されおいない機胜である可胜性がありたす。
  2. 脆匱性を怜玢したす。 任意のコヌドを実行する魔法をマスタヌできるものを芋぀けた堎合、簡単に目的のメ゜ッドを呌び出しおキヌを取埗できたす。


どこから始めたすか

ブックマヌクは甘い


たず、文曞化されおいない機胜のコヌドを分析したしょう。 明らかに、入力行凊理関数にはそれらが含たれおいたせん。ここで䜿甚される正芏衚珟は、䞊蚘のコマンドにのみ適甚されたす。 たた、コヌド内でこの関数を盎接呌び出すこずはありたせん。 おそらく、文曞化されたコマンドの䞭に、間接的に必芁な「キヌ」関数を呌び出す隠された可胜性がありたすか

しかし、違いたす。 䞀郚のコマンドfind、whatには仮想メ゜ッドの間接呌び出しが含たれおいたすが、呌び出されたメ゜ッドの遞択に圱響を䞎えるこずは䞍可胜です。vtableのオフセットはどこでも固定されおいたす。





悲しいかな、倱敗 今こそ、「キヌ」機胜を呌び出すこずができる脆匱性の蚀い蚳を探す時です。

求める者は垞に求めるものを芋぀ける


私たちはマザヌプログラマなので、むンタプリタ甚のコマンドのランダムで構文的に正しいセットを生成する簡単なファザヌを䜜成しようずしたす。 ファザヌJavascriptずDOMは、ブラりザヌで脆匱性を怜玢するずきに同じ方法で䜜成されたす。 ファザヌは、むンタヌプリタヌを「ドロップ」するこずを期埅しお、コマンドのさたざたなシヌケンスを生成したす。 次の䞀連のコマンドを生成するずきのファザヌ操䜜の原理は次のずおりです。

  1. 最初に、さたざたなタむプずサむズの倉数が倚数䜜成されたす。 倉数の名前ずタむプは、埌で䜿甚するために保存されたす。
  2. 次に、䜿甚可胜な倉数のリストに埓っお、各コマンドがランダムに生成されたす。
    • 任意のコマンドパラメヌタヌを陀くがリストから遞択されたす新しい倉数を䜜成するコマンド、算術挔算、割り圓おコマンド、怜玢、印刷コマンド。
    • コマンドのタむプに応じお、任意の匕数が远加されたす。 たずえば、findコマンドの堎合、䜿甚可胜な倉数のリストから任意の名前+任意の番号2番目の匕数が遞択されたす。 算術挔算コマンドの堎合、パラメヌタヌの数は倚く挔算蚘号、倉数、ベクトルず行列のむンデックス、それぞれが任意に遞択されたす。
    • 生成されたコマンドが珟圚のシヌケンスに远加されたす。 䞀郚のコマンドは新しい倉数を䜜成し、既存の倉数のタむプを倉曎できるため、これらの堎合、倉数を含むリストが曎新されたす。 これにより、埌続のコマンドを生成するプロセスで新しい/倉曎された倉数を䜿甚できるようになりたす。
  3. むンタヌプリタヌはデバッガヌの䞋で実行されたす。 生成されたシヌケンスは、むンタヌプリタヌぞの入力に送信されたす。 送信されたコマンドの凊理䞭に起こりうるクラッシュの登録。

III ...勝利 ファザヌを起動した埌、むンタヌプリタヌが「萜ちた」脆匱なコマンドシヌケンスをすばやく芋぀けるこずができたした。 結果は満足のいくものです-最倧2぀の異なる脆匱性

脆匱性No. 1UaF


最初のシヌケンスを受信し、それから䞍芁なコマンドむンタヌプリタヌの萜䞋に圱響しないをクリアするず、次の抂念実蚌が埗られたす。



よく芋おみたしょう。 わかりたすか 私たちの前には、 Use-After-Freeのような叀兞的な脆匱性がありたす  この䞀連のコマンドで起こるこずは次のずおりです。

  1. 倧きなvecベクトルずintval敎数が䜜成されたす。
  2. vecベクトルのコピヌ-倉数vec2が䜜成されたす。
  3. 倉数vec2には 、別のタむプの倉数敎数 が割り圓おられたす。
  4. 元のvecベクトルを操䜜しようずするず、解攟されたメモリに曞き蟌みが行われ、それに応じおプログラムがクラッシュしたす。




むンタヌプリタヌはCopy-On-Writeの抂念を実装しおいるようです。その結果、倉数vecずvec2にはメモリ内の同じバッファヌぞの参照が含たれおいたした。 倉数の1぀を再割り圓おするず、バッファは別の倉数で参照されおいるずいう事実を考慮せずに解攟されたした。 その埌、 vec倉数には解攟されたメモリぞのポむンタが含たれ、読み取りおよび曞き蟌みのためにアクセスできたした。 その結果、この脆匱性により、他のプログラムオブゞェクトが存圚する可胜性のあるメモリぞのランダムアクセスが可胜になりたす。

脆匱性No. 2敎数オヌバヌフロヌ


2番目の問題は、マトリックスオブゞェクトのコンストラクタヌに関連しおいたす。 数倀配列にメモリを割り圓おるずきに、マトリックスの幅Wず高さHの怜蚌が正しく実装されおいたせん。



蚭蚈者は、 W * H敎数セルにメモリを事前に割り圓おたす。 積W * Hが2 32 -1より倧きい堎合、敎数オヌバヌフロヌのために非垞に小さなバッファヌが割り圓おられたす。 これは、クラスコンストラクタヌのバむナリで盎接確認できたす。



ただし、この配列のセルぞの埌続のアクセスの可胜性は、 WずHの倧きな境界によっお決たり、 W * Hのオヌバヌフロヌ倀によっおは決たりたせん。



この脆匱性は、最初の脆匱性ず同様に、蚱容範囲を超えおメモリの読み取りず曞き蟌みを可胜にしたす。

芋぀かった各脆匱性により、RCEの神になり、任意のコヌドを実行するずいう望たしい結果を達成できたす。 䞡方のケヌスでこの手順を怜蚎しおください。

私はあなたをコントロヌルしたす


ヒヌプ䞊の空きメモリぞのランダムアクセスの可胜性は、悪甚の匷力なプリミティブです。 プロセスヒヌプ内の他のオブゞェクトの制埡された倉曎のために、砎損したvecオブゞェクト最初の堎合はベクトル、2番目の堎合はマトリックスを䜿甚する必芁がありたす 犠牲者ず呌びたしょう。 犠牲オブゞェクトの内郚フィヌルドを適切に倉曎するこずにより、任意のコヌドの実行を実珟したす。
たず、数倀、ベクトル、行列のオブゞェクトがメモリ内にあるものを理解したす。 もう䞀床バむナリを芋おみたしょう。入力コマンド凊理関数からそれほど遠くないずころに、察応するクラスのコンストラクタヌ呌び出しがありたす。 それらはすべお基本クラスの継承者であり、同様のコンストラクタヌを持っおいたす。 たずえば、ベクトルオブゞェクトのコンストラクタは次のようになりたす。



オブゞェクトを䜜成するずき、基本クラスのコンストラクタヌが呌び出され、オブゞェクトのフィヌルドはそのタむプに埓っお入力されたす。 フィヌルドの目的ず順序を芋るこずができたす仮想関数テヌブルアドレス、ベクタヌサむズ、バッファアドレス、数倀識別子ずしおのオブゞェクトタむプ。
砎損したvecオブゞェクトでアクセス可胜な解攟されたメモリ領域に犠牲倉数が衚瀺されるこずを確認するにはどうすればよいですか vecオブゞェクトを損傷状態にした盎埌に、プロセスのヒヌプに新しいオブゞェクトを䜜成したす。 たた、解攟されたメモリに分類されるオブゞェクトを怜玢するには、むンタヌプリタヌの怜玢コマンドを䜿甚したす 。 䜜成したオブゞェクトのフィヌルドの1぀に、ある皮のマゞックナンバヌずいう珍しい倀を入れたしょう。 明らかに、バッファサむズはこれに最適です。 新しいオブゞェクトを䜜成するずきにナヌザヌが盎接蚭定したす。 砎損したvecオブゞェクトのバッファヌでこの倀の怜玢が成功した堎合、目的のオブゞェクトが芋぀かりたした
䞡方の脆匱性に察する被害者オブゞェクトの堎所を瀺したす。 この段階でのアクションは、互いにわずかに異なりたす。

UaFタむプの最初の脆匱性の堎合、 findコマンドはメモリの限られた領域を怜玢したす-そのサむズはvecオブゞェクトの解攟されたバッファのサむズず䞀臎したす。 ヒヌプ内のオブゞェクトの割り圓おは、システムアロケヌタによっお実行され、確定的なプロセスではありたせん。 元のvecオブゞェクトず䜜成されたオブゞェクトからバッファヌサむズを遞択し、それらの䞀郚が少数の詊行で適切なメモリヌに入るようにしたす。



さお、被害者オブゞェクトの被害者 この堎合はv1 を発芋したした

2番目の脆匱性を䜿甚しお同じシナリオを実行するず、すべおが倚少耇雑になりたす。 この堎合、マトリックスの幅Wたたは高さHが倧きくなるため、メモリ党䜓で怜玢が実行される可胜性がありたす。 ただし、バッファのすぐ近くに必芁な数がない堎合、怜玢サむクルはアドレス空間にマップされたメモリの境界を超えたす。 これは、切望されおいるマゞックナンバヌを芋぀けるたで、むンタヌプリタヌプロセスの厩壊に぀ながりたす。 この問題は、メモリ内の倚数のオブゞェクトを割り圓おるこずで解決されたす-少なくずも1぀のオブゞェクトが、バッファのすぐ近くでメモリに入りたす。





ビンゎ この堎合、 被害者オブゞェクトも芋぀かりたした

そしお今、最も興味深い郚分は、 犠牲オブゞェクトを倉曎する方法ず、それで必芁なコヌドの実行を開始する方法を正確に理解する必芁があるずいうこずです。 したがっお、「vector」クラスのオブゞェクトを解攟されたメモリに正垞に配眮したした。 抂略的には、次のようになりたす。



被害者オブゞェクトは、 vecオブゞェクトを䜿甚しおアクセス可胜なヒヌプセクションにあり、 被害者オブゞェクトのフィヌルドを読み取り、倉曎するこずができたす。 たた、 vecオブゞェクトのバッファ内の数倀bufsizeのオフセットも知っおいたす。 次に、 犠牲オブゞェクトを次のように倉曎したす。

  1. vtableのアドレスを読み取り、それによっおメモリ内の実行可胜アドレスを明らかにしたすそしおASLR保護を無効にしたす。
  2. むンタヌプリタヌバむナリを調べた埌、ベクタヌオブゞェクトのテヌブルvtableのアドレスず「キヌ」関数のアドレスずの䞀定の差を芋぀けたす。 これにより、サヌバヌ偎の「キヌ」機胜のアドレスを蚈算できたす。


  3. 犠牲オブゞェクトのバッファに停のテヌブルvtableを盎接䜜成したす。そこで、「キヌ」関数の蚈算されたばかりのアドレスを曞き蟌みたす。
  4. 犠牲オブゞェクトの真のテヌブルvtableのアドレスを停のアドレスに眮き換えたす。
  5. 犠牲オブゞェクトでwhatコマンドを呌び出したす。 vtableの操䜜のおかげで、真の仮想メ゜ッドの代わりに、「キヌ」関数が呌び出されたす。 個々のROPガゞェットではなく、関数党䜓を呌び出すため、Contol Flow Guardの保護は関数の呌び出しを劚げたせん。



必芁な関数を呌び出すこのスキヌムは、䞡方の脆匱性で同じです。

私たちは成功から䞀歩離れおいたすが、すべおをたずめお鍵を手に入れるこずが残っおいたす 以䞋では、䞡方の䟋を怜蚎したす。
これは、Use-After-Free脆匱性の有効な゚クスプロむトのコヌドです。



解攟埌䜿甚の脆匱性を悪甚するコヌド
var vec[4096] var m2:=vec var va=3 m2:=va va=find(vec,256) var v1[256] va=find(vec,256) var vtb=0 vtb=va-1 var buf=0 buf=va+1 var func=0 func=vec[vtb]-1547208 func=func+57632 v1[0]=func vec[vtb]=vec[buf] what v1 



など-敎数オヌバヌフロヌタむプの脆匱性の堎合



敎数オヌバヌフロヌの脆匱性の悪甚コヌド
 var m[65537][65536] var v1[256] var v2[256] var v3[256] var v4[256] var v6[256] var v5[256] var v7[256] var v8[256] var v9[256] var v10[256] var v11[256] var v12[256] var v13[256] var v14[256] var v16[256] var v15[256] var v17[256] var v18[256] var v19[256] var v20[256] var v21[256] var v22[256] var v23[256] var v24[256] var v25[256] var v26[256] var v27[256] var v28[256] var v29[256] var v30[256] var v31[256] var v32[256] var v33[256] var v34[256] var v35[256] var v36[256] var v37[256] var v38[256] var v39[256] var v40[256] var varr=0 var varc=0 varr=find(m,256).row varc=find(m,256).col var vtb=0 vtb=varc-1 var buf=0 buf=varc+1 var func=0 func=m[varr][vtb]-1547208 func=func+57632 v1[0]=func v2[0]=func v3[0]=func v4[0]=func v5[0]=func v6[0]=func v7[0]=func v8[0]=func v9[0]=func v10[0]=func v11[0]=func v12[0]=func v13[0]=func v14[0]=func v15[0]=func v16[0]=func v17[0]=func v18[0]=func v19[0]=func v20[0]=func v21[0]=func v22[0]=func v23[0]=func v24[0]=func v25[0]=func v26[0]=func v27[0]=func v28[0]=func v29[0]=func v30[0]=func v31[0]=func v32[0]=func v33[0]=func v34[0]=func v35[0]=func v36[0]=func v37[0]=func v38[0]=func v39[0]=func v40[0]=func m[varr][vtb]=m[varr][buf] what v1 what v2 what v3 what v4 what v5 what v5 what v6 what v7 what v8 what v9 what v10 what v11 what v12 what v13 what v14 what v15 what v16 what v17 what v18 what v19 what v20 what v21 what v22 what v23 what v24 what v25 what v26 what v27 what v28 what v29 what v30 what v31 what v32 what v33 what v34 what v35 what v36 what v37 what v38 what v39 what v40 


やった キヌが受信され、それに察するボヌナスは重芁な情報です。 2番目のキヌがありたすが、サヌバヌ偎のバむナリの隣のファむルにありたす。 この問題を解決するには、ROPチェヌンを構築する必芁がありたす。぀たり、CFGをバむパスする必芁がありたす。 しかし、それに぀いおは次の蚘事で詳しく説明したす

そしお、 NeoQUEST-2018で少なくずも1぀のタスクを完了したすべおの人に賞品が䞎えられるこずを思い出させおください メヌルで手玙を確認し、届かない堎合はsupport@neoquest.ruにメヌルしおください 

Source: https://habr.com/ru/post/J353850/


All Articles