互联网科技程序员技术交流程序猿阵线联盟-汇总各类技术干货

渗透入门——手把手教你如何做一个端口扫描器

2018-11-03  本文已影响94人  程序员Sunny
图片.png

前言

端口扫描可以算是渗透过程中的最最入门的一部分,也可以说是先行军。通常某些常用端口提供的服务存在一些已经被发现的漏洞,比如21端口ftp服务,22端口的ssh服务,以及去年大规模爆发的勒索病毒锁利用的445端口、135端口以及137-139端口,当然更多的漏洞还未被披露出来。
如果需要做渗透,首先得知道目标主机到底提供了哪些服务,然后根据具体服务存在的已知漏洞进行攻击(特别是一些低版本的服务,很多已知漏洞并未被修复)。因此,首先进行端口扫描是很有必要的。当然,目前其实也有不少成熟的端口扫描工具,甚至可以测出是否存在某些漏洞,如弱口令等。但是,自己写出来的比用工具更为有成就感哦。

正式开始

今天的内容我们主要用python来实现,相对来说,python的库更为丰富,很多时候只是为了实现某种目的而不在意运行效率的话,python可以算是较优的选项了,今天主要实现对目标主机的开放端口的检测,python只需要三个函数,短短四十多行就可以完成。
程序首先从main函数开始:

def main():
    parser = optparse.OptionParser("usage%prog -H <target host>")
    parser.add_option("-H", dest="targetHost", type="string", help="specify the host")
    (options, args) = parser.parse_args()
    targetHost = options.targetHost
    if targetHost is None:
        print "illegal args"
        exit(0)
    else:
        scan(targetHost)

这里实现的其实非常简单,本质是利用optparse库来接收参数并调用scan函数来执行具体的扫描任务。
然后来看看具体scan函数做了什么内容:

def scan(host):
    try:
        targetIp = gethostbyname(host)
    except:
        print 'cannot resolve '+ host
        return
    try:
        targetName = gethostbyaddr(targetIp)
        print 'targetName is '+ targetName[0]
    except:
        print 'scan result for '+ targetIp

    for port in range(1, 65536):
        print "scanning port %d " %port
        scanCore(host, port)

在scan函数里,我们主要实现了对host的解析,如果发现是无效域名,则不继续执行,如果是有效的,则针对1到65535的端口进行扫描,具体针对某个端口是否开放用的是scanCore进行确认——实际上,这里端口范围可以根据自己的需求来调整。

def scanCore(host, port):
    try:
        sock = socket(AF_INET, SOCK_STREAM)
        sock.settimeout(3)
        sock.connect((host, port))
        print "%d port opened" % port
        sock.close()
    except:
        print "%d port not opened" %port

在scanCore中,实质是利用socket对该主机的该端口进行连接,如果连接成功则意味着该端口为开放状态;如果超时或者连接失败,则判定为该端口并未开放。

总结

代码非常简单,实现的功能也非常简单,可以说是一个初级版本。实际上,另外还有很多方式可以来对端口进行测试,比如telnet。


欢迎小伙伴与我讨论哦~

邮箱:zsunny@yeah.net

本文欢迎转载,请注明本文地址:https://www.jianshu.com/p/417e9bfcbb59

上一篇下一篇

猜你喜欢

热点阅读