渗透测试之服务扫描

2018-08-20  本文已影响0人  Louisnie

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

  识别目标操作系统,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相应特征分析识别服务,向目标发送系列复杂的探测,并且依据相应特征的指纹信息判断开放的服务

上一篇下一篇

猜你喜欢

热点阅读