# ids **Repository Path**: aishuijiaogengaixuexi/ids ## Basic Information - **Project Name**: ids - **Description**: 个人入侵检测系统的作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-03-13 - **Last Updated**: 2024-02-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [TOC] [snort源码分析](snort源码分析.md) [snort实验最终源码分析](snort源码分析最终版.md) # 第一次作业 ## snort安装 1. 操作系统: ubuntu 22.04.1以上 2. snort版本: 2.9.15.1 3. 安装教程: [『网安产品开发实践』Linux-snort 的安装与配置、规则设计_Ho1aAs的博客-CSDN博客](https://blog.csdn.net/Xxy605/article/details/121532122) ``` //安装 sudo apt-get install snort //检查是否安装成功 snort -V ``` ![snort安装](图片/1.snort安装.png) ## 入侵检测产品信息     1. 信息来源 [【译】13款入侵检测系统介绍 - starnight_cyber - 博客园 (cnblogs.com)](https://www.cnblogs.com/Hi-blog/p/intrusion-detection-tools.html) | 产品 | 介绍 | | ------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | SolarWinds Security Event Manager | 分析来自Windows,Unix,Linux和Mac OS系统的日志。它管理Snort收集的数据,包括实时数据。 SEM还是一种入侵防御系统,附带700多个规则以关闭恶意活动。改善安全性,响应事件并实现合规性的重要工具 | | CrowdStrike Falcon(免费试用) | 一种基于云的端点保护平台,其中包括威胁搜寻 | | ManageEngine EventLog Analyzer(免费试用) | 一种日志文件分析器,用于搜索入侵的证据 | | Snort | 由Cisco Systems提供,可免费使用,领先的基于网络的入侵检测系统软件 | | OSSEC | 优秀的基于主机的入侵检测系统,可免费使用 | | Suricata | 基于Network的入侵检测系统软件,在应用程序层运行,以提高可视性 | | Zeek | 网络监控器和基于网络的入侵防御系统 | | Sagan | 日志分析工具可以集成在snort数据上生成的报告,因此它是具有少量NIDS的HIDS | | Security Onion | 网络监视和安全工具由从其他免费工具中提取的元素组成 | | AIDE | 高级入侵检测环境是适用于Unix,Linux和Mac OS的HIDS | | OpenWIPS-NG | 来自Aircrack-NG制造商的无线NIDS和入侵防御系统 | | Samhain | 直接基于主机的入侵检测系统,适用于Unix,Linux和Mac OS | | Fail2Ban | 用于Unix,Linux和Mac OS的轻型基于主机的入侵检测软件系统 | --- # 第二次作业 ## liunx安装和环境配置 1. liunx安装: 已经安装了ubuntu系统(22.04.1)    2. 账户设置: 添加用户名为3120004854的账户 ![liunx系统安装和账户设置报错](图片/2.liunx系统安装和账户设置报错.png) ![liunx系统adduser的正则表达式](图片/2.liunx系统adduser的正则表达式.png) 解决方案:[ Linux创建用户和删除用户_QFIUNE的博客-CSDN博客](https://blog.csdn.net/weixin_42038527/article/details/110169400) ![liunx系统adduser成功](图片/2.liunx系统adduser成功.png) ![liunx系统3120004854登录成功](图片/2.liunx系统3120004854登录成功.png) 3. 为账户添加root权限 ![2.为账户添加root权限](图片/2.为账户添加root权限.png) [(1条消息) 用户 不在 sudoers 文件中。此事将被报告。_用户不在sudoers文件中此事将被报告_邹奇的博客-CSDN博客](https://blog.csdn.net/csdnzouqi/article/details/95499348) 4. ubuntu环境配置     git 版本 ![环境配置git](图片/2.环境配置git.png)        gcc 版本 ![环境配置gcc](图片/2.环境配置gcc.png)     gdb 版本 ![2.环境配置gdb](图片/2.环境配置gdb.png)     make版本 ![2.环境配置make](图片/2.环境配置make.png)     安装libpcap-dev ``` apt-get install libpcap-dev ``` ![2.环境配置pcap](图片/2.环境配置pcap.png) ## snort0.96 源码下载并编译执行 1. 编译 ``` 命令1 linux32 ./configure ``` ![2.snort安装(1)](图片/2.snort安装(1).png)     加上linux32是未了骗过系统 ![2.snort安装(5)](图片/2.snort安装(5).png) ``` checking host system type... Invalid configuration `x86_64-pc-linux-gnuoldld': machine `x86_64-pc' not recognized ```     这句的话存在将导致你的make不成功。     解决方案:[Is there another version of the binutils for x86_64? - Stack Overflow](https://stackoverflow.com/questions/19580394/is-there-another-version-of-the-binutils-for-x86-64)     也就是在命令前面加上linux32. ``` 命令2 make ``` ![2.snort安装(2)](图片/2.snort安装(2).png)     注意,这里用vscode打开查看源码时,有(u_类型)的定义是错误的,这里就没管因为还是能编译出snort可执行文件出来 2. 执行 ``` 命令3 sudo ./snort ``` ![2.snort安装(4)](图片/2.snort安装(4).png)     无root的话 ![2.snort安装(3)](图片/2.snort安装(3).png) ## snort0.96 源码分析 [snort0.96源码分析](snort源码分析.md) --- # 第三次作业 ## ubuntu 安装 因为已经安装了ubuntu,所以我就简单说 1. 安装VMware Workstation 2. 上网找密钥解锁正版使用权 3. 去ubuntu官网下载ios镜像 4. 使用VMware安装镜像 5. 安装好镜像后下载vmtool 6. 注册账号 ## snort0.96 安装 ``` 在第二次作业的snort0.96文件中 sudo make install ``` ![3.snort0.96安装](图片/3.snort0.96安装.png)     安装成功 ![3.snort0.96安装成功](图片/3.snort0.96安装成功.png) ## 1987-IEEE TSE-An Intrusion-Detection Model 翻译 [1987-IEEE TSE-An Intrusion-Detection Model 翻译](一篇翻译.md) --- # 第四次作业 ## 黑客收集信息的手段和方法 参考:[渗透测试之信息收集篇_渗透测试信息收集_未完成的歌~的博客-CSDN博客](https://blog.csdn.net/qq_43531669/article/details/112498646?ops_request_misc=&request_id=&biz_id=102&utm_term=%E9%BB%91%E5%AE%A2%E6%94%B6%E9%9B%86%E4%BF%A1%E6%81%AF%E7%9A%84%E6%89%8B%E6%AE%B5%E5%92%8C%E6%96%B9%E6%B3%95&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-9-112498646.nonecase&spm=1018.2226.3001.4187) 使用的是kali操作系统 ### 域名信息收集 1. whoise查询 ![4.whois](图片/4.whois.png) 2. 备案信息查询 [ICP备案查询](http://icp.chinaz.com/) [天眼查](https://beian.tianyancha.com/) ![4.备案信息查询](图片/4.备案信息查询.png) ### 敏感信息收集 1. Google Hacking语法 2. FOFA网络安全空间搜索 3. GitHub信息泄露     以上多是基于搜索引擎来查询敏感信息 ### 子域名收集 1. subDomainsBrute 2. 搜索引擎 3. 在线网站     [DNSdumpster.com - dns recon and research, find and lookup dns records](https://dnsdumpster.com/)     [phpinfo.me](https://phpinfo.me/domain/) ### 端口探测 1. namp ``` nmap 域名 ``` ![4.namp](图片/4.namp.png) 2. Masscan ``` sudo masscan --ports 1-500(端口范围) ip地址 ``` ![4.masscan](图片/4.masscan.png) 3. 在线工具     [端口扫描 - 站长工具 (chinaz.com)](https://tool.chinaz.com/port/) ### CMS指纹识别 CMS(Content Management System)又称为整站系统或文章系统,用于网站内容管理。用户只需要下载对应的CMS软件包,完成部署搭建,就能直接利用CMS。 因为各类CMS都有其独特的结构命名规则和特定的文件内容,因此可以利用这些内容来判断一个CMS类型信息,这就叫CMS指纹识别。 在渗透测试中,对目标站点进行指纹识别是很有必要的,如果识别出目标站点对应的CMS,则可以查找与该CMS相关的漏洞,方便对目标的进一步的渗透。 1. 在线工具     [在线cms指纹识别](http://whatweb.bugscaner.com/look/) 2. 本地工具     御剑Web指纹识别。     大禹CMS识别程序。 3. CMS漏洞查询     可以上一些平台去查询CMS漏洞 ### 查找真实ip 1. CDN:内容分发网络,国内使用,一般使用户查询ip是最近的CDN服务器而不是其真正的ip地址。 2. 使用ping命令可以判断目标服务器是否使用了CDN 3. 在线网站判断 [全球Ping测试,在线ping工具 - 网络工具 (wepcc.com)](https://www.wepcc.com/) [http://www.gdut.edu.cn GET测试结果 网站速度测试 17CE](https://www.17ce.com/) ### 敏感目录/文件收集 探测Web目录结构和隐藏的敏感文件 获取网站的后台管理、文件上传等重要页面 1. dirsearch 2. 御剑后台扫描 ### 操作系统识别 1. 直接ping         linux ttl = 64         windows ttl = 128 2. 大小写, windows对大小写不敏感, linux对大小写敏感     3. nmap ``` sudo nmap -O ip/域名 ``` ![4.操作系统识别](图片/4.操作系统识别.png) ### 社会工程学 kali系统自带有一个社会工程学攻击的软件 这个软件主要是用来制作钓鱼网站 制作钓鱼网站,劫持DNS,使得受害者登录钓鱼网站填写自己的账户密码 --- # 第五次作业 ## 漏洞说明 ### phpstudy-linux SQL注入漏洞 1. [phpstudy-linux SQL注入漏洞](https://www.cnvd.org.cn/flaw/show/CNVD-2023-19775) | CNVD-ID | CNVD-2023-19775 | | ------- | --------------------------------------------------------------------------------------------------- | | 公开日期 | 2023-03-24 | | 危害级别 | 高 | | 影响产品 | 商丘芝麻开门网络科技有限公司 phpstudy-linux | | 漏洞描述 | phpstudy-linux是PhpStudy linux版,PhpStudy是一个PHP调试环境的程序集成包。phpstudy-linux存在SQL注入漏洞,攻击者可利用该漏洞获取数据库敏感信息。 | | 漏洞类型 | 通用型漏洞 | | 参考链接 | https://www.bilibili.com/video/BV1Yc411j7TP/ | | 漏洞解决方案 | 目前没有详细解决方案提供:https://www.xp.cn/ | 2. 漏洞复现 ``` wget -O install.sh https://notdocker.xp.cn/install.sh && sudo bash install.sh ``` ![5.小皮安装(1)](图片/5.小皮安装(1).png) ![5.小皮安装(2)](图片/5.小皮安装(2).png) 小皮是使用php来启动web服务器 也就是通过访问9080端口来进行登录 监听9080端口的php应用对登录信息进行简单校验和封装后会发送给8090端口。 也就是真正重要的东西都在8090端口上。 可以通过对登录信息的封装来直接访问8090端口 ![5.小皮sql注入(1)](图片/5.小皮sql注入(1).png) * 出现XSS的原因:用户名处没有过滤 * 可以进行sql注入 * 怎么注入 ![5.小皮sql注入(2)](图片/5.小皮sql注入(2).png) 如上图,直接搞崩服务器。 同时会自动拉起一个新进程(重启)。 也就是我每回到服务器会再次要求登录。 ![5.小皮sql注入(3)](图片/5.小皮sql注入(3).png) 通过nc连接服务器,发送构造的命令,返回的错误信息发现sqlite3_exec ![5.小皮sql注入(4)](图片/5.小皮sql注入(4).png) 堆叠注入 ``` admin';UPDATE ADMINS set PASSWORD = 'd48be00285a53681ece5c64b104d66b7';-- ``` 这变我是失败了,但视频是成功的 视频通过堆叠注入,直接把服务器给干崩重启 然后就可以随意登录后台,也就是可以留下后门。 ## 缓冲区溢出例子 参考:[经典缓冲区溢出小例子_缓冲区溢出例题_C4cke的博客-CSDN博客](https://blog.csdn.net/qq_35289660/article/details/104707842?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167965974316800217291434%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167965974316800217291434&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-104707842-null-null.142^v76^wechat,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA%E4%BE%8B%E5%AD%90&spm=1018.2226.3001.4187) ```c #include void HelloWord() { printf("Hello World"); getchar(); } void Fun() { int arr[5] = {1,2,3,4,5}; arr[6] = (int) HelloWord; } int main() { Fun(); return 0; } ``` 首先是Fun()函数 定义了一个数组arr[5],分别存放了1,2,3,4,5,占用了40个字节 arr[6] = (int) HelloWord; 这就话就是把helloworld函数的地址给放到arr[4]这个地址后面的地址, 也就是fun()函数的返回地址被helloworld函数的地址覆盖了。 ![5.缓冲区溢出(1)](图片/5.缓冲区溢出(1).png) ``` void Fun() { 00007FF7FEF017A0 push rbp 00007FF7FEF017A2 push rdi 00007FF7FEF017A3 sub rsp,118h 00007FF7FEF017AA lea rbp,[rsp+20h] 00007FF7FEF017AF lea rdi,[rsp+20h] 00007FF7FEF017B4 mov ecx,0Eh 00007FF7FEF017B9 mov eax,0CCCCCCCCh 00007FF7FEF017BE rep stos dword ptr [rdi] 00007FF7FEF017C0 lea rcx,[__D61FA245_源@cpp (07FF7FEF11008h)] 00007FF7FEF017C7 call __CheckForDebuggerJustMyCode (07FF7FEF01366h) int arr[5] = { 1,2,3,4,5 }; 00007FF7FEF017CC mov dword ptr [arr],1 00007FF7FEF017D3 mov dword ptr [rbp+0Ch],2 00007FF7FEF017DA mov dword ptr [rbp+10h],3 00007FF7FEF017E1 mov dword ptr [rbp+14h],4 00007FF7FEF017E8 mov dword ptr [rbp+18h],5 //arr[6] = (int)HelloWord; } 00007FF7FEF017EF lea rcx,[rbp-20h] 00007FF7FEF017F3 lea rdx,[__xt_z+1E0h (07FF7FEF09C80h)] 00007FF7FEF017FA call _RTC_CheckStackVars (07FF7FEF01302h) 00007FF7FEF017FF lea rsp,[rbp+0F8h] 00007FF7FEF01806 pop rdi 00007FF7FEF01807 pop rbp 00007FF7FEF01808 ret ``` 分析这个反汇编的代码 如果没有arr[6]; 向栈push fun函数 存放数据 将fun函数pop出来 | | | | ------- | --------- | | rbp+08h | 1 | | rbp+0Ch | 2 | | rbp+10h | 3 | | rbp+14h | 4 | | rbp+18h | 5 | | rbp+1Ch | ... | | rbp+20h | fun函数返回地址 | 如果加入了arr[6] = (int)helloworld arr[6]的地址恰好是fun函数返回地址 当arr[6] = (int) helloworld时, helloworld的函数地址就会把fun函数地址给覆盖掉。 也就是说,我们只需要把通过溢出,把返回地址覆盖成我们攻击程序的地址,就能实现栈溢出攻击。 ## 端口扫描程序 学习windows网络编程:[c++ 端口扫描程序 - lance2008 - 博客园 (cnblogs.com)](https://www.cnblogs.com/clc2008/p/6858670.html) ### 编程环境 1. windows11, 2. vs2022, 3. C++17。 ### 思路 1. 不使用qt,没意思。 2. 使用windows环境下的socket接口。 3. 创建套接字,对目标端口继续逐一连接,连接成功是开放的,失败是没开放的。 4. 由于扫描端口很慢,使用多线程加快速度。 5. 扫描目标是我的windows server 2008 r2虚拟机 ![5.端口扫描,思路,虚拟机1](图片/5.端口扫描,思路,虚拟机1.png) ### 源码 1. IOC容器 ```c++ #include #include #include #include #include using namespace std; class IocContainer { public: template void registerType(string key) { std::function func = [](Args...args) { return new Depend(args...); }; aregistertype(key, func); } //根据唯一标志查询对应的构造器 创建对象 template T* resolve(string key, Args...args) { if (m_map.find(key) == m_map.end()) { return nullptr; } any func = m_map[key]; //转换为合适的类型 std::function f = std::any_cast>(func); return f(args...); } template std::shared_ptr resolveShared(string key, Args...args) { T* t = resolve(key, args...); return std::shared_ptr(t); } private: //注册函数,用来向map容器中插入对应的 void aregistertype(string key, any func) { if (m_map.find(key) != m_map.end()) { //invalid_argument:无效参数 throw std::invalid_argument("this key has exist"); } else { m_map.emplace(key, func); } } private: map m_map; //ioc容器内部的存储容器,any是任意类型 }; ``` 主要是利用模板函数和map容器来创建IOC容器 map容器用于存放关键字和构造构造函数。 any类型为任意对象类型 可以创建含参数的构造函数 2. mysocket.h ```c++ #pragma once #include #pragma comment(lib, "Ws2_32") #define WIN32_LEAN_AND_MEAN #include class Socket { public: virtual bool myconnect(std::string ip, int port) = 0; }; class MySocket : public Socket { public: MySocket(); bool myconnect(std::string ip, int port); private: WSADATA wsa; SOCKET s; struct sockaddr_in server; }; ``` windows平台提供网络编程的api在winsock2.h头文件内。 liunx平台是sys/socket.h。 接口编程 3. mysocket.cpp ```c++ #include "mysocket.h" #include #include using namespace std; MySocket::MySocket() { WSAStartup(MAKEWORD(2, 2), &wsa); //使用winsock函数之前,必须用WSAStartup函数来装入并初始化动态连接库 server.sin_family = AF_INET; //指定地址格式,在winsock中只能使用AF_INET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //创建一个使用IPV4协议的TCP套接字 } bool MySocket::myconnect(std::string ip, int port) { //inet_pton(AF_INET, ip.c_str(), (void*)&server); //指定被扫描的IP地址 server.sin_addr.s_addr = inet_addr(ip.c_str()); //指定被扫描的IP地址 server.sin_port = htons(port); //指定被扫描IP地址的端口号 int ret = connect(s, (struct sockaddr*)&server, sizeof(server));//连接 string msg = " ip:"+ ip + " 端口:"+ to_string(port); if (ret == 0) { msg.append(" 开放\n"); cout << msg; closesocket(s); return true; } else { msg.append(" 未开放\n"); cout << msg; return false; } } ``` 这部分用了一个过时的函数inet_addr(ip); 在项目文件预编译中添加了 ``` _WINSOCK_DEPRECATED_NO_WARNINGS ``` 以忽略这个错误。 或者可以使用inet_pton函数。(我不太会用) 4. main.cpp ```c++ #include #include"mysocket.h" #include #include"ioc.h" using namespace std; IocContainer ioc;//IOC容器 //注册函数 void regist() { ioc.registerType("mySocket"); //注册MySocket对象到IOC容器 } //扫描函数,扫描对应ip的主机的端口(从startport-endport,i是线程编号) void scan(string ip, int startport, int endport, int i) { string msg = "线程:"+to_string(i)+" 正在运行\n"; cout << msg; auto mysocket = ioc.resolve("mySocket"); //利用IOC容器创建mysocket对象 if (mysocket == nullptr) { cout << "ERROR"; return; } for (int i = startport; i <= endport; i++) { mysocket->myconnect(ip, i); } delete mysocket; //释放对象 msg = "线程:" + to_string(i) + " 结束运行\n"; cout << msg; } int main() { regist(); string ip = "192.168.176.132"; //指定ip int portnum = 95; //指定端口1-95 const int threadnum = 10; int midnum = portnum / threadnum; thread th[threadnum]; //创建10个线程 for (int i = 0; i < threadnum; i++) { if (i == threadnum - 1) { th[i] = std::thread(scan, ip, i * midnum + 1, portnum, i); } else { th[i] = std::thread(scan, ip, i * midnum + 1, i* midnum + midnum, i); } } //等待线程执行完毕 for (int i = 0; i < threadnum; i++) { th[i].join(); } return 0; } ``` 使用多线程加快端口扫描速度。 利用ioc容器分别在各个线程中声明一个mysocket对象,扫描完所分配的端口后就释放对象结束线程。 ### 结果展示 ![5.端口扫描,结果1](图片/5.端口扫描,结果1.png) ![5.端口扫描,结果2](图片/5.端口扫描,结果2.png) 其中80端口是开放的。 --- # 第六次作业 1. snort1.0源码解析 [snort1.0源码分析](snort源码分析.md) --- # 第七次作业 1. snort1.5源码解析 [snort1.5源码分析](snort源码分析.md) 2. 1987-IEEE TSE-An Intrusion-Detection Model 翻译 [1987-IEEE TSE-An Intrusion-Detection Model 翻译](一篇翻译.md) ---