package com.netifera.platform.net.tools.auth; import java.io.IOException; import java.util.ArrayList; import java.util.concurrent.TimeUnit; import com.netifera.platform.api.iterables.IndexedIterable; import com.netifera.platform.api.iterables.ListIndexedIterable; import com.netifera.platform.net.internal.tools.auth.Activator; import com.netifera.platform.net.services.auth.CredentialsVerifier; import com.netifera.platform.net.services.auth.TCPCredentialsVerifier; import com.netifera.platform.net.services.credentials.Credential; import com.netifera.platform.net.services.credentials.UsernameAndPassword; import com.netifera.platform.net.sockets.CompletionHandler; import com.netifera.platform.net.sockets.LineChannel; import com.netifera.platform.net.sockets.TCPChannel; import com.netifera.platform.util.locators.TCPSocketLocator; public class IMAPAuthBruteforcer extends AuthenticationBruteforcer { private TCPSocketLocator target; @Override public IndexedIterable<Credential> defaultCredentials() { ArrayList<Credential> list = new ArrayList<Credential>(); list.add(new UsernameAndPassword("root","toor")); // XXX for testing with slackserver vmware list.add(new UsernameAndPassword("test","test")); return new ListIndexedIterable<Credential>(list); } @Override protected void setupToolOptions() { super.setupToolOptions(); target = (TCPSocketLocator) context.getConfiguration().get("target"); context.setTitle("Bruteforce authentication on IMAP @ "+target); } @Override public void authenticationSucceeded(Credential credential) { UsernameAndPassword up = (UsernameAndPassword) credential; Activator.getInstance().getNetworkEntityFactory().createUsernameAndPassword(realm, context.getSpaceId(), target, up.getUsernameString(), up.getPasswordString()); super.authenticationSucceeded(credential); } @Override public CredentialsVerifier createCredentialsVerifier() { return new TCPCredentialsVerifier(target) { @Override protected void authenticate(final TCPChannel channel, final Credential credential, final long timeout, final TimeUnit unit, final CompletionHandler<Boolean, Credential> handler) { final LineChannel lineChannel = new LineChannel(channel); lineChannel.setSeparator("\n"); lineChannel.writeLine("1 LOGIN "+((UsernameAndPassword)credential).getUsernameString()+" "+((UsernameAndPassword)credential).getPasswordString(), timeout, unit, null, new CompletionHandler<Void,Void>() { public void cancelled(Void attachment) { handler.cancelled(credential); } public void completed(Void result, Void attachment) { lineChannel.readLine(timeout, unit, attachment, new CompletionHandler<String,Void>() { public void cancelled(Void attachment) { handler.cancelled(credential); } public void completed(String result, Void attachment) { if (!result.startsWith("1 ")) { context.warning("bad result: "+result); lineChannel.readLine(timeout, unit, attachment, this); } else { boolean authenticated = result.startsWith("1 OK"); handler.completed(authenticated,credential); if (authenticated) try { channel.close(); } catch (IOException e) { context.exception("I/O Error", e); } } } public void failed(Throwable exc, Void attachment) { handler.failed(exc, credential); } }); } public void failed(Throwable exc, Void attachment) { handler.failed(exc, credential); } }); } }; } }