教材内容总结
网络嗅探
定义:网络嗅探是一种黑客的窃听技术,嗅探器通过捕获经过封包处理的二进制数据,再结合网络协议分析技术,恢复出相应信息。
网络嗅探技术
网络嗅探的技术可以按照所监听的链路层网络进行分类,常见的链路层网络协议有以太网何WIFI。目前绝大多数网络嗅探器均支持对以太网的嗅探,而通常无线嗅探器都支持对WIFI网络的监听。这两大嗅探器的唯一区别是无线嗅探器可以读取和分析无线传输协议的数据包。
网络嗅探器按照传输形式也可以分为硬件嗅探器和软件嗅探器。
以太网工作原理
以太网共享传输信道,并采用载波侦听/冲突检测技术避免共享链路上的通信冲突。以太网中数据以帧为单位传送,以太网上的网络接口设备通常是网卡,且都有以一个48位的MAC地址。正常情况下:只接受传给自己的数据帧和广播的数据帧。
网卡支持一种混杂模式:不管数据帧是否传给自己,都接收通过它连接共享通信媒介的数据帧而为了嗅探以太网上的流量,我们需要让网卡处于混杂模式
以太网在实际部署有限局域网时,根据部署方式不同分为共享网络与交换式网络两种。
共享网络即用集线器(hub)连接。交换网络用交换机连接。
交换机可以对接收到的每一个数据帧检查,并进行转发处理。而集线器把它接收到的数据发送到它所有的接口。
交换式网络中实现嗅探的方式
MAC地址洪泛攻击:指向交换机发送大量的含有虚构mac地址和ip地址的数据包,使得交换机的mac地址端口映射表溢出无法处理。然后交换机就会开始类似于集线器的工作方式,容易嗅探。
MAC欺骗:将源MAC地址伪造成目标地址的源MAC地址,并将数据包通过交换机发送出去,使得交换机相信攻击者的
ARP欺骗:利用IP地址与MAC地址转换时的协议漏洞,时交换式网络中最常见的一种嗅探技术手段。
网络嗅探工具
Linux平台的网络嗅探技术主要通过内核态的BPF和用户态的libpcap抓包工具库实现
windows系统中网络嗅探技术的实现需要与BPF模块兼容的NPF。它可以过滤数据包,并将这些数据 包原封不动的传给用户态模块。
类Unix系统中的网络嗅探器软件
libpcap抓包开发库
tcpdump嗅探器软件:是利用libpcap库捕获数据,并允许用户使用基于BPF的过滤规则来限制捕获数据包的数量与类型。
wireshark嗅探器软件
网络嗅探的检测与防范
Linux内核中,正常情况下,只处理本机MAC地址或以太网广播MAC地址的数据包。而在混杂模式下,许多版本的Linux内核只检查数据包中的IP地址以确定是否送到IP协议栈,因此可以构造MAC地址无效而IP地址有效的ICMP Echo请求,看目标主机是否应答包,如果应答,说明未检查MAC地址,即处于混杂模式,正执行嗅探;如果目标主机忽略请求,说明目标主机的网卡处于正常模式。
网络嗅探的防范措施
采用安全的网络拓扑,尽量使用交换式网络,通过交换机上设置VLAN等技术手段,对网络进行合理的分段
用静态ARP或者MAC-端口映射表代替动态机制
重视网络数据传输的集中位置点的安全防范
避免使用明文传输口令或敏感信息的网络协议
网络协议分析
定义:网络协议分析是指对网络上传输的二进制格式数据包进行解析,以恢复出各层网络协议信息以及传输内容的技术方法。
过程:
它与主机的解包原理过程相似,但是主机接收数据包时对传输层,网络层,链路层的信息并不关心,只获取应用层的数据。
网络协议分析需要解析与保存各个网络层次上的所有包头字段信息,以及高层的应用层数据。
网络协议分析的几个步骤 :
1、从链路层获取二进制数据包,大多数情况下是以太网数据帧。
2、根据帧头的Type字段确定网络层协议类型,大多数情况下时IP协议(0800)并提取其中包含的网络层数据内容
3、进一步对IP数据包进行分析,如果设置了分片位,则进行IP分片重组,根据IP协议头中的protocol字段,确定传输层协议类型(TCP或UDP),通常情况下时TCP(6)或者UDP(17)并提取其中的传输层数据内容
4、根据TCP或UDP的目标端口确定具体的应用层协议,如http、ftp、telnet等协议数据包。并对TCP或UDP数据包进行拼接重组,得到应用层特定协议的应用交互内容
5、根据相应的应用层协议对数据进行整合恢复,得到实际传输的数据。
Kali视频学习
openvas的使用
1、打开Metasploitable后ifconfig获取目标IP地址,在kali下使用 ping IP看是否能够ping通,能ping通的话访问本地https://127.0.0.1:9392登录openvas的WEB界面
2、在openvas界面中添加一个新的目标,点击new target;在name和manual里面输入目标主机的IP地址,其他默认。
3、新建扫描任务,点击Scan Management——New Task,起一个名字,输入正确IP地址,其他默认;主界面会显示刚刚添加的扫描任务和名字,点击action下面的start,开始扫描。
Web漏洞扫描器Golismero
- Golismero是开源的Web扫描器,本身具有很多安全测试工具,还能导入分析市场流行的扫描工具的结果,如Openvas 、Wfuzz、SQLMap、DNS recon等,并自动分析。
- Golismero采用插件形式的框架结构,使用Python编写,并集成了许多开源的安全工具可在Windows,Linux,BSD,OS X等系统上使用,几乎没有系统依赖性。
- Golismero采用了插件使得框架结构,提供了一系列几口,用户只要继承并且实现这些接口,就可以自定义自己的插件。可以分为四类:
a、ImportPlugin(倒入插件) 主要用来加载其他安全工具的扫描结果
b、TestingPlugin(测试插件) 测试或者渗透入侵的插件
c、ReportPlugin(报表插件) 对测试结果生成报表
d、UIPlugin(界面插件) 用语和用户交互,显示当前从系统的运行情况
Nikto.pl
Nikto是一款开源的网页服务扫描器,它可以对网页服务进行多种扫描。用如下命令可以扫描靶机
nkito -h 192.168.232.135
nkito -h 192.168.232.135 -p 80.88,443对多个端口扫描
Lynis系统信息收集整理工具
对Linux操作系统详细配置等信息进行枚举收集,生成移动的报告文件。
lynis --check-all
lynis --check-all -Q//为了避免交互,在末尾添加-Q
优点:报告整齐
unix-privesc-check
这个工具是一个类似lynis的工具,可用uni-privesc-check standard命令查看安全设置.
web爬行##
针对WEB网站的扫描,往往需要对网站路径,页面,账户等进行枚举,这就需要用到web安全中的爬行工具,kali字典下存放的路径为/usr/share/wordlists/。kali中的部分web爬行工具如下:
-
apache-users
这个工具是枚举apache存在着哪些账号。命令行中,-h加上目标主机的IP地址,-l是加一个用户名的字典,这里使用的是dirbuster中的apache-user-enum-2.0,-p指定端口号,-s看是否有ssl支持,0表示没有。-e表示返回的状态码,-t参数指定线程,比如10个进程 -
cutycapt
这个工具是用来截图的。 -
DIRB
一个强大的web目录扫描工具,命令行输入dirb可以得到DIRB使用示例。 -
dirbuster
这是kali下的图形化web目录扫描器,拥有直观的的扫描结果 -
vega
kali下的一个web漏洞扫描器只需要点scan,输入ip地址即可扫描 -
webslayer
主要用于爆破攻击
WEB漏洞扫描 -
cadaver
这个工具是一个用来浏览和修改WebDAV共享的Unix命令行程序。这种工具就是以一种客户端,命令行的格式链接webdav -
DAVtest
测试对支持WebDAV的服务器上传文件等
语法:davtest -url http://222.28.136.226/dav/ -
deblaze
针对FLASH远程调用等的枚举,一般在xss或者较深入的web安全中可能会用到 -
Fimap
文件包含漏洞利用工具 -
Grabber
Grabber是一个WEB应用漏洞扫描器,可以指定扫描漏洞类型结合爬虫对网站进行安全扫描 -
joomscan
类似于Wpscan的扫描器,针对特定CMS -
SkipFish
skipfish是谷歌出品的一款自动化的网络安全扫描工具,与Nikto,Nessus等工具有相似的功能。它的语法如下:
执行完之后开始发包扫描
扫描结束之后,打开之前创建的report123目录,在目录下找到index.html文件,用浏览器打开,就可以看到这个页面 -
uniscan
这个工具可以勾选一些选项,然后加上url,然后直接开始扫描就行了 -
W3AF
w3af是一个web应用程序攻击和检查框架,包括检查网站爬虫,SQL注入,跨站(XSS),本地文件包含(LFI),远程文件包含(RFI)等。该项目的目标是要建立一个框架,以寻找和开发web应用安全漏洞,所以很容易使用和扩展 -
wapiti
wapiti的工作方式与nikto类似,也采用黑盒的方式主动对被测web应用进行扫描,寻找其中潜在的安全缺陷。
它扫描的方式就是,python wapiti.py http://www.xxxxxx.com -v 2 -
webshag
一个综合性的调用框架,可以调用Nmap,UScan,信息收集,爬虫等功能,是扫描过程更简单 -
websploit
主要用于远程扫描和分析系统漏洞,使用它可以非常容易和快速发现系统中存在的问题,并用于深入分析
wireshark的使用
首先是wireshark的界面,在interface list 中选取etho这块网卡,点击Start,即可开始抓包。
从左向右,第一列是编号,
第二列是抓包的时间。
第三列是所抓报文的源,源地址若是二层报文,则显示的是MAC地址,如果是三层以上的报文,会显示一个IP地址。
第四列是目标,同第三列相同,要么是目标MAC,要么是目标IP。
第五列是报文的协议。最后一列是关于报文信息的描述。
且wireshark提供过滤功能,如filter中输入ip.ddr192.168.136.223,即可筛选出
也可以根据端口号进行过滤,比如需要过滤80端口的数据,输入tcp.port80即可
需要过滤二层报文,输入的条件需要为eth.addr==mac地址
三层报文的过滤是ip.addr
【注意】wireshark是大小写敏感的
课本实践作业#
作业要求:
1)攻击方用nmap扫描(给出特定目的的扫描命令)
2)防守方用tcpdump嗅探,用Wireshark分析(保留Wireshark的抓包数据),分析出攻击方的扫描目的和nmap命令
3) 提交抓包数据和截图
作业结果:
这是抓到的第一个数据包:
此扫描方式应为UDP端口扫描:nmap -sU ip
针对UDP端口一般采用UDP ICMP端口不可达扫描。
如果对应的UDP端口开启,则会返回UDP数据包。
如果端口未开启,则返回“ICMP端口不可达”消息。
此扫描方式应为秘密扫描TCPACK:nmap -sA ip
TCP ACK扫描是利用标志位ACK,而ACK标志在TCP协议中表示确认序号有效,它表示确认一个正常的TCP连接。但是在TCP ACK扫描中没有进行正常的TCP连接过程,实际上是没有真正的TCP连接。所以使用TCP ACK扫描不能够确定端口的关闭或者开启,
因为当发送给对方一个含有ACK表示的TCP报文的时候,都返回含有RST标志的报文,无论端口是开启或者关闭。但是可以利用它来扫描防火墙的配置和规则等。
此扫描方式应为全连接扫描sT:nmap -sT ip
全连接扫描调用操作系统提供的connect()函数,通过完整的三次TCP连接来尝试目标端口是否开启。全连接扫描是一次完整的TCP连接。
1)如果目标端口开启 攻击方:首先发起SYN包;
目标:返回SYN ACK;
攻击方:发起ACK;
攻击方:发起RST ACK结束会话。
2)如果端口未开启 攻击方:发起SYN包;
目标:返回RST ACK结束会话。
python3简明教程学习
(参考实验楼)
字符串的一些方法
title()返回字符串的标题格式,即每个单词首字母大写,其余字母小写
upper()将字符串所有字母都改成大写
lower()将字符串中所有字母都改成小写
swapcase()将字符串中大写字符转换成小写,小写字符转换成大写
isalnum()判断字符串中是否只包含字母和数字
isalpha()判断字符串中是否只包含字母
split(char)对字符串进行分割,如果不跟参数,默认用空格分割
join(列表)使用指定字符连接多个字符串,它需要一个包含字符串元素的列表作为输入然后连接列表内的字符串元素
strip(chars),用来剥离字符串首尾中指定的字符,它允许有一个字符串参数,这个参数为剥离哪些字符提供依据。不指定参数则默认剥离掉首尾的空格和换行符
lstrip(chars) 只对字符串左剥离,如s.lstrip("cwsd.")表示删掉s这个字符串左边出现的'c','w','s','d','.'字符
rstrip(chars) 只对字符串右剥离
find(chars)返回部分字符串在本字符串中第一次出现的位置,没有找到则返回 -1。
startswith(chars) 检查字符串是否以 chars开头,返回值为true或者false
s.endswith(chars) 检查字符串是否以 chars 结尾,返回值为true或者false
格式符为真实值预留位置,并控制显示的格式。常用的有:
%s 字符串(用 str() 函数进行字符串转换)
%r 字符串(用 repr() 函数进行字符串转换)
%d 十进制整数
%f 浮点数
%% 字符“%”
为单词计数的小程序
s = input("Enter a line: ")
print("The number of words in the line are %d" % (len(s.split(" "))))
首先让用户输入一行字符串,然后将字符串用空格分割成一个列表,再用len方法计算列表中元素的个数,即输入的单词数目
函数
1、定义一个函数
def 函数名(参数):
语句1
语句2
2、局部变量也要先定义,再使用
a = 9
def change():
print(a)
a = 100
change()#发现报错,原因是在change函数内部,先使用了局部变量a,而未先定义
3、def change():
global a
a = 90
print(a)#这里通过关键字 global 来告诉 a 的定义是全局的,因此在函数内部更改了 a 的值,函数外 a 的值也实际上更改了。
4、函数的参数变量:
可以有默认值,也就是说如果我们对指定的参数变量没有给出任何值则会赋其默认值。
>>> def test(a , b=-99):
if a > b:
return True
else:
return False#即我们在调用此函数时,如果没有给b赋值,那么默认为-99
有两个非常重要的地方,第一个是具有默认值的参数后面不能再有普通参数,比如f(a,b=90,c) 就是错误的;第二个是默认值只被赋值一次,因此如果默认值是任何可变对象时会有所不同,比如列表、字典或大多数类的实例。
5、比较两种参数变量
def f(a, data=[]): def f(a, data=None):
data.append(a) if data is None:
return data data = []
>>> print(f(1)) return data
data.append(a) >>> print(f(1))
[1] [1]
>>> print(f(2)) >>> print(f(2))
[1, 2] [2]
6、比较两种调用方式
>>> def hello(*, name='User'):
print("Hello", name)
#调用:
>>> hello('shiyanlou')#结果报错
>>> hello(name='shiyanlou')#输出结果为Hello shiyanlou
7、文档字符串
import math
def longest_side(a, b):
"""
注释文档
"""
return math.sqrt(a*a + b*b)
if __name__ == '__main__':
print(longest_side.__doc__)#输出注释文档
print(longest_side(4,5))