[Python黑帽子_黑客与渗透测试编程之道.pdf] 第三章代码

《Python黑帽子_黑客与渗透测试编程之道》github有好兄弟把书放出来了

https://github.com/TrojanAZhen/Self_Back/blob/master/书籍/Python黑帽子_黑客与渗透测试编程之道.pdf

由于原文是Python2,并且部分API有改动,这里的代码也略有改动,不影响使用

第三章总的来说还算简单,重点理解一下那个 IP 包结构和ICMP部分结构就行,我这样没怎么学过网络的童鞋来说,还行

windows和linux上的包嗅探

import socket
import os# 监听的主机,不是本机的IP也可以
host = "localhost"# 创建原始套接字,然后绑定在公开接口上
if os.name == "nt":socket_protocol = socket.IPPROTO_IP
else:socket_protocol = socket.IPPROTO_ICMP
# windows和linux 的区别,windows运行嗅探所有的数据包,linux只能嗅探ICMP协议sniffer = socket.socket(socket.AF_INET,socket.SOCK_RAW, socket_protocol)
sniffer.bind((host, 0))#
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)# 在 windows 平台上,我们需要设置 IOCTL 以启用混杂模式
if os.name == "nt":# 发送 IOCTL 信号到网卡驱动sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)# 读取单个数据包
while True:recv = sniffer.recvfrom(65535)# print(len(recv[0]), recv)print(recv[1])if os.name == "nt":sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

解码IP层

import socketimport os
import struct
from ctypes import *# 监听的主机
host = "10.202.60.3"# IP头定义
class IP(Structure):# 定义了 ctype 结构体_fields_ = [("ihl",           c_ubyte, 4),("version",       c_ubyte, 4),("tos",           c_ubyte),("len",           c_ushort),("id",            c_ushort),("offset",        c_ushort),("ttl",           c_ubyte),("protocol_num",  c_ubyte),("sum",           c_ushort),("src",           c_ulong),("dst",           c_ulong),]def  __new__(self, socket_buffer=None):# __new__ 方法将原始缓冲区中的数据填充到结构中return self.from_buffer_copy(socket_buffer)# 当调用 __init__ 方法时,__new__ 方法已经完成了对缓冲区数据的处理def __init__(self, socket_buffer=None):# 协议字段与协议名称self.protocol_map = { 1:"ICMP",6:"TCP",17:"UDP"}# 可读性更强的IP地址self.src_address = socket.inet_ntoa(struct.pack("<L", self.src))self.dst_address = socket.inet_ntoa(struct.pack("<L", self.dst))# 协议类型try:self.protocol = self.protocol_map[self.protocol_num]except:self.protocol = str(self.protocol_num)if os.name == "nt":socket_protocol = socket.IPPROTO_IP
else:socket_protocol = socket.IPPROTO_ICMPsniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)sniffer.bind((host, 0))
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)if os.name == "nt":sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)try:while True:# 读取数据包raw_buffer = sniffer.recvfrom(65535)[0]# 将缓冲区的前20个字节按照IP头进行解析ip_header = IP(raw_buffer[0:20])# 输出协议与通信双方的IP地址print("Protocal: %s %s -> %s" % (ip_header.protocol, ip_header.src_address, ip_header.dst_address))except KeyboardInterrupt:# 如果运行 windows 上,关闭混杂模式if os.name == "nt":sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

我这里ping一下百度哈:


这是我的结果:

ping 是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态

解码ICMP

import socketimport os
import struct
from ctypes import *# 监听的主机
host = "10.202.60.3"
# host = 'localhost'# IP头定义
class IP(Structure):# 定义了 ctype 结构体_fields_ = [("ihl",           c_ubyte, 4),("version",       c_ubyte, 4),("tos",           c_ubyte),("len",           c_ushort),("id",            c_ushort),("offset",        c_ushort),("ttl",           c_ubyte),("protocol_num",  c_ubyte),("sum",           c_ushort),("src",           c_ulong),("dst",           c_ulong),]def  __new__(self, socket_buffer=None):# __new__ 方法将原始缓冲区中的数据填充到结构中return self.from_buffer_copy(socket_buffer)# 当调用 __init__ 方法时,__new__ 方法已经完成了对缓冲区数据的处理def __init__(self, socket_buffer=None):# 协议字段与协议名称self.protocol_map = { 1:"ICMP",6:"TCP",17:"UDP"}# 可读性更强的IP地址self.src_address = socket.inet_ntoa(struct.pack("<L", self.src))self.dst_address = socket.inet_ntoa(struct.pack("<L", self.dst))# 协议类型try:self.protocol = self.protocol_map[self.protocol_num]except:self.protocol = str(self.protocol_num)class ICMP(Structure):_fields_ = [("type",         c_ubyte),("code",         c_ubyte),("checksum",     c_ushort),("unused",       c_ushort),("next_hop_mtu", c_ushort),]def __new__(self, socket_buffer):return self.from_buffer_copy(socket_buffer)def __init__(self, socket_buffer):passif os.name == "nt":socket_protocol = socket.IPPROTO_IP
else:socket_protocol = socket.IPPROTO_ICMPsniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)sniffer.bind((host, 0))
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)if os.name == "nt":sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)try:while True:# 读取数据包raw_buffer = sniffer.recvfrom(65535)[0]# 将缓冲区的前20个字节按照IP头进行解析ip_header = IP(raw_buffer[0:20])# if host == ip_header.src_address or host == ip_header.dst_address:#     # 输出协议与通信双方的IP地址#     print("Protocal: %s %s -> %s" % #           (ip_header.protocol, ip_header.src_address, ip_header.dst_address))# print("Protocal: %s %s -> %s" % #           (ip_header.protocol, ip_header.src_address, ip_header.dst_address))# 如果是 ICMP 协议包, 则进行处理if ip_header.protocol == "ICMP":# 计算ICMP包的起始位置offset = ip_header.ihl * 4# 计算ICMP数据在原始数据包中的偏移buf = raw_buffer[offset: offset+sizeof(ICMP)]# 解析 ICMP 数据icmp_header = ICMP(buf)print("ICMP -> Type: %d Code: %d" % (icmp_header.type, icmp_header.code))except KeyboardInterrupt:# 如果运行 windows 上,关闭混杂模式if os.name == "nt":sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
pip install netaddr -i https://mirror.baidu.com/pypi/simple
# 在程序中添加最后的代码,实现UDP数据的获取扫描结果了
import os
import socket
import threading
import time
import struct
from ctypes import *from netaddr import IPNetwork, IPAddress# 监听的主机
host = "10.202.60.3" # 本机地址# 扫描的目标子网
subnet = "10.202.32.000/19"# 自定义的字符串,我们将在 ICMP 响应中进行核对
magic_message = b"PYTHONRULES!"# IP头定义
class IP(Structure):# 定义了 ctype 结构体_fields_ = [("ihl",           c_ubyte, 4),("version",       c_ubyte, 4),("tos",           c_ubyte),("len",           c_ushort),("id",            c_ushort),("offset",        c_ushort),("ttl",           c_ubyte),("protocol_num",  c_ubyte),("sum",           c_ushort),("src",           c_ulong),("dst",           c_ulong),]def  __new__(self, socket_buffer=None):# __new__ 方法将原始缓冲区中的数据填充到结构中return self.from_buffer_copy(socket_buffer)# 当调用 __init__ 方法时,__new__ 方法已经完成了对缓冲区数据的处理def __init__(self, socket_buffer=None):# 协议字段与协议名称self.protocol_map = { 1:"ICMP",6:"TCP",17:"UDP"}# 可读性更强的IP地址self.src_address = socket.inet_ntoa(struct.pack("<L", self.src))self.dst_address = socket.inet_ntoa(struct.pack("<L", self.dst))# 协议类型try:self.protocol = self.protocol_map[self.protocol_num]except:self.protocol = str(self.protocol_num)class ICMP(Structure):_fields_ = [("type",         c_ubyte),("code",         c_ubyte),("checksum",     c_ushort),("unused",       c_ushort),("next_hop_mtu", c_ushort),]def __new__(self, socket_buffer):return self.from_buffer_copy(socket_buffer)def __init__(self, socket_buffer):passif os.name == "nt":socket_protocol = socket.IPPROTO_IP
else:socket_protocol = socket.IPPROTO_ICMPsniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol)sniffer.bind((host, 0))
sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)# 批量发送 UDP 数据包
def udp_sender(subnet, magic_message):time.sleep(1)sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)for ip in IPNetwork(subnet): # 我的IP是:list(IPNetwork(subnet))try:# print("[SendTo] %s %d"%(ip, 65212))sender.sendto(magic_message, ("%s"%ip, 65212))except:passtime.sleep(0.05)# udp_sender(subnet, magic_message) # 调试入口# 开始发送数据包
t = threading.Thread(target=udp_sender, args=(subnet, magic_message))
t.start()if os.name == "nt":sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)try:while True:# 读取数据包raw_buffer = sniffer.recvfrom(65535)[0]# 将缓冲区的前20个字节按照IP头进行解析ip_header = IP(raw_buffer[0:20])# if host == ip_header.src_address or host == ip_header.dst_address:#     # 输出协议与通信双方的IP地址#     print("Protocal: %s %s -> %s" % #           (ip_header.protocol, ip_header.src_address, ip_header.dst_address))# print("Protocal: %s %s -> %s" % #           (ip_header.protocol, ip_header.src_address, ip_header.dst_address))# 如果是 ICMP 协议包, 则进行处理if ip_header.protocol == "ICMP":# 计算ICMP包的起始位置offset = ip_header.ihl * 4# 计算ICMP数据在原始数据包中的偏移buf = raw_buffer[offset: offset+sizeof(ICMP)]# 解析 ICMP 数据icmp_header = ICMP(buf)# print("ICMP -> Type: %d Code: %d" % #       (icmp_header.type, icmp_header.code))# 检查类型和代码值是否为3if icmp_header.code == 1 and icmp_header.type == 3:# 确认响应的主机在我们的目标子网之内if IPAddress(ip_header.src_address) in IPNetwork(subnet):# 确认 ICMP 数据中包括我们发送的自定义的字符串if raw_buffer[len(raw_buffer)-len(magic_message):] == magic_message:print("Host Up: %s -> %s" % (ip_header.dst_address, ip_header.src_address))except KeyboardInterrupt:# 如果运行 windows 上,关闭混杂模式if os.name == "nt":sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

Python黑帽子_hack与渗透测试编程之道 第三章代码相关推荐

  1. Python黑帽子--黑客与渗透测试编程之道 python3 实现代码

    最近在看 Python黑帽子–黑客与渗透测试编程之道 这本书 发现这本书的代码实现都是使用python2 的于是我就想使用python3来实现 缓慢更新中 python2版本 有一个博主写的特别好 这 ...

  2. Python黑帽子 黑客与渗透测试编程之道(七) 第四章:Scapy:网络的掌控者

    1 窃取Email认证 代码: from scapy.all import *def packet_callback(packet):if packet[TCP].payload:mail_packe ...

  3. Python黑帽子-黑客与渗透测试编程之道

    Python黑帽子-黑客与渗透测试编程之道 时间:2018年4月28日 前言 本文参考了两篇资料,优化补全了代码内容 giantbranch 的 Python黑帽子–黑客与渗透测试编程之道 意闲 的 ...

  4. 关于《Python黑帽子:黑客与渗透测试编程之道》的学习笔记

    本篇文章是学习<Python黑帽子:黑客与渗透测试编程之道>的笔记,会持续地将书上的代码自己敲一遍,从而让自己对Python的安全编程有更多的了解,同时希望各位可以给给建议,不足之处太多了 ...

  5. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(三):scapy——网络的掌控者

    目录 前言 1.窃取email认证 2.ARP缓存投毒 3.PCAP文件处理 结语 前言 <Python黑帽子:黑客与渗透测试编程之道>的读书笔记,会包括书中源码,并自己将其中一些改写成P ...

  6. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(九):自动化攻击取证

    目录 前言 1.Volatility配置 2.抓取口令的哈希值 3.直接代码注入 4.插入shellcode 结语 前言 <Python黑帽子:黑客与渗透测试编程之道>的读书笔记,会包括书 ...

  7. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(二):原始套接字和流量嗅探

    目录 前言 1.Windows和Linux上的包嗅探 2.解码IP层 3.解码ICMP层 4.发现主机 结语 前言 <Python黑帽子:黑客与渗透测试编程之道>的读书笔记,会包括书中源码 ...

  8. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(四):web攻击

    目录 前言 1.urllib2 2.开源web应用安装 3.破解目录和文件位置 4.破解HTML表格认证 结语 前言 <Python黑帽子:黑客与渗透测试编程之道>的读书笔记,会包括书中源 ...

  9. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(五):扩展burp代理

    目录 前言 1.burp的fuzz脚本 2.burp中利用Bing服务 3.利用网站内容生成密码字典 结语 前言 <Python黑帽子:黑客与渗透测试编程之道>的读书笔记,会包括书中源码, ...

  10. 《Python黑帽子:黑客与渗透测试编程之道》 Web攻击

    Web的套接字函数库:urllib2 一开始以urllib2.py命名脚本,在Sublime Text中运行会出错,纠错后发现是重名了,改过来就好: #!/usr/bin/python #coding ...

最新文章

  1. 一个弹出式menu的制作
  2. 用了fastapi还需要nginx_专门为API接口开发出现,FastAPI零门槛学习
  3. 日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别
  4. 一个草根站长的创业故事·双喜临门
  5. CodeForces 525C Ilya and Sticks 贪心
  6. ffmpeg-0.8 开源编码解码库从linux下移植到windows vs2005
  7. C++学习之路 | PTA乙级—— 1018 锤子剪刀布 (20分)(精简)
  8. jpa 托管_java – jpa非托管实体
  9. NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver.
  10. jmeter笔记02
  11. Jenkins自动化UI测试Tomcat报错“The web application [/jenkins] appears to have started a thread named”解决办法...
  12. EF架构~对AutoMapper实体映射的扩展
  13. 施工员简历英语计算机水平,土建施工员电子版英文简历模板
  14. 主板检测卡常见错误代码:0D~0F
  15. Pano2VR 展示全景图
  16. 智能电销机器人语音自动外呼效果好吗
  17. 用python来开发webgame服务端(3)
  18. “迅速、坚决、果断”
  19. 2021最受欢迎开源免费CMS建站系统排行榜
  20. 计算机有哪些知识,电脑基本操作知识有哪些

热门文章

  1. nero 2015 installing
  2. 3dmax快捷键大全
  3. 数学建模中的规划问题
  4. 【HTML】【简易电子相册】超链接
  5. 微信公众帐号中使用的QQ表情代码对照表
  6. 微信经典飞机大战素材
  7. linux看网卡ip,linux查看ip地址、显示太网卡配置、网络设备
  8. [渝粤教育] 四川农业大学 农业气象学 参考 资料
  9. cadence SPB17.4 - 保存和恢复颜色配置
  10. 【Linux】一个小故事让你秒懂shell外壳程序