当前位置: 首页 > 科技观察

报文处理工具-Scapy高级使用(一)_0

时间:2023-03-17 12:05:43 科技观察

主机检测到TCPSYNPing发送一个空的TCP报文,只设置了SYN。SYN/ACK或RST响应意味着机器已启动并正在运行。>>>ans,unans=sr(IP(dst="60.205.177.0/28")/TCP(dport=80,flags="S"))Beginemission:Finishedsending16packets..**********.......................................................................................^CReceived92packets,got9answers,remaining7packets>>>ans.summary(lambdas:s[1].sprintf("%IP.src%isalive"))60.205.177.1isalive60.205.177.2isalive60.205.177.4isalive60.205.177.6isalive60.205.177.7isalive60.205.177.8isalive60.205.177.11isalive60.205.177.12isalive60.205.177.14isa??liveTCPACKPing发送仅设置了ACK位的空TCP数据包。应使用显示机器的RST响应未经请求的ACK数据包。SYN-ping和ACK-ping看似多余,但大多数无状态防火墙不会过滤未经请求的ACK数据包,因此最好同时使用这两种ping技术。>>>ans,unans=sr(IP(dst='60.205.177.90-105')/TCP(dport=80,flags='A'))开始任务:Finishedsending16packets..*.******..........................................................................................................................................................................^CReceived173packets,got7answers,remaining9packets>>>ans.summary(lambdas:s[1].sprintf("{IP:%IP.src%isalive}"))60.205.177.91isalive60.205.177.94isalive60.205.177.102isaliveUDPPing将UDP数据包发送到给定的端口,使其更有效地扫描有效负载。选择最有可能被关闭的端口(开放的UDP端口可能会收到空包,但忽略它们)ICMP端口不可达表示机器已启动。>>>ans,unans=sr(IP(dst='60.205.177.100-254')/UDP(dport=90),timeout=0.1)Beginmission:Finishedsending155packets...******..*****...收到18个数据包,得到11个答案,剩余144个数据包>>>ans.summary(lambdas:s[1].sprintf("%IP.src%isunreachable"))60.205.177.106isunreachable60.205.177.108isunreachable60.205.177.107isunreachable60。.111isunreachable60.205.177.125isunreachable60.205.177.172isunreachable60.205.177.191isunreachable60.205.177.203isunreachable60.205.177.224isunreachable60.205.177.242isunreachable60.205.177.244isunreachableARPPing在同一网络/LAN上探测存活主机时,可以使用ARPPing。Fasterandmore可靠,因为它仅通过ARP在第2层上运行。ARP是任何第2层通信的骨干协议。由于IPv6中没有ARP协议,所以在IPv6的上层定义了NDP协议,实现ARP地址解析、地址冲突检测等功能,以及IPv6的邻居发现功能。>>>ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="172.17.51.0/24"),timeout=2)Beginmission:Finishedsending256packets.*************************************************************************************************************************************************************************************.........................Received190packets,got162answers,remaining94packets>>>ans.summary(lambdar:r[0].sprintf("%Ether.src%%ARP.pdst%"))00:16:3e:0c:d1:ad172.17.51.000:16:3e:0c:d1:ad172。17.51.100:16:3e:0c:d1:ad172.17.51.200:16:3e:0c:d1:ad172.17.51.300:16:3e:0c:d1:ad172.17.51.400:16:3e:0c:d1:ad172.17.51.500:16:3e:0c:d1:ad172.17.51.600:16:3e:0c:d1:ad172.17.51.7ICMPPingICMP扫描涉及无处不在的_pingprogram_send标准数据包。向目标IP发送一个ICMP类型8(回声请求)数据包,并接收一个ICMP类型0(回声响应)数据包以表明该机器处于活动状态。许多主机和防火墙现在会阻止这些数据包,因此基本的ICMP扫描是不可靠的。ICMP还支持时间戳请求和地址掩码请求,它们可以指示计算机的可用性。>>>ans,unans=sr(IP(dst="60.205.177.168-180")/ICMP())>>>ans.summary(lambdas:s[0].sprintf("{IP:%IP.dst%isalive}"))60.205.177.168isalive60.205.177.169isalive60.205.177.171isalive60.205.177.172isalive60.205.177.175isalive60.205.177.174isalive60.205.177.176isalive60.205.177.179isalive60.205.177.178isalive60.205.177.180isalive服务发现(端口scanning)TCP连接扫描找一张网络图(入侵删除)这里显示tcpdump抓到的握手包192.168.2.1.35555>192.168.2.12.4444:Flags[S]seq=12345192.168.2.12.4444>192.168。2.1.35555:Flags[S.],seq=9998ack=12346192.168.2.1.35555>192.168.2.12.4444:Flags[.]seq=12346ack=9999IP和端口号用'.'隔开,ACK用'隔开.'表示SYN用'S'表示,[S.]表示SYN+ACK在Scapy中制作三次握手包Step1-Sendtheclient'sSYNtothelisteningserver使用源IP地址和目的地址制作IP头IP地址。在生成TCP源端口的地方做一个TCP头,设置服务器监听的目的端口,设置TCP的标志SYN,生成客户端的seq。ip=IP(src="192.168.2.53",dst="60.205.177.168")syn_packet=TCP(sport=1500,dport=80,flags="S",seq=100)第2步-监听服务器的响应(SYN-ACK)保存服务器的响应。获取服务器的TCP序列号并将该值加1。synack_packet=sr1(ip/syn_packet)my_ack=synack_packet.seq+1步骤3服务器响应的确认(ACK)从客户端发送到与初始SYN数据包具有相同源和目标的IP标头。TCP头与syn数据包具有相同的TCP源和目标端口,只是设置了ACK位,由于SYN数据包消耗一个序列号,客户端的ISN加1,确认值设置为增加后的服务器的序号值。ack_packet=TCP(sport=1500,dport=80,flags="A",seq=101,ack=my_ack)send(ip/ack_packet)完整代码如下#!/usr/bin/pythonfromscapy.allimport*#Buildpayloadget='GET/HTTP/1.0\n\n'#设置目的地址和源地址ip=IP(src="192.168.2.53",dst="60.205.177.168")#定义一个随机源端口port=RandNum(1024,65535)#构造SYN包SYN=ip/TCP(sport=port,dport=80,flags="S",seq=42)#发送SYN并接收服务器响应(SYN,ACK)SYNACK=sr1(SYN)#构建确认包ACK=ip/TCP(sport=SYNACK.dport,dport=80,flags="A",seq=SYNACK.ack,ack=SYNACK.seq+1)/get#发送ack确认包回复,error=sr(ACK)#打印响应结果print(reply.show())SYN扫描SYN扫描也叫半开放扫描。该策略可用于在不建立完整连接的情况下确定通信端口的状态。客户端首先向被测主机发送一个syn数据包。如果端口是开放的,服务器会回应一个syn+ack数据包,然后客户端会发送第一个数据包来reset。否则,服务器会直接响应第一个数据包,表示端口没有打开。如果我们在没有确认的情况下发送大量的SYN包,服务器会不断的发送SYN+ACK包,会不断的消耗服务器的CPU和内存。这就是我们常说的SYNflood攻击。接下来我们使用scapy模拟syn扫描对单个主机、单个端口进行SYN扫描使用sr1函数发送和响应数据包使用sprintf方法打印响应中的字段。(“SA”标志表示开放端口,“RA”标志表示关闭端口)>>>syn_packet=IP(dst='60.205.177.168')/TCP(dport=22,flags='S')>>>rsp=sr1(syn_packet)Beginemission:Finishedsending1packets...*Received3packets,got1answers,remaining0packets>>>rsp.sprintf("%IP.src%%TCP.sport%%TCP.flags%")'60.205.177.168sshSA'inSinglehost,在多个端口上进行SYN扫描>>>ans,unans=sr(IP(dst="60.205.177.168")/TCP(dport=(20,22),flags="S"))Beginmission:Finishedsending3packets...*..**Received7packets,got3answers,remaining0packets>>>ans.summary(lambdas:s[1].sprintf("%TCP.sport%%TCP.flags%"))ftp_dataRAftpRAsshSA多主机,多端口SYN扫描make_table接受三个值,行、列和表数据。(下例中x轴为目标IP,y轴为目标端口,响应中的TCP标志为表格数据)60.205.177.16920和22端口没有响应数据包,猜测可能是中间有一个设备(防火墙)被屏蔽了。>>>ans,unans=sr(IP(dst=["60.205.177.168-170"])/TCP(dport=[20,22,80],flags="S"))Beginmission:Finishedsending9packets...*..**..*......................................................................................................……………………………………………………………….................................................................^CReceived251packets,got4answers,remaining5packets>>>ans.make_table(lambdas:(s[0].dst,s[0].dport,s[1].sprintf("%TCP.flags%")))60.205.177.16860.205.177.16920RA-22SA-80SASAFin扫描客户端会向服务器发送一个带有fin标志(关闭连接)的数据包。当服务器没有响应时,说明端口是开放的,否则会收到第一个数据包。打开端口>>>fin_packet=IP(dst='60.205.177.168')/TCP(dport=4444,flags='F')>>>resp=sr1(fin_packet)Beginemission:Finishedtosend1packets.^CReceived0packets,got0answers,remaining1packetsportClose>>>fin_packet=IP(dst='60.205.177.168')/TCP(dport=4399,flags='F')>>>resp=sr1(fin_packet)>>>resp.sprintf('%TCP.flags%')'RA'NULLscan空扫描会发送一个没有设置任何标志位的TCP数据包,当收到第一个响应数据包时,表示端口关闭,否则表示端口打开,如果接收到的类型为3且代码为1,ICMP错误为2、3、9、10或13表示端口被过滤,无法获取端口状态。端口关闭>>>null_scan_resp=sr1(IP(dst="60.205.177.168")/TCP(dport=4399,flags=""),timeout=1)>>>null_scan_resp.sprintf('%TCP.flags%')'RA'Xmas扫描XMAS扫描发送带有URG、PUSH、FIN标志的TCP数据包,如果没有收到数据包,则认为该端口是开放的;如果收到RST数据包,则认为端口已关闭。如果收到类型为3、代码为1、2、3、9、10或13的ICMP错误,则表示该端口已被过滤,无法获取端口状态。端口关闭>>>xmas_scan_resp=sr1(IP(dst="60.205.177.168")/TCP(dport=4399,flags="FPU"),timeout=1)Beginemission:.Finishedsending1packets.*Received2packets,got1answers,remaining0packets>>>xmas_scan_resp.sprintf('%TCP.flags%')'RA'UDP扫描UDP扫描最常用于检测DNS、SNMP和DHCP服务。客户端发送一个UDP数据包,其中包含要连接的端口号。如果服务器用UDP数据包响应客户端,则该端口在服务器上打开。如果返回ICMPportunreachabletype3andcode3错误包,说明服务器端口关闭。>>>udp_scan=sr1(IP(dst="60.205.177.168")/UDP(dport=53),timeout=1))traceroutetraceroute技术是基于IP协议的设计方法。IP标头中的TTL值被视为跳数限制。每当路由器收到要转发的数据包时,它会将TTL减1并转发数据包。当TTL达到0时,路由器将向源计算机发送数据包已被丢弃的回复。各种工具背后的技术是相同的,但它们的实现方式略有不同。Unix系统使用UDP数据报,而Windowstracert发送ICMP请求,Linux的tcptraceroute使用TCP协议。使用ICMP跟踪路由>>>ans,unans=sr(IP(dst="49.232.152.189",ttl=(1,10))/ICMP())Beginmission:Finishedsending10packets.*****.**。.............................................................................................................^CReceived112packets,got7answers,remaining3packets>>>ans.summary(lambdas:s[1].sprintf("%IP.src%"))10.36.76.14210.54.138.2110.36.76.1345.112.216.134103.216.40.189。102.250.22110.102.251.214使用tcp进行路由跟踪>>>ans,unans=sr(IP(dst="baidu.com",ttl=(1,10))/TCP(dport=53,flags="S"))Beginemission:Finishedsending10packets.********................^CReceived31packets,got9answers,remaining1packets>>>ans.summary(lambdas:s[1].sprintf("%IP.src%{ICMP:%ICMP.type%}"))10.36.76.142time-exceeded10.36.76.13time-exceeded10.102.252.130time-exceeded117.49.35.150time-exceeded10.102.34.237time-exceeded111.13.128exceed2time150.206.88.22time-exceeded39.156.67.73time-exceeded39.156.27.1time-exceededScapy内置了一个traceroute()函数,可以实现和上面一样的功能>>>traceroute("baidu.com")Beginemission:Finishedsending30packets.***********************Received24packets,got24answers,remaining6packets220.181.38.148:tcp80210.36.76.1311310.102.252.34114117.49.35.138115116.251.112.18511636.110.217.911736.110.246.201118220.181.17.1501114220.181.38.148SA15220.181.38.148SA16220.181.38.148SA17220.181.38.148SA18220.181.38.148SA19220.181.38.148SA20220.181.38.148SA21220.181.38.148SA22220.181.38.148SA23220.181.38.148SA24220.181.38.148SA25220.181.38.148SA26220.181.38.148SA27220.181.38.148SA28220.181.38.148SA29220.181.38.148SA30220.181.38.148SA(,使用DNStraceroute我们可以在traceroute()中指定执行DNStraceroute的函数l4参数中的完整数据包>>>ans,unans=traceroute("60.205.177.168",l4=UDP(sport=RandShort())/DNS(qd=DNSQR(qname="thesprawl.org")))开始任务:****Finisedsending30packets......................Received21packets,got4answers,remaining26packets60.205.177.168:udp53110.2.0.1112114.242.29.1114125.33.185.11411561.49.143.211本文转载自微信《运维开发故事》,可通过以下二维码关注和转载本文,请联系运维开发故事公众号。