From 19ec648fc9e6675e022c519433fa2e353d9408bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=BE=E5=B3=B6=E9=A3=8E=E8=B5=B7=E6=99=82?= Date: Thu, 25 Sep 2025 03:18:53 +0800 Subject: [PATCH] Add files via upload --- Chapter1/1-1.md | 71 ++++++++++++++++++++++++++++++++++++++++++ Chapter1/1-10.md | 24 +++++++++++++++ Chapter1/1-11.md | 53 +++++++++++++++++++++++++++++++ Chapter1/1-12.md | 55 +++++++++++++++++++++++++++++++++ Chapter1/1-13.md | 16 ++++++++++ Chapter1/1-14.md | 30 ++++++++++++++++++ Chapter1/1-15.md | 8 +++++ Chapter1/1-16.md | 64 ++++++++++++++++++++++++++++++++++++++ Chapter1/1-17.md | 27 ++++++++++++++++ Chapter1/1-18.md | 28 +++++++++++++++++ Chapter1/1-2.md | 32 +++++++++++++++++++ Chapter1/1-3.md | 33 ++++++++++++++++++++ Chapter1/1-4.md | 30 ++++++++++++++++++ Chapter1/1-5.md | 30 ++++++++++++++++++ Chapter1/1-6.md | 42 +++++++++++++++++++++++++ Chapter1/1-7.md | 55 +++++++++++++++++++++++++++++++++ Chapter1/1-8.md | 77 ++++++++++++++++++++++++++++++++++++++++++++++ Chapter1/1-9.md | 14 +++++++++ Chapter1/README.md | 20 ++++++++++++ 19 files changed, 709 insertions(+) create mode 100644 Chapter1/1-1.md create mode 100644 Chapter1/1-10.md create mode 100644 Chapter1/1-11.md create mode 100644 Chapter1/1-12.md create mode 100644 Chapter1/1-13.md create mode 100644 Chapter1/1-14.md create mode 100644 Chapter1/1-15.md create mode 100644 Chapter1/1-16.md create mode 100644 Chapter1/1-17.md create mode 100644 Chapter1/1-18.md create mode 100644 Chapter1/1-2.md create mode 100644 Chapter1/1-3.md create mode 100644 Chapter1/1-4.md create mode 100644 Chapter1/1-5.md create mode 100644 Chapter1/1-6.md create mode 100644 Chapter1/1-7.md create mode 100644 Chapter1/1-8.md create mode 100644 Chapter1/1-9.md create mode 100644 Chapter1/README.md diff --git a/Chapter1/1-1.md b/Chapter1/1-1.md new file mode 100644 index 0000000..d4fc144 --- /dev/null +++ b/Chapter1/1-1.md @@ -0,0 +1,71 @@ +### 如何处理子域名爆破的泛解析问题 + +**1. 泛解析的探测与识别** + +在进行子域名爆破之前,第一步是确定目标域名是否开启了泛解析 + +**操作方法:** + +1. **随机生成一个不存在的子域名**:例如,`random-string-123.example.com`。这个字符串要足够随机且复杂,以确保它不可能是真实存在的子域名 +2. **对其进行 DNS 查询**:使用 `ping`、`dig` 或 `nslookup` 等命令来查询其 IP 地址 +3. **记录返回的 IP 地址**:如果返回了一个 IP 地址,那么这个地址很可能就是泛解析的地址 + +为了提高准确性,你可以多生成几个随机子域名并重复上述步骤。如果它们都解析到相同的 IP 地址,那么就可以确认泛解析已开启,且你已经找到了泛解析的 IP 地址 + +**2. 爆破过程中的泛解析过滤** + +确认泛解析后,在进行子域名爆破时,你需要过滤掉所有解析到泛解析 IP 地址的结果 + +**操作方法:** + +1. **使用专门的工具**:许多现代的子域名爆破工具,如 **Subfinder**、**Massdns**、**Amas** 等,都内置了泛解析过滤功能。它们会在爆破前自动进行泛解析检测,并在爆破过程中自动过滤掉泛解析结果 +2. **手动处理(脚本化)**:如果你使用的是不具备自动过滤功能的工具,或者想自己编写脚本,可以采用以下策略: + - **第一步:获取 IP 列表** + - 运行你的爆破工具,例如 `dnsrecon` 或 `fierce`,并将所有解析出的子域名及其 IP 地址保存到一个文件中 + - **第二步:过滤泛解析** + - 编写一个简单的脚本(Python、Bash 等) + - 遍历文件中的每一行数据(`子域名 IP`) + - 对比每个 IP 地址,如果它等于之前探测到的泛解析 IP 地址,就将其所在的行删除或标记 + - 最后,你剩下的就是非泛解析的、真实存在的子域名 + +**一个简单的 Python 脚本示例:** + +```python +import sys + +def filter_wildcard(input_file, wildcard_ip): + """ + 过滤包含泛解析 IP 的子域名 + """ + try: + with open(input_file, 'r') as f: + lines = f.readlines() + + filtered_domains = [] + for line in lines: + parts = line.strip().split() + if len(parts) >= 2: + domain, ip = parts[0], parts[1] + if ip != wildcard_ip: + filtered_domains.append(domain) + + return filtered_domains + + except FileNotFoundError: + print(f"Error: The file '{input_file}' was not found.") + sys.exit(1) + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: python filter_domains.py ") + sys.exit(1) + + input_file = sys.argv[1] + wildcard_ip = sys.argv[2] + + real_domains = filter_wildcard(input_file, wildcard_ip) + + print("Found the following real subdomains:") + for domain in real_domains: + print(domain) +``` diff --git a/Chapter1/1-10.md b/Chapter1/1-10.md new file mode 100644 index 0000000..53f6665 --- /dev/null +++ b/Chapter1/1-10.md @@ -0,0 +1,24 @@ +### 登录验证码怎么绕过 + +**1. 验证码本身的设计缺陷** + +很多验证码系统本身存在漏洞,这是最容易利用的突破口 + +- **万能验证码或静态验证码:** 有些开发者为了方便测试,会设置一个固定的“万能验证码”,比如 `1234` 或 `abcd`。或者验证码每次刷新都是一样的。这使得攻击者可以轻松地在每次登录尝试时都使用这个固定的值 +- **验证码可重复利用:** 正常情况下,验证码使用一次后就应该失效。如果验证码可以重复使用,攻击者就可以通过一次有效的请求获取一个验证码,然后在多次请求中重复使用它来尝试不同的密码 +- **验证码在客户端生成:** 尽管非常罕见,但有些不安全的实现是在前端(如JavaScript)生成验证码。这意味着攻击者可以直接在浏览器控制台中获取或修改验证码的值 +- **验证码不与会话绑定:** 验证码与用户会话(Session)没有正确绑定。攻击者可以先访问登录页面,获取一个验证码,然后用不同的会话(但使用同一个验证码)来尝试暴力破解,这使得验证码失去了它的防重放作用 + +**2. 暴力破解验证码** + +如果验证码系统本身没有设计缺陷,攻击者可能会尝试通过技术手段识别验证码 + +- **简单验证码的图像识别:** 对于那些扭曲度低、背景干扰少、字符集简单的验证码(如纯数字、4 位字母),攻击者可以使用 **OCR(光学字符识别)**工具或专门的验证码识别库(如 Tesseract、dlib)进行识别 +- **训练模型识别验证码:** 对于更复杂的验证码,攻击者可以收集大量的验证码图片,然后使用机器学习或深度学习技术(如卷积神经网络 CNN)来训练一个模型,以达到较高的识别成功率 +- **人工打码平台:** 这是最直接、最有效的方法。攻击者将验证码图片发送到专业的**打码平台**。这些平台背后有大量人工或半自动化工具,可以在极短时间内返回识别结果。这使得攻击者能够以较低的成本实现大规模的自动化攻击 + +**3. 绕过验证码逻辑** + +- **API 接口漏洞:** 有些应用程序的登录过程并非只有一个接口。攻击者可能会发现,用于处理登录的 API 接口与用于获取验证码的接口是分开的。如果登录 API 接口没有强制要求验证码参数,或者在验证码参数为空时依然处理请求,那么攻击者可以直接绕过验证码步骤 +- **不安全的登录逻辑:** 攻击者可以尝试多次错误的登录,观察服务器的响应。如果服务器只在第一次登录尝试时返回验证码,或者在多次失败后才返回验证码,攻击者可以利用这个时间差进行快速尝试 +- **会话劫持或利用令牌:** 如果应用程序在登录过程中使用了某种令牌(Token),而验证码的验证没有正确与这个令牌关联,那么攻击者可以利用这个漏洞绕过验证码 \ No newline at end of file diff --git a/Chapter1/1-11.md b/Chapter1/1-11.md new file mode 100644 index 0000000..40e86ed --- /dev/null +++ b/Chapter1/1-11.md @@ -0,0 +1,53 @@ +### 工作组环境下怎么判断是否有域环境 + +**1. 系统信息查看** + +这是最直接、最常用的方法。 + +- **GUI 界面**: + - 右键点击“此电脑”或“我的电脑”,选择“属性” + - 在弹出的窗口中,找到**“计算机名、域和工作组设置”** + - 如果显示的是“工作组:WORKGROUP”或其他工作组名称,则很可能处于工作组环境 + - 如果显示的是“域:xxx.local”或类似域名,则表明当前计算机已加入域 +- **命令行(CMD/PowerShell)**: + - 使用 `systeminfo` 命令。在命令输出中,寻找**“域”**或**“登录域”**字段。如果显示具体的域名,那就是域环境;如果显示“WORKGROUP”,那就是工作组 + - 使用`net config workstation`命令。该命令会显示当前计算机的配置信息,其中“工作站域”会明确列出当前是工作组还是域 + - 使用`whoami /all`命令。该命令会显示当前用户的详细信息,包括所属的域或工作组 + +**2. 网络和 DNS 配置** + +域环境依赖于特定的网络配置,尤其是 DNS + +- **DNS 服务器**: + - 域环境中的客户端通常会将 DNS 服务器设置为域控制器或指向域控制器的 DNS 解析服务器 + - 你可以通过 `ipconfig /all` 命令查看当前主机的 DNS 服务器地址。如果 DNS 服务器地址指向内网IP,且该 IP 可能就是域控制器,那就值得怀疑。 + - 你可以尝试 `nslookup` 命令解析域名。在域环境中,客户端可以解析域控制器名称(例如:`nslookup dc.example.com`),而在工作组环境中通常无法解析 +- **Ping 域控制器**: + - 如果你能猜测或已经获得了可能的域控制器名称,可以尝试 `ping` 该域名。如果 ping 通了,说明网络是连通的,并且 DNS 解析正常,很可能存在域环境 + - 例如:`ping test.local` + +**3. 登录方式和用户账户** + +用户登录界面的信息也会提供线索 + +- **登录界面**: + - 在 Windows 登录界面,如果用户名输入框上方或下方显示**“登录到:xxx.local”**,说明可以登录到域 + - 工作组环境通常只显示本地计算机名 +- **用户账户**: + - 在工作组环境中,本地用户通常是 `用户名` + - 在域环境中,用户登录名通常是 `域名\用户名` 或 `用户名@域名` + - 可以通过 `net user` 或 `whoami` 命令来查看当前用户的完整信息。如果显示 `test\administrator` 或`test.local\user`,那就很可能是域环境 + + + +#### 4. 特定的网络服务和端口 + + + +域环境中的主机通常会开放一些特定的服务和端口,用于域内通信。 + +- **Kerberos协议**:域环境使用Kerberos进行身份验证。攻击者可以扫描域控制器特有的端口(如TCP/UDP 88)。 +- **LDAP协议**:域控制器提供LDAP服务(轻量目录访问协议),用于管理目录信息。端口通常是TCP 389或636(LDAPS)。 +- **SMB协议**:虽然工作组和域都使用SMB,但在域环境中,通过`net view`等命令可以看到域内共享资源。 + +通过端口扫描工具(如Nmap),可以快速发现目标主机是否开放了这些与域相关的服务端口 \ No newline at end of file diff --git a/Chapter1/1-12.md b/Chapter1/1-12.md new file mode 100644 index 0000000..d556744 --- /dev/null +++ b/Chapter1/1-12.md @@ -0,0 +1,55 @@ +### 只有一个网卡通过什么方式判断内网中是否有其他网段 + +**1. 路由表分析** + +这是最直接、最快速的方式。当一个主机连接到网络时,它的操作系统会维护一个路由表,其中包含了到达不同目标网络的数据包应该通过哪个网关发送。通过分析这个路由表,我们可以发现除了默认网关之外,是否还有其他的内网路由规则 + +在 **Windows** 系统中,可以使用以下命令: + +```cmd +route print +``` + +或者 + +```cmd +netstat -rn +``` + +这两个命令都会显示详细的路由信息。关注“活动路由”或“Persistent Routes”部分。如果发现除了`0.0.0.0`(默认网关)以外,还有其他`10.0.0.0/8`、`172.16.0.0/12`或`192.168.0.0/16`等私有地址网段的路由,那就表明存在通向这些网段的路径 + +在 **Linux/macOS** 系统中,可以使用以下命令: + +``` +ip route show +``` + +或者 + +``` +netstat -r +``` + +同样,检查输出结果中是否有指向其他内网网段的路由条目。例如,你可能会看到类似于`192.168.2.0/24 via 192.168.1.1 dev eth0`的条目,这说明存在一个到`192.168.2.0`网段的路由 + +**2. ARP 缓存表分析** + +**ARP**(Address Resolution Protocol)用于将IP地址解析为物理MAC地址。当主机与同一局域网内的其他设备通信时,它会将对应的IP-MAC映射关系存储在**ARP缓存表**中。通过查看这个缓存表,我们可以发现哪些主机是活跃的 + +使用以下命令来查看: + +- **Windows**:`arp -a` +- **Linux/macOS**:`arp -n` + +如果你的ARP缓存表中出现了不同网段的IP地址,比如你当前IP是`192.168.1.100`,但缓存表中出现了`192.168.2.1`的条目,这可能是一个网络设备(如路由器或三层交换机)的IP地址,它负责连接到另一个网段 + +**3. DNS 和 WINS 服务查询** + +**DNS**(域名系统)和 **WINS**(Windows Internet Name Service)在内部网络中扮演着关键角色。内网中的主机通常会依赖这些服务来解析主机名。通过查询这些服务,我们可以发现属于其他网段的主机 + +- **DNS 查询**: + - 在Windows上,使用`nslookup`或`dig`命令 + - 例如:`nslookup -type=any example.local` + - 如果能查询到属于不同网段的A记录(主机名-IP地址映射),那就能确认存在其他网段 +- **WINS 查询**: + - 在Windows上,可以使用`nbtstat -r`命令。它会显示通过广播或WINS服务器获取的NetBIOS名称解析统计信息。如果能看到不同网段的主机名,就说明存在其他网段 \ No newline at end of file diff --git a/Chapter1/1-13.md b/Chapter1/1-13.md new file mode 100644 index 0000000..9670ee6 --- /dev/null +++ b/Chapter1/1-13.md @@ -0,0 +1,16 @@ +### 说说 Webpack 信息泄露 + +**常见的泄露文件和表现形式** + +- **`\*.js.map` 文件**: 这是最常见的`sourcemap`文件,例如 `main.bundle.js.map`。通过这些文件,可以还原出完整的源代码目录结构和内容 +- **源代码中的注释**: 开发过程中留下的注释,如TODO、FIXME、调试信息,甚至是一些硬编码的敏感信息 +- **前端路由和API接口地址**: `sourcemap`中会暴露所有前端路由配置,攻击者可以借此发现未公开的页面或接口 +- **环境变量和密钥**: 如果在前端代码中使用了`process.env`等方式读取了后端传递的环境变量,这些变量可能会被打包并泄露 +- **打包配置文件**: 一些不当的配置可能会导致`webpack.config.js`等文件也被泄露,从中可以获取更多项目结构和依赖信息 + +**渗透测试中的利用方法** + +1. **发现目标**: 首先,通过浏览器或Burp Suite等工具访问目标网站,观察前端加载的`.js`文件,看是否存在`.map`文件。例如,如果存在`main.bundle.js`,尝试访问`main.bundle.js.map` +2. **目录猜解**: 有时`sourcemap`文件没有直接暴露,但可以通过对`.js`文件的URL进行目录猜解。比如,如果`js`文件在`/static/js/`下,那么`sourcemap`可能也在这个目录下 +3. **使用自动化工具**: 有很多工具可以自动化这一过程。例如,使用`npm install -g reverse-sourcemap`安装的工具可以从`*.js.map`文件还原出源代码。此外,一些渗透测试框架如`Nuclei`也包含了专门针对Webpack信息泄露的扫描模板 +4. **手动分析**: 如果找到了`sourcemap`文件,下载下来并使用文本编辑器打开。`.map`文件是JSON格式,其中`sourcesContent`字段包含了原始的源代码内容,`sources`字段包含了原始的文件路径。通过分析这些字段,可以快速定位敏感信息 \ No newline at end of file diff --git a/Chapter1/1-14.md b/Chapter1/1-14.md new file mode 100644 index 0000000..33bec00 --- /dev/null +++ b/Chapter1/1-14.md @@ -0,0 +1,30 @@ +### net group "Domain Admins" /domain 这条命令查询域内管理员没查到,那么可能出现了什么问题,怎么解决 + +**1. 权限问题** + +这是最常见的原因。`net group "Domain Admins" /domain` 这条命令需要**域用户的身份**才能正确执行 + +- **问题所在**:你当前 Shell 所处的机器可能是一个工作组机器,或者你使用的是一个本地账户,没有通过认证来访问域控制器。即使你获得了 SYSTEM 权限,它也只是本地机器的最高权限,无法直接用来查询域内的资源 + +- **解决方案**:你需要获得一个**域用户的凭据**(用户名和密码/哈希)。然后通过以下方法进行认证: + + - **哈希传递(Pass-the-Hash)**:如果手上有一个域用户的哈希,你可以使用 **`psexec.py`** 或 **`mimikatz`** 等工具,以该用户的身份在域内执行命令 + + ```bash + # 使用Impacket工具包 + psexec.py domain.local/user@dc_ip -hashes <哈希> + ``` + + - **Kerberos 票据注入**:如果手上有一个域用户的 Kerberos 票据(TGT),你可以使用 **`mimikatz`** 的 **`kerberos::ptt`** 命令将其注入到当前会话中,然后你的 Shell 就具备了访问域资源的权限 + +**2. 网络连接问题** + +即使你拥有正确的权限,如果网络连接存在问题,命令也无法成功执行 + +- **问题所在**:你的机器可能无法直接与域控制器(DC)通信。这可能是因为: + - **防火墙**:目标机器的防火墙阻止了 SMB/LDAP 协议的流量 + - **路由问题**:你的机器不在域所在的网络段,无法直接路由到 DC + - **端口未开放**:DC 可能没有开放必要的端口,如 LDAP (389) 或 SMB (445) +- **解决方案**: + - **端口扫描**:使用 **`nmap`** 等工具扫描 DC 的 IP 地址,检查 389 (LDAP)、445 (SMB) 等端口是否开放 + - **端口转发/隧道**:如果你能访问域内的一台机器,但不能直接访问 DC,可以考虑使用端口转发工具,如 **`chisel`** 或 **`ssh -L`**,将 DC 的流量转发到你的本地机器,从而绕过防火墙或路由限制 \ No newline at end of file diff --git a/Chapter1/1-15.md b/Chapter1/1-15.md new file mode 100644 index 0000000..493cc7b --- /dev/null +++ b/Chapter1/1-15.md @@ -0,0 +1,8 @@ +### 继上题,这条命令的本质究竟是去哪里查 + +**查询的详细过程** + +1. **发出请求**:当你在一台域成员机器上执行 `net group "Domain Admins" /domain` 命令时,你的电脑会向配置的**域控制器**发送一个网络请求。这个请求是一个基于 **LDAP**(Lightweight Directory Access Protocol,轻量级目录访问协议)的查询,它包含了你想要查询的对象,也就是 `"Domain Admins"` 这个组 +2. **验证身份**:域控制器会首先验证你的身份。它会检查你当前所使用的账户(无论是用户账户还是机器账户)是否是域的一部分,并且是否有权限查询这个组的信息。如果你的账户是**域用户**,它通常就有权限执行这个查询 +3. **Active Directory 数据库查询**:验证通过后,域控制器会在它的 **Active Directory** 数据库中查找名为 `"Domain Admins"` 的安全组对象。Active Directory 是一个分层数据库,用于存储域内所有对象(用户、组、计算机等)的信息 +4. **返回结果**:找到这个组后,域控制器会从该组的属性中提取出所有**成员(members)**的信息,然后将这些信息打包成一个响应,返回给你的电脑。你的电脑随后会解析这个响应,并在命令行中显示出组成员的列表 \ No newline at end of file diff --git a/Chapter1/1-16.md b/Chapter1/1-16.md new file mode 100644 index 0000000..2dce565 --- /dev/null +++ b/Chapter1/1-16.md @@ -0,0 +1,64 @@ +### 如何判断目标单位的机器是哪种协议出网 + +**1. 自动化扫描与端口探测** + +这是最直接且高效的方法 + +- **使用自动化工具**:利用 **Nmap** 或 **`port-scan`** 这类工具,对目标内网机器或出网网段进行扫描 +- **常用端口与协议**: + - **HTTP/HTTPS**(80/443):这是最常见的出网协议。几乎所有企业都必须开放这两个端口以供员工浏览网页。这是一个非常好的 C2 通道选择 + - **DNS**(53):如果 DNS 请求能够出网,那么你可以利用 DNS 隧道技术。这种方法非常隐蔽,因为 DNS 流量通常被认为是无害的 + - **SMTP/SMTPS**(25/465/587):如果企业允许员工收发邮件,那么这些端口很可能出网 + - **FTP/FTPS**(20/21):不常见,但如果开放了,也是一个很好的出网通道 + - **SSH**(22):如果目标允许员工通过 SSH 远程访问服务器,那么这个端口很可能出网 +- **优点**:快速、自动化,能提供初步的端口开放信息 +- **缺点**:不一定能确定协议能否出网,因为端口开放可能只是用于内部服务 + +**2. 手动测试与验证** + +自动化扫描后,你需要手动验证协议是否真的能出网 + +- **使用命令行工具**: + + - **`ping`**:测试 ICMP 协议是否出网 + - **`telnet`** 或 **`nc` (netcat)**:测试 TCP 协议。例如,`telnet www.baidu.com 443` 或 `nc -vz www.baidu.com 443`。如果连接成功,说明 443 端口出网 + +- **利用编程语言**: + + - **Python**:编写一个简单的 Python 脚本,尝试通过不同的协议向你的服务器发送请求 + + ```python + import socket + try: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(5) + s.connect(('your_server_ip', 443)) + print("Port 443 is open") + s.close() + except Exception as e: + print(f"Port 443 is closed: {e}") + ``` + +- **优点**:能精确验证某个端口是否出网,并能获得更详细的错误信息 + +**3. 基于 DNS 查询的隐蔽测试** + +如果你无法通过常见的协议出网,DNS 是一个非常隐蔽的测试方法 + +- **原理**:即使防火墙非常严格,也必须允许 DNS 流量出网,否则员工将无法正常上网。你可以利用这个特性,通过 DNS 查询来判断出网情况 +- **操作步骤**: + 1. 在你的攻击服务器上,搭建一个 DNS 服务器,并配置一个域名,例如 `test.com` + 2. 在目标机器上,执行一个 DNS 查询命令,例如 `nslookup <随机字符串>.test.com` + 3. 回到你的 DNS 服务器,如果收到了这个 DNS 查询请求,就说明 DNS 协议出网。你甚至可以从 DNS 请求的源 IP 地址,判断是哪台机器发出的请求 +- **优点**:高度隐蔽,能绕过许多严格的防火墙规则 + +**4. 利用现有权限进行系统配置分析** + +如果你已经通过其他漏洞(如钓鱼、弱口令等)获得了某台机器的权限,那么判断出网协议就变得更加容易 + +- **检查防火墙规则**: + - **Windows**:`netsh advfirewall firewall show rule name=all` 或 `Get-NetFirewallRule`。这能直接告诉你哪些端口是出网的 +- **检查代理服务器**: + - **Windows**:`netsh winhttp show proxy` 或检查浏览器的代理设置。许多公司要求所有出网流量必须通过一个代理服务器。在这种情况下,你需要配置你的 C2 通道去使用这个代理 +- **检查应用程序日志**: + - 查看 Web 服务器、代理服务器或防火墙的日志。这些日志文件会记录所有出入流量,是判断出网协议的最佳来源 \ No newline at end of file diff --git a/Chapter1/1-17.md b/Chapter1/1-17.md new file mode 100644 index 0000000..db61f66 --- /dev/null +++ b/Chapter1/1-17.md @@ -0,0 +1,27 @@ +### NSE 脚本原理 + +**1. NSE 脚本的运行机制** + +NSE 的核心是一个脚本解释器,它运行用 **Lua 语言**编写的脚本。Nmap 会在扫描过程中加载并执行这些脚本,以扩展其核心功能。整个运行机制可以概括为以下几个步骤: + +1. **脚本加载**:Nmap 在启动时,会根据你的命令行参数(如 `-sC` 或 `--script <脚本名>`),加载相应的 NSE 脚本。这些脚本文件通常位于 Nmap 的安装目录下的 `scripts` 文件夹中 +2. **事件触发**:NSE 脚本不会无缘无故地运行。它依赖于一系列的**事件触发器(Triggers)**,这些触发器会在 Nmap 的不同扫描阶段被激活 + - `pre-scan`:在任何主机扫描开始之前运行。通常用于一些全局性任务,如收集 DNS 信息 + - `host-scan`:在扫描每个主机时运行。通常用于对单个主机进行枚举或漏洞检测 + - `port-scan`:在扫描每个端口时运行。这是最常用的触发器,用于针对特定端口的服务进行探测,如 HTTP、FTP、SSH 等 + - `post-scan`:在所有主机扫描完成后运行。通常用于汇总结果或生成报告 +3. **脚本执行**:当一个事件被触发时,Nmap 会调用相应脚本中的**`action()` 函数**。这个函数包含了脚本要执行的核心逻辑 +4. **结果返回**:`action()` 函数执行完毕后,会将结果返回给 Nmap。Nmap 会将这些结果以标准的格式(如 XML、文本等)显示给用户 + +**2. 编写 NSE 脚本的核心结构** + +一个典型的 NSE 脚本由以下几个关键部分组成: + +1. **脚本描述(`description`)**:一个简短的字符串,描述脚本的功能 +2. **分类(`categories`)**:脚本的分类,如 `safe`(安全)、`vuln`(漏洞)、`auth`(认证)等。这些分类使得用户可以通过 `-sC` 或 `--script=safe` 等参数来批量运行某一类脚本 +3. **依赖关系(`dependencies`)**:如果脚本依赖于其他脚本,可以在这里声明 +4. **触发器(`hostrule`、`portrule` 等)**:指定脚本在什么条件下运行。例如,`portrule` 规定了脚本只在发现某个特定端口开放时才运行 + - `portrule = "tcp or udp"`:在所有 TCP 或 UDP 端口上运行 + - `portrule = "port:80"`:只在 80 端口上运行 + - `hostrule`:在整个主机上运行,不依赖于特定端口 +5. **主函数(`action()`)**:这是脚本的核心代码,包含了所有业务逻辑。在这个函数中,你可以使用 Nmap 提供的各种库函数(如 `http.get`、`nmap.set_port_state` 等),来完成网络交互和数据处理 \ No newline at end of file diff --git a/Chapter1/1-18.md b/Chapter1/1-18.md new file mode 100644 index 0000000..586aed9 --- /dev/null +++ b/Chapter1/1-18.md @@ -0,0 +1,28 @@ +### Nmap 的 FIN 扫描和空扫描是什么 + +**1. FIN 扫描 (FIN Scan)** + +- **命令**:`nmap -sF ` +- **原理**: + - FIN 扫描的原理基于 TCP 协议的 RFC 793 规范 + - 攻击者向目标端口发送一个只包含 **`FIN`**(Finish)标志位的 TCP 数据包 + - **如果端口是关闭的**:根据 TCP 协议规范,目标系统会回复一个带有 **`RST`**(Reset)标志位的 TCP 包,表示连接已重置 + - **如果端口是开放的**:根据 TCP 协议规范,目标系统会忽略这个包,**不回复任何信息** +- **优点**: + - **隐蔽性**:由于不进行完整的三次握手,许多基本的防火墙和 IDS 都不会记录这种连接尝试,从而使扫描行为更加隐蔽 + - **绕过状态防火墙**:一些状态防火墙只跟踪那些以 `SYN` 包开始的连接。由于 FIN 扫描不使用 `SYN` 包,因此可以绕过这类防火墙 +- **缺点**: + - **Windows 兼容性**:FIN 扫描在许多非 Windows 系统(如 Linux、BSD)上表现良好,但在 Windows 系统上,即使端口是开放的,它也可能回复一个 `RST` 包,导致扫描结果不准确。这是因为 Windows 系统的 TCP/IP 栈实现与 RFC 规范略有不同 + +**2. 空扫描 (Null Scan)** + +- **命令**:`nmap -sN ` +- **原理**: + - 空扫描的原理与 FIN 扫描类似,也基于 TCP 协议规范 + - 攻击者向目标端口发送一个**没有任何标志位**(`SYN`, `ACK`, `FIN`, `RST` 等)的 TCP 数据包 + - **如果端口是关闭的**:根据 TCP 协议规范,目标系统会回复一个带有 **`RST`** 标志位的 TCP 包 + - **如果端口是开放的**:根据 TCP 协议规范,目标系统会忽略这个包,**不回复任何信息** +- **优点**: + - **极度隐蔽**:由于发送的数据包没有任何标志位,空扫描比 FIN 扫描更具隐蔽性,因为数据包看起来像是损坏或无效的,许多 IDS 可能会直接忽略它 +- **缺点**: + - **Windows 兼容性**:与 FIN 扫描一样,空扫描在 Windows 系统上同样表现不佳,即使端口开放,也可能收到 `RST` 回复,导致误报 \ No newline at end of file diff --git a/Chapter1/1-2.md b/Chapter1/1-2.md new file mode 100644 index 0000000..438b08c --- /dev/null +++ b/Chapter1/1-2.md @@ -0,0 +1,32 @@ +### 如何绕过 CDN 查找真实 IP + +**1. 子域名查询** + +- **原理**: 很多时候,一个网站的主域名使用了 CDN,但其子域名(例如 `blog.example.com`、`ftp.example.com` 或 `mail.example.com`)却没有使用。这些子域名可能与主域名部署在同一个服务器上,或者在同一个 IP 段内。 +- **方法**: + - 使用自动化工具(如 `Sublist3r`、`Amass`、`OneForAll`)进行大规模子域名扫描 + - 通过在线的子域名查询服务(如 **站长之家**、**VirusTotal**)进行查询 + - 然后对这些子域名进行 `ping` 或 `nslookup`,如果返回的 IP 地址与主域名不同,且多次查询结果稳定,就可能找到了真实 IP + +**2. 邮件头信息** + +- **原理**: 很多网站的邮件服务器(如 `SMTP`)与 Web 服务器部署在同一台机器上,而邮件服务器通常不使用 CDN +- **方法**: + - 尝试给目标网站的邮箱(如 `admin@example.com`)发送一封邮件 + - 在你的邮箱中查看这封邮件的**原始邮件头(Original Headers)** + - 在邮件头中寻找 **`Received: from`** 字段。这个字段记录了邮件在传输过程中经过的服务器 IP 地址。通常,第一个 `Received: from` 后面的 IP 地址就是邮件服务器的真实 IP,而这个 IP 很可能就是网站的真实 IP + +**3. 历史 DNS 记录查询** + +- **原理**: 一个网站在上线 CDN 之前,其 DNS A 记录直接指向的就是真实 IP。一些服务会保存这些历史记录 +- **方法**: + - 使用在线服务(如 **`SecurityTrails`**、**`WhoisXML API`** 或 **`ViewDNS`**)查询域名的历史 DNS 解析记录 + - 通过这些历史记录,你可以找到在 CDN 启用之前网站使用的真实 IP 地址 + +**4. SSL 证书查询** + +- **原理**: SSL 证书可能会包含一些指向源站的信息,例如在某些情况下,证书颁发者会记录申请者的 IP 地址 +- **方法**: + - 通过在线服务(如 **`Censys`**、**`Shodan`**)对目标域名进行 SSL 证书查询 + - 查看证书的 **`subjectAltName`** 字段,或者检查是否有其他关联信息泄露了真实 IP + - 在某些情况下,如果目标网站使用了与源站 IP 绑定的证书,可以在 Shodan 等搜索引擎中直接搜索证书哈希或序列号来定位真实 IP \ No newline at end of file diff --git a/Chapter1/1-3.md b/Chapter1/1-3.md new file mode 100644 index 0000000..b3939ad --- /dev/null +++ b/Chapter1/1-3.md @@ -0,0 +1,33 @@ +### phpinfo 页面你会关注哪些信息 + +**1. PHP 配置和安全设置** + +这些信息直接决定了攻击的难度和可用方法 + +- **`disable_functions`**: 这是最关键的信息。如果这个列表为空,或者只禁用了少数函数,那么我就可以直接使用像 `system()`、`exec()`、`shell_exec()`、`passthru()` 等命令执行函数来获取 WebShell,进行系统命令执行 +- **`allow_url_fopen` 和 `allow_url_include`**: 如果这两个选项都为 `On`,则存在**远程文件包含 (RFI)** 漏洞的可能性。攻击者可以从远程服务器加载恶意 PHP 文件并执行 +- **`open_basedir`**: 如果这个选项设置了,它会限制 PHP 脚本只能在指定的目录及其子目录中操作。这能有效限制攻击者的权限,但我会寻找绕过它的方法 +- **`display_errors`**: 如果这个选项是 `On`,服务器会显示详细的错误信息,包括文件路径、数据库查询语句等。这些信息对于 SQL 注入、文件包含等漏洞的调试和利用非常有帮助 +- **`expose_php`**: 如果这个选项为 `On`,`phpinfo()` 页面会暴露 PHP 的**精确版本号**(例如 PHP/8.1.12)。这使得我能快速在漏洞数据库(如 CVEs)中查找该版本已知的安全漏洞,并针对性地进行攻击 + +**2. 服务器环境信息** + +这些信息帮助我了解 PHP 运行在什么样的环境中,以及我能获得多大的权限 + +- **`SERVER_SOFTWARE`**: 告诉我 Web 服务器的类型和版本,例如 Apache、Nginx、IIS 等。这些服务器本身也可能存在漏洞 +- **`_SERVER["DOCUMENT_ROOT"]`**: 暴露了网站的根目录路径,这是进行**本地文件包含 (LFI)** 和目录遍历攻击的关键信息 +- **`User` 和 `Group`**: `phpinfo()` 会显示 PHP 进程是以哪个用户和用户组运行的。这决定了我能执行哪些操作,例如是否可以读取其他用户的文件、是否可以写入某些目录等 +- **`PATH`**: 环境变量 `PATH` 包含了系统命令的搜索路径,如果我能执行命令,这能帮助我快速找到像 `whoami`、`ls`、`id` 等常用命令 + +**3. 已加载的模块和扩展** + +这些信息揭示了 PHP 环境的功能,以及潜在的攻击面 + +- **`cURL`、`sockets`**: 如果这些扩展存在,我可能会尝试**服务器端请求伪造 (SSRF)** 攻击,通过服务器向内部网络发起请求,探测内网服务 +- **`pdo`、`mysqli`、`sqlsrv` 等数据库扩展**: 确认网站使用了哪种数据库,为后续的**SQL 注入**攻击提供目标 +- **`GD`、`ImageMagick` 等图像处理扩展**: 如果存在,可能会有**图像处理库漏洞**,导致命令执行。 + +**4. 文件系统和路径信息** + +- **`_SERVER["SCRIPT_FILENAME"]`**: 暴露了当前脚本在服务器上的**绝对路径**。这是进行本地文件包含、路径遍历、以及了解服务器文件结构的重要线索 +- **`upload_tmp_dir`**: 如果我能找到一个文件上传漏洞,这个选项会告诉我临时文件上传的目录。有时候,我可以在这个目录上传并执行一个 WebShell \ No newline at end of file diff --git a/Chapter1/1-4.md b/Chapter1/1-4.md new file mode 100644 index 0000000..5ddb897 --- /dev/null +++ b/Chapter1/1-4.md @@ -0,0 +1,30 @@ +### 如何判断目标操作系统 + +**1. 被动指纹识别** + +这是在不与目标系统直接交互或发送特定探测请求的情况下进行识别,通常通过分析网络流量来完成 + +- **TTL (Time-To-Live)**:这是最常用且最简单的方法。TTL 是 IP 包在网络中存活的最大跳数。不同的操作系统有不同的初始 TTL 值 + - **Linux/Unix**:通常为 **64** + - **Windows**:通常为 **128** + - **老版本 Windows XP**:也可能是 **64** + - **思科设备**:通常为 **255** + - **判断方法**:在你的机器上 `ping` 目标,或者通过 `tracert`/`traceroute`,观察返回包的 TTL 值。例如,你 `ping` 一个服务器,返回的 TTL 是 118,那么初始值很可能是 128,表明目标是 Windows +- **TCP 窗口大小 (Window Size)**:不同的操作系统在进行 TCP 握手时,其初始的 TCP 窗口大小也不同 + - **Linux**:通常为 **5840** + - **Windows**:通常为 **65535** + - **判断方法**:通过抓包工具(如 Wireshark)分析 TCP 三次握手的第一个 SYN-ACK 包,观察其 Window Size 字段 + +判断目标操作系统是渗透测试中的一个基本步骤,这可以帮助你选择正确的漏洞利用方法和工具。以下是几种从渗透测试角度判断目标操作系统的方法,从被动到主动,由浅入深 + +**2. 主动指纹识别** + +这需要你向目标发送特定的探测请求,并分析其响应 + +- **Nmap**:这是最强大的操作系统指纹识别工具。Nmap 使用其内置的脚本和复杂的算法来识别操作系统 + - **命令**:`nmap -O [目标 IP]` + - **原理**:Nmap 会发送一系列精心构造的 TCP/IP 数据包到目标,并分析响应的 TTL、TCP 窗口大小、序列号(IP ID)、TCP 时间戳等多种特征,然后将这些特征与 Nmap 数据库中的操作系统指纹进行比对 +- **HTTP 响应头**:如果目标是 Web 服务器,其 HTTP 响应头通常会泄露操作系统和 Web 服务器软件的信息 + - **`Server` 头**:可能包含 `Apache/2.4.6 (CentOS)` 或 `Microsoft-IIS/10.0` 等信息 + - **`X-Powered-By` 头**:可能包含 `ASP.NET` 或 `PHP` 等信息 + - **判断方法**:使用 `curl` 命令或 Burp Suite 等工具发送请求,然后查看响应头 \ No newline at end of file diff --git a/Chapter1/1-5.md b/Chapter1/1-5.md new file mode 100644 index 0000000..9b14d48 --- /dev/null +++ b/Chapter1/1-5.md @@ -0,0 +1,30 @@ +### 如何判断是否使用 CDN + +**1. DNS 解析查询** + +CDN 的核心原理就是将你的请求解析到离你最近的节点服务器 + +- **多次查询**: 在不同地区或使用不同的 DNS 解析服务器(如 Google DNS, 阿里云 DNS)多次对目标域名进行 `ping` 或 `nslookup` 查询 +- **观察 IP 地址**: 如果每次查询返回的 IP 地址都不同,或者返回多个 IP 地址,那么很可能目标使用了 CDN。因为 CDN 会根据你的地理位置,将域名解析到不同的边缘节点服务器 +- **查询CNAME**: 许多 CDN 服务商会使用一个特殊的 CNAME(别名记录)来指向他们的 CDN 节点。例如,你查询 `www.example.com` 的 CNAME,如果返回一个类似 `www.example.com.cdn.cloudflare.net` 或 `w.alikun.com` 的域名,那么目标就使用了 CDN + +你可以使用在线工具如 **nslookup.io**、**`ping` 命令** 或 **`nslookup` 命令** 来进行测试 + +**2. HTTP 响应头分析** + +许多 CDN 服务商会在 HTTP 响应头中添加特定的信息来标识自己 + +- **`Server` 字段**: 一些 CDN 会在 `Server` 字段中暴露自己的身份,例如 `Server: cloudflare` 或 `Server: Tengine`(阿里巴巴的 CDN) +- **`X-Powered-By` 或自定义字段**: 有些 CDN 可能会添加自定义的 HTTP 头,如 `X-Cache`、`X-CDN` 或 `Via` 来指示内容是否由 CDN 缓存 +- **`Set-Cookie`**: 一些 CDN 服务会在响应中设置特定的 Cookie 来追踪用户,这也能作为判断依据 + +你可以使用 `curl` 命令或浏览器的开发者工具来查看这些 HTTP 头信息。例如:`curl -I http://www.example.com` + +**3. IP 地址归属地查询** + +- **IP 库查询**: 如果通过 DNS 查询获得了目标 IP 地址,可以利用 IP 地址查询工具来判断其归属地 +- **观察归属地**: 如果 IP 地址归属地是一个知名的 CDN 服务商(如 Cloudflare, Akamai, AWS),那么目标就使用了 CDN + +**4. SSL/TLS 证书信息** + +- **证书颁发者**: 有些 CDN 服务商会提供 SSL/TLS 证书服务,如果证书的颁发者是 Cloudflare 或 Let's Encrypt 等,这可能暗示使用了 CDN \ No newline at end of file diff --git a/Chapter1/1-6.md b/Chapter1/1-6.md new file mode 100644 index 0000000..7b0af6b --- /dev/null +++ b/Chapter1/1-6.md @@ -0,0 +1,42 @@ +### 有没有了解过 SVN/GIT 源代码泄露 + +**SVN 源代码泄露** + +SVN(Subversion)是一个集中式版本控制系统,它的核心目录是 `.svn`。当开发者在 Web 服务器的根目录下直接使用 `svn checkout` 或 `svn update` 命令时,`.svn` 目录及其所有子目录也会被同步到服务器上。如果 Web 服务器没有正确配置,这个隐藏目录就会被公网访问 + +**漏洞原理** + +`/.svn/` 目录下存储了代码的元数据,这些数据通常以 `.svn/entries`、`.svn/text-base/` 等形式存在。攻击者可以通过递归下载这些文件来还原出整个代码库 + +- `/.svn/entries`:在 SVN 1.6 及更早版本中,这个文件包含了目录下所有文件的元数据,包括文件名、版本号、文件类型等。攻击者可以通过解析这个文件,获取所有文件的相对路径 +- `/.svn/text-base/`:这个目录存储了每个文件的原始版本副本。文件名通常是 `filename.svn-base`。攻击者可以下载这些文件来获取源代码 + +**如何利用** + +利用 SVN 源代码泄露,通常需要一个自动化工具来递归下载所有 `.svn` 目录下的文件,并根据元数据将它们重组为完整的代码库 + +1. **探测**:在目标网站 URL 后面加上 `/.svn/entries` 或 `/.svn/wc.db`(SVN 1.7+)来探测漏洞是否存在 + - `http://example.com/.svn/entries` + - `http://example.com/some-dir/.svn/entries` +2. **自动化下载与重构**:使用 `svn-dumper`、`dvcs-ripper` 等工具。这些工具能够自动化完成下载和还原代码的过程 + +**Git 源代码泄露** + +Git 是一个分布式版本控制系统,它的核心目录是 `.git`。和 SVN 类似,当开发者将代码直接在 Web 目录下进行 `git init` 或 `git clone` 操作时,`.git` 目录就会被创建并暴露出来 + +**漏洞原理** + +`/.git/` 目录包含了 Git 版本库的所有信息,如对象(objects)、引用(refs)、索引(index)、配置文件(config)等。攻击者可以通过下载这些文件,利用 Git 内部的命令来还原代码 + +- `/.git/HEAD`:指向当前分支,可以确定当前分支名 +- `/.git/index`:包含了暂存区的文件信息 +- `/.git/objects/`:这个目录存储了所有的 Git 对象(包括文件、目录、提交等)。这是攻击者还原代码最关键的目录 + +**如何利用** + +1. **探测**:在目标 URL 后面加上 `/.git/` 或 `/.git/config` 来探测漏洞 + - `http://example.com/.git/config` + - `http://example.com/.git/HEAD` +2. **下载与重构**:同样可以使用 `dvcs-ripper` 或专门针对 Git 的工具。这些工具会下载 `.git` 目录下的所有文件,然后在本地创建一个 Git 仓库并还原出源代码 + - 通过 `git log` 查看提交历史 + - 通过 `git checkout` 切换到不同版本,获取所有版本的代码 \ No newline at end of file diff --git a/Chapter1/1-7.md b/Chapter1/1-7.md new file mode 100644 index 0000000..900aaea --- /dev/null +++ b/Chapter1/1-7.md @@ -0,0 +1,55 @@ +### 说说域信息收集思路 + +**阶段一:宏观侦察** + +这个阶段的目标是**在不暴露自己身份的情况下,尽可能多地了解域环境的整体情况** + +1. **确定网络边界和域控位置:** + - **DNS 侦察:** 查询 DNS 服务器,获取域控(DC)、全局编录服务器(GC)的 IP 地址。通常通过 `nslookup` 或 `dig` 命令查询 `_ldap._tcp.dc._msdcs.` 或 `_kerberos._tcp.dc._msdcs.` 记录。这是最基本的域内服务发现方法 + - **SMB 侦察:** 使用 `nbtscan` 或 `nmap` 扫描器,发现网络中开放了 445 端口(SMB)的主机,这些主机很可能是 Windows 主机,其中域控的特征会更明显 +2. **判断域的信任关系:** + - 域之间可能存在信任关系,允许一个域的用户访问另一个域的资源。通过 `nltest /domain_trusts` 或 PowerView 的 `Get-DomainTrust` 命令可以列出域之间的信任关系。这是一个重要的横向移动点,如果能控制一个受信任的子域,可能可以借此攻击主域 +3. **发现域内主机:** + - **ICMP/ARP 扫描:** 使用 `ping` 或 `nmap -sn` 对内网 IP 段进行存活主机探测 + - **端口扫描:** 发现域内主机开放的服务,特别是 Kerberos (88/TCP)、LDAP (389/TCP)、SMB (445/TCP)、WinRM (5985/TCP) 等与域服务相关的端口 + +**阶段二:微观信息枚举** + +在初步了解了域环境后,这个阶段的目标是**利用已有的权限(即使是普通用户权限),深入挖掘域内的各种实体信息** + +**1. 用户和组信息枚举** + +- **目标:** 发现域内所有用户、管理员账户、组及其成员 +- **常用技术:** + - **`net user /domain` 和 `net group /domain`:** 最基础的命令行工具,可以列出域内用户和组 + - **PowerView (PowerShell):** 这是域渗透中最强大的信息收集工具之一。它提供了大量 cmdlet,如 `Get-DomainUser`、`Get-DomainGroup`、`Get-DomainGroupMember`,可以高效、详细地查询域内用户、组及其关系 + - **AdFind.exe:** 一款经典的 LDAP 查询工具,可以灵活地查询域内任何信息 + - **BloodHound:** 这是一个革命性的工具,它通过收集域内用户、组、计算机、服务等实体之间的关系,并以图形化方式展示,帮助攻击者快速找到通往域控的**最短攻击路径**。这是渗透测试中必不可少的工具 + +**2. 计算机和域控信息枚举** + +- **目标:** 发现域内所有计算机,特别是域控、高权限服务器,以及这些机器上运行的服务 +- **常用技术:** + - **PowerView 的 `Get-DomainComputer`:** 可以获取域内所有计算机的详细信息,包括操作系统、角色(如是否为域控)等 + - **SMB 和 WinRM 枚举:** 尝试连接域内计算机的 SMB 或 WinRM 服务,并使用已有的凭据进行登录,如果成功,可以进一步收集该机器上的本地信息。 + +**3. 服务信息枚举(Kerberoasting)** + +- **目标:** 发现域内所有注册了 SPN (Service Principal Name) 的服务账户 +- **常用技术:** + - **PowerView 的 `Get-DomainSPN`:** 专门用于查询注册了 SPN 的服务账户 + - **Kerberoasting 攻击:** 通过向 KDC (Key Distribution Center) 请求特定服务的 TGS 票据,然后离线破解票据中的哈希,从而获取服务账户的明文密码。这是一个非常高效的域内提权和横向移动方法 + +**4. 组策略信息(SYSVOL)** + +- **目标:** 收集域内的组策略设置,寻找配置不当或包含敏感信息的 GPO +- **常用技术:** + - **访问 `\\\SYSVOL` 共享:** SYSVOL 文件夹是公开可访问的 + - **搜索 `SYSVOL`:** 在 SYSVOL 文件夹中搜索密码、脚本(如 `.vbs` 或 `.bat` 文件)或任何可能包含敏感信息的 XML 文件。有时管理员会将密码硬编码在组策略脚本中,这会是一个巨大的突破口 + +**5. 域内漏洞扫描与识别** + +- **目标:** 发现域内存在的已知漏洞,特别是与域服务相关的关键漏洞 +- **常用技术:** + - **PowerView 的 `Find-DomainVulnerableSPN` 等:** 寻找可能存在漏洞的配置 + - **专业漏洞扫描器:** 使用商业或开源的漏洞扫描器,如 Nessus、OpenVAS 或专门针对域控的漏洞扫描工具,检查域控和成员服务器是否存在 Zerologon (CVE-2020-1472)、PetitPotam (CVE-2021-36942) 等严重漏洞 \ No newline at end of file diff --git a/Chapter1/1-8.md b/Chapter1/1-8.md new file mode 100644 index 0000000..b02d2be --- /dev/null +++ b/Chapter1/1-8.md @@ -0,0 +1,77 @@ +### 如何快速定位域控 + +**1. 使用内置环境变量** + +这是最快、最简单的方法,特别是在你已经获得域内任意一台 Windows 主机的权限时 + +当一台 Windows 主机加入域后,它会自动设置一个名为 `%LOGONSERVER%` 的环境变量,该变量存储了当前用于登录认证的域控名称。 + +- **命令:** + + ```powershell + echo %LOGONSERVER% + ``` + + 或者在 PowerShell 中: + + ```powershell + $env:LOGONSERVER + ``` + +- **优点:** 无需任何额外工具,几乎即时返回结果 + +**2. 通过 DNS 服务查询** + +在域环境中,域控会在 DNS 服务器上注册特定的服务记录(SRV Records),这些记录指向其 IP 地址和端口。这是最可靠的定位方法之一 + +- **命令:** + + ```powershell + nslookup -type=SRV _ldap._tcp.dc._msdcs.yourdomain.com + ``` + + 将 `yourdomain.com` 替换为目标域的名称。例如,如果域是 `contoso.local`,命令就是 `nslookup -type=SRV _ldap._tcp.dc._msdcs.contoso.local` + +- **输出:** DNS 服务器会返回包含域控主机名和 IP 地址的列表 + +- **优点:** 几乎所有 Windows 域都依赖 DNS 服务,这种方法非常通用且准确 + +**3. 利用 Windows 内置工具** + +`nltest` 是一个用于测试和管理网络登录服务的命令行工具,可以用来发现域控 + +- **命令:** + + ```powershell + nltest /dclist:yourdomain.com + ``` + + 这个命令会列出域内的所有域控 + +- **优点:** 无需管理员权限,可以在任何域成员主机上运行,非常方便 + +**4. 使用端口扫描** + +域控提供多种核心服务,这些服务都在特定的端口上运行。通过扫描这些端口,可以有效地识别出域控 + +- **关键端口:** + + - **Kerberos:** 88/TCP + - **LDAP:** 389/TCP + - **LDAP over SSL:** 636/TCP + - **Global Catalog:** 3268/TCP + - **SMB:** 445/TCP + +- **Nmap 扫描:** + + ```bash + nmap -p 88,135,139,389,445,636 --open + ``` + + 这个命令会扫描指定网段中开放了这些域控服务端口的主机。 你还可以使用 Nmap 的脚本来更精确地识别: + + ```bash + nmap -p 88 --script krb5-enum-users + ``` + + 如果一个主机在 88 端口上运行了 Kerberos 服务,它很可能就是域控 \ No newline at end of file diff --git a/Chapter1/1-9.md b/Chapter1/1-9.md new file mode 100644 index 0000000..6c2c24e --- /dev/null +++ b/Chapter1/1-9.md @@ -0,0 +1,14 @@ +### Wappalyzer 怎么进行指纹识别的 + +Wappalyzer 的指纹识别过程可以概括为以下几个主要步骤: + +1. **特征库匹配**:Wappalyzer 维护一个巨大的、社区驱动的 JSON 特征库文件,其中包含了各种 Web 技术(如 CMS、Web 服务器、前端框架、编程语言、数据库等)的**独特指纹信息** +2. **获取信息**:当你访问一个网站时,Wappalyzer 会利用浏览器已经加载的数据,从中提取出以下几类信息: + - **HTTP 响应头(HTTP Headers)**:检查 `Server`、`X-Powered-By`、`Set-Cookie` 等响应头字段。例如,`Server: Nginx` 就直接表明使用了 Nginx 服务器;`X-Powered-By: PHP/7.4.3` 则表明使用了特定版本的 PHP + - **HTML 页面内容**:在页面的 `` 和 `` 标签中搜索特定的字符串。例如,许多 CMS 会在页面中包含特定的元标签,如 ``,这直接暴露了所使用的技术及其版本 + - **JavaScript 变量和库**:检查全局 JavaScript 变量或特定库文件的存在。例如,如果页面加载了 `jquery.js`,并且存在 `window.jQuery` 变量,Wappalyzer 就可以识别出使用了 jQuery 库 + - **URL 路径和文件名**:分析 URL 的结构,特别是目录和文件名。例如,`/wp-content/` 目录是 WordPress 的典型特征;而 `/admin` 或 `/login` 路径可能指向特定的 CMS 或框架 + - **Cookies**:检查 Cookie 名称或值。例如,`wordpress_logged_in_...` 或 `PHPSESSID` 都是典型的指纹信息 + - **CSS 文件**:通过分析 CSS 文件的路径、内容或文件名来识别技术 +3. **匹配与判断**:Wappalyzer 将上述提取到的信息与本地的特征库进行比对。如果某个或某几个特征与库中的某个技术指纹相匹配,那么该技术就会被识别出来,并显示在 Wappalyzer 的图标或面板中 +4. **结果展示**:最终,Wappalyzer 会将所有匹配成功的技术以图标和文字的形式展示给用户,通常还会附带该技术的名称、版本和类型(如 CMS、框架、库等) \ No newline at end of file diff --git a/Chapter1/README.md b/Chapter1/README.md new file mode 100644 index 0000000..9eecb4f --- /dev/null +++ b/Chapter1/README.md @@ -0,0 +1,20 @@ +# 网安面试题(涵盖护网、红队、逆向、二进制) + +上万道安全面试题已经全部为您划分好,适用于网络安全所有岗位!!! + +HR:请问………… + +我:叽里咕噜说啥呢,看看八股文上写了没 + +(Summary.md 是目录噢!!) + +**🙏 特别感谢名单** + +在整理和完善本项目的过程中,以下朋友给予了宝贵的帮助与支持,在此表示诚挚的感谢!(排名不分先后) + +- **@用户名1** —— 提供了大量安全面试题方向的补充 +- **@用户名2** —— 纠正了多个问题的答案与表述 +- **@用户名3** —— 贡献了真实面试题经验分享 +- **@用户名4** —— 对内容结构与目录提出改进建议 + +如果您也愿意参与本项目,欢迎通过 **微信: XR3327026244** 投稿面试题或反馈问题,我们会在后续版本中加入您的名字