Python安全攻防-从入门到入狱
Posted {Yasso}
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python安全攻防-从入门到入狱相关的知识,希望对你有一定的参考价值。
居家隔离闲着无聊
思来想去决定写篇关于 【 P y t h o n 攻 防 】 \\colorblue【Python攻防】 【Python攻防】专栏
没办法-越🥦越想学
网上有《Python安全攻防》📕
想深入学习的👦可以买
我没买–毕竟我喜欢白嫖🤪
⛰前言⛰
- 随着近几年互联网的发展,Python在各行各业发挥着举足轻重的作用。除应用在科学计算、大数据处理等人们熟知的领域外,在信息安全领域中使用也异常广泛。这是因为对于渗透测试工程师来说Python语言不仅上手容易,而且还有大量丰富的开源库。通过Python可以帮助他们又好又快的完成一项任务,以少量的代码便可实现所需功能。从而借助Python打造更安全的💻。
国家网络安全法
敲重点👉中华人民共和国网络安全法👈建议倒背如流
🌋正文🌋
一、Socket网络编程
网络调试助手:https://pan.baidu.com/s/1Do-v8XMDaIYJsXRQok5RhQ 提取码:ya4g (便于测试)
套接字(Socket)是计算机之间进行通信的一种约定。通过Socket,一台计算机可以接受其他计算机的数据,也可以向其他计算机发送数据。远程管理软件和黑客软件大多依赖于Socket来实现特定功能的,其包括两个部分:运行于服务器端称之为ServerSocket,运行于客户机端称之ClientSocket。
TCP
TCP是因特网中的传输层协议,使用三次握手协议建立连接。
TCP_Client.py
import socket
def main():
# 创建TCP套接字
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 服务器地址
sever_ip = input("请输入服务器ip:")
sever_port = input("请输入服务器端口:")
# 连接服务器(元组)
tcp_client_socket.connect((sever_ip,int(sever_port)))
# 输入发送的数据
data = input("请输入要发送的数据:")
# 发送数据
tcp_client_socket.send(data.encode("utf-8"))
#接收数据
recv_data = tcp_client_socket.recv(1024)
print("对方的回复:"recv_data.decode("utf-8"))
if __name__ == '__main__':
main()
nc -lvp 8888
监听8888端口
(一次完整对话)
TCP_Sever.py
import socket
def main():
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定本地IP和端口
tcp_server_socket.bind(("192.168.12.1",8888))
# 被动 listen
tcp_server_socket.listen(128)
while True:
# 等待客户端信息
print("等待客户端连接")
client_socket,client_addr = tcp_server_socket.accept()
print("客户端为:",client_addr)
#接收对方发送数据
recv_data = client_socket.recv(1024)
print("接收到信息为:",recv_data.decode("utf-8"))
#发送数据到客户端
client_socket.send("Yasso".encode("utf-8"))
client_socket.close()
if __name__ == "__main__":
main()
UDP
UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
UDP_Client_send.py
import socket
#创建udp套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 目标ip和端口
target_addr = ('192.168.12.128',8888)
#获取数据
data = input("请输入要发送的数据:")
#发送数据
udp_socket.sendto(data.encode('utf-8'),target_addr)
udp_socket.close()
UDP_Client_receive.py
import socket
#创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
local_addr=('192.168.12.128',8888)
#绑定ip(必须本地)和端口
udp_socket.bind(local_addr)
#等待接受对方发送的数据
recv_data = udp_socket.recvfrom(1024) #表示本次接受的最大字节数1024
# 显示接受的数据
print(recv_data[0].decode('utf-8'))
udp_socket.close()
liunx等待接受数据->win10发送数据->liunx成功接收数据
nc -ulp 8888
监听udp模式下的8888端口
私密聊天室
# UDP应用-私密聊天室(极简)
import socket
def send(chat_ip,chat_port):
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
"""发送消息"""
address = (chat_ip,int(chat_port))
print(address)
data = input("请输入发送的消息:")
udp_socket.sendto(data.encode("utf-8"),address)
def receive():
"""接收消息"""
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定本地IP和端口
udp_socket.bind(("192.168.12.1",8888))
recv_data = udp_socket.recvfrom(1024)
print(recv_data[0].decode('utf-8'))
def main():
chat_ip = input("请输入您聊天对方IP地址:")
chat_port = input("请输入您聊天对方端口:")
# 循环调用
while True:
print("++++++欢迎进入私密聊天室++++++")
print("0:发送消息")
print("1:接收消息")
print("2:退出聊天")
function = input("请输入您要用的模块")
if function == "0":
send(chat_ip,chat_port)
elif function == "1":
receive()
elif function == "2":
break
else:
print("输入有误,请重新输入")
if __name__ == '__main__':
main()
二、Scapy网络嗅探
Scapy是一个可以让用户发送、侦听和解析并伪装网络报文的Python程序。这些功能可以用于制作侦测、扫描和攻击网络的工具
pip install scapy
安装scapy
pip install ipython
安装交互式shell
Scapy是一个强大的交互式包操作程序。它能够伪造或解码大量协议的数据包,在网络上发送它们,捕获它们,匹配请求和响应,等等。Scapy可以轻松地处理大多数经典任务,如扫描、跟踪、探测、单元测试、攻击或网络发现。它可以代替hping、arpsoof、arp-sk、arping、p0f甚至Nmap、tcpdump和tshark的某些部分
TCP发送数据
TCPsend.py
# -- coding: utf-8 --
import time
import threading
import sys
from scapy.all import *
# 数据包应用层数据部分
data = 'flagflag_is_not_here'
# src:源地址 、sport:源端口、dst:目标地址、dport:目标端口
pkt = IP(src='192.168.12.128', dst='192.168.12.166') / TCP(sport=4444, dport=6666) / data
# 间隔一秒发送一次 总共发送5次 发送网卡口(iface):eth0
send(pkt, inter=1, count=5, iface="eth0")
基于ICMP协议的存活主机探测
ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。 属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。
判断是否为活跃主机,只需要向其发送一个ICMP请求,如果这台主机处于活跃状态,那么它在收到这个请求之后就会给出一个回应。
# -- coding: utf-8 --
from scapy.all import *
# 构造IP包头构造ICMP包头加载发送数据包函数
for i in range(1,254): # 整个个网段
ip="192.168.12."+str(i) # 设置IP地址
pkt=IP(dst=ip,src="192.168.12.128")/ICMP(type="Echo-request") #ICMP包的类型为Echo request——回显请求(Ping请求)
rep=sr1(pkt,timeout=1,verbose=False) # 发送和接受数据包,超时时间为1秒,设置无过程回显。
# 如果该数据包有回应则输出
if rep:
print("The " + rep[IP].src + " is live")
基于TCP/UDP的主机发现
基于TCP、UDP的主机发现属于四层主机发现是一个位于传输层的协议。可以用来探测远程主机存活、端口开放、服务类型以及系统类型等信息,相比于三层主机发现更为可靠用途更广.
TCP
工作原理主要依据目标主机响应数据包中flags字段,如果flags字段有值,则表示主机存活,该字段通常包括SYN、FIN、ACK、PSH、RST、URG六种类型。SYN表示建立连接,FIN表示关闭连接,ACK表示应答,PSH表示包含DATA数据传输,RST表示连接重置,URG表示紧急指针。
# -- coding: utf-8 --
from scapy.all import *
for i in range(1,254): # 整个个网段
ip="192.168.12."+str(i) # 设置IP地址
pkt=IP(dst=ip)/TCP(flags="A",dport=4444) #响应数据包中flags值判断主机是否存活
rep=sr1(pkt,timeout=1,verbose=False) # 发送和接受数据包,超时时间为1秒,设置无过程回显。
if rep:
# 如果该数据包有相应则输出
print("The " + rep[IP].src + " is live")
UDP
UDP是向目标主机一个没有开放的端口发送数据,目标主机会返回一个目的端口不可达的ICMP报文,以此来判断主机是否在线。如果主机不在线,或者目标端口开放,UDP探测是不会收到响应包的。
# -- coding: utf-8 --
from scapy.all import *
for i in range(1,254): # 整个个网段
ip="192.168.12."+str(i) # 设置IP地址
pkt=IP(dst=ip)/UDP(dport=6666)
rep=sr1(pkt,timeout=1,verbose=False) # 发送和接受数据包,超时时间为1秒,设置无过程回显。
if rep:
# 如果该数据包有相应则输出
print("The " + rep[IP].src + " is live")
wireshark拦截
基于ARP协议的主机发现
地址解析协议,即ARP,是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
ARP
对以太网内的每个主机都进行ARP请求。若主机存活,则会响应我们的ARP请求,否则不会响应.因为ARP涉及网络层和数据链路层所以需要使用Scapy中的Ether和ARP。
# -- coding: utf-8 --
from scapy.all import *
for i in range(1,254): # 整个个网段
ip_list=[]
ip="192.168.12."+str(i) # 设置IP地址
# 发送ARP包
# 二层发包,需要添加以太网头部,所以要写成Ether/ARP
# 因为最底层用到了二层,所以要用srp()发包
ans=srp(Ether(dst='FF:FF:FF:FF:FF:FF')/ARP(op=1,pdst=ip,hwdst='00:00:00:00:00:00'),timeout=1,verbose=False)
if ans[0].res:
print("The "+ip+" is live")
三、信息搜集
IP查询
IP查询是通过当前所获取到的URL去查询对应IP地址的过程。可以应用Socket库函数中的gethostbyname()获取域名所对应的IP值°
import socket
domain = input("请输入要查询的域名:")
ip = socket.gethostbyname(domain)
print("IP地址为:",ip)
Whois查询
whois模块查询域名www.baidu.com的注册信息
pip install python-whois
安装模块
from whois import whois
data = whois('www.baidu.com')
print(data)
子域名挖掘
域名可以分为顶级域名、—级域名、二级域名等。子域名(subdomam)是顶级域名(一级域名或父域名)的下—级。例如mail.example.com和calendar.example.com是example.com的两个子域,而example.com则是顶级域.com的子域。在测试过程中测试目标主站时如果未发现任何相关漏洞,此时通常会考虑⛏︎目标系统的子域名。子域名⛏︎方法有很多种,例如,搜索引擎、子域名破解、字典查询等。
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import sys
def bing_search(site,pages):
Subdomain = []
headers = #HTTP Headers是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/99.0.7113.93 Safari/537.36', #是HTTP协议中的一部分,属于头域的组成部分,是一种向访问网站提供你所使用的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',#属于请求报头,代表发送端(客户端)希望接受的数据类型
'Referer': "https://cn.bing.com", #表示一个来源
for i in range(1,int(pages)+1):
url = "https://cn.bing.com/search?q=site%3a"+site+"&go=Search&qs=ds&first="+ str((int(i)-1)*10) +"&FORM=PERE"
html = requests.get(url,headers=headers) #获取HTML网页,对应HTTP的GET
soup = BeautifulSoup(html.content,'html.parser')
job_bt = soup.findAll('h2') #返回一个包含HTML文档标题标签h2的列表
for i in job_bt:
link = i.a.get('href')
domain = str(urlparse(link).scheme + "://" +urlparse(link).netloc) #储存子域名
if domain in Subdomain:
pass
else:
Subdomain.append(domain)
print(domain)
if __name__ == '__main__':
if len(sys.argv) == 3:
site = sys.argv[1]
page = sys.argv[2]
else:
print("usage: %s baidu.com 10" % sys.argv[0]) #输出帮助信息
sys.exit(-1)
Subdomain = bing_search(site,page)
python Subdomain.py baidu.com 20
数字20表示获取Ping引擎页数
力推👉️在线子域名查询👈️
邮件爬取
在针对目标系统进行渗透的过程中,如果目标服务器安全性很高,通过服务器很难获取目标权限时,通常会采用社工的方式对目标服务进行进一步攻击🤺。针对搜索界面的相关📩信息进行爬取、处理等操作之后。利用获得的📫账号批量发送🎣📩,诱骗、欺诈目标用户或管理员进行账号登录或点击执行,进而获取目标系统的其权限。
import sys
import getopt
import requests
from bs4 import BeautifulSoup
import re
#主函数,传入用户输入的参数
def start(argv):
url = ""
pages = ""
if len(sys.argv) < 2:
print("-h 帮助信息;\\n")
sys.exit()
#定义异常处理
try:
banner()
opts,args = getopt.getopt(argv,"-u:-p:-h")
except getopt.GetoptError:
print('Error an argument!')
sys.exit()
for opt,arg in opts:
if opt == "-u":
url = arg
elif opt == "-p":
pages = arg
elif opt == "-h":
print(usage())
launcher(url,pages)
#banner信息
def banner():
print('\\033[0;31;42m 爬虫不控频,亲人两行泪 \\033[0m')
#使用规则
def usage():
print('-h: --help 帮助;')
print('-u: --url 域名;')
print('-p: --pages 页数;')
print('eg: python -u "www.baidu.com" -p 100' + '\\n')
sys.exit()
#漏洞回调函数
def launcher(url,pages): #调用bing_search()和baidu_search()函数并且将bing爬到的和baidu爬到的合并去重
email_num = []
key_words = ['email','mail','mailbox','邮件','邮箱','postbox']
for page in range(1,int(pages)+1):
for key_word in key_words:
bing_emails = bing_search(url,page,key_word)
baidu_emails = baidu_search(url,page,key_word)
sum_emails = bing_emails + baidu_emails
for email in sum_emails:
if email in email_num:
以上是关于Python安全攻防-从入门到入狱的主要内容,如果未能解决你的问题,请参考以下文章