python套接字操作尝试一个无法连接的主机。_成为顶级黑客--python绝技 阅读笔记(四)...

用Python进行渗透测试

  1. 编写一个端口扫描器
  2. 构建一个SSH僵尸网络
  3. 通过FTP批量抓取肉机
  4. 重现蠕虫病毒
  5. 构建攻击脚本
1dcc46b329ec86f97ff47334d80fd037.png

蠕虫历史

22年,Morris蠕虫病毒使用了一个三管齐下的攻击方式入侵系统,首先利用了UNIX邮件发送程序中的漏洞,其次利用UNIX系统的finger守护进程中的一个独立的漏洞。最后,它会利用一些常见的用户名/密码,尝试连接那些使用RSH(远程shell)协议目标主机,只要三个攻击中的任何一个成功,蠕虫就会执行一个小程序,下载并执行病毒的剩余部分。Morris中的大部分攻击代码都是用C语言写的,我们将用Python重现Morris蠕虫的部分功能及现代的攻击方法。

编写一个端口扫描器

89c14fc477ee5ad95265b35a2e7c8db6.png

TCP三次握手协议

Python提供了访问BSD套接字的接口,BSD套接字提供了一个应用编程接口(API),能编写在主机之间进行网络通信的应用程序,通过一系列的套接字API函数,我们可以创建,绑定,监听,连接或在TCP/IP套接字上发送数据。TCP连接扫描是实用完整的三次握手来确定服务器或端口是否使用。

输入一个主机名和逗号分隔的端口列表,并予以扫描。

我们在程序中使用optparse库解析命令行参数,调用optparse.OptionPaser([usage message])会生成一个参数解析器(option parser)类的实例。接着,在parser.add_option中指定这个脚本具体要解析哪个命令行参数。下面是快速解析扫描的目标主机和端口的方法。

import optparseparser = optparse.OptionParser('usage %prog -H  -p ')parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')parser.add_option('-p', dest='tgtPort', type='string', help='specify target port')(options, args) = parser.parse_args()tgtHost = options.tgtHosttgtPort = options.tgtPortif tgtHost == None or tgtPort == None: print(parser.usage) exit(0)else: print(tgtHost) print(tgtPort)

将主机名转换成IPv4互联网地址,对列表每个端口,我们都会连接目标地址与该端口。

尝试建立与扫描出来的目标主机和端口进行连接。

from socket import *def connScan(tgtHost, tgtPort): try: connSkt = socket(AF_INET, SOCK_STREAM) connSkt.connect((tgtHost, tgtPort)) print('[+] %d/tcp open' % tgtPort) connSkt.close() except Exception: print('[-] %d/tcp closed' % tgtPort)def portScan(tgtHost, tgtPorts): try: tgtIP = gethostbyname(tgtHost) except: print("[-] Cannot resolve '%s': Unknown host" % tgtHost) return try: tgtName = gethostbyaddr(tgtHost) print("[+] Scan Results for: " + tgtName[0]) except: print("[-] Scan Results for: " + tgtIP) setdefaulttimeout(1) for tgtPost in tgtPorts: print("Scannint port " + tgtPost) connScan(tgtHost, tgtPost)

发送垃圾数据并读取具体应用返回的Banner。

d4d1da3025f17f352b12fbee037fd829.png

抓取目标主机上的应用的Banner,找到开放的端口发送数据串并等待响应,收集响应判断出在目标主机和端口上运行的应用。

from socket import *def connScan(tgtHost, tgtPort): try: connSkt = socket(AF_INET, SOCK_STREAM) connSkt.connect((tgtHost, tgtPort)) connSkt.send('Hello Python') results = connSkt.recv(1024) print('[+] {}/tcp open'.format(tgtPort)) print('[+] ' + str(results)) connSkt.close() except: print('[-] {}/tcp closed'.format(tgtPort))def portScan(tgtHost, tgtPorts): try: tgtIP = gethostbyname(tgtHost) except: print("[-] Cannot resolve '{}': Unknown host".format(tgtHost)) return try: #通过主机名获取地址 In [6]: socket.gethostbyaddr('www.baidu.com')Out[6]: ('127.0.0.1', [], ['119.75.216.20']) 主机名 别名 IP tgtName = gethostbyaddr(tgtIP) print("[+] Scan Results for: " + tgtName[0]) except: print('[+] Scan Results for: ' + tgtIP) setdefaulttimeout(1) for tgtPort in tgtPorts: print('Scanning port ' + tgtPort) connScan(tgtHost, tgtPort)def main(): import optparse parser = optparse.OptionParser('usage %prog -H  -p ') parser.add_option('-H', dest='tgtHost', type='string', help='specify target host') parser.add_option('-p', dest='tgtPort', type='string', help='specify target port') (options, args) = parser.parse_args() tgtHost = options.tgtHost tgtPorts = (options.tgtPort).split(' ') if tgtPorts[0] == None or tgtHost == None: print('[-] You must specify a target host and port[s].') exit(0) portScan(tgtHost, tgtPorts)if __name__ == '__main__': main()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值