目录
1.入侵分析--日志查看
2.入侵分析--可以进程
3.报文解析项目介绍
1 入侵分析——系统日志
• 一些常见的系统日志介绍如下:
o /var/log/messages: 一般的系统日志
o /var/log/kern.log: 系统内核日志 非法接入设备的时候可以在这里查看日志
o /var/log/boot.log: 系统启动日志 linux启动的时候输出的日志放到这里
o /var/log/auth.log: 登录相关的日志, 比如ssh/sudo成功失败的日志都在这里
o /var/log/cron.d: cron计划任务的执行日志
• 审计, 审计日志由auditd产生,/etc/audit/auditd.conf为审计配置文件,/etc/audit/audit.rules 为审计规则文件。
/var/log/audit/* : 为审计记录,可以进一步分析,也许可以发现一些意想不到的痕迹(如果有的话).
4.dpi项目的需求分析
2 可疑进程分析
使用top命令或者ps命令来查看当前正在运行的命令
查看该进程启动的完整命令行: ps eho command -p $PID
查看该进程启动时候所在的目录: readlink /proc/$PID/cwd
查看该进程启动时的完整环境变量: strings -f /proc/$PID/environ | cut -f2 -d ‘ ‘
列出该进程所打开的所有文件: lsof -p $PID
查看当前主机的网络连接情况, netstat -apn | grep $PID
抓包分析,tcpdump 或者 使用图形化抓包工具wireshark
查看主机防火墙iptables, DNS(/etc/resolv.conf和/etc/resolvconf/)、http代理,或者/etc/hosts, 都可能会导致我们正常的网络请求被攻击者监听并篡改. 这些小小的修改也许不是很明显,可一旦发现自身网络环境’不太对劲’, 就要提高警惕, 仔细排查了.
5.pcap文件的获取
3 深度报文解析需求
传入数据:
网络的原始报文(可以实时抓包进行分析,也可以使用一些pcap文件进行分析)
传出数据:
对应网络报文的协议
传入pcap文件,最后得到结果,对应的一些应用协议报文有多少....
6.pcap文件的介绍
4 获取pcap文件
1 tcpdump -i 网卡名 -w 要存储的文件名.pcap [过滤器]
2 使用wireshark进行抓包,抓包完成之后存成pcap文件即可
编程基础
apt install libpcap-dev
#include <pcap/pcap.h>
链接库 -lpcap
1 初始化
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t *pcap_open_offline(const char *fname, char *errbuf);
fname : pcap文件
errbuf: 错误信息的输出
返回值:
句柄,不需要我们去解析里边的内容,给其他api来使用的
成功返回非0,失败返回NULL,并且errbuf被赋值
7.pcap文件编程实现报文计数
2 业务处理
我们业务是从pcap文件里边去解析每一个报文
每一个报文包含一个packet header + packet data
需要一个循环来读取每一个报文
typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,
const u_char *bytes);
int pcap_loop(pcap_t *p, int cnt,
pcap_handler callback, u_char *user);
这是一个循环的函数,用来解析pcap文件中的每个报文
p : 句柄 ,pcap_open拿到的
cnt : 遍历多少个报文,如果值为0或者-1 ,遍历所有报文
callback : 回调函数
具体回调逻辑可以大概认为如下:
while(文件还没有到达最后)
{
遍历一个packet header + packet data;
callback(user自定义参数,&packetHeader,&packetData);
}
user: 自定义回调参数,就是每次调用我们的回调函数的时候会传进来
返回值:
成功返回0,出错失败返回-1
8.复习
3 垃圾回收
void pcap_close(pcap_t *p);
p就是pcap_open得到的句柄
5 将dpi 做成一个库
库对应有更好的灵活性,目前我们要做的东西只是一个大系统的模块
定义接口:
句柄就是结果集:
typedef struct dpi_result
{
unsigned int ether_count; //以太网报文数量
unsigned int ip_count; //ip报文数量
unsigned int tcp_count; //tcp 报文数量
unsigned int udp_count; //udp报文数量
unsigned int ssh_count; //ssh报文数量
//...
}dpi_result;
1 初始化
dpi_result* dpi_init(const char *pcapfile);
pcapfile :要处理的pcap文件
返回值:设计一个句柄,这个句柄包含了结果
成功返回非空的指针,失败,返回NULL
2 业务处理
void dpi_loop(dpi_result *res);
启动执行报文解析的函数
3 资源释放
void dpi_destroy(dpi_result *res);
9.dpi库的设计
6 以太网报文的解析
每个packet header中都有两个字段 caplen len
caplen 是抓取到的报文存到pcap文件中的实际大小
len 是被抓取的报文的理应该大小
如果抓包的过程中,2k的报文,抓到1k数据后就中断
caplen = 1k
len = 2k
保护措施,如果这两个值不等,表名报文被中断,不应该再继续做解析
对于数据中的字段位置确定的,访问方式最好是使用结构体
10.dpi库的接口基本实现
struct eth *hdr = data;
hdr->type ; 直接操作type就可以操作对应的13-14个字节
定义一个结构体,标识一个报文的解析的路径信息
typedef struct dpi_pkt
{
uint32_t ether_len; //以太网报文长度
char *ether_packet; //以太网报文的地址
uint32_t ip_len; //ip报文长度
char *ip_packet; //ip网报文的地址
uint32_t tcp_len; //tcp报文长度
char *tcp_packet; //tcp报文的地址
uint32_t udp_len; //udp报文长度
char *udp_packet; //udp报文的地址
}dpi_pkt;
11.pcap透传参数实现以太网报文计数
12.以太网分析packet header长度问题
13.报文分析思路路径
14.解析以太网报文类型
15.ip报文的统计