美文网首页
渗透测试之服务扫描

渗透测试之服务扫描

作者: Louisnie | 来源:发表于2018-08-20 22:02 被阅读0次

    服务扫描:识别开放端口上运行的应用

      识别目标操作系统,Windows,Linux等

    扫描方法:

    Banner捕获:扫描端口,通过工具识别端口对应的服务,不准确,仅作参考

    服务识别:基于指纹信息判断

    操作系统识别

    SNMP分析:通过SNMP识别目标系统,SNMP通过系统内部信息进行探测,结果比较准确

    防火墙识别:识别边界防火墙,绕过防火墙

    Banner捕获:通过软件开发商,软件名称,服务类型,版本号(直接发现已知的漏洞和弱点),还需要结合另类的服务识别方法,通过特征行为和相应字段,不同的相应也可用于识别底层操作系统,如ping Windows和ping Linux得到的TTL值就有所不同

    使用Ncat去扫描端口获得其服务名:nc -nv 192.168.45.129  22(主动连接该IP地址的22号端口)

    使用ncat去扫描连接80号端口,命令get获取其服务器信息,可知其系统为Metasploitable2,开启了80端口,其账户名为msfadmin

    通过python语言获取banner信息:(scapy主要用于三四层网络数据包的注入,劫持,嗅探,对应用层操作比较困难,在应用层操作使用的是python的socket模块)

    socket模块:用于与目标系统建立TCP连接,并且与目标服务器进行应用层的会话传输

    用python进行网络编程,就是在python程序本身这个进程内,连接别的服务器进程的通信端口进行通信

    socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进场间进行通讯

    在Python中,我们使用socket模块的socket函数创建一个socket对象,通过调用bind(hostname,port)函数来指定服务的port(端口);接着,我们调用socket对象的accept方法,该方法等待客户端的连接,并返回connection对象,表示已连接到客户端

    python提供了两个级别的网络服务:

    低级别的网络服务支持基本的socket,它提供了标准的BSD socket API,可以访问底层操作系统socket接口的全部方法

    高级别的网络服务模块socket server,它提供了服务器中心化,可以简化网络服务器的开发

    socket()函数

    python中,使用socket()函数来创建套接字,语法格式如下:

    socket.socket([family[,type[,protocal]]])

    参数:

    family:套接字家族可以使用AF_UNIX或者AF_INET(表示使用的是ipv4地址和端口号的组合)

    type:套接字类型可以根据是面向对象连接的还是非面向对象分为SOCK_STREAM或者SOCK_DGRAM

    protocol:指定协议,TCP,UDP,STCP协议,TIPC协议,设置protocal为0时,python会自动选择type类型对应的默认协议

    connect方法:connect用于客户端和服务器建立连接,使用方法为

    socket.socket():使用socket模块中的socket函数

    客户端在调用connect之前不必非得调用bind函数,内核会确定源IP地址,并选择一个临时端口作为源端口.如果使用TCP协议,connect将激发TCP的三次握手过程,TCP状态由CLOSED变成SYN_SEND,最终变为ESTABLISHED

    bind方法:用于把一个本地协议地址赋予给一个套接字,格式和connect格式相同

    在不调用bind的情况下,内核会确定IP地址,并分配临时端口,这种情况很适合客户端,因此客户端在调用connect之前不调用bind方法,而服务端需要一个确定的IP和端口,因此需要调用bind指定地址和端口.一般情况下,服务器都有多个IP地址,除了环路地址127.0.0.1外,还有局域网和公网地址,如果bind绑定的是环路地址127.0.0.1,则只有本机通过环路地址才能访问,如果需要通过任意IP都可以访问,可以绑定统配地址0.0.0.0,当指定的端口为0时,内核会分配一个临时端口

    listen方法:

    当创建一个套接字时,默认为主动套接字,也就是说,是一个将调用

    connect发起连接的客户套接字。listen方法把一个未连接的套接字转换为一个

    被动套接字,指示内核应接受指向该套接字的状态请求。根据TCP状态转换图,

    调用listen导致套接字从CLOSED状态转换到LISTEN状态。此方法参数规定了

    内核应该为相应套接字排队的最大连接个数,在bind之后,并在accept之前调用

    accent方法:

    accept用于从已完成连接队列头返回下一个已完成连接,如果已完成连

    接队列为空,那么进程会被投入睡眠(套接字为阻塞方式)。

    accept会自动生成一个全新的文件描述符,代表与所返回客户的TCP连接。

    需要注意的是,此处有两个套接字对象,一个是监听套接字,一个返回的已连

    接套接字。

    区分这两个套接字很重要,一个服务器通常仅仅创建一个监听套接字,它

    在该服务器的生命周期内一直存在,内核为每个由服务器进程接受的客户连接

    创建一个已连接套接字(也就是说TCP三次握手已经完成),当服务器完成对

    某个给定客户的服务时,相应的已连接套接字会被关闭。

    close方法:close方法用来关闭套接字,

    需要注意的是,close方法并不一定会触发TCP的四分组连接终止序列,当一个已连接套

    接字被多个进程打开时,关闭套接字只会导致此进程相应描述符的计数值减1,只有所有进程

    都将该套接字关闭后,套接字的引用计数值小于1以后,系统内核才会开始终止连接操作,这

    一点在多进程开发过程中需要格外注意。如果确实想在某个TCP连接上发送FIN触发主动关闭,

    可以调用shutdown方法。

    send方法:用来发送TCP数据,

    每一个TCP套接字都有一个发送缓冲区,默认大小通socket.SO_SNDBUF

    查看,当某个进程调用send时,内核从该应用进程的缓冲区复制所有数据到所

    写套接字的发送缓冲区,如果该套接字的发送缓冲区容不下该应用进程的所有

    数据(或是应用进程的缓冲区大小大于套接字的发送缓冲区,或是套接字的发

    送缓冲区已有其他数据),该应用进程将被投入睡眠(套接字阻塞的情况),

    内核将不从系统调用返回,直到应用进程缓冲区的所有数据都复制到套接字发

    送缓存区。当对端确认收到数据后,会发送ACK分节,随着对端ACK的不断到

    达,本端TCP才能从套接字发送缓存区中丢弃已确认的数据。

    recv方法:用来进行TCP接收数据

    实例:

    有些banner信息不允许被抓取,那么recv函数无返回被挂起

    sys模块:sys模块提供了许多函数和变量来处理python运行时环境的不同部分

    处理命令行参数:在解释器启动后,argv列表包含了传递给脚本的所有的参数,列表的第一个元素为脚本自身的名称,如sys.argv[0]表示脚本的名称,sys.argv[1]表示第一个参数

    select模块:select是监听触发机制,监听可读和可写队列。当有事件发生时,进行遍历轮询事件发生的对象然后返回 

    比如在服务端启动之后把服务端添加到select的可读监听队列中,当有客户端请求连接服务端时,select函数会返回一个可读事件再让服务端接受客户端的连接。 

    select的返回方式可以是阻塞或者是非阻塞,非阻塞式的select处理方式是轮询的,会不断询问占用Cpu太多的资源和时间,所以建议使用阻塞等待返回的方式去使用select,简单说就是让一个线程去处理多个连接,在连接有事情做的时候才去处理,没事做的话线程就挂起,让线程的利用率更高

    使用dmitry进行服务扫描常见的150个端口,判断其服务

    :dmitry -pb 192.168.45.129  参数-p表示进行TCP扫描,参数-b表示从端口去判断开启的服务

    使用nmap去扫描端口,判断其开放的服务nmap -sT 192.168.45.129 -p 22 --script=banner,nmap的脚本存放在/usr/share/nmap/scripts

    使用amap去扫描端口判断服务是否开启:

    banner信息抓取能力有限

    所以使用nmap进行扫描,nmap相应特征分析识别服务,向目标发送系列复杂的探测,并且依据相应特征的指纹信息判断开放的服务

    相关文章

      网友评论

          本文标题:渗透测试之服务扫描

          本文链接:https://www.haomeiwen.com/subject/ynjriftx.html