头图

信息安全微专业(一) 网络基础

绿茵华尔兹

一、基础知识

1. 网络模型

1969--互联网诞生,APPANET研制成功(鲍勃泰勒、拉里罗伯茨);
1974--TCP/IP协议诞生(罗伯特卡恩、文顿瑟夫);
1984--OSI七层模型;
1989--万维网诞生,第一个web服务器和第一个web浏览器(蒂姆博纳斯李);

历史总结:

互联网的成长在于实践,在于创新;
互联网世界是平等的,每个人都充满了机遇;
TCP/IP协议的实现早于OSI标准的提出;
TCP/IP模型是理论和实践的总结,更符合实际场景

OSI七层模型:
只是一个参考模型,没有实际使用过
重点关注第四层和第七层

可以认为2到7层都是虚拟的,只有第一层(物理层)是真实存在的连接;
用户输入的信息经过7到2层的层层包装到达最底层。物理层根本不用理解包装的含义,在它眼里只有0和1,只要传输就是了;
接收是传输的逆向过程,把包装层层打开,最终将发送端的数据赤裸裸地呈现在接收端面前。

整个传输过程每一次只干一层的活,层与层之间是互不干涉的。在用户看来就相当于把信息直接发送给对方一样

TCP/IP模型:
TCP/IP模型的产生是在协议发明之后,是成功之后的总结,方便后人学习。又由于OSI这样的宏观模型已经存在,所以人们把新协议向旧协议上靠。有人得到四层模型,有人得到五层模型。后面以五层讲解(折中方案)。

原有的OSI 5、6、7层合并为应用层;
TCP/IP四层模型和五层模型的区别只是1层2层是否合并

常见协议对应的层次:
网络层协议的唯一支柱是IP协议。往上分成连接型的TCP协议和无连接型的UDP协议。根据应用层的场景各有所长各有所短

web安全更关注http、https协议;
主机密码爆破关注ssh、rdp协议;
“永恒之蓝”勒索病毒利用445端口的SMB协议
IP协议向下是2层的mac子层协议;
mac子层协议会把IP数据包包装成数据帧,并发送给对端的局域网地址(mac地址);
mac地址是网卡出厂时固化的;
因为以太网是目前使用最广泛的局域网技术,所以以太网帧是大家最熟悉的mac帧格式

TCP/IP五层的实现:
TCP/IP是实际存在的模型,所以每一层有对应的实现,也就是协议具体封装在什么实物里面(这里只是举例说明)

传输层、应用层,都可以用操作系统和上面安装的软件实现,不需要硬件;
常见的网络互连设备工作在下三层。比如一层的网线;二层的网卡和交换机;三层的路由器;
在网络安全领域,我们更关注上两层的漏洞

真实网络环境下的数据传输:
IP协议在整个网络传输过程中起到了至关重要的作用。它是唯一的,所有设备都要认它
路由器这样的三层设备成了串联数据传输中局域网的关键。无论是什么局域网,1层2层是什么,网络层必须是IP协议

TCP/IP协议的问题:

安全思维:安全需要质疑一切权威

设计初期只考虑到了开放性和便利性,并没有考虑到安全性
目前来看,TCPIP的安全缺陷是无法彻底修复的,只能在协议之外缓解

例子1:IP欺骗
IP协议从来都不会检查IP头中的源IP,信任发包机器的源IP地址。接收方收到的最终消息如果需要回复的话,可能会发送到另一台主机上

例子2:三次握手时延
如果三次握手最后的ACK包不发了,又会怎么样?
对方会不断发SYN-ACK包直到超时(DDoS)

安全测试常常要考虑的问题:不按常理出牌会不会导致协议崩溃?

2. IP地址

3. 主机端口

二、后面用到的补充知识点

1. TCP三次握手&四次挥手

2. DNS协议

3.补充

“你猜猜我要在这里写点啥”

二、网络抓包

1.wireshark

winpcap→npcap
lookback抓取本地回环

【模拟实验1】抓取aq.163.com

选网卡选波动最大的
快速滚动的颜色区域是数据包,一行代表一个包,不同颜色代表不同类型
什么都不干,网卡也会有大量数据通信(内网通信、本地回环、本地默认服务和后台运行程序……)
https对于wireshark加密
浏览器第一次请求http会跳转到https,对于多次访问的网站会默认缓存这个动作,不再请求http
设置过滤规则 http.host=="aq.163.com"
输入时关键字会自动补全
自动检测输入,绿色底为书写正确
选中一行数据包后,下面会显示该数据包的详细数据(物理、mac、网络、传输、应用)
原始数据以16进制和字符串形式展示
右键点击--追踪流--http流
可查看完整的HTTP请求和响应(类似burp)
去诶单是仅可以抓取到HTTP。因为HTTPS是加密传输
过滤规则 ip.addr==59.11.160.94 获取完整四层通信
前三个包:tcp三次握手
SYN包 > SYNACK包 > ACK包
建立tcp连接,发送http数据
服务端返回301跳转,变成https(响应包)
三次握手(443端口)
ssl握手(交换加密证书和秘钥。Certificate,Key EXchange)

过滤规则:

eq == 等于
ne != 不等于
gt > 大于
lt < 小于
ge >= 大于等于
le <= 小于等于
and && 逻辑与
or || 逻辑或
xor ^^ 逻辑异或
not ! 逻辑非

协议过滤格式:tcp / udp / http / udp&&dns / dup&&!dns
IP过滤格式:ip.src==10.219.163.0/24

ip.src    源地址
ip.dst    目的地址
ip.addr   源地址 / 目的地址

端口过滤:tcp.dstport==80
内容过滤:
http.request.uri contains'static'
http.request.uri matches "^/static/"

contains  匹配字符串,包含指定的字符串
maches    匹配正则表达式。"^/"表示开始,"static"为期望的字符串

源IP统计:菜单 > 统计 > IPv4 statistics > All address
计算所有IP的请求排行,排行结果可以导出另作他用

【模拟实验2】研究三次握手

2.tcpdump

安全排查需要服务器抓包,但是linux系统一般是命令行,无GUI,内网访问控制很难安装第三方抓包程序
kali默认安装tcpdump

kali切换root用户:sudo -i
                 sudo -iu root
命令行开头变为井号,切换成功

查看tcpdump是否安装:tcpdump -h

tcpdump抓包:
tcpdump tcp port 80 -nn -vv

参数解释:
-i 指定网卡
-any 监听所有网卡
-i eth0 监听eth0
-n / -nn 不解析主机名/端口名
-v / -vv 显示更多包信息
-r / -w 读取文件/输出到文件
-c 抓取包个数
-s 抓取每个包字节长度,0表示整个包

数据包类型:
tcp / udp / icmp 协议关键字
src / dst 传输方向关键字
host / net / port 包类型关键字
and(&&) / or(||) / not(!) 逻辑表达式
[x:y] 高级包头过滤。指定数据包中的字符范围,类似wireshark中的contains

tcpdump生成pcap数据文件:
tcpdump tcp port 80 -w aq.163.com.pcap
tcpdump指定多个端口:
tcpdump tcp port 80 or port 443 -nn-vv
tcpdump 指定源host和目的端口:
tcpdump -i any -nn -vv src host 192.168.164.136 and dst port 80
tcpdump配合gerp使用(linux搜索工具):
tcpdump tcp port 80 -nn -vv | gerp'163.com'
tcpdump只抓取http请求:
tcpdump tcp[20:4]=0x47455420 or tcp[20:4]=0x504f5354 -nn -vv

tcp头部一般20个字节,后面为数据部分,取数据部分前四个字节,写为TCP[20:4]
数据前四个字节为"GET+space",或者为POST,即为HTTP请求(取他们的16进制数据匹配)
更准确的写法:把20换成(tcp[12:1]&0xf0)>>2

经典面试题:从url输入到页面展现发生了什么?

3.数据包分析

【模拟实验3】DNS解析
wireshark中输入过滤规则:http contains "aq.163.com"
域名解析请求:dns contains "\x02aq\x03163\x03com"
请求和响应对比:
IP协议--源/目的地址
UDP协议--源/目的端口
transcation ID
Flags

DNS资源记录的Name:
\x02 aq \x03 163 x03 com \x00
\x03 www \x06 google \x03 com \x00

DNS资源记录的Type:

DNS资源记录的TTL:
十六进制:0x012c;十进制:300
5分钟(300秒)后,DNS缓存过期

DNS重绑定(DNS Rebinding):自建DNS服务器,TTL设置为0,每时每刻都要和DNS服务器交互
无论域名解析经过多少步,我们抓包只能看到step1的dns query和step8的dns response

linux dig命令:dig ag.163.com+trace
请求根服务器root-servers.net,j服务器返回com域服务器
gtld-servers.net,b服务器返回163.com域名服务器
ns8.166.com返回aq.163.com的记录59.111.160.194

【模拟实验4】TCP握手
wireshark中输入过滤规则:http contains "aq.163.com",右键追踪tcp流

tcp连接的建立(三次握手)

tcp标志位
syn flag: 000010=0x02
syn-ack flag: 010010=0x12
ack flag:010000=0x10

三次握手之SYN包:
1.SYN=1, seq=x
flag=0x02, seq=2715693670
2.flag=0x12, seq=3526619357
ack=2715693670+1
3.flag=0x10
seq=2715693670+1
ack=3526691357+1

TCP连接的释放(四次挥手):
实际情况1:输入aq.163.com快速关闭浏览器后,客户端发送FIN到服务端(第一步),服务端发送FIN到客户端(包含第二三步),客户端发送ACK,TCP断开(第四步)
实际情况2:一直不关浏览器,服务端发起,过程颠倒

【模拟实验5】HTTP请求
tcp[12:1]
前面有3行,每行4字节,取12个字符后开始的第一个字节

tcp[12:1]&0xf0
只取前4个比特,后4个比特是0

4
得到数据偏移的数值

乘以4(<<2)
与真正的tcp头部长度差4倍,每个偏移可以表示4个字节,即向左移动两位

aq.163.com的http请求:
真实数据包中的tcp头部
tcp头部是8:8*4=32字节
tcp头部最大:15*4=60字节

HTTPS交互:
wireshark过滤规则:ip.addr==59.111.160.194
Client Hello:443端口刚刚建立好第一个传输包。cipher suites字段:加密算法
Server Hello:对Client Hello的响应。服务端从上面17种中选择1种,每种2字节,后续所有交互基于这种算法

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
EC- 椭圆曲线;-E 临时的
非对称加密算法:ECDHE_RSA。用于在握手过程中加密生成的密码(DH- 基于离散对数的秘钥交互算法)
对称加密算法:AES_128_GCM。用于对真正传输的数据进行加密
HASH算法:SHA256.用于验证数据的完整性

HTTPS简化流程:

三、网络发包

1.hping

源码地址:https://github.com/antirez/hping
开源。C语言编写。TCP/IP数据包的C语言经典实现
安装包下载地址:http://hping.org/download.php
kali下自带hping,免安装。只需在root下输入hping3 -h,通过查看使用文档判断能否正常启动
红帽安装命令:yum install hping3
Debian安装命令:apt-get install hping3

136发包:hping3 --syn --flood 192.168.164.137
137抓包:tcpdump src host 192.168.164.136

Ctrl+C 停止抓包

通用参数:
-h, --help 显示帮助
-v, --version 显示版本
-I, --interface 网卡接口
-d, --data 发送数据包内容长度,缺省为0
-c, --count 发送数据包的数目,缺省一直发
数据包类型:
-1, --icmp 发icmp包
-2, --udp 发udp包
-S, --syn 发tcp包,标志位是syn
-A, --ack 发tcp包,标志位是ack
-R, --rst 发tcp包,标志位是rst
-F, --fin 发tcp包,标志位是fin
-P, --push 发tcp包,标志位是push
-U, --urg 发tcp包,标志位是urg
发送速率:
-i, -interval 发送数据包间隔ux,x是微秒
--fast -i u100000(每秒10个)
--faster -i u10000(每秒100个)
--flood 尽快发送

2.apachbench

开源。一个c文件。2000行代码
https://httpd.apache.org/docs...
kali:免安装自带。ab -h查看使用文档
红帽:yum install httpd-tools
Debian:apt-get install apache2-utils

开启.137的web服务:80端口
/etc/init.d/apache2.start
.136的请求:显示apache首页证明启动好了
curl http://192.168.164.137/ | grep title -t10
.136请求发包:
ab -t 10 -C100 http://192.168.164.137 -C100
.137开启抓包:利用tcp偏移长度匹配GET
tcpdump 'tcp[((tcp[12:1]&0xf0) >> 2):4] = 0x47455420' -nn
.137应用层日志:
tail -100 /var/log/apache2/access.log

.137启动apache:
/etc/init.d/apache2 start
136 curl
137输入tcpdump命令,抓取get请求
136ab是否可以执行ab -h
输入发包命令
136源端口递增
137目的端口都说80,长度统一,访问的都是根目录,使用http1.0协议
Ctrl+C关闭抓包
tail日志

通用参数:
-h 显示帮助
-V 显示版本
-n 总共的请求执行数,缺省为1
-c 并发数,缺省为1
-t 测试所进行的总时间,单位为秒,缺省50000秒
HTTP格式参数:
-H 添加请求头,可重复该参数添加多行
-C 添加cookie信息,可重复该参数添加多个
-k 启用HTTP Keep Alive功能
-m 设置任意请求方法
-i 执行HEAD请求,而非默认的GET
-p 执行POST请求,而非默认的GET
-u 执行PUT请求,而非默认的GET
-T 添加Content -type头信息与-p和-u配合

ab设置UA
136:ab -n 100 -H "user-Agent:Mozila/5.0" http://192.168.164.137/
137:tail -n 10 /var/log/apache2/access.log

ab设置请求方法
136:ab -t10 -mPOST http://192.168.164.137
137:``

ab传递参数
136:echo '{"name":"netease"}' > data.json
ab -p data.json -T application/json http://192.168.164.137

137:tcpdump src host 192.168.164.136 -nn -vv

ab伪造IP
-x 设置代理,proxy:port模式。本机用port设置代理

136:ab -n 100 -X 192.168.164.1:8888 http://192.168.164.137
137:
收到的源IP地址为192.168.164.1

136上用burp>HTTP history查看历史

3.僵尸网络

僵尸网络(botnet)是攻击者出于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络
其中用来发起命令,控制的信道是僵尸程序
控制服务器:command and control server / C&C / C2 / CnC
傀儡机(肉鸡):bot
C2服务器和肉鸡组成类似星型的网络

僵尸网络发包:
攻击者远程登录C2
控制C2向bots发送发包指令(进行攻击)
不计延时,所有肉鸡几乎同时收到指令
bots向受害者发包

mirai源码编译:https://github.com/jgamblin/M...
代码质量差,半成品,不建议阅读
bot目录最后生成的二进制文件是在肉鸡上运行的,因为涉及发包操作,考虑到效率,用C编写
cnc目录生成的二进制文件在主控上运行,用来和bot程序通信,给攻击者登录管理接口(go语言)
loader 下载器,可以在线下下载不同类型的bot程序
tools 加密小程序
scripts 脚本文件

mirai编译步骤
C2主控域名配置
编译加密工具:
root@kali:~/Mirai-Source-Code# cd mirai/tools && gcc enc.c -o enc.out
加密域名:
root@kali:~/MSC/mirai/tools ./enc.out string cnc.mirai.com

root@kali:~/MSC/mirai/tools ./enc.out string report.mirai.com

修改/mirai/bot/table.c代码

2.MySQL数据库配置
kali自带MySQL。启动MySQL
root@kali:~/MSC/etc/init.d/mysql/start
Starting mysql (via systemctl):mysql service

修改root密码
修改/scripts/db.sql开始
CREATE DATABASE mirai;
use mirai;
CREATE TABLE 'history'

修改/scripts/db.sql结束
CREATE TABLE 'whitelist'(...);
INSERT INTO users VALUES (NULL, 'mirai', 'mirai'; 0.0.0.0,-1,1,30,'');

执行SQL脚本
修改/mirai/cnc/main.go数据库配置
(修改第三行密码为之前的mysql密码)

3.交叉编译环境配置
创建交叉编译目录:cross-compile-bin,必须与mirai的目录一致
瞎子啊其他平台的编译环境
修改环境变量 ~/.bashrc
环境变量立刻生效
更新软件列表。脚本会在线下载一下软件,比如gcc.golang,不更新下载不下来
执行 /script/cross-compile.sh脚本

4.go编译依赖包配置
go的MySQL数据库依赖
go的命令行解析依赖

5.运行编译脚本
创建debug目录
修改 /mirai/bot/includes.h
/mirai/build.sh脚本运行

阅读 121

1 声望
0 粉丝
0 条评论
你知道吗?

1 声望
0 粉丝
宣传栏