网络安全课设

最近好像做了挺多事情,但是没有系统地整理输出。这几天做的网络安全课程设计还是挺好玩的,作业是做扫描器和嗅探器,在这个过程中学到了不少 socket 编程的知识(当然,仅限第一个实验)。

具体的代码位于 https://github.com/40m41h42t/NUAA-CyberSec ,代码写的很丑。在写的过程中有过一些酷炫的想法,然而随着 deadline 的到来只能 Keep it simple, stupid。具体的感受如下:

在这个过程中算是大概了解了计算机网络编程的知识。

Scanner

扫描器的要求如下:

Scanner 简单网络扫描程序实现

  • 实验目的:熟悉并实现网络扫描的基本原理,了解网络扫描的几种常用的方法。

  • 实验环境:Linux,C 语言

  • 实验内容:

    用 C 语言编写一个在 Linux 下扫描局域网内主机的程序。要求可以显示局域网内的主机名列表,并可以显示哪些主机开放了哪些端口。

最著名的扫描器应该是 nmap 无疑了。我参考了它扫描的方法来完成自己的扫描器。

1
nmap -sP 192.168.1.1/24

可以用 TCP SYN 的方法扫描该网段的 IP。在扫描的过程中抓包,我们就可以轻松看到 nmap 发包的过程。

  • 扫描局域网内主机可以通过发送接收 ARP 报文来实现。
  • 显示局域网内的主机名列表可以通过 DNS 报文实现。
  • 显示哪些主机开放了哪些端口可以通过 TCP SYN 扫描实现。

然而,对于我这种菜鸡来说,虽然梦想是美好的,写起代码的时候就会感觉各种坑爹。。

整个扫描器的设计如下:

初始化网络信息会从设定的网卡编号中得到网络信息,其实 socket 编程也并不难,重要的是理解各个层级之间的关系。不过对我这种习惯了写 Python 的萌新来说,C 的各种定义真是让人头大。。在得到本机当前网卡的 IP 和子网掩码之后,我们就可以得到整个内网的网段了。接下来就是发送并接收 ARP 报文,获取内网的存活主机。

扫描存活主机的设计如下:

嗯。。父进程(也就是自己)接收 ARP 报文,子进程发送 ARP 报文,其实可以开线程的。

ARP 报文的格式如下:

构造 ARP 报文花了我不少时间,中文的资料太坑爹了。。

接收的时候,问题出现了,怎么样才能确定所有回复的 ARP 报文都被接收了呢?我有几种想法:

  • 首先,增大发送 ARP 包的间隔,让父进程能收到所有的报文。
  • 其次,可以发送多次请求,最后整理排序即可。
  • 除此之外,设定接收 ARP 的超时时间为 5s,这样可以避免无限收包的死循环。

当然我的方法就很菜了。。如果直接用 time.h 中的时间结构体的话,在计算时间获取时间上会消耗大量时间,设定为 5s,最后跑起来可能就 6、7s 了,有时候不知道为什么还会卡住,消耗了大量时间却没有获取到所有的流量包。于是我改用 alarm 函数设定时间,用 setjmp 跳回父函数,简直是不能再窒息的方法,不知道有没有什么更好的设定计时器跳出循环的办法。。

接下来要获取主机名称,查找的时候发现有一个神奇的函数叫 gethostbyaddr,完全不用自己构造报文,太舒服了。。

最后本应该实现 TCP SYN 扫描的,但是由于我之前多次咕咕咕的原因到了 ddl,于是我只好换了一种比较简单(?)的 TCP connect 方法。

呜呜呜其实是照着大白学长的来写了,以后有时间(咕咕咕)再加上 TCP SYN 的扫描吧,我已经留好接口了,就差实现了!咕咕咕

1
2
3
4
5
6
void *ScannerThread(void *args)
{
ScanArgs *p = (ScanArgs *)args;
p->result = SYNScan(p->ip, p->port);
return NULL;
}

Sniffer

嗅探器的要求如下:

网络嗅探器

  • 实验目的:熟悉并实现网络监听的基本原理
  • 实验环境:Linux/Windows,C 语言
  • 实验内容:
    • 用 C 语言编写一个监听网络流量的程序,并对截取的报文进行解析,
  • 实验结果
    • 提交实验报告
    • 作为后续信息安全综合实验的基础

这个本来也应该用 socket 来写的,读取原始套接字,解析二层 MAC,三层 IP,以及之后的 TCP/UDP 等协议的。有一张图片可以画出各个网络层之间的关系:

但是随着 DDL 的临近,我发现了 libpcap 库。。于是一切都变得简单了起来 <- 一个造轮子失败的人QAQ

对于 libpacp 库,Programming with pcap 把所有用到的嗅探器需要的方法都告诉我了,我甚至可以直接用上面的代码。。。理解第一,理解万岁.jpg。于是 Sniffer 只花了一小会就写完了。。

其结构如下:

其实我也是想解析其他报文的,不过果然咕咕咕是最舒服的(

pcap_loop 函数已经把我们所有需要做的工作封装好了。我们在函数中可以通过最后一个参数得到所有的报文信息,然后再按照上面的文档解析报文。我只解析了三种协议,从以太网的 Ethernet 头部就不说了,只有 MAC_dstMAC_srcether_type 三个变量。IP 和 TCP 的报头分别为:

嗯,上面的都是我闲的无聊的时候画的。。有画的时间写点代码多好。。

所以最后感觉也没做什么工作,要实在说是有的话算是加深了一点点对计网的理解?唔,大概就是这样,又水了一篇博客。。

文章作者: 40m41h42t
文章链接: http://qrzbing.cn/2019/06/08/网络安全课设/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 QRZ's Blog