实习实训day2

要求

1、DNS解析详细步骤。
2、绕过CDN查找主机真实IP的方法。
3、子域名信息收集常用手段。
4、Nmap全端口扫描(使用昨日搭建的pikachu靶场),加分项:能够说明SYN半开扫描的原理和跳过主机存活检测扫描使用常见。
5、dirmap目录探测工具实践(使用昨日搭建的pikachu靶场),要求讲述为什么dirmap每次扫描条数不一样,加分项:dirmap高级应用,详细见项目文档,项目链接:https://github.com/H4ckForJob/dirmap
6、Fscan实践(使用昨日搭建的pikachu靶场)
7、课上所演示插件安装成功截图。
注意:每个加分项加0.5分,除布置任务除外,如果其他信息收集建议、好方法,经研判会额外加分。

DNS解析步骤

DNS(域名系统,Domain Name System)的解析过程是将人类可读的域名转换为计算机可读的IP地址的过程。这个过程分为多个步骤,以下是详细步骤的描述:

  1. 用户请求域名解析
    当用户在浏览器中输入一个域名(如www.example.com)并按下回车键时,浏览器会检查本地缓存(DNS缓存)中是否已经存储了该域名的IP地址。如果存在,浏览器会直接使用该IP地址与目标服务器通信。
  2. 查询操作系统的DNS缓存
    如果浏览器本地缓存中没有找到对应的IP地址,它会向操作系统的DNS缓存(也叫作“hosts”文件)进行查询。如果在“hosts”文件中找到了匹配的IP地址,浏览器将使用这个IP地址。
  3. 向本地DNS服务器发送请求
    如果操作系统的DNS缓存中也没有找到对应的IP地址,操作系统会将请求发送给配置的本地DNS服务器(通常由ISP提供)。本地DNS服务器接到请求后,会首先查询自己的缓存,如果命中则返回IP地址。
  4. 本地DNS服务器递归查询
    如果本地DNS服务器没有缓存该域名的IP地址,它会进行递归查询。递归查询通常涉及以下步骤:
  • 根DNS服务器查询:本地DNS服务器首先向根DNS服务器查询域名。根DNS服务器不会直接提供目标IP地址,而是告诉本地DNS服务器应当查询哪个顶级域名服务器(如.com.net等)。
  • 顶级域名服务器查询:接着,本地DNS服务器会向顶级域名服务器(如.com域名服务器)查询,顶级域名服务器会返回负责该域名的权威DNS服务器的地址。
  • 权威DNS服务器查询:最后,本地DNS服务器会向返回的权威DNS服务器发送查询请求,权威DNS服务器返回域名对应的最终IP地址。
  1. 返回IP地址
    本地DNS服务器将权威DNS服务器返回的IP地址缓存下来(以备下次查询时使用),然后将IP地址返回给操作系统。
  2. 浏览器与服务器通信
    操作系统将接收到的IP地址返回给浏览器,浏览器使用这个IP地址与目标服务器建立连接,发送HTTP请求,获取网页内容。
  3. 后续请求
    后续的请求如果是针对相同域名的,会直接从浏览器缓存、操作系统缓存或本地DNS缓存中获取IP地址,而无需再次进行完整的DNS解析。

CDN

什么是CDN?

参考链接:

CDN(Content Delivery Network)内容分发网络原理、组成、访问过程、动静态加速、作用详解

CDN和传统方式的访问流程区别

传统访问流程

  1. DNS解析
  • 用户在浏览器中输入要访问的域名。
  • 浏览器向本地DNS服务器请求对该域名的解析。
  • 本地DNS服务器中如果缓存有这个域名的解析结果,则直接响应用户的解析请求;如果没有,则向根DNS服务器逐级查询,最终获得该域名对应的源服务器IP地址。
  1. 内容请求与响应
  • 浏览器利用得到的IP地址,向源服务器发起TCP连接请求。
  • TCP连接建立后,浏览器向源服务器发送HTTP请求。
  • 源服务器处理请求,将用户请求的内容通过HTTP响应发送给浏览器。
  • 浏览器接收并显示内容,然后断开TCP连接。

CDN访问流程

  1. DNS解析
  • 用户同样在浏览器中输入要访问的域名。
  • 浏览器向本地DNS服务器请求对该域名的解析。
  • 由于网站接入了CDN服务,本地DNS服务器在查询过程中可能会得到该域名对应的CNAME记录(而不是直接的IP地址)。
  • 浏览器需要再次对CNAME记录进行解析,此时请求会被转发到CDN的全局负载均衡DNS解析服务器。
  • 全局负载均衡DNS解析服务器根据用户的地理位置、网络状况等因素,选择最佳的CDN节点(缓存服务器),并将该节点的IP地址返回给浏览器。
  1. 内容请求与响应
  • 浏览器利用得到的CDN节点IP地址,向该节点发起TCP连接请求。
  • TCP连接建立后,浏览器向CDN节点发送HTTP请求。
  • CDN节点检查本地缓存中是否有用户请求的内容。如果有,则直接从缓存中读取内容并响应给浏览器;如果没有,则向源服务器发起请求,获取内容后缓存并响应给浏览器。
  • 浏览器接收并显示内容,然后断开TCP连接。

区别总结

DNS解析过程:传统方式直接解析到源服务器IP地址;CDN方式则先解析到CNAME记录,再解析到最近的CDN节点IP地址。
内容请求与响应:传统方式直接请求源服务器;CDN方式则首先请求CDN节点,CDN节点可能直接从缓存中提供内容,或向源服务器请求后再提供。
访问速度和效率:CDN方式通过缓存和就近访问显著提高了访问速度和效率,减轻了源服务器的负载压力。
高可用性和安全性:CDN还提供了更高的可用性和安全性保障,通过多个节点部署和冗余备份来确保服务连续性和数据安全。

绕过CDN查找主机真实IP的方法

  1. 使用子域名

一些网站的子域名可能没有经过CDN保护,子域名的IP地址可能直接指向原始服务器。
可以使用命令行工具如nslookupdig对子域名进行DNS查询,查看是否能找到未使用CDN的IP地址。

nslookup subdomain.example.com
  1. 通过历史DNS记录

使用DNS历史记录服务(如SecurityTrails、DNSdumpster、ViewDNS)查询域名的历史解析记录,有时可以找到网站启用CDN前的原始IP地址。

  1. 利用网络扫描工具

使用ShodanCensys等互联网扫描工具,通过搜索网站的域名或服务器的某些特征,可以尝试找到与目标相关的其他公开暴露的IP地址。

  1. 检查电子邮件头信息

如果曾经收到过来自目标网站的邮件,可以查看电子邮件的头信息,其中可能包含邮件服务器的真实IP地址。如果邮件服务器和网站服务器共用同一IP地址,这可能会暴露真实IP。

  1. 逆向查找CDN的真实IP

一些CDN提供商允许通过特定的路径直接访问源站。例如,在某些情况下,可以尝试访问example.com/cdn-cgi/trace,这个路径可能返回一些调试信息,包括真实的IP地址。

  1. 社交工程

有时候通过社交工程的手段,可以从网站管理员或IT人员那里获取原始IP地址。这种方式在道德上和法律上存在很大风险,不推荐使用。

  1. 暴力子域名扫描

通过子域名爆破工具(如Sublist3rAmass)对目标域名进行子域名扫描,查找那些没有经过CDN保护的子域名,进而找到原始IP。

  1. 使用错误配置的服务器

有时候目标服务器可能被错误地配置为在CDN之外直接提供服务。可以通过端口扫描、网络爬虫等手段发现未保护的开放端口或服务。

  1. 分析网站外部资源

分析网站引用的外部资源(如图片、JS文件等)的URL,有时可以发现这些资源托管在未使用CDN保护的服务器上,进而推测出原始IP。

  1. 请求特定资源文件

在某些情况下,CDN配置可能会允许访问某些特定资源文件时直接连接到源站。通过查找并请求这些文件,可以获得源站的真实IP。

子域名信息收集常用手段

  1. 搜索引擎查询

直接搜索:通过百度、谷歌等搜索引擎直接搜索目标组织的名称,通常可以找到其官网,进而获取主域名。
Site语法:利用搜索引擎的site语法(如site:example.com)来限制搜索结果,获取目标域名下的所有子域名信息。这种方法简单直接,但可能遗漏一些未被搜索引擎收录的子域名。

  1. 官方备案网站查询

通过工信部ICP备案系统、chinaz等官方备案网站,可以查询目标域名的备案信息,包括域名所属公司名称。进一步搜索该公司名称,可能获取其所有注册域名,包括子域名。

  1. 企业信息查询平台

利用天眼查、爱企查、企查查等企业信息查询平台,通过查看目标公司的股权穿透图,可以查找其子公司,并收集子公司的域名信息。这种方法有助于发现与目标公司相关联的子域名。

  1. Whois查询

使用Whois查询网站(如Whois.chinaz.com),通过同一公司的域名可能使用同一邮箱注册的信息进行反查,从而发现其他子域名。

  1. 子域名查询网站

利用专门的子域名查询网站(如SecurityTrails、IP138、Chinaz、dnsscan.cn等),输入目标域名即可获取子域名列表。这些网站通常集成了多种查询技术和数据库,能够提供较为全面的子域名信息。

  1. 威胁情报平台

通过威胁情报平台(如ThreatBook、VirusTotal、AlienVault OTX、RiskIQ、ThreatMiner等),可以收集到目标组织的子域名信息。这些平台不仅提供子域名查询服务,还包含丰富的威胁情报数据,有助于发现潜在的安全风险。

  1. 自动化工具和脚本

自动化收集工具:如Subfinder、OneForAll、Layer子域名挖掘机等,这些工具通过多个API和字典枚举的方式自动化收集子域名,速度快且效率高。
爬虫技术:通过编写爬虫程序,爬取目标网站的所有页面、robots.txt文件、crossdomain.xml文件、sitemap文件等,从中筛选出子域名信息。这种方法需要一定的编程技能,但能够获取到较为全面的子域名数据。

  1. 其他手段

证书透明度查询:由于许多企业域名使用HTTPS协议,TLS证书中通常包含域名信息。通过证书透明度查询网站(如crt.sh、Censys、SSLmate、Facebook CT等),可以收集到目标域名的子域名信息。
DNS历史记录查询:利用DNS历史记录查询服务(如SecurityTrails、DNSdumpster.com、WhoisXML、PassiveTotal等),通过查询过去DNS解析记录的服务,可以发现目标组织过去使用过的子域名。这种方法有时能发现已被删除但仍解析到目标组织的子域名。
JS文件分析:许多网站在JS文件中会包含子域名的信息。通过分析JS文件,可以挖掘出子域名。可以使用专门的脚本或工具(如JSFinder)来自动化这一过程。

Nmap

Nmap一般扫描流程:

主机发现(Host Discovery)

  1. 发送探测包:Nmap首先会向目标主机发送多种类型的探测包,包括ICMP ECHO请求、TCP SYN包到常用端口(如443、80等)、TCP ACK包以及ICMP时间戳请求等。这些探测包的发送旨在确定目标主机是否在线。
  2. 接收回复:Nmap等待并接收来自目标主机的回复。如果收到任何类型的回复包,说明目标主机是开启的,扫描流程将继续。
  3. 避免误判:通过发送多种类型的探测包,Nmap能够更有效地避免因防火墙或丢包导致的误判,提高主机发现的准确性。

端口扫描(Port Scanning)

  1. 确定扫描范围:在确认目标主机在线后,Nmap将根据用户指定的端口范围(如未指定,则默认为前1000个最有可能开放的端口)进行端口扫描。
  2. 发送扫描包:Nmap向目标主机的指定端口发送扫描包,这些扫描包可能是TCP SYN包(默认扫描方式)、TCP ACK包、TCP FIN/Xmas/Null包等,具体取决于用户选择的扫描技术。
  3. 分析响应:Nmap分析目标主机对每个扫描包的响应,以确定端口的开放状态。端口状态可能包括开放、关闭、被过滤等。

服务识别与版本探测(Service Identification and Version Detection)

  1. 服务识别:在端口扫描的基础上,Nmap会尝试识别每个开放端口上运行的服务类型。这通常通过向端口发送特定的探测包并分析响应来实现。
  2. 版本探测:对于识别出的服务,Nmap会进一步尝试探测其版本信息。这有助于了解目标主机上运行的软件版本及其可能存在的安全漏洞。

操作系统侦测(Operating System Detection)

  1. 发送探测包:为了侦测目标主机的操作系统类型,Nmap会向目标主机发送一系列精心设计的探测包,这些包可能包括TCP/IP协议栈的特定选项、ICMP消息等。
  2. 分析响应:通过分析目标主机对这些探测包的响应,Nmap能够推断出目标主机的操作系统类型、版本以及可能存在的安全补丁等信息。

报告生成(Report Generation)

  1. 整理信息:在完成上述扫描步骤后,Nmap会整理收集到的所有信息,包括主机发现结果、端口扫描结果、服务识别与版本探测结果以及操作系统侦测结果等。
  2. 生成报告:根据用户指定的格式(如文本、XML、Grepable等),Nmap会生成详细的扫描报告。报告中包含了目标主机或网络的全面信息,有助于用户进行进一步的安全分析和漏洞管理。

全端口扫描

选择all TCP ports选项,执行全TCP端口扫描:
image.png
扫描结果显示我本地开启的端口有8080(BP代理)、3306(MySQL)、21(FTP)、8081(本地phpstudy配置的Apache)等。

SYN半开扫描的原理

一句话概括:只完成TCP三次握手的前两次。
扫描过程

  1. 发送SYN包:扫描主机向目标主机的指定端口发送一个带有SYN标志的TCP数据包,试图建立连接。这个数据包不包含ACK标志,因此它并不期望立即完成TCP三次握手。
  2. 等待响应:扫描主机等待目标主机的响应。根据目标端口的状态,目标主机可能回复不同的响应:
    • 如果目标端口是开放的,目标主机会回复一个SYN-ACK包,表示它愿意接受连接。
    • 如果目标端口是关闭的,目标主机会回复一个RST(复位)包,表示端口不可用。
    • 如果目标主机没有响应,或者响应被防火墙拦截,则扫描主机可能无法收到任何回复,此时端口状态可能被标记为Filtered(被过滤)。
  3. 发送RST包(可选):在收到SYN-ACK响应后,扫描主机通常不会完成三次握手中的最后一步(发送ACK包),而是立即发送一个RST包来终止连接。这一步是可选的,因为扫描主机的主要目的是检测端口状态,而不是真正建立连接。

特点

  • 隐蔽性:由于扫描主机不建立完整的TCP连接,这种扫描方式相对隐蔽,不易被目标主机上的应用程序记录。
  • 高效性:相比完整的TCP连接建立过程,SYN半开扫描可以更快地扫描大量端口。
  • 依赖性:SYN半开扫描需要扫描主机具有发送原始套接字的权限,通常需要在Linux等操作系统上以root用户身份运行Nmap。

应用场景
SYN半开扫描是Nmap的默认扫描模式之一,广泛应用于网络安全领域,用于发现目标主机上开放的端口,进而进行后续的安全评估或漏洞扫描。

跳过主机存活检测扫描

Nmap的跳过主机存活检测扫描是一种特定的扫描模式,它允许用户在不进行主机存活检测的情况下直接对目标主机或网络进行端口扫描、操作系统检测等操作。这种扫描模式在某些场景下非常有用,比如当目标网络中的主机存活状态已知,或者用户希望快速进行端口扫描而不关心主机是否存活时。
在Nmap中,要实现跳过主机存活检测扫描,可以使用-Pn(或--no-ping)选项。这个选项会告诉Nmap将所有指定的主机视为在线,从而跳过主机发现(即存活检测)的过程,直接进入端口扫描等后续步骤。
使用场景

  • 已知目标主机存活:当用户已经通过其他方式(如物理访问、远程管理工具等)确认目标主机处于在线状态时,可以使用-Pn选项来加快扫描速度。
  • 绕过防火墙限制:在某些情况下,目标网络可能配置了防火墙来阻止ICMP Echo请求(即ping命令)等存活检测数据包。此时,使用-Pn选项可以绕过这些限制,直接对目标主机进行端口扫描。
  • 快速扫描:当用户需要快速获取目标主机或网络的端口开放情况时,可以使用-Pn选项来减少扫描过程中的不必要步骤,从而提高扫描效率。

dirmap实践

基础应用

用dirmap扫描pikachu靶场:
image.png
扫描结果和真实目录对比,可见成功扫描出了大部分目录结构:
在这里插入图片描述

为什么dirmap每次扫描条数不一样

  1. 网站内容动态变化

内容更新:网站的内容可能会随着时间的推移而不断更新,新增或删除页面、文件等,这自然会导致扫描结果的变化。
临时页面或重定向:网站可能会设置临时页面或进行重定向,这些在扫描时可能被识别为不同的结果。

  1. 扫描配置和参数

扫描模式:dirmap支持多种扫描模式,如字典模式、爆破模式、爬虫模式等。选择不同的扫描模式或配置不同的参数(如字典文件、请求头等),会直接影响扫描结果。
并发和线程数:并发扫描的线程数设置不同,可能会导致扫描的广度和深度有所差异,从而影响最终的结果条数。

  1. 网络和环境因素

网络延迟和稳定性:网络延迟或不稳定可能导致扫描过程中某些请求未能成功发送或接收,从而影响扫描结果的完整性。
防火墙和安全设置:网站的防火墙或安全设置可能会阻止或限制dirmap的某些扫描请求,导致部分页面或文件未能被扫描到。

  1. 其他外部因素

CDN和缓存:网站可能使用CDN加速服务,导致不同地区的用户访问到不同的服务器节点,从而影响扫描结果。同时,浏览器缓存或中间代理缓存也可能导致扫描结果的不一致。
并发扫描竞争:如果有多个用户同时使用dirmap对同一网站进行扫描,可能会因为并发竞争而导致扫描结果的不一致。

高级应用

  1. 配置dirmap.conf,修改字典模式为多字典模式
[ScanModeHandler]
#Dict mode:Close :0;single dict:1;multiple dict:2
conf.dict_mode = 2

image.png
该模式下扫描结果条数较少,不如单字典模式。

  1. 开启爆破模式
#Blast mode:tips:Use "conf.file_extension" options for suffixes
conf.blast_mode = 1

在这里插入图片描述
对比没开爆破模式的扫描结果,条数变多了,效果更好:
在这里插入图片描述

  1. 开启递归扫描模式
#recursive scan:Close:0;Open:1
conf.recursive_scan = 1

在这里插入图片描述
递归模式开启后会对整个网站进行深度扫描,扫描时间明显变长,结果条数也大量增加:
在这里插入图片描述

Fscan实践

扫描本地主机,可以看到一些开放的端口,主机信息,web网址等,还爆出了mysql的用户名和密码:
在这里插入图片描述

扫描本地搭建的网站,可以看到扫出了网站title:
在这里插入图片描述

浏览器插件安装

我用的是火狐,插件安装情况如下:
image.png

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言万年历的实训报告,供您参考: 一、实训目的 本次实训的主要目的是通过编写一个简单的C语言万年历程序,巩固C语言基本语法和编程思想,提高编程能力和解决问题的能力。 二、实训要求 1、能够使用C语言基本语法和控制语句编写程序。 2、能够使用数组来存储和操作数据。 3、能够使用函数来实现模块化编程。 4、能够使用指针来操作内存中的数据。 5、能够使用文件来读取和写入数据。 三、实训内容 1、程序功能 本程序实现了一个简单的万年历功能,可以通过输入年份和月份来显示该月的日历。 2、程序实现 以下是本程序的主要代码实现: ```c #include <stdio.h> // 判断是否为闰年 int is_leap_year(int year) { if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return 1; } else { return 0; } } // 获取某个月份的总天数 int get_days(int year, int month) { int days[] = {31, 28 + is_leap_year(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return days[month - 1]; } // 获取某个日期是星期几 int get_weekday(int year, int month, int day) { if (month == 1 || month == 2) { year--; month += 12; } int c = year / 100; int y = year % 100; int w = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1; w = (w % 7 + 7) % 7; return w; } // 显示日历 void show_calendar(int year, int month) { int days = get_days(year, month); int weekday = get_weekday(year, month, 1); printf(" 日 一 二 三 四 五 六\n"); int i; for (i = 0; i < weekday; i++) { printf(" "); } for (i = 1; i <= days; i++) { printf("%2d ", i); if ((weekday + i) % 7 == 0) { printf("\n"); } } if ((weekday + days) % 7 != 0) { printf("\n"); } } int main() { int year, month; printf("请输入年份:"); scanf("%d", &year); printf("请输入月份:"); scanf("%d", &month); if (month < 1 || month > 12) { printf("月份输入错误!\n"); return 1; } printf(" %d年%d月\n", year, month); show_calendar(year, month); return 0; } ``` 四、实训总结 通过本次实训,我学会了如何使用C语言来编写一个简单的万年历程序,巩固了C语言基本语法和编程思想,加强了对函数、数组、指针、文件等概念和用法的理解,提高了编程能力和解决问题的能力。同时,我也意识到在编程过程中需要注重代码的规范、可读性和可维护性,这对于日后的开发工作非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值