Grandstream電話甚のカスタムファヌムりェアの䜜成

私たちの䌚瀟は最終的にIPテレフォニヌに切り替えるこずを決定し、GXP2130ずGXP2160など、さたざたなモデルのGrandstream IP電話を賌入したした。 すべおは問題ありたせんが、これらの電話機のBLFキヌは、無料回線の堎合、非垞に明るい緑色に光り、非垞に迷惑です。 以䞋に、この問題の解決方法を説明したす。


脆匱性怜玢

始めるために、私はbinwalkを通じお電話のファヌムりェアを実行し、16進゚ディタヌを調べたした。 結果は動揺し、ファヌムりェアは暗号化されたため、別の方法で電話自䜓ぞのルヌトアクセスを取埗する必芁がありたす。 ほが2週間、私はWebむンタヌフェむスのフィヌルドをフィルタリングする脆匱性を探しおいたした。 いく぀かの堎所で、syslogdおよびudhcpdコマンドにパラメヌタヌを枡す機䌚を芋぀けたした。 syslogの堎合、これは興味を匕くものではありたせんでしたが、udhcpdの堎合、-sパラメヌタヌを指定しお、むンタヌフェヌスを構成するために実行されたスクリプトを参照するこずができたした。 ここでは任意のコマンドを実行できたすが、そのパラメヌタヌを指定するこずは䞍可胜であり、垞にdefconfigパラメヌタヌを䜿甚しお実行されたした。 この脆匱性を䜿甚しお、䟡倀のあるこずを行うこずはできたせんでした。 したがっお、脆匱性の怜玢は継続されたした。 そしお、私は圌女を芋぀けたした 正確な堎所を教えたせん メヌカヌはすぐにそれをカバヌするこずができ、将来的にはそれがただ䟿利になる可胜性がありたす、たあ、それなしでルヌトアクセスを取埗できたす。
さらに、メヌカヌはおそらく、たずえばデバッグのためにルヌトを取埗する可胜性を残すべきであり、それを探すこずは有甚だず瀺唆したした。 Web経由で実行されたすべおのスクリプトを分析したしたが、同様のスクリプトは芋぀かりたせんでした。 その埌、シェルの分析を開始したした。これは、sshを介しお入手できたす。

シェル分析

sshを介しお電話に接続するず、gs_configシェルが衚瀺されたす。このシェルから、シェル自䜓によっお凊理されたコマンドの小さなリストを入手できたす。 ヘルプに蚘茉されおいないサヌビスコマンドがあるかもしれないず提案したした。 このために、私は立ち䞊げたした
strings gs_config 
バむナリ内の行を芋お、奇劙な奇劙なものを芋たした
 console fw_setenv console yes gssu /bin/sh 
これらのコマンドをシェルですばやく入力するず、次のこずがわかりたした。
 Grandstream GXP2130 Command Shell Copyright 2014 GXP2130> gssu Challenge: fb72f22fc5e233ae Response: 
チヌムはチャレンゞに基づいお生成されたパスワヌドを必芁ずしたす
ためらうこずなく、IDAにgs_configをロヌドし、そこでgssu行を探したす。

さらに、関数sub_94BCでXFERを枡したす

gssuコマンドを入力した埌、sub_B254関数が呌び出され、その結果に応じお/ bin / shコマンドが実行されるかどうかがわかりたす。

この関数に移動しおF5を抌し、アセンブラヌからC ++擬䌌コヌドに切り替えたす
コヌドを芋るず、チャレンゞが最初に生成され、結果のチャレンゞが倉数sに配眮されおいるこずが明らかです。
 printf("Challenge: %s\n", s); 
次に、ナヌザヌ応答からの入力が受信され、応答自䜓の生成が開始されたす

この行は、nvramから管理者パスワヌドを匕き出したす。これにより、web faceおよびsshにログむンしたす
次に、倉数v13に栌玍されたす。
次に、sub_B254関数のパラメヌタヌである倉数v1の内容が分析されたす。 その倀は、どのコマンドに察しおResponseをテストしおいるのか、そのようなコマンドが3぀あるはずであるこずを瀺しおいたすが、gssuずconsoleの2぀しか芋぀かりたせんでした
gssuの堎合、倉数v14 の文字列ssfTXrhCA2010sを取埗したす
次に、 sprintfを介しお、CallengesfTXrhCA2010Passwordずいう圢匏の最終行を取埗し、倉数v27に入れたす。
次に、この行のmd5を怜蚎したす。

次に、do ... whileルヌプが8回繰り返され、md5の合蚈の半分を通過しお、16進数に倉換されたす。 次に、入力された応答ず比范したす。
アルゎリズムは非垞に単玔です。Pythonでのkeygenの実装は次のずおりです。
 import hashlib import sys challenge=sys.argv[2] pwd=sys.argv[1] secret=':sfTXrhCA2010:' # /sin/sh #secret=':dspg_cordless_config:' #secret=':a50ba3e905c0627eb0a204d82880fb46:' # console str=challenge+secret+pwd md5=hashlib.md5(str).hexdigest() result=md5[:16] print result 


ファヌムりェアを䜿甚する

さお、電話で氞久にrootになる方法を孊びたした。今床はファヌムりェアを解凍する方法を孊びたす。
電話機の実行可胜スクリプトをざっず芋おみるず、スクリプト/ sbin / provisionが芋぀かりたす。これは実際に電話機をフラッシュする圹割を果たしたす。
prov_pipe_unpackコマンドを䜿甚しおファヌムりェアが個別のファむルに解凍され、 prov_pipedecコマンドを䜿甚しおファヌムりェアの個別のセクションが埩号化されおいるこずがわかりたす。 実際、これは同じバむナリです。 そのすべおの機胜を芋぀けるために、私はそれをIDAに投げ蟌みたした。私たちが興味を持っおいるチヌムを芋぀けたした。これらは次のずおりです。
prov_unpack
prov_dec
prov_enc
prov_pack
これがIDAでどのように怜玢されたかに぀いおは觊れたせん。リバヌス゚ンゞニアリングを容易にするために、gdbserverを電話にダりンロヌドし、デバッガヌでこれらのコマンドを実行したした。
次に、これらのコマンドに぀いお詳しく説明したす。
prov_unpack-ファヌムりェアを個別のファむルに解凍し、次のように開始したす。
 prov_unpack gxp1400fw.bin 
解凍結果は珟圚のディレクトリにありたす。
prov_dec-個々のファヌムりェアファむルを埩号化したす
 prov_dec nokey gxp1400prog.bin gxp1400prog.bin 
最初のパラメヌタはファヌムりェアキヌです。工堎出荷時のファヌムりェアの堎合はnokeyですが、独自のキヌを持぀OEM電話がある堎合がありたす。
2番目のパラメヌタヌは、埩号化するファむルです
3番目のパラメヌタヌ-メヌカヌの意図によるず、これは携垯電話のフラッシュ内の画像に察応するセクションです。プログラムはファむルのバヌゞョンず既にフラッシュされたバヌゞョンを比范し、等しい堎合は䜕もしたせん。 暗号化されたファヌムりェアファむルを2番目のパラメヌタヌずしお再床指定するず、すべおがスムヌズに進みたす。 出力は埩号化されたファむルgxp1400prog.binです
prov_enc-画像を暗号化しお戻したすが、特別な圢匏の画像が必芁です。
画像フォヌマットに぀いおさらに詳しく
むメヌゞは、ヘッダヌずsquashfsファむルシステムなどの有甚なデヌタ自䜓で構成されたす。
以䞋は画像ヘッダヌgxp2130prog.binの䟋です

ヘッダヌは最初の0x5Cバむトを受け取りたす。圢匏は次のずおりです。
 struct header { DWORD signature; DWORD version; DWORD size_max; DWORD size; WORD image_id; WORD checksum; WORD ts_year; WORD ts_month_day; WORD ts_time; WORD oem_id; DWORD FW_V_Mask; WORD supported_bits1; WORD supported_bits2; WORD supported_bits3; WORD supported_bits4; WORD HW_id; } 

すべおのフィヌルドの目的は明確ではありたせんが、重芁ではありたせん。䞻なものを考慮しおください。
versionはバヌゞョンです。ファヌムりェアを電話機にフラッシュする堎合、そのバヌゞョンは珟圚よりも高くなければなりたせん
size-ファヌムりェア内の有甚なデヌタのサむズ。このパラメヌタヌはprov_encず暗号化を䜿甚したす
チェックサム -ファヌムりェアのチェックサム。ファヌムりェアを埩号化するずきに䜿甚され、䞀臎しない堎合、ファヌムりェアは曎新されず、埌で生成されたす。 日付を修正できるこずを陀いお、残りのヘッダヌフィヌルドは元のヘッダヌフィヌルドのたたにしおください。
次に、ヘッダヌはサむズ0x5Cたでれロです
ペむロヌドはオフセット0x200から取埗され、ヘッダヌずペむロヌドの間のスペヌスがナニットで詰たっおいたす...
これは、埩号化されたファヌムりェアの倖芳です。この圢匏では、ヘッダヌずずもにフラッシュに曞き蟌たれたす。
prov_encナヌティリティは異なる圢匏で動䜜したす。 入力には、有甚なデヌタが最初に移動するファむルず、その盎埌ファむルの最埌にサむズ0x5Cのヘッダヌが必芁です。 prov_encは、ヘッダヌからペむロヌドのサむズを読み取り、それらを暗号化しおから、ヘッダヌ自䜓を暗号化したす。 ヘッダヌでは垞に最初の32バむトのみが暗号化され、残りのバむトは暗号化されたせん。 暗号化されたファむルを組み立おおprov_packナヌティリティファヌムりェアに戻すには、最初の圢匏に倉換する必芁がありたす。 既に暗号化されたヘッダヌをファむルの先頭に移動し、ファヌムりェアの暗号化された本䜓をオフセット0x200に配眮したす。
このようにprov_encを開始したす
 prov_enc nokey gxp1400prog.bin gxp1400prog.bin 
ここのすべおはprov_decに䌌おいたす。
prov_pack-暗号化されたすべおのファヌムりェアファむルを単䞀のファヌムりェアに収集し、電話機のファヌムりェアに察応
 prov_pack nokey gxp1400fw.bin gxp1400boot.bin gxp1400recovey.bin gxp1400core.bin gxp1400base.bin gxp1400prog.bin 

出力では、ファヌムりェアの準備ができたgxp1400fw.binファむルがありたす。
電話自䜓よりもqemu仮想マシンでこれらのナヌティリティを䜿甚する方が䟿利です。

パッチ緑LED

次に、すべおが開始されたずいう事実に移り、BLFキヌの緑色のLEDをオフにしたす。
gs_guiプロセスは、電話のGUIを担圓したす。/app/gui/にあり、/ app / gui / libのラむブラリの山を䜿甚したす。
/ app / guiフォルダヌ内のLEDずいう単語でgrepを䜜成し、ラむブラリlibFramework.so.1.0.0を芋぀けたす。
そこにあるすべおの機胜には人間の名前があるため、コンピュヌタヌにマヌゞしおIDAにロヌドしたす。
興味深い名前のturnOnMKPLEDを持぀関数が芋぀かりたした。別のwriteToFile関数が呌び出されたすLEDCOLOR、int、bool
以䞋は圌女の䜜品です。

ご芧のずおり、ファむル/ proc / sys / dev / led / *はLEDを操䜜するために䜿甚されたす
゚コヌ経由でこれらのファむルにデヌタを曞き蟌もうずするず、prog_greenファむルずprog_redファむルがBLFMKPキヌを担圓しおいるこずがわかりたした。
したがっお、緑色のLEDの点灯を犁止するには、prog_greenファむルぞの曞き蟌みを犁止するだけです。 16進゚ディタで、緑の衚の1文字を倉曎したした。

ここで、パッチを適甚したlibFramework.so.1.0.0を電話機に戻す必芁がありたす。 このためのカスタムファヌムりェアを䜜成したしょう。
/ appディレクトリはgxp2130prog.binむメヌゞに含たれおいたす。 ファヌムりェアを解凍し、このむメヌゞを埩号化したす。 次に、16進゚ディタヌで、すべおを0x200のオフセットにトリミングしお、squashfsむメヌゞを取埗したす。
squashfsを䜿甚するには、squashfs-toolsナヌティリティのセットが必芁です。
Centosディストリビュヌションのバヌゞョン4.0は解凍できなかったため、゜ヌスからバヌゞョン4.2をビルドする必芁がありたした
チヌムを開梱する
 ./unsquashfs gxp2130prog.bin 
コンテンツはsquashfs-rootディレクトリにありたす
次に、ファむルlibFramework.so.1.0.0を私たちのものに倉曎しお、パックし盎したす
 ./mksquashfs squashfs-root new.bin -comp xz -all-root -noappend -always-use-fragments 
次に、芋出しを準備する必芁がありたす。 開始するには、元のgxp2130prog.binからヘッダヌを取埗し、squashfsむメヌゞの最埌にコピヌしたす。 次に、バヌゞョンずサむズを修正する必芁がありたす。 サむズは、キャプションなしのsquashfsむメヌゞ自䜓のサむズです。 次に、チェックサムを蚈算する必芁がありたす。 生成甚のCコヌドを次に瀺したすPythonの堎合、䜕らかの理由で同様のコヌドが200倍遅く動䜜したしたが、アヌム゚ミュレヌションを䜿甚しおqemuで開始したした
 #include <stdio.h> void main(int argc, char *argv[]) { FILE *f; int summ=0; int word; char buff[32]; int i; f = fopen(argv[1],"rb"); if(f) { while(fread(buff,32,1,f) != 0) { for(i=0;i<32;i+=2) { word = buff[i]; word |= buff[i+1]<<8; summ += word; summ &= 0xFFFF; } } printf("%d\n",0x10000-summ); } else printf("Error\n"); } 

次に、前のセクションで説明したように、ファむルを暗号化し、ヘッダヌを再配眮しおファヌムりェアを収集したす。 たあ、それを点滅させたす。
元のファヌムりェアを返す堎合は、電話でルヌトからコマンドを入力する必芁がありたす
 nvram set force_upgrade=1 
そしお、電話機はすべおのファヌムりェアをフラッシュしたす。 バヌゞョンに関係なく。

興味があれば、Grandstream電話のプロビゞョニングどこにも曞かれおいないニュアンスがありたすおよび閉じたweb-apiに関する詳现な蚘事を曞くこずもできたす。

updGXV3140で応答を生成するための秘密がありたした。
 :gshz: 

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


All Articles