展开

关键词

《Python黑帽子》:原始套接和流量嗅探

本文中,我们将使用原始套接来访问诸如IP 和ICMP 头等底层的网络信息。在下面的例子,我们只对IP 层和更高层感兴趣,因此我们不会去解码以太网头中的信息。 Windows 和Linux 上的包嗅探 Windows 和Linux 上访问原始套接有些许不同,但我们更中意于多平台部署同样的嗅探器以实现更大的灵活性。 第一个例子,我们只需设置原始套接嗅探器,读取一个数据包,然后退出即可。 ? 首先,我们通过构建套接对象对网络接口上的数据包嗅探进行必要的参数设置①。 然后,我们通过设置套接选项②设置捕获的数据包包含IP 头。下一步③,我们判断程序是否运行在Windows 上,如果是,那么我们发送IOCTL 信号到网卡驱动上以启用混杂模式。 可以看到,我们捕获到的是发送到nostarch.com 的ICMP ping 请求包(基于数据的nostarch.com 字符串)。

40020

Go中原始套接的深度实践

介绍 原始套接(raw socket)是一种网络套接,允许直接发送/接收更底层的数据包而不需要任何传输层协议格式。 平常我们使用较多的套接(socket)都是基于传输层,发送/接收的数据包都是不带TCP/UDP等协议头部的。 当使用套接发送数据时,传输层在数据包前填充上面格式的协议头部数据,然后整个发送到网络层,接收时去掉协议头部,把应用数据抛给上层。 如果想自己封装头部或定义协议的话,就需要使用原始套接,直接向网络层发送数据包。 为了便于后面理解,这里统一称应用数据为 payload,协议头部为 header,套接为socket。 冒号后面的是子协议,表示监听的是网络层icmp协议的流量,这个子协议IP header字段Protocol(下面的8位协议)体现出,IP header一般也是20节: ?

1.6K20
  • 广告
    关闭

    老用户专属续费福利

    云服务器CVM、轻量应用服务器1.5折续费券等您来抽!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python socket 模块的使用

    ,普通的套接无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接,可以通过IP_HDRINCL套接选项由用户构造IP SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。    其中data是包含接收数据的字符串,address是发送数据的套接地址。 sk.send(string[,flag])   将string的数据发送到连接的套接。 sk.sendall(string[,flag])   将string的数据发送到连接的套接,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。 每一条线程接收请求之后如何处理,这个步骤就是由我们自己 定义的类来指定了 """ class MyServer(SocketServer.BaseRequestHandler):     #这个handle

    38420

    C语言第1课——socket编程+c++,c语言语录

    2.套接(socket) 在网络中用来描述计算机不同程序与其他计算机程序的通信方式。socket其实是一种特殊的IO接口,也是一种文件描述符。 套接分为三类: 流式socket(SOCK_STREAM):流式套接提供可靠、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。 原始socket:原始套接允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用复杂,主要用于一些协议的开发。 套接由三个参数构成:IP地址,端口号,传输层协议。 套接的数据结构:C语言进行套接编程时,常会使用到sockaddr数据类型和sockaddr_in数据类型,用于保存套接信息。 ,大部分的情况下只是用于bind,connect,recvfrom,sendto等函数的参数,指明地址信息,一般编程,并不对此结构体直接操作。

    43010

    原始套接 IP_HDRINCL 转

    原始套接可以访问ICMPICMP等协议包,可以读写内核不处理的IP数据包。可以创建自定义的IP数据包首部。一句话,使用原始套接可以   编写基于IP协议的通讯程序。    IP协议第二个参数:SOCKET类型第三个参数:协议类型注意:@如果指定协议为0时,原始套接可以接收内核传递给原始套接的任何IP数据包,且只有超级用户才可以创建原始套接。    @当需要编写自己的IP数据包首部时,可以原始套接上设置套接选项IP_HDRINCL.不设置这个选项的情况下,IP协议自动填充IP数据包的首部。    发送数据包   使用原始套接发送数据包必须遵循以下规则:1.如果没有用connect函数绑定对方地址时,则应使用sendto或sendmsg函数发送数据包,函数参数中指定对方地址。如? 将一个IP数据包传送给原始套接之前,内核需要选择匹配的原始套接1.数据包的协议域必须与接收原始套接的协议类型匹配。

    1.1K10

    UNPv1第二十五章:原始套接

    概述 原始套接口提供以下三种TCP及UDP套接口一般不提供的功能。 1. 使用原始套接口可以读写ICMPv4,IGMPv4,ICMPv6分组。 例如:Ping程序,就使用原始套接口发送ICMP回射请求,并接受ICMP回射应答。 2. 使用原始套接口可以读写特殊的IPv4数据报,内核不处理这些数据报的IPv4协议字段。 3. (4)原始套接口上可调用connect函数,但也不常用。connect函数仅设置目的地址,再重申一遍:端口号对原始套接口而言没有意义。 原始套接口输入 接收到的哪些IP分组将传递给原始套接口: (1)接收到的TCP分组和UDP分组决不会传递给任何原始套接口,如果一个进程希望读取包括TCP或UDP分组的IP数据报,那么它们必须在数据链路层读入 对源自Berkeley的实现而言,除了回射请求,时间戳请求和地址掩码请求将完全由内核处理以外,所有收到的ICMP分组都将传递给某个原始套接口。

    39640

    python学习----------so

    #从服务端接收消息 serve_data = obj_client.recv(1024) print serve_data obj_client.close() 具体的解释代码已经给出,可以操作体会 ,普通的套接无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接,可以通过IP_HDRINCL套接选项由用户构造IP SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。    注:讲select时会用到 sk.accept()   接受连接并返回(conn,address),其中conn是新的套接对象,可以用来接收和发送数据。address是连接客户端的地址。 其中data是包含接收数据的字符串,address是发送数据的套接地址。 sk.send(string[,flag])   将string的数据发送到连接的套接

    17010

    Python3实现ICMP远控后门(上)

    HTTP协议主要是用在以大型网站作为C&C服务器的场景,例如之前就有使用twitter作为 C&C服务器。 ping命令使用的就是ICMP协议,ping百度的过程,咱们使用wireshark抓一下包,这样比较直观。 ICMP报文以IP协议为基础,其报文格式如下: ? 如上图所示,ICMP协议实际传输数据包:20节IP首部 + 8ICMP首部+ 1472节<数据大小>38节。 第三节 ping实现 在上面我们简单讲解了ICMP的报文格式,接下来我们使用Python3根据报文格式简单实现一下ping功能,主要用到了raw socket技术,即原始套接使用struct pack 原始套接的初始化,使用如下代码: socket.socket(socket.AF_INET,socket.SOCK_RAW, socket.getprotobyname('icmp')) 里面比较复杂的是计算校验和

    72430

    网络嗅探器

    原理:   通常的套接程序只能响应与自己MAC地址相匹配的 或者是 广播形式发出的数据帧,对于其他形式的数据帧网络接口采取的动作是直接丢弃   为了使网卡接收所有经过他的封包,要将其设置成混杂模式,通过原始套接来实现 设置混杂模式:   创建原始套接,   绑定到一个明确的本地地址,   向套接发送SIO_RCVALL控制命令,   接收所有的IP包 代码实现步骤:   1 创建原始套接   2 绑定到明确地址 主程序代码如下: void main() { //创建原始套接 SOCKET sRaw = socket(AF_INET,SOCK_RAW,IPPROTO_IP); //获取本地 取出封包的协议头,向用户打印出协议信息。 : break; } } void main() { // 创建原始套节 SOCKET sRaw = socket(AF_INET, SOCK_RAW,

    996100

    Python-socket总结

    socket是什么 什么是socket所谓socket通常也称作"套接",用于描述IP地址和端口,是一个通信链的句柄。 应用程序通常通过"套接"向网络发出请求或者应答网络请求。 列入你和移动客服咨询问题时,会有一个客服为你解决问题一样,就是你和客服间的相互通信 socket里就是“发送”和“接收”这两个动作就是socket通信方式 socket.gethostname()     socket.SOCK_STREAM # 流式socket , for TCP socket.SOCK_DGRAM # 数据报式socket , for UDP socket.SOCK_RAW # 原始套接 ,普通的套接无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接,可以通过IP_HDRINCL套接选项由用户构造IP SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用

    29920

    linux 网络通信(TCPIP)《Rice linux 学习开发》

    (SOCK_STREAM):流式套接提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。 原始socket:原始套接允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。 listen()函数:服务端程序成功建立套接和与地址进行绑定之后,还需要准备套接接收新的连接请求。此时调用listen()函数来创建一个等待队列,在其中存放未处理的客户端连接请求。 accept()函数:服务端程序调用listen()函数创建等待队列之后,调用accept()函数等待并接收客户端的连接请求。它通常从由bind()所创建的等待队列取出第一个未处理的连接请求。 connect()函数:该函数TCP是用于bind()的之后的client端,用于与服务器端建立连接。 send()和recv():这两个函数分别用于发送和接收数据,用在TCP

    7420

    python资源库——socket网络编

    sockket简介 socekt又称为‘套接’,用于描述IP和地址端口,是一个通信链路的句柄,应用程序通常通过套接向网络发出请求或者应答网络请求。 ,普通的套接无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接,可以通过IP_HDRINCL套接选项由用户构造IP SOCK_RAM用来提供对原始协议的低级访问,需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。 其中data是包含接收数据的字符串,address是发送数据的套接地址。 sk.send(string[,flag]) 将string的数据发送到连接的套接。 然后接收传来的数据,并发送给对方数据 传输完毕后,关闭套接 TCP客户端 创建套接,连接远端地址 连接后发送数据和接收数据 传输完毕后,关闭套接 server端: import socket ip_port

    29010

    网络协议

    b类,前16位表示网络id,后16位表示主机id,分配给中等规模的企业使用C类,前24位表示网络id,后8位表示主机id,该地址分配给任何需要的人使用。 是通过网络号的头几位区分abcde三类。 一个路由式网络,源地址主机向目标地址主机发送数据时,IP协议是如何将数据成功发送到目标主机上面的呢。 为了区分同一台主机上面不同应用程序的数据包,传输层提供了端口和套接.端口号用来识别应用程序. 套接socket,可以区分不同应用程序间的网络通讯和连接. 多路复用:从源主机的不同套接收集数据库,并且能为每个数据块封装首部信息,从而生成报文段,然后将报文段传递到网络层. 多路分解,能把传输层报文段的数据交付到正确的套接. 重新排序,就算TCP数据报以错误的顺序到达目的地,也能重新排序,恢复原始数据. 流量控制,TCP能确保数据传输不会超过目的计算机接收数据的能力. 优先级和安全, 适当的关闭.

    9610

    IO复用——shutdown函数

    其中ICMP报文56个字节,再加上20个字节的IP头和8个字节的ICMP头。因此IP报文的总长度为84节。 使用原始的回射客户端服务器程序,发送10条44节的文本测试一下,可以看到实际的时延和我们预估的一致。 绘制满足上述假设的一个请求过程: [以停-等方式填充管道] 由于管道是全双工的,这样一个请求过程,我们只用了1/8的管道容量,为了充分利用管道,我们可能会考虑批量地客户端进行输入。 [管道仍有未完成请求和应答] 因此我们需要一种方式来关闭TCP连接的一半,给服务器发送一个FIN,告诉它已经完成数据发送,但是仍开放套接口描述用于读数据。这就需要shutdown函数来完成。 无论描述访问计数是否为0,进程都不能再对套接口执行任何写操作。 SHUT_RDWR 关闭连接的读和写。等效于先使用SHUT_RD调用,然后使用SHUT_WD调用。

    26451

    八股文!!

    Fragment offset:某个分片位于原始报文中的偏移,重组报文时使用 TTL:分片生命周期 Protocol:上层协议标识(TCP/UDP/ICMP等) 校验和:针对IP首部的累加校验和 源IP 早期的IP地址网络号与主机号使用固定分配 基于子网掩码的划分 子网掩码将ip地址中网络号的位设置为1,主机标识的位设置为0 IP路由配置 发送数据包时,首先确认IP包的目的IP地址,再从路由控制表中找到与该地址具有相同网络地址的记录 并且可以让迷途的分组该时间内自然消亡,不会影响以该套接对建立的新链接。 但这也导致该链接使用的本地端口在这段时间内不能被使用 该选项允许使用处于2MSL等待状态的本地端口 tcp是双工的链接,底层针对每一条链接都有自己的发送缓冲区和接收缓冲区,同时可以互不影响的发送和接收数据 机器崩溃 机器崩溃时,tcp内核模块无法做出反应,对端不会接收到任何通知也不会再接收到任何数据 另一端read该套接时,将会被挂起或得到EAGAIN错误 另一端write该套接时将会持续重传,直到

    13311

    Cocos网络篇(3) ——S

    【唠叨】     客户端游戏开发使用HTTP进行网络通信的比较少,一般使用的都是Socket进行通信。而HTTP一般用于网页或者网页游戏。      数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接。  2.3、原始套接(SOCK_RAW)      该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务配置的新设备。 (c)连接确认:当服务器端套接监听到或者说接收到客户端套接的连接请求时,就响应客户端套接请求,建立一个新的线程,把服务器端套接的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。 而服务器端套接继续处于监听状态,继续接收其他客户端套接的连接请求

    28230

    ping 实现设计---ICMP

    校验和的计算方法:   将数据以为单位累加到一个双字,如果数据长度为奇数,最后一个字节将被扩展到,累加的结果是一个双字,最后将这个双字的高16位,低16位相加后取反,便得到了校验和。 下面是Ping的执行步骤: 1 创建协议类型为IPPROTO_ICMP原始套接 2 创建并初始化ICMP封包 3 调用sendto函数向远程主机发送ICMP请求 4 调用recvfrom函数接收ICMP int main() { // 目的IP地址,即要Ping的IP地址 char szDestIp[] = "127.0.0.1"; // 127.0.0.1 // 创建原始套节 pIcmp->icmp_type = 8; // 请求一个ICMP回显 pIcmp->icmp_code = 0; pIcmp->icmp_id = (USHORT)::GetCurrentProcessId { printf(" Too few bytes from %s \n", ::inet_ntoa(from.sin_addr)); } // 接收到的数据包含

    45470

    原始 socket 编程

    原始套接简介 普通 socket 的权力和原始 socket 权力对比。 1.原始 socket 可以和内核一样直接对所有层进行操作(除了物理层)。可以更改 mac 更改 ip 更改端口。 它值都是系统预先定义的宏,系统支持哪些协议我们才可以使用,否则会调用失败。协议簇是网络层的协议。一种是处理IP层即其上的数据,通过指定socket第一个参数为AF_INET来创建这种套接。 有两种原始套接。另一种是处理数据链路层即其上的数据,通过指定socket第一个参数为AF_PACKET来创建这种套接。 能:该套接可以接收协议类型为(tcp udp icmp等)发往本机的ip数据包 不能:收到非发往本地ip的数据包(ip软过滤会丢弃这些不是发往本机ip的数据包) 不能:收到从本机发送出去的数据包发送的话需要自己组织 (ETH_P_IP|ETH_P_ARP|ETH_P_ALL)) 发送接收以太网数据帧这种套接比较强大,可以监听网卡上的所有数据帧 能: 接收发往本地mac的数据帧 能: 接收从本机发送出去的数据帧

    77820

    原始套接打造ping命令

    简单来说,ping命令发出的数据,类型是8,代码是0,如果对方有回应,那么对方回应的数据,类型是0,代码是0。 自己实现Ping命令时,就是去自己构造一个请求回显的ICMP数据报,然后进行发送。 最下面的部分显示了数据的原始的二进制数据,熟练掌握协议后,查看原始的二进制数据也并不是不可能的。 *)szBuff; char icmp_data[32] = { 0 }; WSAStartup(MAKEWORD(2, 2), &wsaData); // 创建原始套接 完整内容参考《C++黑客编程揭秘与防范》(第三版)一书。

    33830

    相关产品

    • 高级威胁检测系统

      高级威胁检测系统

      腾讯云高级威胁检测系统(Network Traffic Analysis System,NTA)通过镜像方式采集企业网络边界流量,结合腾讯多年积累的海量安全数据,运用数据模型、安全模型、感知算法模型识别网络攻击及高级威胁(APT)。同时,对事件告警原始流量进行留存,方便事后追溯,可极大提升云环境下的威胁感知能力。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券