【python】端口扫描器

这是我通过学习书籍《Python绝技——运用Python成为顶级黑客》一书中的学习笔记。

学习Python这一门语言,我觉得是需要大家一起分享,一起进步的,尤其是做安全工作的同志。

通过学习第二章有关扫描器的部分,自己试着模仿程序并且有自己的心得和体会。

网络嗅探是网络攻击开始的第一步,而获取目标使用的操作系统、开放的服务和端口等信息对于攻击者来说是十分有用的,攻击者可以通过获取得到的这些信息对下一步进行的攻击做铺垫。

通过书籍后发现,该章节使用了TCP全连接、nmap对端口进行扫描,且均对固定的端口进行扫描,现如今使用固定端口扫描的场景大多是在互联网上抓取肉鸡,我将程序稍作改动,改成了对同一个IP地址主机的所有端口进行扫描,这样做是可以针对某个IP地址的主机进行网络嗅探。

下面是我使用简单的SOCKET编程实现的针对单一主机进行攻击的python代码:

# -- coding: utf-8 --
#输入目标IP地址对0-65535端口进行扫描
#输入方式:python scanner_SingleHost.py -H 127.0.0.1
import optparse
from socket import *
from threading import *
screenLock = Semaphore(value=1)
def portscan(tgtHost,tgtPort):
    try:
        skt = socket(AF_INET,SOCK_STREAM)
        skt.settimeout(2)
        skt.connect((tgtHost,tgtPort))
        skt.send("Hello,I'm uruz!\r\n")
        response = skt.recv(4096)
        screenLock.acquire()
        print "[+] %s/tcp open and the address is %s" %(tgtPort,tgtHost)
        print "[+] banner is %s\n" %response
    except:
        screenLock.acquire()
        #print "[-] %s/tcp closed and the address is %s" %(tgtPort,tgtHost)
    finally:
        screenLock.release()
        skt.close()
def main():
    parser = optparse.OptionParser('usage%prog '+'-H <target host>')
    parser.add_option('-H', dest = 'tgtHost', type = 'string', help = 'plese specify the host')
    (options,args) = parser.parse_args()
    tgtHost = options.tgtHost
    for i in range(0,65536):
        t = Thread(target = portscan, args=(tgtHost,i))
        t.start()
if __name__=="__main__":
    main()

当然,对单一主机进行扫描所有端口你可能没有那么多时间,仅仅想要扫描该主机的某个端口,那么下面这段代码可能就比较适合你:

# -- coding: utf-8 --
#输入目标IP地址和端口进行扫描
#输入方式:python scanner_normal.py -H 127.0.0.1 -p 22
import optparse
from socket import *
from threading import *
screenLock = Semaphore(value=1)
def portscan(tgtHost,tgtPort):
    try:
        skt = socket(AF_INET,SOCK_STREAM)
        skt.settimeout(2)
        skt.connect((tgtHost,tgtPort))
        skt.send("Hello,I'm uruz!\r\n")
        response = skt.recv(4096)
        screenLock.acquire()
        print "[+] %d/tcp open and the address is %s" %(tgtPort,tgtHost)
        print "[+] banner is %s\n" %response
    except:
        screenLock.acquire()
        print "[-] %d/tcp closed and the address is %s" %(tgtPort,tgtHost)
    finally:
        screenLock.release()
        skt.close()
def main():
    parser = optparse.OptionParser('usage%prog '+'-H <target host> '+ '-p <target port>')
    parser.add_option('-H', dest = 'tgtHost', type = 'string', help = 'please specify the host')
    parser.add_option('-p', dest = 'tgtPort', type = 'int', help = 'please specify the port')
    (options,args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPort = options.tgtPort
    portscan(tgtHost,tgtPort)
if __name__ == '__main__':
    main()

根据该书所说,如果目标主机设置了防火墙等相关的防护措施,普通的SOCKET编程可能对这样的主机无法进行很好的嗅探,那么怎么办呢?书上提及,使用NMAP对端口进行扫描。使用NMAP之前,必须先把python-nmap这个包安装上,使用pip进行安装,如果你还没有pip,你就得先安装pip。我使用的是kali操作系统,理论上debian和ubuntu也可以使用同样的方式进行安装,安装如下:

sudo apt-get install pip
sudo pip install python-nmap

安装完成后,在你所使用的编辑器中设置一下环境即可使用。

nmap扫描器的代码如下:

# -- coding: utf-8 --
#输入目标IP地址和端口进行扫描
#输入方式:python scanner_nmap.py -H 127.0.0.1 -p 22,80
import optparse
import nmap
def nmapScan(tgtHost,tgtPort):
    nmScan = nmap.PortScanner()
    nmScan.scan(tgtHost,tgtPort)
    state = nmScan[tgtHost]['tcp'][int(tgtPort)]['state']
    print"[*] " + tgtHost + " tcp/" + tgtPort + " " + state
def main():
    parser = optparse.OptionParser('usage%prog '+'-H <target host> '+ '-p <target port>')
    parser.add_option('-H', dest = 'tgtHost', type = 'string', help = 'please specify the host')
    parser.add_option('-p', dest = 'tgtPort', type = 'string', help = 'please specify the port')
    (options,args) = parser.parse_args()
    tgtHost = options.tgtHost
    tgtPorts = str(options.tgtPort).split(',')
    if (tgtHost == None) | (tgtPorts[0] == None):
        print parser.usage
        exit(0)
    for tgtPort in tgtPorts:
        nmapScan(tgtHost,tgtPort)
if __name__ == "__main__":
    main()

有些人可能对Python不是很熟悉,改代码段中的

tgtPorts = str(options.tgtPort).split(',')

意思是将这个字符串以‘,’分开,并将分开的部分存入列表(在C/C++中我们更加习惯叫数组,这是两种类似的数据结构)中,比如

options.tgtPort = '22,80'

那么tgtPorts中存储的内容就是(22,80)

以上就是我对扫描器这一章节进行的学习。

学习过程中我发现,该书介绍的使用optparse模块对参数的处理十分有意思,是我学习C/C++不曾使用过的方式

另外,大学本科学习过程中老师并没有教会我使用SOCKET编程,从这个章节中我了解到了如何进行SOCKET客户端编程(TCP连接方式):

第一步,创建套接字实例

第二步,套接字与目标主机通过(IP地址,端口号)进行连接

第三步,发送、接收数据

第四步,关闭连接

 

各位有何高见希望能和我联系,我们共同进步。

看完后觉得有帮助希望能够在左方点一个赞~

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值